detached b6125b8

refactor(cef): remove legacy startup config duplication

commit
b6125b88d8055d96d6529bbf09278e7f284706d8
author
brice · · 2026-04-11 12:52 UTC
parent
d702cff
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +23 -44
M internal/infrastructure/cef/engine_init.go +21 -42
@@ -35,23 +35,7 @@ func NewEngine(
3535 logger := logging.FromContext(ctx)
3636 stateRoot := resolvedStateRoot(opts)
3737 cleanStaleSingletonLocks(logger, stateRoot)
38-
39- legacyCfg := config.CEFEngineConfig{
40- CEFDir: cfg.CEFDir,
41- LogFile: cfg.LogFile,
42- LogSeverity: cfg.LogSeverity,
43- WindowlessFrameRate: cfg.WindowlessFrameRate,
44- EnableAudioHandler: cfg.EnableAudioHandler,
45- EnableContextMenuHandler: cfg.EnableContextMenuHandler,
46- TraceHandlers: cfg.TraceHandlers,
47- }
48- legacyTranscodingCfg := config.TranscodingConfig{
49- Enabled: transcodingCfg.Enabled,
50- HWAccel: transcodingCfg.HWAccel,
51- MaxConcurrent: transcodingCfg.MaxConcurrent,
52- Quality: transcodingCfg.Quality,
53- }
54- windowlessFrameRate := legacyCfg.CEFWindowlessFrameRate()
38+ windowlessFrameRate := config.CEFEngineConfig{WindowlessFrameRate: cfg.WindowlessFrameRate}.CEFWindowlessFrameRate()
5539
5640 settings, err := prepareCEFSettings(opts, cfg, logger)
5741 if err != nil {
@@ -81,7 +65,7 @@ func NewEngine(
8165 }
8266 os.Args = savedArgs
8367
84- return wireEngine(ctx, eng, legacyCfg, legacyTranscodingCfg, windowlessFrameRate, audioFactory, logger)
68+ return wireEngine(ctx, eng, cfg, transcodingCfg, windowlessFrameRate, audioFactory, logger)
8569 }
8670
8771 func resolvedStateRoot(opts port.EngineOptions) string {
@@ -101,29 +85,19 @@ func prepareCEFSettings(opts port.EngineOptions, cfg RuntimeConfig, logger *zero
10185 return purecef.Settings{}, fmt.Errorf("%w: %s", ErrCookiePolicyUnsupported, opts.CookiePolicy)
10286 }
10387
104- legacyCfg := config.CEFEngineConfig{
105- CEFDir: cfg.CEFDir,
106- LogFile: cfg.LogFile,
107- LogSeverity: cfg.LogSeverity,
108- WindowlessFrameRate: cfg.WindowlessFrameRate,
109- EnableAudioHandler: cfg.EnableAudioHandler,
110- EnableContextMenuHandler: cfg.EnableContextMenuHandler,
111- TraceHandlers: cfg.TraceHandlers,
112- }
113-
11488 settings := purecef.DefaultSettings()
11589 settings.MultiThreadedMessageLoop = true
11690 settings.ExternalMessagePump = false
11791 settings.RootCachePath = resolvedStateRoot(opts)
118- if legacyCfg.CEFDir != "" {
119- settings.CEFDir = legacyCfg.CEFDir
92+ if cfg.CEFDir != "" {
93+ settings.CEFDir = cfg.CEFDir
12094 }
121- if runtimeLogFile, err := prepareCEFLogFile(legacyCfg); err != nil {
95+ if runtimeLogFile, err := prepareCEFLogFile(cfg.LogFile); err != nil {
12296 logger.Warn().Err(err).Msg("cef: failed to prepare runtime log file")
12397 } else {
12498 settings.LogFile = runtimeLogFile
12599 }
126- if bootstrapLogFile, err := prepareCEFInitTraceFile(legacyCfg); err != nil {
100+ if bootstrapLogFile, err := prepareCEFInitTraceFile(cfg.LogFile); err != nil {
127101 logger.Warn().Err(err).Msg("cef: failed to prepare init trace file")
128102 } else if bootstrapLogFile != "" {
129103 settings.InitTraceFile = bootstrapLogFile
@@ -132,8 +106,8 @@ func prepareCEFSettings(opts port.EngineOptions, cfg RuntimeConfig, logger *zero
132106 Str("env_var", puregoCEFInitTraceEnvVar).
133107 Msg("cef: init bootstrap diagnostics enabled")
134108 }
135- if legacyCfg.LogSeverity != 0 {
136- settings.LogSeverity = legacyCfg.LogSeverity
109+ if cfg.LogSeverity != 0 {
110+ settings.LogSeverity = cfg.LogSeverity
137111 }
138112 if helperPath := findHelperBinary(); helperPath != "" {
139113 settings.BrowserSubprocessPath = helperPath
@@ -171,7 +145,7 @@ func initializeCEF(eng *Engine, settings purecef.Settings, logger *zerolog.Logge
171145
172146 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.
173147 func wireEngine(
174- ctx context.Context, eng *Engine, cfg config.CEFEngineConfig, transcodingCfg config.TranscodingConfig,
148+ ctx context.Context, eng *Engine, cfg RuntimeConfig, transcodingCfg TranscodingRuntimeConfig,
175149 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,
176150 ) (*Engine, error) {
177151 gl, err := newGLLoader()
@@ -187,7 +161,12 @@ func wireEngine(
187161 transcoderState := buildTranscoderStartupState(transcodingCfg)
188162 if transcodingCfg.Enabled {
189163 transcoderState.ProbeAttempted = true
190- tc := transcoderpkg.New(transcodingCfg, logger)
164+ tc := transcoderpkg.New(config.TranscodingConfig{
165+ Enabled: transcodingCfg.Enabled,
166+ HWAccel: transcodingCfg.HWAccel,
167+ MaxConcurrent: transcodingCfg.MaxConcurrent,
168+ Quality: transcodingCfg.Quality,
169+ }, logger)
191170 caps := tc.Capabilities()
192171 transcoderState.API = caps.API
193172 transcoderState.Encoders = append([]string(nil), caps.Encoders...)
@@ -270,7 +249,7 @@ func wireEngine(
270249 return eng, nil
271250 }
272251
273-func buildTranscoderStartupState(cfg config.TranscodingConfig) transcoderStartupState {
252+func buildTranscoderStartupState(cfg TranscodingRuntimeConfig) transcoderStartupState {
274253 hwaccel := cfg.HWAccel
275254 if hwaccel == "" {
276255 hwaccel = "auto"
@@ -408,9 +387,9 @@ const (
408387 filePerm = 0o644
409388 )
410389
411-func prepareCEFLogFile(cfg config.CEFEngineConfig) (string, error) {
412- if cfg.LogFile != "" {
413- runtimeLogFile := filepath.Clean(cfg.LogFile)
390+func prepareCEFLogFile(logFile string) (string, error) {
391+ if logFile != "" {
392+ runtimeLogFile := filepath.Clean(logFile)
414393 if err := os.MkdirAll(filepath.Dir(runtimeLogFile), dirPerm); err != nil {
415394 return "", fmt.Errorf("mkdir %s: %w", filepath.Dir(runtimeLogFile), err)
416395 }
@@ -430,12 +409,12 @@ func prepareCEFLogFile(cfg config.CEFEngineConfig) (string, error) {
430409 return runtimeLogFile, nil
431410 }
432411
433-func prepareCEFInitTraceFile(cfg config.CEFEngineConfig) (string, error) {
412+func prepareCEFInitTraceFile(logFile string) (string, error) {
434413 if !puregoCEFInitTraceEnabled() {
435414 return "", nil
436415 }
437416
438- runtimeLogFile := cfg.LogFile
417+ runtimeLogFile := logFile
439418 if runtimeLogFile != "" {
440419 runtimeLogFile = filepath.Clean(runtimeLogFile)
441420 } else {
@@ -35,23 +35,7 @@ func NewEngine(
35 logger := logging.FromContext(ctx)35 logger := logging.FromContext(ctx)
36 stateRoot := resolvedStateRoot(opts)36 stateRoot := resolvedStateRoot(opts)
37 cleanStaleSingletonLocks(logger, stateRoot)37 cleanStaleSingletonLocks(logger, stateRoot)
38-38+ windowlessFrameRate := config.CEFEngineConfig{WindowlessFrameRate: cfg.WindowlessFrameRate}.CEFWindowlessFrameRate()
39- legacyCfg := config.CEFEngineConfig{
40- CEFDir: cfg.CEFDir,
41- LogFile: cfg.LogFile,
42- LogSeverity: cfg.LogSeverity,
43- WindowlessFrameRate: cfg.WindowlessFrameRate,
44- EnableAudioHandler: cfg.EnableAudioHandler,
45- EnableContextMenuHandler: cfg.EnableContextMenuHandler,
46- TraceHandlers: cfg.TraceHandlers,
47- }
48- legacyTranscodingCfg := config.TranscodingConfig{
49- Enabled: transcodingCfg.Enabled,
50- HWAccel: transcodingCfg.HWAccel,
51- MaxConcurrent: transcodingCfg.MaxConcurrent,
52- Quality: transcodingCfg.Quality,
53- }
54- windowlessFrameRate := legacyCfg.CEFWindowlessFrameRate()
55 39
56 settings, err := prepareCEFSettings(opts, cfg, logger)40 settings, err := prepareCEFSettings(opts, cfg, logger)
57 if err != nil {41 if err != nil {
@@ -81,7 +65,7 @@ func NewEngine(
81 }65 }
82 os.Args = savedArgs66 os.Args = savedArgs
83 67
84- return wireEngine(ctx, eng, legacyCfg, legacyTranscodingCfg, windowlessFrameRate, audioFactory, logger)68+ return wireEngine(ctx, eng, cfg, transcodingCfg, windowlessFrameRate, audioFactory, logger)
85 }69 }
86 70
87 func resolvedStateRoot(opts port.EngineOptions) string {71 func resolvedStateRoot(opts port.EngineOptions) string {
@@ -101,29 +85,19 @@ func prepareCEFSettings(opts port.EngineOptions, cfg RuntimeConfig, logger *zero
101 return purecef.Settings{}, fmt.Errorf("%w: %s", ErrCookiePolicyUnsupported, opts.CookiePolicy)85 return purecef.Settings{}, fmt.Errorf("%w: %s", ErrCookiePolicyUnsupported, opts.CookiePolicy)
102 }86 }
103 87
104- legacyCfg := config.CEFEngineConfig{
105- CEFDir: cfg.CEFDir,
106- LogFile: cfg.LogFile,
107- LogSeverity: cfg.LogSeverity,
108- WindowlessFrameRate: cfg.WindowlessFrameRate,
109- EnableAudioHandler: cfg.EnableAudioHandler,
110- EnableContextMenuHandler: cfg.EnableContextMenuHandler,
111- TraceHandlers: cfg.TraceHandlers,
112- }
113-
114 settings := purecef.DefaultSettings()88 settings := purecef.DefaultSettings()
115 settings.MultiThreadedMessageLoop = true89 settings.MultiThreadedMessageLoop = true
116 settings.ExternalMessagePump = false90 settings.ExternalMessagePump = false
117 settings.RootCachePath = resolvedStateRoot(opts)91 settings.RootCachePath = resolvedStateRoot(opts)
118- if legacyCfg.CEFDir != "" {92+ if cfg.CEFDir != "" {
119- settings.CEFDir = legacyCfg.CEFDir93+ settings.CEFDir = cfg.CEFDir
120 }94 }
121- if runtimeLogFile, err := prepareCEFLogFile(legacyCfg); err != nil {95+ if runtimeLogFile, err := prepareCEFLogFile(cfg.LogFile); err != nil {
122 logger.Warn().Err(err).Msg("cef: failed to prepare runtime log file")96 logger.Warn().Err(err).Msg("cef: failed to prepare runtime log file")
123 } else {97 } else {
124 settings.LogFile = runtimeLogFile98 settings.LogFile = runtimeLogFile
125 }99 }
126- if bootstrapLogFile, err := prepareCEFInitTraceFile(legacyCfg); err != nil {100+ if bootstrapLogFile, err := prepareCEFInitTraceFile(cfg.LogFile); err != nil {
127 logger.Warn().Err(err).Msg("cef: failed to prepare init trace file")101 logger.Warn().Err(err).Msg("cef: failed to prepare init trace file")
128 } else if bootstrapLogFile != "" {102 } else if bootstrapLogFile != "" {
129 settings.InitTraceFile = bootstrapLogFile103 settings.InitTraceFile = bootstrapLogFile
@@ -132,8 +106,8 @@ func prepareCEFSettings(opts port.EngineOptions, cfg RuntimeConfig, logger *zero
132 Str("env_var", puregoCEFInitTraceEnvVar).106 Str("env_var", puregoCEFInitTraceEnvVar).
133 Msg("cef: init bootstrap diagnostics enabled")107 Msg("cef: init bootstrap diagnostics enabled")
134 }108 }
135- if legacyCfg.LogSeverity != 0 {109+ if cfg.LogSeverity != 0 {
136- settings.LogSeverity = legacyCfg.LogSeverity110+ settings.LogSeverity = cfg.LogSeverity
137 }111 }
138 if helperPath := findHelperBinary(); helperPath != "" {112 if helperPath := findHelperBinary(); helperPath != "" {
139 settings.BrowserSubprocessPath = helperPath113 settings.BrowserSubprocessPath = helperPath
@@ -171,7 +145,7 @@ func initializeCEF(eng *Engine, settings purecef.Settings, logger *zerolog.Logge
171 145
172 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.146 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.
173 func wireEngine(147 func wireEngine(
174- ctx context.Context, eng *Engine, cfg config.CEFEngineConfig, transcodingCfg config.TranscodingConfig,148+ ctx context.Context, eng *Engine, cfg RuntimeConfig, transcodingCfg TranscodingRuntimeConfig,
175 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,149 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,
176 ) (*Engine, error) {150 ) (*Engine, error) {
177 gl, err := newGLLoader()151 gl, err := newGLLoader()
@@ -187,7 +161,12 @@ func wireEngine(
187 transcoderState := buildTranscoderStartupState(transcodingCfg)161 transcoderState := buildTranscoderStartupState(transcodingCfg)
188 if transcodingCfg.Enabled {162 if transcodingCfg.Enabled {
189 transcoderState.ProbeAttempted = true163 transcoderState.ProbeAttempted = true
190- tc := transcoderpkg.New(transcodingCfg, logger)164+ tc := transcoderpkg.New(config.TranscodingConfig{
165+ Enabled: transcodingCfg.Enabled,
166+ HWAccel: transcodingCfg.HWAccel,
167+ MaxConcurrent: transcodingCfg.MaxConcurrent,
168+ Quality: transcodingCfg.Quality,
169+ }, logger)
191 caps := tc.Capabilities()170 caps := tc.Capabilities()
192 transcoderState.API = caps.API171 transcoderState.API = caps.API
193 transcoderState.Encoders = append([]string(nil), caps.Encoders...)172 transcoderState.Encoders = append([]string(nil), caps.Encoders...)
@@ -270,7 +249,7 @@ func wireEngine(
270 return eng, nil249 return eng, nil
271 }250 }
272 251
273-func buildTranscoderStartupState(cfg config.TranscodingConfig) transcoderStartupState {252+func buildTranscoderStartupState(cfg TranscodingRuntimeConfig) transcoderStartupState {
274 hwaccel := cfg.HWAccel253 hwaccel := cfg.HWAccel
275 if hwaccel == "" {254 if hwaccel == "" {
276 hwaccel = "auto"255 hwaccel = "auto"
@@ -408,9 +387,9 @@ const (
408 filePerm = 0o644387 filePerm = 0o644
409 )388 )
410 389
411-func prepareCEFLogFile(cfg config.CEFEngineConfig) (string, error) {390+func prepareCEFLogFile(logFile string) (string, error) {
412- if cfg.LogFile != "" {391+ if logFile != "" {
413- runtimeLogFile := filepath.Clean(cfg.LogFile)392+ runtimeLogFile := filepath.Clean(logFile)
414 if err := os.MkdirAll(filepath.Dir(runtimeLogFile), dirPerm); err != nil {393 if err := os.MkdirAll(filepath.Dir(runtimeLogFile), dirPerm); err != nil {
415 return "", fmt.Errorf("mkdir %s: %w", filepath.Dir(runtimeLogFile), err)394 return "", fmt.Errorf("mkdir %s: %w", filepath.Dir(runtimeLogFile), err)
416 }395 }
@@ -430,12 +409,12 @@ func prepareCEFLogFile(cfg config.CEFEngineConfig) (string, error) {
430 return runtimeLogFile, nil409 return runtimeLogFile, nil
431 }410 }
432 411
433-func prepareCEFInitTraceFile(cfg config.CEFEngineConfig) (string, error) {412+func prepareCEFInitTraceFile(logFile string) (string, error) {
434 if !puregoCEFInitTraceEnabled() {413 if !puregoCEFInitTraceEnabled() {
435 return "", nil414 return "", nil
436 }415 }
437 416
438- runtimeLogFile := cfg.LogFile417+ runtimeLogFile := logFile
439 if runtimeLogFile != "" {418 if runtimeLogFile != "" {
440 runtimeLogFile = filepath.Clean(runtimeLogFile)419 runtimeLogFile = filepath.Clean(runtimeLogFile)
441 } else {420 } else {
M internal/infrastructure/cef/engine_init_test.go +2 -2
@@ -38,7 +38,7 @@ func TestPrepareCEFSettings_RejectsNonDefaultCookiePolicy(t *testing.T) {
3838 func TestPrepareCEFInitTraceFile_DisabledByDefault(t *testing.T) {
3939 t.Setenv(puregoCEFInitTraceEnvVar, "")
4040
41- path, err := prepareCEFInitTraceFile(config.CEFEngineConfig{})
41+ path, err := prepareCEFInitTraceFile("")
4242 require.NoError(t, err)
4343 require.Empty(t, path)
4444 }
@@ -49,7 +49,7 @@ func TestPrepareCEFInitTraceFile_EnabledViaEnv(t *testing.T) {
4949 LogFile: filepath.Join(t.TempDir(), "cef_runtime.log"),
5050 }
5151
52- path, err := prepareCEFInitTraceFile(cfg)
52+ path, err := prepareCEFInitTraceFile(cfg.LogFile)
5353 require.NoError(t, err)
5454 require.Equal(t, filepath.Join(filepath.Dir(cfg.LogFile), "cef_runtime.bootstrap.log"), path)
5555 require.FileExists(t, path)
@@ -38,7 +38,7 @@ func TestPrepareCEFSettings_RejectsNonDefaultCookiePolicy(t *testing.T) {
38 func TestPrepareCEFInitTraceFile_DisabledByDefault(t *testing.T) {38 func TestPrepareCEFInitTraceFile_DisabledByDefault(t *testing.T) {
39 t.Setenv(puregoCEFInitTraceEnvVar, "")39 t.Setenv(puregoCEFInitTraceEnvVar, "")
40 40
41- path, err := prepareCEFInitTraceFile(config.CEFEngineConfig{})41+ path, err := prepareCEFInitTraceFile("")
42 require.NoError(t, err)42 require.NoError(t, err)
43 require.Empty(t, path)43 require.Empty(t, path)
44 }44 }
@@ -49,7 +49,7 @@ func TestPrepareCEFInitTraceFile_EnabledViaEnv(t *testing.T) {
49 LogFile: filepath.Join(t.TempDir(), "cef_runtime.log"),49 LogFile: filepath.Join(t.TempDir(), "cef_runtime.log"),
50 }50 }
51 51
52- path, err := prepareCEFInitTraceFile(cfg)52+ path, err := prepareCEFInitTraceFile(cfg.LogFile)
53 require.NoError(t, err)53 require.NoError(t, err)
54 require.Equal(t, filepath.Join(filepath.Dir(cfg.LogFile), "cef_runtime.bootstrap.log"), path)54 require.Equal(t, filepath.Join(filepath.Dir(cfg.LogFile), "cef_runtime.bootstrap.log"), path)
55 require.FileExists(t, path)55 require.FileExists(t, path)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close