detached 51da5d5

refactor(cef): fail fast on missing config builders

commit
51da5d55481e8c65764baa836175443fedeeff1f
author
brice · · 2026-04-11 13:10 UTC
parent
d24a1f0
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
3 files · +29 -3
M internal/infrastructure/cef/engine_init.go +5 -1
@@ -207,13 +207,17 @@ func wireEngine(
207207 eng.transcoderState = transcoderState
208208
209209 messageRouter := NewMessageRouter(ctx)
210- schemeHandler := newDumbSchemeHandler(
210+ schemeHandler, err := newDumbSchemeHandler(
211211 ctx,
212212 messageRouter,
213213 mediaTranscoder,
214214 currentConfigPayload,
215215 defaultConfigPayload,
216216 )
217+ if err != nil {
218+ purecef.Shutdown()
219+ return nil, err
220+ }
217221 schemeHandler.setAssets(assets.WebUIAssets)
218222
219223 // Bridge clipboard writes from CEF JS → GDK system clipboard.
@@ -207,13 +207,17 @@ func wireEngine(
207 eng.transcoderState = transcoderState207 eng.transcoderState = transcoderState
208 208
209 messageRouter := NewMessageRouter(ctx)209 messageRouter := NewMessageRouter(ctx)
210- schemeHandler := newDumbSchemeHandler(210+ schemeHandler, err := newDumbSchemeHandler(
211 ctx,211 ctx,
212 messageRouter,212 messageRouter,
213 mediaTranscoder,213 mediaTranscoder,
214 currentConfigPayload,214 currentConfigPayload,
215 defaultConfigPayload,215 defaultConfigPayload,
216 )216 )
217+ if err != nil {
218+ purecef.Shutdown()
219+ return nil, err
220+ }
217 schemeHandler.setAssets(assets.WebUIAssets)221 schemeHandler.setAssets(assets.WebUIAssets)
218 222
219 // Bridge clipboard writes from CEF JS → GDK system clipboard.223 // Bridge clipboard writes from CEF JS → GDK system clipboard.
M internal/infrastructure/cef/scheme_handler.go +9 -2
@@ -68,7 +68,14 @@ func newDumbSchemeHandler(
6868 transcoder port.MediaTranscoder,
6969 currentConfigPayload func() ([]byte, error),
7070 defaultConfigPayload func() ([]byte, error),
71-) *dumbSchemeHandler {
71+) (*dumbSchemeHandler, error) {
72+ if currentConfigPayload == nil {
73+ return nil, fmt.Errorf("current config payload builder not configured")
74+ }
75+ if defaultConfigPayload == nil {
76+ return nil, fmt.Errorf("default config payload builder not configured")
77+ }
78+
7279 log := logging.FromContext(ctx)
7380 return &dumbSchemeHandler{
7481 ctx: ctx,
@@ -78,7 +85,7 @@ func newDumbSchemeHandler(
7885 logger: log.With().Str("component", "scheme-handler").Logger(),
7986 currentConfigPayload: currentConfigPayload,
8087 defaultConfigPayload: defaultConfigPayload,
81- }
88+ }, nil
8289 }
8390
8491 // setAssets sets the embedded filesystem containing webui assets.
@@ -68,7 +68,14 @@ func newDumbSchemeHandler(
68 transcoder port.MediaTranscoder,68 transcoder port.MediaTranscoder,
69 currentConfigPayload func() ([]byte, error),69 currentConfigPayload func() ([]byte, error),
70 defaultConfigPayload func() ([]byte, error),70 defaultConfigPayload func() ([]byte, error),
71-) *dumbSchemeHandler {71+) (*dumbSchemeHandler, error) {
72+ if currentConfigPayload == nil {
73+ return nil, fmt.Errorf("current config payload builder not configured")
74+ }
75+ if defaultConfigPayload == nil {
76+ return nil, fmt.Errorf("default config payload builder not configured")
77+ }
78+
72 log := logging.FromContext(ctx)79 log := logging.FromContext(ctx)
73 return &dumbSchemeHandler{80 return &dumbSchemeHandler{
74 ctx: ctx,81 ctx: ctx,
@@ -78,7 +85,7 @@ func newDumbSchemeHandler(
78 logger: log.With().Str("component", "scheme-handler").Logger(),85 logger: log.With().Str("component", "scheme-handler").Logger(),
79 currentConfigPayload: currentConfigPayload,86 currentConfigPayload: currentConfigPayload,
80 defaultConfigPayload: defaultConfigPayload,87 defaultConfigPayload: defaultConfigPayload,
81- }88+ }, nil
82 }89 }
83 90
84 // setAssets sets the embedded filesystem containing webui assets.91 // setAssets sets the embedded filesystem containing webui assets.
M internal/infrastructure/cef/scheme_handler_test.go +15 -0
@@ -1,6 +1,7 @@
11 package cef
22
33 import (
4+ "context"
45 "errors"
56 "testing"
67
@@ -28,3 +29,17 @@ func TestResolveConfigPayload_NilBuilderFails(t *testing.T) {
2829 require.Error(t, err)
2930 require.Contains(t, err.Error(), "config payload builder")
3031 }
32+
33+func TestNewDumbSchemeHandler_NilCurrentConfigPayloadFails(t *testing.T) {
34+ h, err := newDumbSchemeHandler(context.Background(), nil, nil, nil, func() ([]byte, error) { return nil, nil })
35+ require.Error(t, err)
36+ require.Nil(t, h)
37+ require.Contains(t, err.Error(), "current config payload builder")
38+}
39+
40+func TestNewDumbSchemeHandler_NilDefaultConfigPayloadFails(t *testing.T) {
41+ h, err := newDumbSchemeHandler(context.Background(), nil, nil, func() ([]byte, error) { return nil, nil }, nil)
42+ require.Error(t, err)
43+ require.Nil(t, h)
44+ require.Contains(t, err.Error(), "default config payload builder")
45+}
@@ -1,6 +1,7 @@
1 package cef1 package cef
2 2
3 import (3 import (
4+ "context"
4 "errors"5 "errors"
5 "testing"6 "testing"
6 7
@@ -28,3 +29,17 @@ func TestResolveConfigPayload_NilBuilderFails(t *testing.T) {
28 require.Error(t, err)29 require.Error(t, err)
29 require.Contains(t, err.Error(), "config payload builder")30 require.Contains(t, err.Error(), "config payload builder")
30 }31 }
32+
33+func TestNewDumbSchemeHandler_NilCurrentConfigPayloadFails(t *testing.T) {
34+ h, err := newDumbSchemeHandler(context.Background(), nil, nil, nil, func() ([]byte, error) { return nil, nil })
35+ require.Error(t, err)
36+ require.Nil(t, h)
37+ require.Contains(t, err.Error(), "current config payload builder")
38+}
39+
40+func TestNewDumbSchemeHandler_NilDefaultConfigPayloadFails(t *testing.T) {
41+ h, err := newDumbSchemeHandler(context.Background(), nil, nil, func() ([]byte, error) { return nil, nil }, nil)
42+ require.Error(t, err)
43+ require.Nil(t, h)
44+ require.Contains(t, err.Error(), "default config payload builder")
45+}

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