refactor: extract shared WebUI message handlers, wire CEF RegisterHandlers
Move message handlers from webkit/handlers/ to infrastructure/handlers/ (engine-agnostic shared package). Both WebKit and CEF now use the same handler code via the port.WebUIHandlerRouter interface. Port layer: - Add WebUIMessageHandler, WebUIMessageHandlerFunc, WebUIHandlerRouter - Expand HandlerDependencies with SaveConfig and keybinding usecases - Remove unused legacy MessageRouter interface Shared handlers (internal/infrastructure/handlers/): - Moved from webkit/handlers/: register, config, keybindings, clipboard - Moved homepage/: history, favorites, folders, tags, response, registry - All use port.WebUIMessageHandler instead of webkit.MessageHandler - RegisterAll takes port.WebUIHandlerRouter + port.HandlerDependencies WebKit adapter: - MessageHandler/MessageHandlerFunc are now aliases for port types - MessageRouter implements port.WebUIHandlerRouter (compile-time check) - Engine registrar signatures updated to use port.WebUIHandlerRouter CEF adapter: - MessageRouter implements port.WebUIHandlerRouter via portHandlerAdapter - RegisterHandlers now calls handlers.RegisterAll (was a stub) - registerInternalHandler for accent handlers (bare uint64 webviewID) Bootstrap: - Updated to pass keybinding deps and SaveConfig in HandlerDependencies - Import path changed from webkit/handlers to infrastructure/handlers
- commit
- a8445528998ad4cafa5e87f5c9738512c71680b6
- author
- brice · · 2026-03-21 21:49 UTC
- committer
- brice · · 2026-03-28 04:38 UTC
- parent
- c693591
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
19 files · +256 -193
M internal/application/port/engine.go +0 -1
| @@ -206,7 +206,6 @@ type SchemeHandler interface { | |||
| 206 | 206 | RegisterScheme(scheme string, handler func(uri string) ([]byte, string, error)) | |
| 207 | 207 | } | |
| 208 | 208 | ||
| 209 | - | ||
| 210 | 209 | // SettingsApplier defines the port interface for applying browser settings to WebViews. | |
| 211 | 210 | // Implementations apply engine-specific settings (security, features, etc.) uniformly | |
| 212 | 211 | // across a set of WebView instances. | |
| @@ -206,7 +206,6 @@ type SchemeHandler interface { | |||||
| 206 | RegisterScheme(scheme string, handler func(uri string) ([]byte, string, error)) | 206 | RegisterScheme(scheme string, handler func(uri string) ([]byte, string, error)) | ||
| 207 | } | 207 | } | ||
| 208 | 208 | ||||
| 209 | - | ||||
| 210 | // SettingsApplier defines the port interface for applying browser settings to WebViews. | 209 | // SettingsApplier defines the port interface for applying browser settings to WebViews. | ||
| 211 | // Implementations apply engine-specific settings (security, features, etc.) uniformly | 210 | // Implementations apply engine-specific settings (security, features, etc.) uniformly | ||
| 212 | // across a set of WebView instances. | 211 | // across a set of WebView instances. | ||
M internal/bootstrap/engine.go +31 -23
| @@ -8,8 +8,8 @@ import ( | |||
| 8 | 8 | "github.com/bnema/dumber/internal/application/usecase" | |
| 9 | 9 | "github.com/bnema/dumber/internal/infrastructure/cef" | |
| 10 | 10 | "github.com/bnema/dumber/internal/infrastructure/config" | |
| 11 | + | "github.com/bnema/dumber/internal/infrastructure/handlers" | |
| 11 | 12 | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 12 | - | "github.com/bnema/dumber/internal/infrastructure/webkit/handlers" | |
| 13 | 13 | "github.com/bnema/dumber/internal/ui/theme" | |
| 14 | 14 | "github.com/rs/zerolog" | |
| 15 | 15 | ) | |
| @@ -38,10 +38,10 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||
| 38 | 38 | } | |
| 39 | 39 | wkCfg := webkit.EngineConfigFromConfig(cfg.Engine.WebKit) | |
| 40 | 40 | ||
| 41 | - | // Pre-build keybindings handler for handler registration. | |
| 42 | - | keybindingsHandler, err := buildKeybindingsHandler() | |
| 41 | + | // Pre-build keybinding use cases for handler registration. | |
| 42 | + | keybindingDeps, err := buildKeybindingDeps() | |
| 43 | 43 | if err != nil { | |
| 44 | - | return nil, fmt.Errorf("failed to build keybindings handler: %w", err) | |
| 44 | + | return nil, fmt.Errorf("failed to build keybinding deps: %w", err) | |
| 45 | 45 | } | |
| 46 | 46 | ||
| 47 | 47 | // Pre-build config save function for handler registration. | |
| @@ -53,18 +53,18 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||
| 53 | 53 | return webkit.NewEngine( | |
| 54 | 54 | input.Ctx, cfg, opts, wkCfg, | |
| 55 | 55 | input.ThemeManager, input.ColorResolver, input.Logger, | |
| 56 | - | func(ctx context.Context, router *webkit.MessageRouter, deps port.HandlerDependencies) error { | |
| 57 | - | return handlers.RegisterAll(ctx, router, handlers.Config{ | |
| 58 | - | HistoryUC: deps.HistoryUC, | |
| 59 | - | FavoritesUC: deps.FavoritesUC, | |
| 60 | - | Clipboard: deps.Clipboard, | |
| 61 | - | AutoCopyConfig: deps.AutoCopyConfig, | |
| 62 | - | SaveConfig: saveConfigFunc, | |
| 63 | - | KeybindingsHandler: keybindingsHandler, | |
| 64 | - | OnClipboardCopied: deps.OnClipboardCopied, | |
| 65 | - | }) | |
| 56 | + | func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error { | |
| 57 | + | // Inject pre-built dependencies that come from bootstrap, not from the engine. | |
| 58 | + | deps.SaveConfig = saveConfigFunc | |
| 59 | + | deps.KeybindingsGetter = keybindingDeps.KeybindingsGetter | |
| 60 | + | deps.KeybindingSetter = keybindingDeps.KeybindingSetter | |
| 61 | + | deps.KeybindingResetter = keybindingDeps.KeybindingResetter | |
| 62 | + | deps.AllKeybindingsResetter = keybindingDeps.AllKeybindingsResetter | |
| 63 | + | return handlers.RegisterAll(ctx, router, deps) | |
| 64 | + | }, | |
| 65 | + | func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error { | |
| 66 | + | return handlers.RegisterAccentHandlers(ctx, router, handler) | |
| 66 | 67 | }, | |
| 67 | - | handlers.RegisterAccentHandlers, | |
| 68 | 68 | ) | |
| 69 | 69 | case "cef": | |
| 70 | 70 | cefCfg := cfg.Engine.CEF | |
| @@ -74,8 +74,16 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||
| 74 | 74 | } | |
| 75 | 75 | } | |
| 76 | 76 | ||
| 77 | - | // buildKeybindingsHandler constructs the keybindings handler using the config manager. | |
| 78 | - | func buildKeybindingsHandler() (*handlers.KeybindingsHandler, error) { | |
| 77 | + | // keybindingDeps holds keybinding use cases built at bootstrap time. | |
| 78 | + | type keybindingDeps struct { | |
| 79 | + | KeybindingsGetter port.KeybindingsGetter | |
| 80 | + | KeybindingSetter port.KeybindingSetter | |
| 81 | + | KeybindingResetter port.KeybindingResetter | |
| 82 | + | AllKeybindingsResetter port.AllKeybindingsResetter | |
| 83 | + | } | |
| 84 | + | ||
| 85 | + | // buildKeybindingDeps constructs keybinding use cases using the config manager. | |
| 86 | + | func buildKeybindingDeps() (*keybindingDeps, error) { | |
| 79 | 87 | mgr := config.GetManager() | |
| 80 | 88 | if mgr == nil { | |
| 81 | 89 | return nil, fmt.Errorf("config manager not initialized") | |
| @@ -83,12 +91,12 @@ func buildKeybindingsHandler() (*handlers.KeybindingsHandler, error) { | |||
| 83 | 91 | ||
| 84 | 92 | gateway := config.NewKeybindingsGateway(mgr) | |
| 85 | 93 | ||
| 86 | - | return handlers.NewKeybindingsHandler( | |
| 87 | - | usecase.NewGetKeybindingsUseCase(gateway), | |
| 88 | - | usecase.NewSetKeybindingUseCase(gateway, gateway), | |
| 89 | - | usecase.NewResetKeybindingUseCase(gateway), | |
| 90 | - | usecase.NewResetAllKeybindingsUseCase(gateway), | |
| 91 | - | ), nil | |
| 94 | + | return &keybindingDeps{ | |
| 95 | + | KeybindingsGetter: usecase.NewGetKeybindingsUseCase(gateway), | |
| 96 | + | KeybindingSetter: usecase.NewSetKeybindingUseCase(gateway, gateway), | |
| 97 | + | KeybindingResetter: usecase.NewResetKeybindingUseCase(gateway), | |
| 98 | + | AllKeybindingsResetter: usecase.NewResetAllKeybindingsUseCase(gateway), | |
| 99 | + | }, nil | |
| 92 | 100 | } | |
| 93 | 101 | ||
| 94 | 102 | // buildSaveConfigFunc constructs the config save function using the config manager. | |
| @@ -8,8 +8,8 @@ import ( | |||||
| 8 | "github.com/bnema/dumber/internal/application/usecase" | 8 | "github.com/bnema/dumber/internal/application/usecase" | ||
| 9 | "github.com/bnema/dumber/internal/infrastructure/cef" | 9 | "github.com/bnema/dumber/internal/infrastructure/cef" | ||
| 10 | "github.com/bnema/dumber/internal/infrastructure/config" | 10 | "github.com/bnema/dumber/internal/infrastructure/config" | ||
| 11 | + | "github.com/bnema/dumber/internal/infrastructure/handlers" | |||
| 11 | "github.com/bnema/dumber/internal/infrastructure/webkit" | 12 | "github.com/bnema/dumber/internal/infrastructure/webkit" | ||
| 12 | - | "github.com/bnema/dumber/internal/infrastructure/webkit/handlers" | |||
| 13 | "github.com/bnema/dumber/internal/ui/theme" | 13 | "github.com/bnema/dumber/internal/ui/theme" | ||
| 14 | "github.com/rs/zerolog" | 14 | "github.com/rs/zerolog" | ||
| 15 | ) | 15 | ) | ||
| @@ -38,10 +38,10 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||||
| 38 | } | 38 | } | ||
| 39 | wkCfg := webkit.EngineConfigFromConfig(cfg.Engine.WebKit) | 39 | wkCfg := webkit.EngineConfigFromConfig(cfg.Engine.WebKit) | ||
| 40 | 40 | ||||
| 41 | - | // Pre-build keybindings handler for handler registration. | 41 | + | // Pre-build keybinding use cases for handler registration. |
| 42 | - | keybindingsHandler, err := buildKeybindingsHandler() | 42 | + | keybindingDeps, err := buildKeybindingDeps() |
| 43 | if err != nil { | 43 | if err != nil { | ||
| 44 | - | return nil, fmt.Errorf("failed to build keybindings handler: %w", err) | 44 | + | return nil, fmt.Errorf("failed to build keybinding deps: %w", err) |
| 45 | } | 45 | } | ||
| 46 | 46 | ||||
| 47 | // Pre-build config save function for handler registration. | 47 | // Pre-build config save function for handler registration. | ||
| @@ -53,18 +53,18 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||||
| 53 | return webkit.NewEngine( | 53 | return webkit.NewEngine( | ||
| 54 | input.Ctx, cfg, opts, wkCfg, | 54 | input.Ctx, cfg, opts, wkCfg, | ||
| 55 | input.ThemeManager, input.ColorResolver, input.Logger, | 55 | input.ThemeManager, input.ColorResolver, input.Logger, | ||
| 56 | - | func(ctx context.Context, router *webkit.MessageRouter, deps port.HandlerDependencies) error { | 56 | + | func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error { |
| 57 | - | return handlers.RegisterAll(ctx, router, handlers.Config{ | 57 | + | // Inject pre-built dependencies that come from bootstrap, not from the engine. |
| 58 | - | HistoryUC: deps.HistoryUC, | 58 | + | deps.SaveConfig = saveConfigFunc |
| 59 | - | FavoritesUC: deps.FavoritesUC, | 59 | + | deps.KeybindingsGetter = keybindingDeps.KeybindingsGetter |
| 60 | - | Clipboard: deps.Clipboard, | 60 | + | deps.KeybindingSetter = keybindingDeps.KeybindingSetter |
| 61 | - | AutoCopyConfig: deps.AutoCopyConfig, | 61 | + | deps.KeybindingResetter = keybindingDeps.KeybindingResetter |
| 62 | - | SaveConfig: saveConfigFunc, | 62 | + | deps.AllKeybindingsResetter = keybindingDeps.AllKeybindingsResetter |
| 63 | - | KeybindingsHandler: keybindingsHandler, | 63 | + | return handlers.RegisterAll(ctx, router, deps) |
| 64 | - | OnClipboardCopied: deps.OnClipboardCopied, | 64 | + | }, |
| 65 | - | }) | 65 | + | func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error { |
| 66 | + | return handlers.RegisterAccentHandlers(ctx, router, handler) | |||
| 66 | }, | 67 | }, | ||
| 67 | - | handlers.RegisterAccentHandlers, | |||
| 68 | ) | 68 | ) | ||
| 69 | case "cef": | 69 | case "cef": | ||
| 70 | cefCfg := cfg.Engine.CEF | 70 | cefCfg := cfg.Engine.CEF | ||
| @@ -74,8 +74,16 @@ func BuildEngine(input EngineInput) (port.Engine, error) { | |||||
| 74 | } | 74 | } | ||
| 75 | } | 75 | } | ||
| 76 | 76 | ||||
| 77 | - | // buildKeybindingsHandler constructs the keybindings handler using the config manager. | 77 | + | // keybindingDeps holds keybinding use cases built at bootstrap time. |
| 78 | - | func buildKeybindingsHandler() (*handlers.KeybindingsHandler, error) { | 78 | + | type keybindingDeps struct { |
| 79 | + | KeybindingsGetter port.KeybindingsGetter | |||
| 80 | + | KeybindingSetter port.KeybindingSetter | |||
| 81 | + | KeybindingResetter port.KeybindingResetter | |||
| 82 | + | AllKeybindingsResetter port.AllKeybindingsResetter | |||
| 83 | + | } | |||
| 84 | + | ||||
| 85 | + | // buildKeybindingDeps constructs keybinding use cases using the config manager. | |||
| 86 | + | func buildKeybindingDeps() (*keybindingDeps, error) { | |||
| 79 | mgr := config.GetManager() | 87 | mgr := config.GetManager() | ||
| 80 | if mgr == nil { | 88 | if mgr == nil { | ||
| 81 | return nil, fmt.Errorf("config manager not initialized") | 89 | return nil, fmt.Errorf("config manager not initialized") | ||
| @@ -83,12 +91,12 @@ func buildKeybindingsHandler() (*handlers.KeybindingsHandler, error) { | |||||
| 83 | 91 | ||||
| 84 | gateway := config.NewKeybindingsGateway(mgr) | 92 | gateway := config.NewKeybindingsGateway(mgr) | ||
| 85 | 93 | ||||
| 86 | - | return handlers.NewKeybindingsHandler( | 94 | + | return &keybindingDeps{ |
| 87 | - | usecase.NewGetKeybindingsUseCase(gateway), | 95 | + | KeybindingsGetter: usecase.NewGetKeybindingsUseCase(gateway), |
| 88 | - | usecase.NewSetKeybindingUseCase(gateway, gateway), | 96 | + | KeybindingSetter: usecase.NewSetKeybindingUseCase(gateway, gateway), |
| 89 | - | usecase.NewResetKeybindingUseCase(gateway), | 97 | + | KeybindingResetter: usecase.NewResetKeybindingUseCase(gateway), |
| 90 | - | usecase.NewResetAllKeybindingsUseCase(gateway), | 98 | + | AllKeybindingsResetter: usecase.NewResetAllKeybindingsUseCase(gateway), |
| 91 | - | ), nil | 99 | + | }, nil |
| 92 | } | 100 | } | ||
| 93 | 101 | ||||
| 94 | // buildSaveConfigFunc constructs the config save function using the config manager. | 102 | // buildSaveConfigFunc constructs the config save function using the config manager. | ||
M internal/infrastructure/cef/engine.go +4 -11
| @@ -12,6 +12,7 @@ import ( | |||
| 12 | 12 | "github.com/bnema/puregotk/v4/glib" | |
| 13 | 13 | ||
| 14 | 14 | "github.com/bnema/dumber/internal/application/port" | |
| 15 | + | "github.com/bnema/dumber/internal/infrastructure/handlers" | |
| 15 | 16 | "github.com/bnema/dumber/internal/logging" | |
| 16 | 17 | ) | |
| 17 | 18 | ||
| @@ -135,15 +136,7 @@ func (e *Engine) RegisterHandlers(ctx context.Context, deps port.HandlerDependen | |||
| 135 | 136 | if e.messageRouter == nil { | |
| 136 | 137 | return nil | |
| 137 | 138 | } | |
| 138 | - | log := logging.FromContext(ctx) | |
| 139 | - | // TODO: Wire homepage, config, keybindings, and clipboard handlers | |
| 140 | - | // into e.messageRouter. Each handler implements MessageHandler and is | |
| 141 | - | // registered by message type (e.g. "get_recent_history", "get_favorites"). | |
| 142 | - | // The CEF MessageRouter dispatches based on Message.Type from the JS bridge. | |
| 143 | - | _ = deps | |
| 144 | - | ||
| 145 | - | log.Warn().Msg("cef: RegisterHandlers stub — handler wiring not yet implemented") | |
| 146 | - | return nil | |
| 139 | + | return handlers.RegisterAll(ctx, e.messageRouter, deps) | |
| 147 | 140 | } | |
| 148 | 141 | ||
| 149 | 142 | // RegisterAccentHandlers registers accent/dead-key input handlers with the message router. | |
| @@ -153,7 +146,7 @@ func (e *Engine) RegisterAccentHandlers(ctx context.Context, handler port.Accent | |||
| 153 | 146 | } | |
| 154 | 147 | log := logging.FromContext(ctx) | |
| 155 | 148 | ||
| 156 | - | if err := e.messageRouter.RegisterHandler("accent_key_press", MessageHandlerFunc( | |
| 149 | + | if err := e.messageRouter.registerInternalHandler("accent_key_press", MessageHandlerFunc( | |
| 157 | 150 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | |
| 158 | 151 | var p struct { | |
| 159 | 152 | Char string `json:"char"` | |
| @@ -171,7 +164,7 @@ func (e *Engine) RegisterAccentHandlers(ctx context.Context, handler port.Accent | |||
| 171 | 164 | return err | |
| 172 | 165 | } | |
| 173 | 166 | ||
| 174 | - | if err := e.messageRouter.RegisterHandler("accent_key_release", MessageHandlerFunc( | |
| 167 | + | if err := e.messageRouter.registerInternalHandler("accent_key_release", MessageHandlerFunc( | |
| 175 | 168 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | |
| 176 | 169 | var p struct { | |
| 177 | 170 | Char string `json:"char"` | |
| @@ -12,6 +12,7 @@ import ( | |||||
| 12 | "github.com/bnema/puregotk/v4/glib" | 12 | "github.com/bnema/puregotk/v4/glib" | ||
| 13 | 13 | ||||
| 14 | "github.com/bnema/dumber/internal/application/port" | 14 | "github.com/bnema/dumber/internal/application/port" | ||
| 15 | + | "github.com/bnema/dumber/internal/infrastructure/handlers" | |||
| 15 | "github.com/bnema/dumber/internal/logging" | 16 | "github.com/bnema/dumber/internal/logging" | ||
| 16 | ) | 17 | ) | ||
| 17 | 18 | ||||
| @@ -135,15 +136,7 @@ func (e *Engine) RegisterHandlers(ctx context.Context, deps port.HandlerDependen | |||||
| 135 | if e.messageRouter == nil { | 136 | if e.messageRouter == nil { | ||
| 136 | return nil | 137 | return nil | ||
| 137 | } | 138 | } | ||
| 138 | - | log := logging.FromContext(ctx) | 139 | + | return handlers.RegisterAll(ctx, e.messageRouter, deps) |
| 139 | - | // TODO: Wire homepage, config, keybindings, and clipboard handlers | |||
| 140 | - | // into e.messageRouter. Each handler implements MessageHandler and is | |||
| 141 | - | // registered by message type (e.g. "get_recent_history", "get_favorites"). | |||
| 142 | - | // The CEF MessageRouter dispatches based on Message.Type from the JS bridge. | |||
| 143 | - | _ = deps | |||
| 144 | - | ||||
| 145 | - | log.Warn().Msg("cef: RegisterHandlers stub — handler wiring not yet implemented") | |||
| 146 | - | return nil | |||
| 147 | } | 140 | } | ||
| 148 | 141 | ||||
| 149 | // RegisterAccentHandlers registers accent/dead-key input handlers with the message router. | 142 | // RegisterAccentHandlers registers accent/dead-key input handlers with the message router. | ||
| @@ -153,7 +146,7 @@ func (e *Engine) RegisterAccentHandlers(ctx context.Context, handler port.Accent | |||||
| 153 | } | 146 | } | ||
| 154 | log := logging.FromContext(ctx) | 147 | log := logging.FromContext(ctx) | ||
| 155 | 148 | ||||
| 156 | - | if err := e.messageRouter.RegisterHandler("accent_key_press", MessageHandlerFunc( | 149 | + | if err := e.messageRouter.registerInternalHandler("accent_key_press", MessageHandlerFunc( |
| 157 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | 150 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | ||
| 158 | var p struct { | 151 | var p struct { | ||
| 159 | Char string `json:"char"` | 152 | Char string `json:"char"` | ||
| @@ -171,7 +164,7 @@ func (e *Engine) RegisterAccentHandlers(ctx context.Context, handler port.Accent | |||||
| 171 | return err | 164 | return err | ||
| 172 | } | 165 | } | ||
| 173 | 166 | ||||
| 174 | - | if err := e.messageRouter.RegisterHandler("accent_key_release", MessageHandlerFunc( | 167 | + | if err := e.messageRouter.registerInternalHandler("accent_key_release", MessageHandlerFunc( |
| 175 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | 168 | func(ctx context.Context, _ uint64, payload json.RawMessage) (any, error) { | ||
| 176 | var p struct { | 169 | var p struct { | ||
| 177 | Char string `json:"char"` | 170 | Char string `json:"char"` | ||
M internal/infrastructure/cef/messaging.go +37 -4
| @@ -7,9 +7,13 @@ import ( | |||
| 7 | 7 | "fmt" | |
| 8 | 8 | "sync" | |
| 9 | 9 | ||
| 10 | + | "github.com/bnema/dumber/internal/application/port" | |
| 10 | 11 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 12 | ) | |
| 12 | 13 | ||
| 14 | + | // Compile-time check: MessageRouter implements port.WebUIHandlerRouter. | |
| 15 | + | var _ port.WebUIHandlerRouter = (*MessageRouter)(nil) | |
| 16 | + | ||
| 13 | 17 | // Message represents a JS -> Go message envelope sent via fetch to /api/message. | |
| 14 | 18 | type Message struct { | |
| 15 | 19 | Type string `json:"type"` | |
| @@ -70,7 +74,8 @@ func (r *MessageRouter) SetBaseContext(ctx context.Context) { | |||
| 70 | 74 | } | |
| 71 | 75 | ||
| 72 | 76 | // RegisterHandler registers a handler for a message type. | |
| 73 | - | func (r *MessageRouter) RegisterHandler(msgType string, handler MessageHandler) error { | |
| 77 | + | // Satisfies port.WebUIHandlerRouter. | |
| 78 | + | func (r *MessageRouter) RegisterHandler(msgType string, handler port.WebUIMessageHandler) error { | |
| 74 | 79 | if msgType == "" { | |
| 75 | 80 | return errors.New("message type cannot be empty") | |
| 76 | 81 | } | |
| @@ -79,14 +84,17 @@ func (r *MessageRouter) RegisterHandler(msgType string, handler MessageHandler) | |||
| 79 | 84 | } | |
| 80 | 85 | r.mu.Lock() | |
| 81 | 86 | defer r.mu.Unlock() | |
| 82 | - | r.handlers[msgType] = handlerEntry{handler: handler} | |
| 87 | + | r.handlers[msgType] = handlerEntry{handler: portHandlerAdapter{handler}} | |
| 83 | 88 | return nil | |
| 84 | 89 | } | |
| 85 | 90 | ||
| 86 | 91 | // RegisterHandlerWithCallbacks registers a handler with response callback names. | |
| 87 | 92 | // callback is invoked on success, errorCallback (optional) on failure. | |
| 88 | 93 | // worldName allows targeting a specific script world (unused in CEF fetch bridge). | |
| 89 | - | func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCallback, worldName string, handler MessageHandler) error { | |
| 94 | + | // Satisfies port.WebUIHandlerRouter. | |
| 95 | + | func (r *MessageRouter) RegisterHandlerWithCallbacks( | |
| 96 | + | msgType, callback, errorCallback, worldName string, handler port.WebUIMessageHandler, | |
| 97 | + | ) error { | |
| 90 | 98 | if msgType == "" { | |
| 91 | 99 | return errors.New("message type cannot be empty") | |
| 92 | 100 | } | |
| @@ -99,7 +107,7 @@ func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCal | |||
| 99 | 107 | r.mu.Lock() | |
| 100 | 108 | defer r.mu.Unlock() | |
| 101 | 109 | r.handlers[msgType] = handlerEntry{ | |
| 102 | - | handler: handler, | |
| 110 | + | handler: portHandlerAdapter{handler}, | |
| 103 | 111 | callback: callback, | |
| 104 | 112 | errorCallback: errorCallback, | |
| 105 | 113 | world: worldName, | |
| @@ -107,6 +115,31 @@ func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCal | |||
| 107 | 115 | return nil | |
| 108 | 116 | } | |
| 109 | 117 | ||
| 118 | + | // registerInternalHandler registers a CEF-internal handler for a message type. | |
| 119 | + | // Used for engine-internal handlers that work directly with uint64 webview IDs. | |
| 120 | + | func (r *MessageRouter) registerInternalHandler(msgType string, handler MessageHandler) error { | |
| 121 | + | if msgType == "" { | |
| 122 | + | return errors.New("message type cannot be empty") | |
| 123 | + | } | |
| 124 | + | if handler == nil { | |
| 125 | + | return errors.New("message handler cannot be nil") | |
| 126 | + | } | |
| 127 | + | r.mu.Lock() | |
| 128 | + | defer r.mu.Unlock() | |
| 129 | + | r.handlers[msgType] = handlerEntry{handler: handler} | |
| 130 | + | return nil | |
| 131 | + | } | |
| 132 | + | ||
| 133 | + | // portHandlerAdapter wraps a port.WebUIMessageHandler as a cef.MessageHandler, | |
| 134 | + | // converting the WebViewID type. | |
| 135 | + | type portHandlerAdapter struct { | |
| 136 | + | inner port.WebUIMessageHandler | |
| 137 | + | } | |
| 138 | + | ||
| 139 | + | func (a portHandlerAdapter) Handle(ctx context.Context, webviewID uint64, payload json.RawMessage) (any, error) { | |
| 140 | + | return a.inner.Handle(ctx, port.WebViewID(webviewID), payload) | |
| 141 | + | } | |
| 142 | + | ||
| 110 | 143 | // HandleMessage decodes a raw JSON message body and routes it to the correct handler. | |
| 111 | 144 | // Returns the JSON-encoded response. Called by the scheme handler for /api/message POST. | |
| 112 | 145 | func (r *MessageRouter) HandleMessage(ctx context.Context, webviewID uint64, body []byte) ([]byte, error) { | |
| @@ -7,9 +7,13 @@ import ( | |||||
| 7 | "fmt" | 7 | "fmt" | ||
| 8 | "sync" | 8 | "sync" | ||
| 9 | 9 | ||||
| 10 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 11 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 12 | ) | ||
| 12 | 13 | ||||
| 14 | + | // Compile-time check: MessageRouter implements port.WebUIHandlerRouter. | |||
| 15 | + | var _ port.WebUIHandlerRouter = (*MessageRouter)(nil) | |||
| 16 | + | ||||
| 13 | // Message represents a JS -> Go message envelope sent via fetch to /api/message. | 17 | // Message represents a JS -> Go message envelope sent via fetch to /api/message. | ||
| 14 | type Message struct { | 18 | type Message struct { | ||
| 15 | Type string `json:"type"` | 19 | Type string `json:"type"` | ||
| @@ -70,7 +74,8 @@ func (r *MessageRouter) SetBaseContext(ctx context.Context) { | |||||
| 70 | } | 74 | } | ||
| 71 | 75 | ||||
| 72 | // RegisterHandler registers a handler for a message type. | 76 | // RegisterHandler registers a handler for a message type. | ||
| 73 | - | func (r *MessageRouter) RegisterHandler(msgType string, handler MessageHandler) error { | 77 | + | // Satisfies port.WebUIHandlerRouter. |
| 78 | + | func (r *MessageRouter) RegisterHandler(msgType string, handler port.WebUIMessageHandler) error { | |||
| 74 | if msgType == "" { | 79 | if msgType == "" { | ||
| 75 | return errors.New("message type cannot be empty") | 80 | return errors.New("message type cannot be empty") | ||
| 76 | } | 81 | } | ||
| @@ -79,14 +84,17 @@ func (r *MessageRouter) RegisterHandler(msgType string, handler MessageHandler) | |||||
| 79 | } | 84 | } | ||
| 80 | r.mu.Lock() | 85 | r.mu.Lock() | ||
| 81 | defer r.mu.Unlock() | 86 | defer r.mu.Unlock() | ||
| 82 | - | r.handlers[msgType] = handlerEntry{handler: handler} | 87 | + | r.handlers[msgType] = handlerEntry{handler: portHandlerAdapter{handler}} |
| 83 | return nil | 88 | return nil | ||
| 84 | } | 89 | } | ||
| 85 | 90 | ||||
| 86 | // RegisterHandlerWithCallbacks registers a handler with response callback names. | 91 | // RegisterHandlerWithCallbacks registers a handler with response callback names. | ||
| 87 | // callback is invoked on success, errorCallback (optional) on failure. | 92 | // callback is invoked on success, errorCallback (optional) on failure. | ||
| 88 | // worldName allows targeting a specific script world (unused in CEF fetch bridge). | 93 | // worldName allows targeting a specific script world (unused in CEF fetch bridge). | ||
| 89 | - | func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCallback, worldName string, handler MessageHandler) error { | 94 | + | // Satisfies port.WebUIHandlerRouter. |
| 95 | + | func (r *MessageRouter) RegisterHandlerWithCallbacks( | |||
| 96 | + | msgType, callback, errorCallback, worldName string, handler port.WebUIMessageHandler, | |||
| 97 | + | ) error { | |||
| 90 | if msgType == "" { | 98 | if msgType == "" { | ||
| 91 | return errors.New("message type cannot be empty") | 99 | return errors.New("message type cannot be empty") | ||
| 92 | } | 100 | } | ||
| @@ -99,7 +107,7 @@ func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCal | |||||
| 99 | r.mu.Lock() | 107 | r.mu.Lock() | ||
| 100 | defer r.mu.Unlock() | 108 | defer r.mu.Unlock() | ||
| 101 | r.handlers[msgType] = handlerEntry{ | 109 | r.handlers[msgType] = handlerEntry{ | ||
| 102 | - | handler: handler, | 110 | + | handler: portHandlerAdapter{handler}, |
| 103 | callback: callback, | 111 | callback: callback, | ||
| 104 | errorCallback: errorCallback, | 112 | errorCallback: errorCallback, | ||
| 105 | world: worldName, | 113 | world: worldName, | ||
| @@ -107,6 +115,31 @@ func (r *MessageRouter) RegisterHandlerWithCallbacks(msgType, callback, errorCal | |||||
| 107 | return nil | 115 | return nil | ||
| 108 | } | 116 | } | ||
| 109 | 117 | ||||
| 118 | + | // registerInternalHandler registers a CEF-internal handler for a message type. | |||
| 119 | + | // Used for engine-internal handlers that work directly with uint64 webview IDs. | |||
| 120 | + | func (r *MessageRouter) registerInternalHandler(msgType string, handler MessageHandler) error { | |||
| 121 | + | if msgType == "" { | |||
| 122 | + | return errors.New("message type cannot be empty") | |||
| 123 | + | } | |||
| 124 | + | if handler == nil { | |||
| 125 | + | return errors.New("message handler cannot be nil") | |||
| 126 | + | } | |||
| 127 | + | r.mu.Lock() | |||
| 128 | + | defer r.mu.Unlock() | |||
| 129 | + | r.handlers[msgType] = handlerEntry{handler: handler} | |||
| 130 | + | return nil | |||
| 131 | + | } | |||
| 132 | + | ||||
| 133 | + | // portHandlerAdapter wraps a port.WebUIMessageHandler as a cef.MessageHandler, | |||
| 134 | + | // converting the WebViewID type. | |||
| 135 | + | type portHandlerAdapter struct { | |||
| 136 | + | inner port.WebUIMessageHandler | |||
| 137 | + | } | |||
| 138 | + | ||||
| 139 | + | func (a portHandlerAdapter) Handle(ctx context.Context, webviewID uint64, payload json.RawMessage) (any, error) { | |||
| 140 | + | return a.inner.Handle(ctx, port.WebViewID(webviewID), payload) | |||
| 141 | + | } | |||
| 142 | + | ||||
| 110 | // HandleMessage decodes a raw JSON message body and routes it to the correct handler. | 143 | // HandleMessage decodes a raw JSON message body and routes it to the correct handler. | ||
| 111 | // Returns the JSON-encoded response. Called by the scheme handler for /api/message POST. | 144 | // Returns the JSON-encoded response. Called by the scheme handler for /api/message POST. | ||
| 112 | func (r *MessageRouter) HandleMessage(ctx context.Context, webviewID uint64, body []byte) ([]byte, error) { | 145 | func (r *MessageRouter) HandleMessage(ctx context.Context, webviewID uint64, body []byte) ([]byte, error) { | ||
R internal/infrastructure/webkit/handlers/clipboard.go → internal/infrastructure/handlers/clipboard.go +3 -4 renamed, 89% similar
| @@ -5,7 +5,6 @@ import ( | |||
| 5 | 5 | "encoding/json" | |
| 6 | 6 | ||
| 7 | 7 | "github.com/bnema/dumber/internal/application/port" | |
| 8 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 9 | 8 | "github.com/bnema/dumber/internal/logging" | |
| 10 | 9 | ) | |
| 11 | 10 | ||
| @@ -32,8 +31,8 @@ type autoCopyRequest struct { | |||
| 32 | 31 | ||
| 33 | 32 | // HandleAutoCopySelection handles the auto_copy_selection message from JS. | |
| 34 | 33 | // It copies the selected text to the clipboard if the feature is enabled. | |
| 35 | - | func (h *ClipboardHandler) HandleAutoCopySelection() webkit.MessageHandler { | |
| 36 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 34 | + | func (h *ClipboardHandler) HandleAutoCopySelection() port.WebUIMessageHandler { | |
| 35 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 37 | 36 | log := logging.FromContext(ctx) | |
| 38 | 37 | ||
| 39 | 38 | // Check if feature is enabled | |
| @@ -71,7 +70,7 @@ func (h *ClipboardHandler) HandleAutoCopySelection() webkit.MessageHandler { | |||
| 71 | 70 | // RegisterClipboardHandlers registers clipboard handlers with the router. | |
| 72 | 71 | func RegisterClipboardHandlers( | |
| 73 | 72 | ctx context.Context, | |
| 74 | - | router *webkit.MessageRouter, | |
| 73 | + | router port.WebUIHandlerRouter, | |
| 75 | 74 | clipboard port.Clipboard, | |
| 76 | 75 | autoCopyConfig port.AutoCopyConfig, | |
| 77 | 76 | onCopied func(textLen int), | |
| @@ -5,7 +5,6 @@ import ( | |||||
| 5 | "encoding/json" | 5 | "encoding/json" | ||
| 6 | 6 | ||||
| 7 | "github.com/bnema/dumber/internal/application/port" | 7 | "github.com/bnema/dumber/internal/application/port" | ||
| 8 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 9 | "github.com/bnema/dumber/internal/logging" | 8 | "github.com/bnema/dumber/internal/logging" | ||
| 10 | ) | 9 | ) | ||
| 11 | 10 | ||||
| @@ -32,8 +31,8 @@ type autoCopyRequest struct { | |||||
| 32 | 31 | ||||
| 33 | // HandleAutoCopySelection handles the auto_copy_selection message from JS. | 32 | // HandleAutoCopySelection handles the auto_copy_selection message from JS. | ||
| 34 | // It copies the selected text to the clipboard if the feature is enabled. | 33 | // It copies the selected text to the clipboard if the feature is enabled. | ||
| 35 | - | func (h *ClipboardHandler) HandleAutoCopySelection() webkit.MessageHandler { | 34 | + | func (h *ClipboardHandler) HandleAutoCopySelection() port.WebUIMessageHandler { |
| 36 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 35 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 37 | log := logging.FromContext(ctx) | 36 | log := logging.FromContext(ctx) | ||
| 38 | 37 | ||||
| 39 | // Check if feature is enabled | 38 | // Check if feature is enabled | ||
| @@ -71,7 +70,7 @@ func (h *ClipboardHandler) HandleAutoCopySelection() webkit.MessageHandler { | |||||
| 71 | // RegisterClipboardHandlers registers clipboard handlers with the router. | 70 | // RegisterClipboardHandlers registers clipboard handlers with the router. | ||
| 72 | func RegisterClipboardHandlers( | 71 | func RegisterClipboardHandlers( | ||
| 73 | ctx context.Context, | 72 | ctx context.Context, | ||
| 74 | - | router *webkit.MessageRouter, | 73 | + | router port.WebUIHandlerRouter, |
| 75 | clipboard port.Clipboard, | 74 | clipboard port.Clipboard, | ||
| 76 | autoCopyConfig port.AutoCopyConfig, | 75 | autoCopyConfig port.AutoCopyConfig, | ||
| 77 | onCopied func(textLen int), | 76 | onCopied func(textLen int), | ||
R internal/infrastructure/webkit/handlers/config.go → internal/infrastructure/handlers/config.go +2 -3 renamed, 90% similar
| @@ -6,7 +6,6 @@ import ( | |||
| 6 | 6 | "fmt" | |
| 7 | 7 | ||
| 8 | 8 | "github.com/bnema/dumber/internal/application/port" | |
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 10 | 9 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 10 | ) | |
| 12 | 11 | ||
| @@ -25,7 +24,7 @@ func NewConfigHandler(saveConfig func(context.Context, port.WebUIConfig) error) | |||
| 25 | 24 | } | |
| 26 | 25 | ||
| 27 | 26 | // Handle processes the save_config message. | |
| 28 | - | func (h *ConfigHandler) Handle(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 27 | + | func (h *ConfigHandler) Handle(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 29 | 28 | if h == nil { | |
| 30 | 29 | return nil, fmt.Errorf("config handler is nil") | |
| 31 | 30 | } | |
| @@ -52,7 +51,7 @@ func (h *ConfigHandler) Handle(ctx context.Context, _ webkit.WebViewID, payload | |||
| 52 | 51 | ||
| 53 | 52 | // RegisterConfigHandlers registers configuration handlers with the router. | |
| 54 | 53 | func RegisterConfigHandlers( | |
| 55 | - | ctx context.Context, router *webkit.MessageRouter, | |
| 54 | + | ctx context.Context, router port.WebUIHandlerRouter, | |
| 56 | 55 | saveConfig func(context.Context, port.WebUIConfig) error, | |
| 57 | 56 | ) error { | |
| 58 | 57 | handler := NewConfigHandler(saveConfig) | |
| @@ -6,7 +6,6 @@ import ( | |||||
| 6 | "fmt" | 6 | "fmt" | ||
| 7 | 7 | ||||
| 8 | "github.com/bnema/dumber/internal/application/port" | 8 | "github.com/bnema/dumber/internal/application/port" | ||
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 9 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 10 | ) | ||
| 12 | 11 | ||||
| @@ -25,7 +24,7 @@ func NewConfigHandler(saveConfig func(context.Context, port.WebUIConfig) error) | |||||
| 25 | } | 24 | } | ||
| 26 | 25 | ||||
| 27 | // Handle processes the save_config message. | 26 | // Handle processes the save_config message. | ||
| 28 | - | func (h *ConfigHandler) Handle(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 27 | + | func (h *ConfigHandler) Handle(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 29 | if h == nil { | 28 | if h == nil { | ||
| 30 | return nil, fmt.Errorf("config handler is nil") | 29 | return nil, fmt.Errorf("config handler is nil") | ||
| 31 | } | 30 | } | ||
| @@ -52,7 +51,7 @@ func (h *ConfigHandler) Handle(ctx context.Context, _ webkit.WebViewID, payload | |||||
| 52 | 51 | ||||
| 53 | // RegisterConfigHandlers registers configuration handlers with the router. | 52 | // RegisterConfigHandlers registers configuration handlers with the router. | ||
| 54 | func RegisterConfigHandlers( | 53 | func RegisterConfigHandlers( | ||
| 55 | - | ctx context.Context, router *webkit.MessageRouter, | 54 | + | ctx context.Context, router port.WebUIHandlerRouter, |
| 56 | saveConfig func(context.Context, port.WebUIConfig) error, | 55 | saveConfig func(context.Context, port.WebUIConfig) error, | ||
| 57 | ) error { | 56 | ) error { | ||
| 58 | handler := NewConfigHandler(saveConfig) | 57 | handler := NewConfigHandler(saveConfig) | ||
R internal/infrastructure/webkit/handlers/homepage/favorites.go → internal/infrastructure/handlers/homepage/favorites.go +8 -9 renamed, 80% similar
| @@ -6,7 +6,6 @@ import ( | |||
| 6 | 6 | ||
| 7 | 7 | "github.com/bnema/dumber/internal/application/port" | |
| 8 | 8 | "github.com/bnema/dumber/internal/domain/entity" | |
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 10 | 9 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 10 | ) | |
| 12 | 11 | ||
| @@ -21,8 +20,8 @@ func NewFavoritesHandlers(favoritesUC port.HomepageFavorites) *FavoritesHandlers | |||
| 21 | 20 | } | |
| 22 | 21 | ||
| 23 | 22 | // HandleList handles favorite_list messages. | |
| 24 | - | func (h *FavoritesHandlers) HandleList() webkit.MessageHandler { | |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 23 | + | func (h *FavoritesHandlers) HandleList() port.WebUIMessageHandler { | |
| 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 26 | 25 | log := logging.FromContext(ctx) | |
| 27 | 26 | ||
| 28 | 27 | requestID := ParseRequestID(payload) | |
| @@ -48,8 +47,8 @@ type setShortcutRequest struct { | |||
| 48 | 47 | } | |
| 49 | 48 | ||
| 50 | 49 | // HandleSetShortcut handles favorite_set_shortcut messages. | |
| 51 | - | func (h *FavoritesHandlers) HandleSetShortcut() webkit.MessageHandler { | |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 50 | + | func (h *FavoritesHandlers) HandleSetShortcut() port.WebUIMessageHandler { | |
| 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 53 | 52 | log := logging.FromContext(ctx) | |
| 54 | 53 | ||
| 55 | 54 | var req setShortcutRequest | |
| @@ -77,8 +76,8 @@ type getByShortcutRequest struct { | |||
| 77 | 76 | } | |
| 78 | 77 | ||
| 79 | 78 | // HandleGetByShortcut handles favorite_get_by_shortcut messages. | |
| 80 | - | func (h *FavoritesHandlers) HandleGetByShortcut() webkit.MessageHandler { | |
| 81 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 79 | + | func (h *FavoritesHandlers) HandleGetByShortcut() port.WebUIMessageHandler { | |
| 80 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 82 | 81 | log := logging.FromContext(ctx) | |
| 83 | 82 | ||
| 84 | 83 | var req getByShortcutRequest | |
| @@ -108,8 +107,8 @@ type setFolderRequest struct { | |||
| 108 | 107 | } | |
| 109 | 108 | ||
| 110 | 109 | // HandleSetFolder handles favorite_set_folder messages. | |
| 111 | - | func (h *FavoritesHandlers) HandleSetFolder() webkit.MessageHandler { | |
| 112 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 110 | + | func (h *FavoritesHandlers) HandleSetFolder() port.WebUIMessageHandler { | |
| 111 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 113 | 112 | log := logging.FromContext(ctx) | |
| 114 | 113 | ||
| 115 | 114 | var req setFolderRequest | |
| @@ -6,7 +6,6 @@ import ( | |||||
| 6 | 6 | ||||
| 7 | "github.com/bnema/dumber/internal/application/port" | 7 | "github.com/bnema/dumber/internal/application/port" | ||
| 8 | "github.com/bnema/dumber/internal/domain/entity" | 8 | "github.com/bnema/dumber/internal/domain/entity" | ||
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 9 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 10 | ) | ||
| 12 | 11 | ||||
| @@ -21,8 +20,8 @@ func NewFavoritesHandlers(favoritesUC port.HomepageFavorites) *FavoritesHandlers | |||||
| 21 | } | 20 | } | ||
| 22 | 21 | ||||
| 23 | // HandleList handles favorite_list messages. | 22 | // HandleList handles favorite_list messages. | ||
| 24 | - | func (h *FavoritesHandlers) HandleList() webkit.MessageHandler { | 23 | + | func (h *FavoritesHandlers) HandleList() port.WebUIMessageHandler { |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 26 | log := logging.FromContext(ctx) | 25 | log := logging.FromContext(ctx) | ||
| 27 | 26 | ||||
| 28 | requestID := ParseRequestID(payload) | 27 | requestID := ParseRequestID(payload) | ||
| @@ -48,8 +47,8 @@ type setShortcutRequest struct { | |||||
| 48 | } | 47 | } | ||
| 49 | 48 | ||||
| 50 | // HandleSetShortcut handles favorite_set_shortcut messages. | 49 | // HandleSetShortcut handles favorite_set_shortcut messages. | ||
| 51 | - | func (h *FavoritesHandlers) HandleSetShortcut() webkit.MessageHandler { | 50 | + | func (h *FavoritesHandlers) HandleSetShortcut() port.WebUIMessageHandler { |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 53 | log := logging.FromContext(ctx) | 52 | log := logging.FromContext(ctx) | ||
| 54 | 53 | ||||
| 55 | var req setShortcutRequest | 54 | var req setShortcutRequest | ||
| @@ -77,8 +76,8 @@ type getByShortcutRequest struct { | |||||
| 77 | } | 76 | } | ||
| 78 | 77 | ||||
| 79 | // HandleGetByShortcut handles favorite_get_by_shortcut messages. | 78 | // HandleGetByShortcut handles favorite_get_by_shortcut messages. | ||
| 80 | - | func (h *FavoritesHandlers) HandleGetByShortcut() webkit.MessageHandler { | 79 | + | func (h *FavoritesHandlers) HandleGetByShortcut() port.WebUIMessageHandler { |
| 81 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 80 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 82 | log := logging.FromContext(ctx) | 81 | log := logging.FromContext(ctx) | ||
| 83 | 82 | ||||
| 84 | var req getByShortcutRequest | 83 | var req getByShortcutRequest | ||
| @@ -108,8 +107,8 @@ type setFolderRequest struct { | |||||
| 108 | } | 107 | } | ||
| 109 | 108 | ||||
| 110 | // HandleSetFolder handles favorite_set_folder messages. | 109 | // HandleSetFolder handles favorite_set_folder messages. | ||
| 111 | - | func (h *FavoritesHandlers) HandleSetFolder() webkit.MessageHandler { | 110 | + | func (h *FavoritesHandlers) HandleSetFolder() port.WebUIMessageHandler { |
| 112 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 111 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 113 | log := logging.FromContext(ctx) | 112 | log := logging.FromContext(ctx) | ||
| 114 | 113 | ||||
| 115 | var req setFolderRequest | 114 | var req setFolderRequest | ||
R internal/infrastructure/webkit/handlers/homepage/folders.go → internal/infrastructure/handlers/homepage/folders.go +8 -9 renamed, 81% similar
| @@ -6,7 +6,6 @@ import ( | |||
| 6 | 6 | ||
| 7 | 7 | "github.com/bnema/dumber/internal/application/port" | |
| 8 | 8 | "github.com/bnema/dumber/internal/domain/entity" | |
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 10 | 9 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 10 | ) | |
| 12 | 11 | ||
| @@ -21,8 +20,8 @@ func NewFolderHandlers(favoritesUC port.HomepageFavorites) *FolderHandlers { | |||
| 21 | 20 | } | |
| 22 | 21 | ||
| 23 | 22 | // HandleList handles folder_list messages. | |
| 24 | - | func (h *FolderHandlers) HandleList() webkit.MessageHandler { | |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 23 | + | func (h *FolderHandlers) HandleList() port.WebUIMessageHandler { | |
| 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 26 | 25 | log := logging.FromContext(ctx) | |
| 27 | 26 | ||
| 28 | 27 | requestID := ParseRequestID(payload) | |
| @@ -48,8 +47,8 @@ type createFolderRequest struct { | |||
| 48 | 47 | } | |
| 49 | 48 | ||
| 50 | 49 | // HandleCreate handles folder_create messages. | |
| 51 | - | func (h *FolderHandlers) HandleCreate() webkit.MessageHandler { | |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 50 | + | func (h *FolderHandlers) HandleCreate() port.WebUIMessageHandler { | |
| 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 53 | 52 | log := logging.FromContext(ctx) | |
| 54 | 53 | ||
| 55 | 54 | var req createFolderRequest | |
| @@ -86,8 +85,8 @@ type deleteFolderRequest struct { | |||
| 86 | 85 | } | |
| 87 | 86 | ||
| 88 | 87 | // HandleDelete handles folder_delete messages. | |
| 89 | - | func (h *FolderHandlers) HandleDelete() webkit.MessageHandler { | |
| 90 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 88 | + | func (h *FolderHandlers) HandleDelete() port.WebUIMessageHandler { | |
| 89 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 91 | 90 | log := logging.FromContext(ctx) | |
| 92 | 91 | ||
| 93 | 92 | var req deleteFolderRequest | |
| @@ -118,8 +117,8 @@ type updateFolderRequest struct { | |||
| 118 | 117 | ||
| 119 | 118 | // HandleUpdate handles folder_update messages. | |
| 120 | 119 | // It delegates to the port.HomepageFavorites interface's UpdateFolder method. | |
| 121 | - | func (h *FolderHandlers) HandleUpdate() webkit.MessageHandler { | |
| 122 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 120 | + | func (h *FolderHandlers) HandleUpdate() port.WebUIMessageHandler { | |
| 121 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 123 | 122 | log := logging.FromContext(ctx) | |
| 124 | 123 | ||
| 125 | 124 | var req updateFolderRequest | |
| @@ -6,7 +6,6 @@ import ( | |||||
| 6 | 6 | ||||
| 7 | "github.com/bnema/dumber/internal/application/port" | 7 | "github.com/bnema/dumber/internal/application/port" | ||
| 8 | "github.com/bnema/dumber/internal/domain/entity" | 8 | "github.com/bnema/dumber/internal/domain/entity" | ||
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 9 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 10 | ) | ||
| 12 | 11 | ||||
| @@ -21,8 +20,8 @@ func NewFolderHandlers(favoritesUC port.HomepageFavorites) *FolderHandlers { | |||||
| 21 | } | 20 | } | ||
| 22 | 21 | ||||
| 23 | // HandleList handles folder_list messages. | 22 | // HandleList handles folder_list messages. | ||
| 24 | - | func (h *FolderHandlers) HandleList() webkit.MessageHandler { | 23 | + | func (h *FolderHandlers) HandleList() port.WebUIMessageHandler { |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 26 | log := logging.FromContext(ctx) | 25 | log := logging.FromContext(ctx) | ||
| 27 | 26 | ||||
| 28 | requestID := ParseRequestID(payload) | 27 | requestID := ParseRequestID(payload) | ||
| @@ -48,8 +47,8 @@ type createFolderRequest struct { | |||||
| 48 | } | 47 | } | ||
| 49 | 48 | ||||
| 50 | // HandleCreate handles folder_create messages. | 49 | // HandleCreate handles folder_create messages. | ||
| 51 | - | func (h *FolderHandlers) HandleCreate() webkit.MessageHandler { | 50 | + | func (h *FolderHandlers) HandleCreate() port.WebUIMessageHandler { |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 53 | log := logging.FromContext(ctx) | 52 | log := logging.FromContext(ctx) | ||
| 54 | 53 | ||||
| 55 | var req createFolderRequest | 54 | var req createFolderRequest | ||
| @@ -86,8 +85,8 @@ type deleteFolderRequest struct { | |||||
| 86 | } | 85 | } | ||
| 87 | 86 | ||||
| 88 | // HandleDelete handles folder_delete messages. | 87 | // HandleDelete handles folder_delete messages. | ||
| 89 | - | func (h *FolderHandlers) HandleDelete() webkit.MessageHandler { | 88 | + | func (h *FolderHandlers) HandleDelete() port.WebUIMessageHandler { |
| 90 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 89 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 91 | log := logging.FromContext(ctx) | 90 | log := logging.FromContext(ctx) | ||
| 92 | 91 | ||||
| 93 | var req deleteFolderRequest | 92 | var req deleteFolderRequest | ||
| @@ -118,8 +117,8 @@ type updateFolderRequest struct { | |||||
| 118 | 117 | ||||
| 119 | // HandleUpdate handles folder_update messages. | 118 | // HandleUpdate handles folder_update messages. | ||
| 120 | // It delegates to the port.HomepageFavorites interface's UpdateFolder method. | 119 | // It delegates to the port.HomepageFavorites interface's UpdateFolder method. | ||
| 121 | - | func (h *FolderHandlers) HandleUpdate() webkit.MessageHandler { | 120 | + | func (h *FolderHandlers) HandleUpdate() port.WebUIMessageHandler { |
| 122 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 121 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 123 | log := logging.FromContext(ctx) | 122 | log := logging.FromContext(ctx) | ||
| 124 | 123 | ||||
| 125 | var req updateFolderRequest | 124 | var req updateFolderRequest | ||
R internal/infrastructure/webkit/handlers/homepage/history.go → internal/infrastructure/handlers/homepage/history.go +16 -17 renamed, 81% similar
| @@ -7,7 +7,6 @@ import ( | |||
| 7 | 7 | ||
| 8 | 8 | "github.com/bnema/dumber/internal/application/port" | |
| 9 | 9 | "github.com/bnema/dumber/internal/domain/entity" | |
| 10 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 11 | 10 | "github.com/bnema/dumber/internal/logging" | |
| 12 | 11 | ) | |
| 13 | 12 | ||
| @@ -29,8 +28,8 @@ type timelineRequest struct { | |||
| 29 | 28 | } | |
| 30 | 29 | ||
| 31 | 30 | // HandleTimeline handles history_timeline messages. | |
| 32 | - | func (h *HistoryHandlers) HandleTimeline() webkit.MessageHandler { | |
| 33 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 31 | + | func (h *HistoryHandlers) HandleTimeline() port.WebUIMessageHandler { | |
| 32 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 34 | 33 | log := logging.FromContext(ctx) | |
| 35 | 34 | ||
| 36 | 35 | var req timelineRequest | |
| @@ -61,8 +60,8 @@ type searchRequest struct { | |||
| 61 | 60 | } | |
| 62 | 61 | ||
| 63 | 62 | // HandleSearchFTS handles history_search_fts messages. | |
| 64 | - | func (h *HistoryHandlers) HandleSearchFTS() webkit.MessageHandler { | |
| 65 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 63 | + | func (h *HistoryHandlers) HandleSearchFTS() port.WebUIMessageHandler { | |
| 64 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 66 | 65 | log := logging.FromContext(ctx) | |
| 67 | 66 | ||
| 68 | 67 | var req searchRequest | |
| @@ -100,8 +99,8 @@ type deleteEntryRequest struct { | |||
| 100 | 99 | } | |
| 101 | 100 | ||
| 102 | 101 | // HandleDeleteEntry handles history_delete_entry messages. | |
| 103 | - | func (h *HistoryHandlers) HandleDeleteEntry() webkit.MessageHandler { | |
| 104 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 102 | + | func (h *HistoryHandlers) HandleDeleteEntry() port.WebUIMessageHandler { | |
| 103 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 105 | 104 | log := logging.FromContext(ctx) | |
| 106 | 105 | ||
| 107 | 106 | var req deleteEntryRequest | |
| @@ -129,8 +128,8 @@ type deleteRangeRequest struct { | |||
| 129 | 128 | } | |
| 130 | 129 | ||
| 131 | 130 | // HandleDeleteRange handles history_delete_range messages. | |
| 132 | - | func (h *HistoryHandlers) HandleDeleteRange() webkit.MessageHandler { | |
| 133 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 131 | + | func (h *HistoryHandlers) HandleDeleteRange() port.WebUIMessageHandler { | |
| 132 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 134 | 133 | log := logging.FromContext(ctx) | |
| 135 | 134 | ||
| 136 | 135 | var req deleteRangeRequest | |
| @@ -160,8 +159,8 @@ func (h *HistoryHandlers) HandleDeleteRange() webkit.MessageHandler { | |||
| 160 | 159 | } | |
| 161 | 160 | ||
| 162 | 161 | // HandleClearAll handles history_clear_all messages. | |
| 163 | - | func (h *HistoryHandlers) HandleClearAll() webkit.MessageHandler { | |
| 164 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 162 | + | func (h *HistoryHandlers) HandleClearAll() port.WebUIMessageHandler { | |
| 163 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 165 | 164 | log := logging.FromContext(ctx) | |
| 166 | 165 | ||
| 167 | 166 | requestID := ParseRequestID(payload) | |
| @@ -199,8 +198,8 @@ func rangeToTime(r string) time.Time { | |||
| 199 | 198 | } | |
| 200 | 199 | ||
| 201 | 200 | // HandleAnalytics handles history_analytics messages. | |
| 202 | - | func (h *HistoryHandlers) HandleAnalytics() webkit.MessageHandler { | |
| 203 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 201 | + | func (h *HistoryHandlers) HandleAnalytics() port.WebUIMessageHandler { | |
| 202 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 204 | 203 | log := logging.FromContext(ctx) | |
| 205 | 204 | ||
| 206 | 205 | requestID := ParseRequestID(payload) | |
| @@ -225,8 +224,8 @@ type domainStatsRequest struct { | |||
| 225 | 224 | } | |
| 226 | 225 | ||
| 227 | 226 | // HandleDomainStats handles history_domain_stats messages. | |
| 228 | - | func (h *HistoryHandlers) HandleDomainStats() webkit.MessageHandler { | |
| 229 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 227 | + | func (h *HistoryHandlers) HandleDomainStats() port.WebUIMessageHandler { | |
| 228 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 230 | 229 | log := logging.FromContext(ctx) | |
| 231 | 230 | ||
| 232 | 231 | var req domainStatsRequest | |
| @@ -255,8 +254,8 @@ type deleteDomainRequest struct { | |||
| 255 | 254 | } | |
| 256 | 255 | ||
| 257 | 256 | // HandleDeleteDomain handles history_delete_domain messages. | |
| 258 | - | func (h *HistoryHandlers) HandleDeleteDomain() webkit.MessageHandler { | |
| 259 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 257 | + | func (h *HistoryHandlers) HandleDeleteDomain() port.WebUIMessageHandler { | |
| 258 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 260 | 259 | log := logging.FromContext(ctx) | |
| 261 | 260 | ||
| 262 | 261 | var req deleteDomainRequest | |
| @@ -7,7 +7,6 @@ import ( | |||||
| 7 | 7 | ||||
| 8 | "github.com/bnema/dumber/internal/application/port" | 8 | "github.com/bnema/dumber/internal/application/port" | ||
| 9 | "github.com/bnema/dumber/internal/domain/entity" | 9 | "github.com/bnema/dumber/internal/domain/entity" | ||
| 10 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 11 | "github.com/bnema/dumber/internal/logging" | 10 | "github.com/bnema/dumber/internal/logging" | ||
| 12 | ) | 11 | ) | ||
| 13 | 12 | ||||
| @@ -29,8 +28,8 @@ type timelineRequest struct { | |||||
| 29 | } | 28 | } | ||
| 30 | 29 | ||||
| 31 | // HandleTimeline handles history_timeline messages. | 30 | // HandleTimeline handles history_timeline messages. | ||
| 32 | - | func (h *HistoryHandlers) HandleTimeline() webkit.MessageHandler { | 31 | + | func (h *HistoryHandlers) HandleTimeline() port.WebUIMessageHandler { |
| 33 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 32 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 34 | log := logging.FromContext(ctx) | 33 | log := logging.FromContext(ctx) | ||
| 35 | 34 | ||||
| 36 | var req timelineRequest | 35 | var req timelineRequest | ||
| @@ -61,8 +60,8 @@ type searchRequest struct { | |||||
| 61 | } | 60 | } | ||
| 62 | 61 | ||||
| 63 | // HandleSearchFTS handles history_search_fts messages. | 62 | // HandleSearchFTS handles history_search_fts messages. | ||
| 64 | - | func (h *HistoryHandlers) HandleSearchFTS() webkit.MessageHandler { | 63 | + | func (h *HistoryHandlers) HandleSearchFTS() port.WebUIMessageHandler { |
| 65 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 64 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 66 | log := logging.FromContext(ctx) | 65 | log := logging.FromContext(ctx) | ||
| 67 | 66 | ||||
| 68 | var req searchRequest | 67 | var req searchRequest | ||
| @@ -100,8 +99,8 @@ type deleteEntryRequest struct { | |||||
| 100 | } | 99 | } | ||
| 101 | 100 | ||||
| 102 | // HandleDeleteEntry handles history_delete_entry messages. | 101 | // HandleDeleteEntry handles history_delete_entry messages. | ||
| 103 | - | func (h *HistoryHandlers) HandleDeleteEntry() webkit.MessageHandler { | 102 | + | func (h *HistoryHandlers) HandleDeleteEntry() port.WebUIMessageHandler { |
| 104 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 103 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 105 | log := logging.FromContext(ctx) | 104 | log := logging.FromContext(ctx) | ||
| 106 | 105 | ||||
| 107 | var req deleteEntryRequest | 106 | var req deleteEntryRequest | ||
| @@ -129,8 +128,8 @@ type deleteRangeRequest struct { | |||||
| 129 | } | 128 | } | ||
| 130 | 129 | ||||
| 131 | // HandleDeleteRange handles history_delete_range messages. | 130 | // HandleDeleteRange handles history_delete_range messages. | ||
| 132 | - | func (h *HistoryHandlers) HandleDeleteRange() webkit.MessageHandler { | 131 | + | func (h *HistoryHandlers) HandleDeleteRange() port.WebUIMessageHandler { |
| 133 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 132 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 134 | log := logging.FromContext(ctx) | 133 | log := logging.FromContext(ctx) | ||
| 135 | 134 | ||||
| 136 | var req deleteRangeRequest | 135 | var req deleteRangeRequest | ||
| @@ -160,8 +159,8 @@ func (h *HistoryHandlers) HandleDeleteRange() webkit.MessageHandler { | |||||
| 160 | } | 159 | } | ||
| 161 | 160 | ||||
| 162 | // HandleClearAll handles history_clear_all messages. | 161 | // HandleClearAll handles history_clear_all messages. | ||
| 163 | - | func (h *HistoryHandlers) HandleClearAll() webkit.MessageHandler { | 162 | + | func (h *HistoryHandlers) HandleClearAll() port.WebUIMessageHandler { |
| 164 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 163 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 165 | log := logging.FromContext(ctx) | 164 | log := logging.FromContext(ctx) | ||
| 166 | 165 | ||||
| 167 | requestID := ParseRequestID(payload) | 166 | requestID := ParseRequestID(payload) | ||
| @@ -199,8 +198,8 @@ func rangeToTime(r string) time.Time { | |||||
| 199 | } | 198 | } | ||
| 200 | 199 | ||||
| 201 | // HandleAnalytics handles history_analytics messages. | 200 | // HandleAnalytics handles history_analytics messages. | ||
| 202 | - | func (h *HistoryHandlers) HandleAnalytics() webkit.MessageHandler { | 201 | + | func (h *HistoryHandlers) HandleAnalytics() port.WebUIMessageHandler { |
| 203 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 202 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 204 | log := logging.FromContext(ctx) | 203 | log := logging.FromContext(ctx) | ||
| 205 | 204 | ||||
| 206 | requestID := ParseRequestID(payload) | 205 | requestID := ParseRequestID(payload) | ||
| @@ -225,8 +224,8 @@ type domainStatsRequest struct { | |||||
| 225 | } | 224 | } | ||
| 226 | 225 | ||||
| 227 | // HandleDomainStats handles history_domain_stats messages. | 226 | // HandleDomainStats handles history_domain_stats messages. | ||
| 228 | - | func (h *HistoryHandlers) HandleDomainStats() webkit.MessageHandler { | 227 | + | func (h *HistoryHandlers) HandleDomainStats() port.WebUIMessageHandler { |
| 229 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 228 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 230 | log := logging.FromContext(ctx) | 229 | log := logging.FromContext(ctx) | ||
| 231 | 230 | ||||
| 232 | var req domainStatsRequest | 231 | var req domainStatsRequest | ||
| @@ -255,8 +254,8 @@ type deleteDomainRequest struct { | |||||
| 255 | } | 254 | } | ||
| 256 | 255 | ||||
| 257 | // HandleDeleteDomain handles history_delete_domain messages. | 256 | // HandleDeleteDomain handles history_delete_domain messages. | ||
| 258 | - | func (h *HistoryHandlers) HandleDeleteDomain() webkit.MessageHandler { | 257 | + | func (h *HistoryHandlers) HandleDeleteDomain() port.WebUIMessageHandler { |
| 259 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 258 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 260 | log := logging.FromContext(ctx) | 259 | log := logging.FromContext(ctx) | ||
| 261 | 260 | ||||
| 262 | var req deleteDomainRequest | 261 | var req deleteDomainRequest | ||
R internal/infrastructure/webkit/handlers/homepage/registry.go → internal/infrastructure/handlers/homepage/registry.go +2 -3 renamed, 93% similar
| @@ -5,7 +5,6 @@ import ( | |||
| 5 | 5 | "fmt" | |
| 6 | 6 | ||
| 7 | 7 | "github.com/bnema/dumber/internal/application/port" | |
| 8 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 9 | 8 | "github.com/bnema/dumber/internal/logging" | |
| 10 | 9 | ) | |
| 11 | 10 | ||
| @@ -16,7 +15,7 @@ type Config struct { | |||
| 16 | 15 | } | |
| 17 | 16 | ||
| 18 | 17 | // RegisterHandlers registers all homepage message handlers with the router. | |
| 19 | - | func RegisterHandlers(ctx context.Context, router *webkit.MessageRouter, cfg Config) error { | |
| 18 | + | func RegisterHandlers(ctx context.Context, router port.WebUIHandlerRouter, cfg Config) error { | |
| 20 | 19 | log := logging.FromContext(ctx) | |
| 21 | 20 | log.Debug().Msg("registering homepage message handlers") | |
| 22 | 21 | ||
| @@ -25,7 +24,7 @@ func RegisterHandlers(ctx context.Context, router *webkit.MessageRouter, cfg Con | |||
| 25 | 24 | const errorCallback = "__dumber_error" | |
| 26 | 25 | const worldName = "" // main world | |
| 27 | 26 | ||
| 28 | - | handlers := make(map[string]webkit.MessageHandler) | |
| 27 | + | handlers := make(map[string]port.WebUIMessageHandler) | |
| 29 | 28 | ||
| 30 | 29 | // History handlers | |
| 31 | 30 | historyHandlers := NewHistoryHandlers(cfg.HistoryUC) | |
| @@ -5,7 +5,6 @@ import ( | |||||
| 5 | "fmt" | 5 | "fmt" | ||
| 6 | 6 | ||||
| 7 | "github.com/bnema/dumber/internal/application/port" | 7 | "github.com/bnema/dumber/internal/application/port" | ||
| 8 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 9 | "github.com/bnema/dumber/internal/logging" | 8 | "github.com/bnema/dumber/internal/logging" | ||
| 10 | ) | 9 | ) | ||
| 11 | 10 | ||||
| @@ -16,7 +15,7 @@ type Config struct { | |||||
| 16 | } | 15 | } | ||
| 17 | 16 | ||||
| 18 | // RegisterHandlers registers all homepage message handlers with the router. | 17 | // RegisterHandlers registers all homepage message handlers with the router. | ||
| 19 | - | func RegisterHandlers(ctx context.Context, router *webkit.MessageRouter, cfg Config) error { | 18 | + | func RegisterHandlers(ctx context.Context, router port.WebUIHandlerRouter, cfg Config) error { |
| 20 | log := logging.FromContext(ctx) | 19 | log := logging.FromContext(ctx) | ||
| 21 | log.Debug().Msg("registering homepage message handlers") | 20 | log.Debug().Msg("registering homepage message handlers") | ||
| 22 | 21 | ||||
| @@ -25,7 +24,7 @@ func RegisterHandlers(ctx context.Context, router *webkit.MessageRouter, cfg Con | |||||
| 25 | const errorCallback = "__dumber_error" | 24 | const errorCallback = "__dumber_error" | ||
| 26 | const worldName = "" // main world | 25 | const worldName = "" // main world | ||
| 27 | 26 | ||||
| 28 | - | handlers := make(map[string]webkit.MessageHandler) | 27 | + | handlers := make(map[string]port.WebUIMessageHandler) |
| 29 | 28 | ||||
| 30 | // History handlers | 29 | // History handlers | ||
| 31 | historyHandlers := NewHistoryHandlers(cfg.HistoryUC) | 30 | historyHandlers := NewHistoryHandlers(cfg.HistoryUC) | ||
R internal/infrastructure/webkit/handlers/homepage/response.go → internal/infrastructure/handlers/homepage/response.go +0 -0 renamed, 100% similar
renamed, 100% similar
R internal/infrastructure/webkit/handlers/homepage/tags.go → internal/infrastructure/handlers/homepage/tags.go +12 -13 renamed, 79% similar
| @@ -6,7 +6,6 @@ import ( | |||
| 6 | 6 | ||
| 7 | 7 | "github.com/bnema/dumber/internal/application/port" | |
| 8 | 8 | "github.com/bnema/dumber/internal/domain/entity" | |
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 10 | 9 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 10 | ) | |
| 12 | 11 | ||
| @@ -21,8 +20,8 @@ func NewTagHandlers(favoritesUC port.HomepageFavorites) *TagHandlers { | |||
| 21 | 20 | } | |
| 22 | 21 | ||
| 23 | 22 | // HandleList handles tag_list messages. | |
| 24 | - | func (h *TagHandlers) HandleList() webkit.MessageHandler { | |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 23 | + | func (h *TagHandlers) HandleList() port.WebUIMessageHandler { | |
| 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 26 | 25 | log := logging.FromContext(ctx) | |
| 27 | 26 | ||
| 28 | 27 | requestID := ParseRequestID(payload) | |
| @@ -48,8 +47,8 @@ type createTagRequest struct { | |||
| 48 | 47 | } | |
| 49 | 48 | ||
| 50 | 49 | // HandleCreate handles tag_create messages. | |
| 51 | - | func (h *TagHandlers) HandleCreate() webkit.MessageHandler { | |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 50 | + | func (h *TagHandlers) HandleCreate() port.WebUIMessageHandler { | |
| 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 53 | 52 | log := logging.FromContext(ctx) | |
| 54 | 53 | ||
| 55 | 54 | var req createTagRequest | |
| @@ -83,8 +82,8 @@ type deleteTagRequest struct { | |||
| 83 | 82 | } | |
| 84 | 83 | ||
| 85 | 84 | // HandleDelete handles tag_delete messages. | |
| 86 | - | func (h *TagHandlers) HandleDelete() webkit.MessageHandler { | |
| 87 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 85 | + | func (h *TagHandlers) HandleDelete() port.WebUIMessageHandler { | |
| 86 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 88 | 87 | log := logging.FromContext(ctx) | |
| 89 | 88 | ||
| 90 | 89 | var req deleteTagRequest | |
| @@ -115,8 +114,8 @@ type updateTagRequest struct { | |||
| 115 | 114 | ||
| 116 | 115 | // HandleUpdate handles tag_update messages. | |
| 117 | 116 | // NOTE: This requires UpdateTag() method to be added to ManageFavoritesUseCase. | |
| 118 | - | func (h *TagHandlers) HandleUpdate() webkit.MessageHandler { | |
| 119 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 117 | + | func (h *TagHandlers) HandleUpdate() port.WebUIMessageHandler { | |
| 118 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 120 | 119 | log := logging.FromContext(ctx) | |
| 121 | 120 | ||
| 122 | 121 | var req updateTagRequest | |
| @@ -154,17 +153,17 @@ type tagAssignRequest struct { | |||
| 154 | 153 | } | |
| 155 | 154 | ||
| 156 | 155 | // HandleAssign handles tag_assign messages. | |
| 157 | - | func (h *TagHandlers) HandleAssign() webkit.MessageHandler { | |
| 156 | + | func (h *TagHandlers) HandleAssign() port.WebUIMessageHandler { | |
| 158 | 157 | return handleTagAssign("tag_assign", h.favoritesUC.TagFavorite) | |
| 159 | 158 | } | |
| 160 | 159 | ||
| 161 | 160 | // HandleRemove handles tag_remove messages. | |
| 162 | - | func (h *TagHandlers) HandleRemove() webkit.MessageHandler { | |
| 161 | + | func (h *TagHandlers) HandleRemove() port.WebUIMessageHandler { | |
| 163 | 162 | return handleTagAssign("tag_remove", h.favoritesUC.UntagFavorite) | |
| 164 | 163 | } | |
| 165 | 164 | ||
| 166 | - | func handleTagAssign(action string, op func(context.Context, entity.FavoriteID, entity.TagID) error) webkit.MessageHandler { | |
| 167 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 165 | + | func handleTagAssign(action string, op func(context.Context, entity.FavoriteID, entity.TagID) error) port.WebUIMessageHandler { | |
| 166 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 168 | 167 | log := logging.FromContext(ctx) | |
| 169 | 168 | ||
| 170 | 169 | var req tagAssignRequest | |
| @@ -6,7 +6,6 @@ import ( | |||||
| 6 | 6 | ||||
| 7 | "github.com/bnema/dumber/internal/application/port" | 7 | "github.com/bnema/dumber/internal/application/port" | ||
| 8 | "github.com/bnema/dumber/internal/domain/entity" | 8 | "github.com/bnema/dumber/internal/domain/entity" | ||
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 9 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 10 | ) | ||
| 12 | 11 | ||||
| @@ -21,8 +20,8 @@ func NewTagHandlers(favoritesUC port.HomepageFavorites) *TagHandlers { | |||||
| 21 | } | 20 | } | ||
| 22 | 21 | ||||
| 23 | // HandleList handles tag_list messages. | 22 | // HandleList handles tag_list messages. | ||
| 24 | - | func (h *TagHandlers) HandleList() webkit.MessageHandler { | 23 | + | func (h *TagHandlers) HandleList() port.WebUIMessageHandler { |
| 25 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 24 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 26 | log := logging.FromContext(ctx) | 25 | log := logging.FromContext(ctx) | ||
| 27 | 26 | ||||
| 28 | requestID := ParseRequestID(payload) | 27 | requestID := ParseRequestID(payload) | ||
| @@ -48,8 +47,8 @@ type createTagRequest struct { | |||||
| 48 | } | 47 | } | ||
| 49 | 48 | ||||
| 50 | // HandleCreate handles tag_create messages. | 49 | // HandleCreate handles tag_create messages. | ||
| 51 | - | func (h *TagHandlers) HandleCreate() webkit.MessageHandler { | 50 | + | func (h *TagHandlers) HandleCreate() port.WebUIMessageHandler { |
| 52 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 51 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 53 | log := logging.FromContext(ctx) | 52 | log := logging.FromContext(ctx) | ||
| 54 | 53 | ||||
| 55 | var req createTagRequest | 54 | var req createTagRequest | ||
| @@ -83,8 +82,8 @@ type deleteTagRequest struct { | |||||
| 83 | } | 82 | } | ||
| 84 | 83 | ||||
| 85 | // HandleDelete handles tag_delete messages. | 84 | // HandleDelete handles tag_delete messages. | ||
| 86 | - | func (h *TagHandlers) HandleDelete() webkit.MessageHandler { | 85 | + | func (h *TagHandlers) HandleDelete() port.WebUIMessageHandler { |
| 87 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 86 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 88 | log := logging.FromContext(ctx) | 87 | log := logging.FromContext(ctx) | ||
| 89 | 88 | ||||
| 90 | var req deleteTagRequest | 89 | var req deleteTagRequest | ||
| @@ -115,8 +114,8 @@ type updateTagRequest struct { | |||||
| 115 | 114 | ||||
| 116 | // HandleUpdate handles tag_update messages. | 115 | // HandleUpdate handles tag_update messages. | ||
| 117 | // NOTE: This requires UpdateTag() method to be added to ManageFavoritesUseCase. | 116 | // NOTE: This requires UpdateTag() method to be added to ManageFavoritesUseCase. | ||
| 118 | - | func (h *TagHandlers) HandleUpdate() webkit.MessageHandler { | 117 | + | func (h *TagHandlers) HandleUpdate() port.WebUIMessageHandler { |
| 119 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 118 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 120 | log := logging.FromContext(ctx) | 119 | log := logging.FromContext(ctx) | ||
| 121 | 120 | ||||
| 122 | var req updateTagRequest | 121 | var req updateTagRequest | ||
| @@ -154,17 +153,17 @@ type tagAssignRequest struct { | |||||
| 154 | } | 153 | } | ||
| 155 | 154 | ||||
| 156 | // HandleAssign handles tag_assign messages. | 155 | // HandleAssign handles tag_assign messages. | ||
| 157 | - | func (h *TagHandlers) HandleAssign() webkit.MessageHandler { | 156 | + | func (h *TagHandlers) HandleAssign() port.WebUIMessageHandler { |
| 158 | return handleTagAssign("tag_assign", h.favoritesUC.TagFavorite) | 157 | return handleTagAssign("tag_assign", h.favoritesUC.TagFavorite) | ||
| 159 | } | 158 | } | ||
| 160 | 159 | ||||
| 161 | // HandleRemove handles tag_remove messages. | 160 | // HandleRemove handles tag_remove messages. | ||
| 162 | - | func (h *TagHandlers) HandleRemove() webkit.MessageHandler { | 161 | + | func (h *TagHandlers) HandleRemove() port.WebUIMessageHandler { |
| 163 | return handleTagAssign("tag_remove", h.favoritesUC.UntagFavorite) | 162 | return handleTagAssign("tag_remove", h.favoritesUC.UntagFavorite) | ||
| 164 | } | 163 | } | ||
| 165 | 164 | ||||
| 166 | - | func handleTagAssign(action string, op func(context.Context, entity.FavoriteID, entity.TagID) error) webkit.MessageHandler { | 165 | + | func handleTagAssign(action string, op func(context.Context, entity.FavoriteID, entity.TagID) error) port.WebUIMessageHandler { |
| 167 | - | return webkit.MessageHandlerFunc(func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 166 | + | return port.WebUIMessageHandlerFunc(func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 168 | log := logging.FromContext(ctx) | 167 | log := logging.FromContext(ctx) | ||
| 169 | 168 | ||||
| 170 | var req tagAssignRequest | 169 | var req tagAssignRequest | ||
R internal/infrastructure/webkit/handlers/keybindings.go → internal/infrastructure/handlers/keybindings.go +9 -10 renamed, 84% similar
| @@ -6,7 +6,6 @@ import ( | |||
| 6 | 6 | "fmt" | |
| 7 | 7 | ||
| 8 | 8 | "github.com/bnema/dumber/internal/application/port" | |
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 10 | 9 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 10 | ) | |
| 12 | 11 | ||
| @@ -34,12 +33,12 @@ func NewKeybindingsHandler( | |||
| 34 | 33 | } | |
| 35 | 34 | ||
| 36 | 35 | // HandleGetKeybindings returns all keybindings grouped by mode. | |
| 37 | - | func (h *KeybindingsHandler) HandleGetKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) { | |
| 36 | + | func (h *KeybindingsHandler) HandleGetKeybindings(ctx context.Context, _ port.WebViewID, _ json.RawMessage) (any, error) { | |
| 38 | 37 | return h.getUC.Execute(ctx) | |
| 39 | 38 | } | |
| 40 | 39 | ||
| 41 | 40 | // HandleSetKeybinding updates a single keybinding. | |
| 42 | - | func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 41 | + | func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 43 | 42 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | |
| 44 | 43 | log.Debug().RawJSON("payload", payload).Msg("HandleSetKeybinding called") | |
| 45 | 44 | ||
| @@ -61,7 +60,7 @@ func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ webkit.W | |||
| 61 | 60 | } | |
| 62 | 61 | ||
| 63 | 62 | // HandleResetKeybinding resets a keybinding to default. | |
| 64 | - | func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 63 | + | func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 65 | 64 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | |
| 66 | 65 | ||
| 67 | 66 | var req port.ResetKeybindingRequest | |
| @@ -79,7 +78,7 @@ func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ webkit | |||
| 79 | 78 | } | |
| 80 | 79 | ||
| 81 | 80 | // HandleResetAllKeybindings resets all keybindings to defaults. | |
| 82 | - | func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) { | |
| 81 | + | func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ port.WebViewID, _ json.RawMessage) (any, error) { | |
| 83 | 82 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | |
| 84 | 83 | log.Info().Msg("resetting all keybindings to defaults") | |
| 85 | 84 | ||
| @@ -91,7 +90,7 @@ func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ we | |||
| 91 | 90 | } | |
| 92 | 91 | ||
| 93 | 92 | // RegisterKeybindingsHandlers registers keybindings handlers with the router. | |
| 94 | - | func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRouter, handler *KeybindingsHandler) error { | |
| 93 | + | func RegisterKeybindingsHandlers(ctx context.Context, router port.WebUIHandlerRouter, handler *KeybindingsHandler) error { | |
| 95 | 94 | log := logging.FromContext(ctx).With().Str("component", "handlers").Logger() | |
| 96 | 95 | ||
| 97 | 96 | // Get all keybindings | |
| @@ -100,7 +99,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||
| 100 | 99 | "__dumber_keybindings_loaded", | |
| 101 | 100 | "__dumber_keybindings_error", | |
| 102 | 101 | "", | |
| 103 | - | webkit.MessageHandlerFunc(handler.HandleGetKeybindings), | |
| 102 | + | port.WebUIMessageHandlerFunc(handler.HandleGetKeybindings), | |
| 104 | 103 | ); err != nil { | |
| 105 | 104 | return err | |
| 106 | 105 | } | |
| @@ -111,7 +110,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||
| 111 | 110 | "__dumber_keybinding_set", | |
| 112 | 111 | "__dumber_keybinding_set_error", | |
| 113 | 112 | "", | |
| 114 | - | webkit.MessageHandlerFunc(handler.HandleSetKeybinding), | |
| 113 | + | port.WebUIMessageHandlerFunc(handler.HandleSetKeybinding), | |
| 115 | 114 | ); err != nil { | |
| 116 | 115 | return err | |
| 117 | 116 | } | |
| @@ -122,7 +121,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||
| 122 | 121 | "__dumber_keybinding_reset", | |
| 123 | 122 | "__dumber_keybinding_reset_error", | |
| 124 | 123 | "", | |
| 125 | - | webkit.MessageHandlerFunc(handler.HandleResetKeybinding), | |
| 124 | + | port.WebUIMessageHandlerFunc(handler.HandleResetKeybinding), | |
| 126 | 125 | ); err != nil { | |
| 127 | 126 | return err | |
| 128 | 127 | } | |
| @@ -133,7 +132,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||
| 133 | 132 | "__dumber_keybindings_reset_all", | |
| 134 | 133 | "__dumber_keybindings_reset_all_error", | |
| 135 | 134 | "", | |
| 136 | - | webkit.MessageHandlerFunc(handler.HandleResetAllKeybindings), | |
| 135 | + | port.WebUIMessageHandlerFunc(handler.HandleResetAllKeybindings), | |
| 137 | 136 | ); err != nil { | |
| 138 | 137 | return err | |
| 139 | 138 | } | |
| @@ -6,7 +6,6 @@ import ( | |||||
| 6 | "fmt" | 6 | "fmt" | ||
| 7 | 7 | ||||
| 8 | "github.com/bnema/dumber/internal/application/port" | 8 | "github.com/bnema/dumber/internal/application/port" | ||
| 9 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 9 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | ) | 10 | ) | ||
| 12 | 11 | ||||
| @@ -34,12 +33,12 @@ func NewKeybindingsHandler( | |||||
| 34 | } | 33 | } | ||
| 35 | 34 | ||||
| 36 | // HandleGetKeybindings returns all keybindings grouped by mode. | 35 | // HandleGetKeybindings returns all keybindings grouped by mode. | ||
| 37 | - | func (h *KeybindingsHandler) HandleGetKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) { | 36 | + | func (h *KeybindingsHandler) HandleGetKeybindings(ctx context.Context, _ port.WebViewID, _ json.RawMessage) (any, error) { |
| 38 | return h.getUC.Execute(ctx) | 37 | return h.getUC.Execute(ctx) | ||
| 39 | } | 38 | } | ||
| 40 | 39 | ||||
| 41 | // HandleSetKeybinding updates a single keybinding. | 40 | // HandleSetKeybinding updates a single keybinding. | ||
| 42 | - | func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 41 | + | func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 43 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | 42 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | ||
| 44 | log.Debug().RawJSON("payload", payload).Msg("HandleSetKeybinding called") | 43 | log.Debug().RawJSON("payload", payload).Msg("HandleSetKeybinding called") | ||
| 45 | 44 | ||||
| @@ -61,7 +60,7 @@ func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ webkit.W | |||||
| 61 | } | 60 | } | ||
| 62 | 61 | ||||
| 63 | // HandleResetKeybinding resets a keybinding to default. | 62 | // HandleResetKeybinding resets a keybinding to default. | ||
| 64 | - | func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 63 | + | func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 65 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | 64 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | ||
| 66 | 65 | ||||
| 67 | var req port.ResetKeybindingRequest | 66 | var req port.ResetKeybindingRequest | ||
| @@ -79,7 +78,7 @@ func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ webkit | |||||
| 79 | } | 78 | } | ||
| 80 | 79 | ||||
| 81 | // HandleResetAllKeybindings resets all keybindings to defaults. | 80 | // HandleResetAllKeybindings resets all keybindings to defaults. | ||
| 82 | - | func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) { | 81 | + | func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ port.WebViewID, _ json.RawMessage) (any, error) { |
| 83 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | 82 | log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger() | ||
| 84 | log.Info().Msg("resetting all keybindings to defaults") | 83 | log.Info().Msg("resetting all keybindings to defaults") | ||
| 85 | 84 | ||||
| @@ -91,7 +90,7 @@ func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ we | |||||
| 91 | } | 90 | } | ||
| 92 | 91 | ||||
| 93 | // RegisterKeybindingsHandlers registers keybindings handlers with the router. | 92 | // RegisterKeybindingsHandlers registers keybindings handlers with the router. | ||
| 94 | - | func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRouter, handler *KeybindingsHandler) error { | 93 | + | func RegisterKeybindingsHandlers(ctx context.Context, router port.WebUIHandlerRouter, handler *KeybindingsHandler) error { |
| 95 | log := logging.FromContext(ctx).With().Str("component", "handlers").Logger() | 94 | log := logging.FromContext(ctx).With().Str("component", "handlers").Logger() | ||
| 96 | 95 | ||||
| 97 | // Get all keybindings | 96 | // Get all keybindings | ||
| @@ -100,7 +99,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||||
| 100 | "__dumber_keybindings_loaded", | 99 | "__dumber_keybindings_loaded", | ||
| 101 | "__dumber_keybindings_error", | 100 | "__dumber_keybindings_error", | ||
| 102 | "", | 101 | "", | ||
| 103 | - | webkit.MessageHandlerFunc(handler.HandleGetKeybindings), | 102 | + | port.WebUIMessageHandlerFunc(handler.HandleGetKeybindings), |
| 104 | ); err != nil { | 103 | ); err != nil { | ||
| 105 | return err | 104 | return err | ||
| 106 | } | 105 | } | ||
| @@ -111,7 +110,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||||
| 111 | "__dumber_keybinding_set", | 110 | "__dumber_keybinding_set", | ||
| 112 | "__dumber_keybinding_set_error", | 111 | "__dumber_keybinding_set_error", | ||
| 113 | "", | 112 | "", | ||
| 114 | - | webkit.MessageHandlerFunc(handler.HandleSetKeybinding), | 113 | + | port.WebUIMessageHandlerFunc(handler.HandleSetKeybinding), |
| 115 | ); err != nil { | 114 | ); err != nil { | ||
| 116 | return err | 115 | return err | ||
| 117 | } | 116 | } | ||
| @@ -122,7 +121,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||||
| 122 | "__dumber_keybinding_reset", | 121 | "__dumber_keybinding_reset", | ||
| 123 | "__dumber_keybinding_reset_error", | 122 | "__dumber_keybinding_reset_error", | ||
| 124 | "", | 123 | "", | ||
| 125 | - | webkit.MessageHandlerFunc(handler.HandleResetKeybinding), | 124 | + | port.WebUIMessageHandlerFunc(handler.HandleResetKeybinding), |
| 126 | ); err != nil { | 125 | ); err != nil { | ||
| 127 | return err | 126 | return err | ||
| 128 | } | 127 | } | ||
| @@ -133,7 +132,7 @@ func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRout | |||||
| 133 | "__dumber_keybindings_reset_all", | 132 | "__dumber_keybindings_reset_all", | ||
| 134 | "__dumber_keybindings_reset_all_error", | 133 | "__dumber_keybindings_reset_all_error", | ||
| 135 | "", | 134 | "", | ||
| 136 | - | webkit.MessageHandlerFunc(handler.HandleResetAllKeybindings), | 135 | + | port.WebUIMessageHandlerFunc(handler.HandleResetAllKeybindings), |
| 137 | ); err != nil { | 136 | ); err != nil { | ||
| 138 | return err | 137 | return err | ||
| 139 | } | 138 | } | ||
R internal/infrastructure/webkit/handlers/register.go → internal/infrastructure/handlers/register.go +24 -31 renamed, 50% similar
| @@ -7,8 +7,7 @@ import ( | |||
| 7 | 7 | "unicode/utf8" | |
| 8 | 8 | ||
| 9 | 9 | "github.com/bnema/dumber/internal/application/port" | |
| 10 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 11 | - | "github.com/bnema/dumber/internal/infrastructure/webkit/handlers/homepage" | |
| 10 | + | "github.com/bnema/dumber/internal/infrastructure/handlers/homepage" | |
| 12 | 11 | ) | |
| 13 | 12 | ||
| 14 | 13 | // AccentKeyHandler is implemented by the InsertAccentUseCase to receive | |
| @@ -17,49 +16,43 @@ import ( | |||
| 17 | 16 | // Deprecated: use port.AccentKeyHandler instead. This alias is kept for compatibility. | |
| 18 | 17 | type AccentKeyHandler = port.AccentKeyHandler | |
| 19 | 18 | ||
| 20 | - | // Config holds all dependencies for message handlers. | |
| 21 | - | type Config struct { | |
| 22 | - | HistoryUC port.HomepageHistory | |
| 23 | - | FavoritesUC port.HomepageFavorites | |
| 24 | - | Clipboard port.Clipboard | |
| 25 | - | AutoCopyConfig port.AutoCopyConfig | |
| 26 | - | SaveConfig func(context.Context, port.WebUIConfig) error // Pre-built by bootstrap (usecase.SaveWebUIConfigUseCase.Execute) | |
| 27 | - | // KeybindingsHandler is required (not optional like other handlers) because the WebUI | |
| 28 | - | // always needs keybinding read/write support regardless of configuration. | |
| 29 | - | KeybindingsHandler *KeybindingsHandler // Pre-built by bootstrap | |
| 30 | - | OnClipboardCopied func(textLen int) // Called when auto-copy completes (for toast notification) | |
| 31 | - | } | |
| 32 | - | ||
| 33 | 19 | // RegisterAll registers all message handlers with the router. | |
| 34 | - | func RegisterAll(ctx context.Context, router *webkit.MessageRouter, cfg Config) error { | |
| 20 | + | // The router can be any engine's message router that implements port.WebUIHandlerRouter. | |
| 21 | + | func RegisterAll(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error { | |
| 35 | 22 | // Homepage handlers (history, favorites, folders, tags) | |
| 36 | - | if cfg.HistoryUC != nil && cfg.FavoritesUC != nil { | |
| 23 | + | if deps.HistoryUC != nil && deps.FavoritesUC != nil { | |
| 37 | 24 | if err := homepage.RegisterHandlers(ctx, router, homepage.Config{ | |
| 38 | - | HistoryUC: cfg.HistoryUC, | |
| 39 | - | FavoritesUC: cfg.FavoritesUC, | |
| 25 | + | HistoryUC: deps.HistoryUC, | |
| 26 | + | FavoritesUC: deps.FavoritesUC, | |
| 40 | 27 | }); err != nil { | |
| 41 | 28 | return err | |
| 42 | 29 | } | |
| 43 | 30 | } | |
| 44 | 31 | ||
| 45 | 32 | // Configuration handlers | |
| 46 | - | if cfg.SaveConfig != nil { | |
| 47 | - | if err := RegisterConfigHandlers(ctx, router, cfg.SaveConfig); err != nil { | |
| 33 | + | if deps.SaveConfig != nil { | |
| 34 | + | if err := RegisterConfigHandlers(ctx, router, deps.SaveConfig); err != nil { | |
| 48 | 35 | return err | |
| 49 | 36 | } | |
| 50 | 37 | } | |
| 51 | 38 | ||
| 52 | 39 | // Keybindings handlers (always available) | |
| 53 | - | if cfg.KeybindingsHandler == nil { | |
| 54 | - | return fmt.Errorf("KeybindingsHandler is required") | |
| 40 | + | if deps.KeybindingsGetter == nil { | |
| 41 | + | return fmt.Errorf("KeybindingsGetter is required") | |
| 55 | 42 | } | |
| 56 | - | if err := RegisterKeybindingsHandlers(ctx, router, cfg.KeybindingsHandler); err != nil { | |
| 43 | + | kbHandler := NewKeybindingsHandler( | |
| 44 | + | deps.KeybindingsGetter, | |
| 45 | + | deps.KeybindingSetter, | |
| 46 | + | deps.KeybindingResetter, | |
| 47 | + | deps.AllKeybindingsResetter, | |
| 48 | + | ) | |
| 49 | + | if err := RegisterKeybindingsHandlers(ctx, router, kbHandler); err != nil { | |
| 57 | 50 | return err | |
| 58 | 51 | } | |
| 59 | 52 | ||
| 60 | 53 | // Clipboard handlers (for auto-copy on selection feature) | |
| 61 | - | if cfg.Clipboard != nil && cfg.AutoCopyConfig != nil { | |
| 62 | - | if err := RegisterClipboardHandlers(ctx, router, cfg.Clipboard, cfg.AutoCopyConfig, cfg.OnClipboardCopied); err != nil { | |
| 54 | + | if deps.Clipboard != nil && deps.AutoCopyConfig != nil { | |
| 55 | + | if err := RegisterClipboardHandlers(ctx, router, deps.Clipboard, deps.AutoCopyConfig, deps.OnClipboardCopied); err != nil { | |
| 63 | 56 | return err | |
| 64 | 57 | } | |
| 65 | 58 | } | |
| @@ -69,7 +62,7 @@ func RegisterAll(ctx context.Context, router *webkit.MessageRouter, cfg Config) | |||
| 69 | 62 | ||
| 70 | 63 | // RegisterAccentHandlers registers accent key press/release handlers with the router. | |
| 71 | 64 | // Must be called after the AccentKeyHandler is initialized (i.e., after initAccentPicker). | |
| 72 | - | func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, handler AccentKeyHandler) error { | |
| 65 | + | func RegisterAccentHandlers(_ context.Context, router port.WebUIHandlerRouter, handler AccentKeyHandler) error { | |
| 73 | 66 | if router == nil { | |
| 74 | 67 | return fmt.Errorf("RegisterAccentHandlers: router must not be nil") | |
| 75 | 68 | } | |
| @@ -77,8 +70,8 @@ func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, han | |||
| 77 | 70 | return fmt.Errorf("RegisterAccentHandlers: handler must not be nil") | |
| 78 | 71 | } | |
| 79 | 72 | ||
| 80 | - | if err := router.RegisterHandler("accent_key_press", webkit.MessageHandlerFunc( | |
| 81 | - | func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 73 | + | if err := router.RegisterHandler("accent_key_press", port.WebUIMessageHandlerFunc( | |
| 74 | + | func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 82 | 75 | var p struct { | |
| 83 | 76 | Char string `json:"char"` | |
| 84 | 77 | Shift bool `json:"shift"` | |
| @@ -95,8 +88,8 @@ func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, han | |||
| 95 | 88 | return err | |
| 96 | 89 | } | |
| 97 | 90 | ||
| 98 | - | if err := router.RegisterHandler("accent_key_release", webkit.MessageHandlerFunc( | |
| 99 | - | func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | |
| 91 | + | if err := router.RegisterHandler("accent_key_release", port.WebUIMessageHandlerFunc( | |
| 92 | + | func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { | |
| 100 | 93 | var p struct { | |
| 101 | 94 | Char string `json:"char"` | |
| 102 | 95 | } | |
| @@ -7,8 +7,7 @@ import ( | |||||
| 7 | "unicode/utf8" | 7 | "unicode/utf8" | ||
| 8 | 8 | ||||
| 9 | "github.com/bnema/dumber/internal/application/port" | 9 | "github.com/bnema/dumber/internal/application/port" | ||
| 10 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | 10 | + | "github.com/bnema/dumber/internal/infrastructure/handlers/homepage" |
| 11 | - | "github.com/bnema/dumber/internal/infrastructure/webkit/handlers/homepage" | |||
| 12 | ) | 11 | ) | ||
| 13 | 12 | ||||
| 14 | // AccentKeyHandler is implemented by the InsertAccentUseCase to receive | 13 | // AccentKeyHandler is implemented by the InsertAccentUseCase to receive | ||
| @@ -17,49 +16,43 @@ import ( | |||||
| 17 | // Deprecated: use port.AccentKeyHandler instead. This alias is kept for compatibility. | 16 | // Deprecated: use port.AccentKeyHandler instead. This alias is kept for compatibility. | ||
| 18 | type AccentKeyHandler = port.AccentKeyHandler | 17 | type AccentKeyHandler = port.AccentKeyHandler | ||
| 19 | 18 | ||||
| 20 | - | // Config holds all dependencies for message handlers. | |||
| 21 | - | type Config struct { | |||
| 22 | - | HistoryUC port.HomepageHistory | |||
| 23 | - | FavoritesUC port.HomepageFavorites | |||
| 24 | - | Clipboard port.Clipboard | |||
| 25 | - | AutoCopyConfig port.AutoCopyConfig | |||
| 26 | - | SaveConfig func(context.Context, port.WebUIConfig) error // Pre-built by bootstrap (usecase.SaveWebUIConfigUseCase.Execute) | |||
| 27 | - | // KeybindingsHandler is required (not optional like other handlers) because the WebUI | |||
| 28 | - | // always needs keybinding read/write support regardless of configuration. | |||
| 29 | - | KeybindingsHandler *KeybindingsHandler // Pre-built by bootstrap | |||
| 30 | - | OnClipboardCopied func(textLen int) // Called when auto-copy completes (for toast notification) | |||
| 31 | - | } | |||
| 32 | - | ||||
| 33 | // RegisterAll registers all message handlers with the router. | 19 | // RegisterAll registers all message handlers with the router. | ||
| 34 | - | func RegisterAll(ctx context.Context, router *webkit.MessageRouter, cfg Config) error { | 20 | + | // The router can be any engine's message router that implements port.WebUIHandlerRouter. |
| 21 | + | func RegisterAll(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error { | |||
| 35 | // Homepage handlers (history, favorites, folders, tags) | 22 | // Homepage handlers (history, favorites, folders, tags) | ||
| 36 | - | if cfg.HistoryUC != nil && cfg.FavoritesUC != nil { | 23 | + | if deps.HistoryUC != nil && deps.FavoritesUC != nil { |
| 37 | if err := homepage.RegisterHandlers(ctx, router, homepage.Config{ | 24 | if err := homepage.RegisterHandlers(ctx, router, homepage.Config{ | ||
| 38 | - | HistoryUC: cfg.HistoryUC, | 25 | + | HistoryUC: deps.HistoryUC, |
| 39 | - | FavoritesUC: cfg.FavoritesUC, | 26 | + | FavoritesUC: deps.FavoritesUC, |
| 40 | }); err != nil { | 27 | }); err != nil { | ||
| 41 | return err | 28 | return err | ||
| 42 | } | 29 | } | ||
| 43 | } | 30 | } | ||
| 44 | 31 | ||||
| 45 | // Configuration handlers | 32 | // Configuration handlers | ||
| 46 | - | if cfg.SaveConfig != nil { | 33 | + | if deps.SaveConfig != nil { |
| 47 | - | if err := RegisterConfigHandlers(ctx, router, cfg.SaveConfig); err != nil { | 34 | + | if err := RegisterConfigHandlers(ctx, router, deps.SaveConfig); err != nil { |
| 48 | return err | 35 | return err | ||
| 49 | } | 36 | } | ||
| 50 | } | 37 | } | ||
| 51 | 38 | ||||
| 52 | // Keybindings handlers (always available) | 39 | // Keybindings handlers (always available) | ||
| 53 | - | if cfg.KeybindingsHandler == nil { | 40 | + | if deps.KeybindingsGetter == nil { |
| 54 | - | return fmt.Errorf("KeybindingsHandler is required") | 41 | + | return fmt.Errorf("KeybindingsGetter is required") |
| 55 | } | 42 | } | ||
| 56 | - | if err := RegisterKeybindingsHandlers(ctx, router, cfg.KeybindingsHandler); err != nil { | 43 | + | kbHandler := NewKeybindingsHandler( |
| 44 | + | deps.KeybindingsGetter, | |||
| 45 | + | deps.KeybindingSetter, | |||
| 46 | + | deps.KeybindingResetter, | |||
| 47 | + | deps.AllKeybindingsResetter, | |||
| 48 | + | ) | |||
| 49 | + | if err := RegisterKeybindingsHandlers(ctx, router, kbHandler); err != nil { | |||
| 57 | return err | 50 | return err | ||
| 58 | } | 51 | } | ||
| 59 | 52 | ||||
| 60 | // Clipboard handlers (for auto-copy on selection feature) | 53 | // Clipboard handlers (for auto-copy on selection feature) | ||
| 61 | - | if cfg.Clipboard != nil && cfg.AutoCopyConfig != nil { | 54 | + | if deps.Clipboard != nil && deps.AutoCopyConfig != nil { |
| 62 | - | if err := RegisterClipboardHandlers(ctx, router, cfg.Clipboard, cfg.AutoCopyConfig, cfg.OnClipboardCopied); err != nil { | 55 | + | if err := RegisterClipboardHandlers(ctx, router, deps.Clipboard, deps.AutoCopyConfig, deps.OnClipboardCopied); err != nil { |
| 63 | return err | 56 | return err | ||
| 64 | } | 57 | } | ||
| 65 | } | 58 | } | ||
| @@ -69,7 +62,7 @@ func RegisterAll(ctx context.Context, router *webkit.MessageRouter, cfg Config) | |||||
| 69 | 62 | ||||
| 70 | // RegisterAccentHandlers registers accent key press/release handlers with the router. | 63 | // RegisterAccentHandlers registers accent key press/release handlers with the router. | ||
| 71 | // Must be called after the AccentKeyHandler is initialized (i.e., after initAccentPicker). | 64 | // Must be called after the AccentKeyHandler is initialized (i.e., after initAccentPicker). | ||
| 72 | - | func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, handler AccentKeyHandler) error { | 65 | + | func RegisterAccentHandlers(_ context.Context, router port.WebUIHandlerRouter, handler AccentKeyHandler) error { |
| 73 | if router == nil { | 66 | if router == nil { | ||
| 74 | return fmt.Errorf("RegisterAccentHandlers: router must not be nil") | 67 | return fmt.Errorf("RegisterAccentHandlers: router must not be nil") | ||
| 75 | } | 68 | } | ||
| @@ -77,8 +70,8 @@ func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, han | |||||
| 77 | return fmt.Errorf("RegisterAccentHandlers: handler must not be nil") | 70 | return fmt.Errorf("RegisterAccentHandlers: handler must not be nil") | ||
| 78 | } | 71 | } | ||
| 79 | 72 | ||||
| 80 | - | if err := router.RegisterHandler("accent_key_press", webkit.MessageHandlerFunc( | 73 | + | if err := router.RegisterHandler("accent_key_press", port.WebUIMessageHandlerFunc( |
| 81 | - | func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 74 | + | func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 82 | var p struct { | 75 | var p struct { | ||
| 83 | Char string `json:"char"` | 76 | Char string `json:"char"` | ||
| 84 | Shift bool `json:"shift"` | 77 | Shift bool `json:"shift"` | ||
| @@ -95,8 +88,8 @@ func RegisterAccentHandlers(_ context.Context, router *webkit.MessageRouter, han | |||||
| 95 | return err | 88 | return err | ||
| 96 | } | 89 | } | ||
| 97 | 90 | ||||
| 98 | - | if err := router.RegisterHandler("accent_key_release", webkit.MessageHandlerFunc( | 91 | + | if err := router.RegisterHandler("accent_key_release", port.WebUIMessageHandlerFunc( |
| 99 | - | func(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) { | 92 | + | func(ctx context.Context, _ port.WebViewID, payload json.RawMessage) (any, error) { |
| 100 | var p struct { | 93 | var p struct { | ||
| 101 | Char string `json:"char"` | 94 | Char string `json:"char"` | ||
| 102 | } | 95 | } | ||
A internal/infrastructure/handlers/register_test.go +86 -0
| @@ -0,0 +1,86 @@ | |||
| 1 | + | package handlers | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "context" | |
| 5 | + | "encoding/json" | |
| 6 | + | "testing" | |
| 7 | + | ||
| 8 | + | "github.com/bnema/dumber/internal/application/port" | |
| 9 | + | "github.com/stretchr/testify/assert" | |
| 10 | + | "github.com/stretchr/testify/require" | |
| 11 | + | ) | |
| 12 | + | ||
| 13 | + | // stubRouter implements port.WebUIHandlerRouter for testing. | |
| 14 | + | type stubRouter struct { | |
| 15 | + | handlers map[string]port.WebUIMessageHandler | |
| 16 | + | } | |
| 17 | + | ||
| 18 | + | func newStubRouter() *stubRouter { | |
| 19 | + | return &stubRouter{handlers: make(map[string]port.WebUIMessageHandler)} | |
| 20 | + | } | |
| 21 | + | ||
| 22 | + | func (r *stubRouter) RegisterHandler(msgType string, handler port.WebUIMessageHandler) error { | |
| 23 | + | r.handlers[msgType] = handler | |
| 24 | + | return nil | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | func (r *stubRouter) RegisterHandlerWithCallbacks(msgType, _, _, _ string, handler port.WebUIMessageHandler) error { | |
| 28 | + | r.handlers[msgType] = handler | |
| 29 | + | return nil | |
| 30 | + | } | |
| 31 | + | ||
| 32 | + | func TestRegisterAccentHandlers_NilRouter(t *testing.T) { | |
| 33 | + | ctx := context.Background() | |
| 34 | + | handler := &stubAccentHandler{} | |
| 35 | + | err := RegisterAccentHandlers(ctx, nil, handler) | |
| 36 | + | require.Error(t, err) | |
| 37 | + | assert.Contains(t, err.Error(), "router") | |
| 38 | + | } | |
| 39 | + | ||
| 40 | + | func TestRegisterAccentHandlers_NilHandler(t *testing.T) { | |
| 41 | + | ctx := context.Background() | |
| 42 | + | router := newStubRouter() | |
| 43 | + | err := RegisterAccentHandlers(ctx, router, nil) | |
| 44 | + | require.Error(t, err) | |
| 45 | + | assert.Contains(t, err.Error(), "handler") | |
| 46 | + | } | |
| 47 | + | ||
| 48 | + | func TestRegisterAccentHandlers_Success(t *testing.T) { | |
| 49 | + | ctx := context.Background() | |
| 50 | + | router := newStubRouter() | |
| 51 | + | handler := &stubAccentHandler{} | |
| 52 | + | err := RegisterAccentHandlers(ctx, router, handler) | |
| 53 | + | require.NoError(t, err) | |
| 54 | + | assert.Contains(t, router.handlers, "accent_key_press") | |
| 55 | + | assert.Contains(t, router.handlers, "accent_key_release") | |
| 56 | + | } | |
| 57 | + | ||
| 58 | + | func TestRegisterAccentHandlers_KeyPress(t *testing.T) { | |
| 59 | + | ctx := context.Background() | |
| 60 | + | router := newStubRouter() | |
| 61 | + | handler := &stubAccentHandler{} | |
| 62 | + | err := RegisterAccentHandlers(ctx, router, handler) | |
| 63 | + | require.NoError(t, err) | |
| 64 | + | ||
| 65 | + | h := router.handlers["accent_key_press"] | |
| 66 | + | require.NotNil(t, h) | |
| 67 | + | ||
| 68 | + | payload := json.RawMessage(`{"char":"e","shift":true}`) | |
| 69 | + | _, err = h.Handle(ctx, 0, payload) | |
| 70 | + | require.NoError(t, err) | |
| 71 | + | assert.Equal(t, 'e', handler.lastPressed) | |
| 72 | + | assert.True(t, handler.lastShift) | |
| 73 | + | } | |
| 74 | + | ||
| 75 | + | // stubAccentHandler satisfies port.AccentKeyHandler for tests. | |
| 76 | + | type stubAccentHandler struct { | |
| 77 | + | lastPressed rune | |
| 78 | + | lastShift bool | |
| 79 | + | } | |
| 80 | + | ||
| 81 | + | func (h *stubAccentHandler) OnKeyPressed(_ context.Context, r rune, shift bool) bool { | |
| 82 | + | h.lastPressed = r | |
| 83 | + | h.lastShift = shift | |
| 84 | + | return false | |
| 85 | + | } | |
| 86 | + | func (*stubAccentHandler) OnKeyReleased(_ context.Context, _ rune) {} | |
| @@ -0,0 +1,86 @@ | |||||
| 1 | + | package handlers | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "context" | |||
| 5 | + | "encoding/json" | |||
| 6 | + | "testing" | |||
| 7 | + | ||||
| 8 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 9 | + | "github.com/stretchr/testify/assert" | |||
| 10 | + | "github.com/stretchr/testify/require" | |||
| 11 | + | ) | |||
| 12 | + | ||||
| 13 | + | // stubRouter implements port.WebUIHandlerRouter for testing. | |||
| 14 | + | type stubRouter struct { | |||
| 15 | + | handlers map[string]port.WebUIMessageHandler | |||
| 16 | + | } | |||
| 17 | + | ||||
| 18 | + | func newStubRouter() *stubRouter { | |||
| 19 | + | return &stubRouter{handlers: make(map[string]port.WebUIMessageHandler)} | |||
| 20 | + | } | |||
| 21 | + | ||||
| 22 | + | func (r *stubRouter) RegisterHandler(msgType string, handler port.WebUIMessageHandler) error { | |||
| 23 | + | r.handlers[msgType] = handler | |||
| 24 | + | return nil | |||
| 25 | + | } | |||
| 26 | + | ||||
| 27 | + | func (r *stubRouter) RegisterHandlerWithCallbacks(msgType, _, _, _ string, handler port.WebUIMessageHandler) error { | |||
| 28 | + | r.handlers[msgType] = handler | |||
| 29 | + | return nil | |||
| 30 | + | } | |||
| 31 | + | ||||
| 32 | + | func TestRegisterAccentHandlers_NilRouter(t *testing.T) { | |||
| 33 | + | ctx := context.Background() | |||
| 34 | + | handler := &stubAccentHandler{} | |||
| 35 | + | err := RegisterAccentHandlers(ctx, nil, handler) | |||
| 36 | + | require.Error(t, err) | |||
| 37 | + | assert.Contains(t, err.Error(), "router") | |||
| 38 | + | } | |||
| 39 | + | ||||
| 40 | + | func TestRegisterAccentHandlers_NilHandler(t *testing.T) { | |||
| 41 | + | ctx := context.Background() | |||
| 42 | + | router := newStubRouter() | |||
| 43 | + | err := RegisterAccentHandlers(ctx, router, nil) | |||
| 44 | + | require.Error(t, err) | |||
| 45 | + | assert.Contains(t, err.Error(), "handler") | |||
| 46 | + | } | |||
| 47 | + | ||||
| 48 | + | func TestRegisterAccentHandlers_Success(t *testing.T) { | |||
| 49 | + | ctx := context.Background() | |||
| 50 | + | router := newStubRouter() | |||
| 51 | + | handler := &stubAccentHandler{} | |||
| 52 | + | err := RegisterAccentHandlers(ctx, router, handler) | |||
| 53 | + | require.NoError(t, err) | |||
| 54 | + | assert.Contains(t, router.handlers, "accent_key_press") | |||
| 55 | + | assert.Contains(t, router.handlers, "accent_key_release") | |||
| 56 | + | } | |||
| 57 | + | ||||
| 58 | + | func TestRegisterAccentHandlers_KeyPress(t *testing.T) { | |||
| 59 | + | ctx := context.Background() | |||
| 60 | + | router := newStubRouter() | |||
| 61 | + | handler := &stubAccentHandler{} | |||
| 62 | + | err := RegisterAccentHandlers(ctx, router, handler) | |||
| 63 | + | require.NoError(t, err) | |||
| 64 | + | ||||
| 65 | + | h := router.handlers["accent_key_press"] | |||
| 66 | + | require.NotNil(t, h) | |||
| 67 | + | ||||
| 68 | + | payload := json.RawMessage(`{"char":"e","shift":true}`) | |||
| 69 | + | _, err = h.Handle(ctx, 0, payload) | |||
| 70 | + | require.NoError(t, err) | |||
| 71 | + | assert.Equal(t, 'e', handler.lastPressed) | |||
| 72 | + | assert.True(t, handler.lastShift) | |||
| 73 | + | } | |||
| 74 | + | ||||
| 75 | + | // stubAccentHandler satisfies port.AccentKeyHandler for tests. | |||
| 76 | + | type stubAccentHandler struct { | |||
| 77 | + | lastPressed rune | |||
| 78 | + | lastShift bool | |||
| 79 | + | } | |||
| 80 | + | ||||
| 81 | + | func (h *stubAccentHandler) OnKeyPressed(_ context.Context, r rune, shift bool) bool { | |||
| 82 | + | h.lastPressed = r | |||
| 83 | + | h.lastShift = shift | |||
| 84 | + | return false | |||
| 85 | + | } | |||
| 86 | + | func (*stubAccentHandler) OnKeyReleased(_ context.Context, _ rune) {} | |||
M internal/infrastructure/webkit/engine.go +2 -2
| @@ -25,8 +25,8 @@ type Engine struct { | |||
| 25 | 25 | logger zerolog.Logger | |
| 26 | 26 | ||
| 27 | 27 | // Handler registrars - injected at construction to avoid import cycles. | |
| 28 | - | handlerRegistrar func(ctx context.Context, router *MessageRouter, deps port.HandlerDependencies) error | |
| 29 | - | accentHandlerRegistrar func(ctx context.Context, router *MessageRouter, handler port.AccentKeyHandler) error | |
| 28 | + | handlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error | |
| 29 | + | accentHandlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error | |
| 30 | 30 | } | |
| 31 | 31 | ||
| 32 | 32 | // Compile-time check that Engine implements port.Engine. | |
| @@ -25,8 +25,8 @@ type Engine struct { | |||||
| 25 | logger zerolog.Logger | 25 | logger zerolog.Logger | ||
| 26 | 26 | ||||
| 27 | // Handler registrars - injected at construction to avoid import cycles. | 27 | // Handler registrars - injected at construction to avoid import cycles. | ||
| 28 | - | handlerRegistrar func(ctx context.Context, router *MessageRouter, deps port.HandlerDependencies) error | 28 | + | handlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error |
| 29 | - | accentHandlerRegistrar func(ctx context.Context, router *MessageRouter, handler port.AccentKeyHandler) error | 29 | + | accentHandlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error |
| 30 | } | 30 | } | ||
| 31 | 31 | ||||
| 32 | // Compile-time check that Engine implements port.Engine. | 32 | // Compile-time check that Engine implements port.Engine. | ||
M internal/infrastructure/webkit/engine_init.go +2 -2
| @@ -26,8 +26,8 @@ func NewEngine( | |||
| 26 | 26 | themeManager *theme.Manager, | |
| 27 | 27 | colorResolver port.ColorSchemeResolver, | |
| 28 | 28 | logger zerolog.Logger, | |
| 29 | - | handlerRegistrar func(ctx context.Context, router *MessageRouter, deps port.HandlerDependencies) error, | |
| 30 | - | accentHandlerRegistrar func(ctx context.Context, router *MessageRouter, handler port.AccentKeyHandler) error, | |
| 29 | + | handlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error, | |
| 30 | + | accentHandlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error, | |
| 31 | 31 | ) (*Engine, error) { | |
| 32 | 32 | // --- Hardware survey and performance profile resolution --- | |
| 33 | 33 | perfSettings := engineSurveyHardwareAndResolveProfile(ctx, cfg, logger) | |
| @@ -26,8 +26,8 @@ func NewEngine( | |||||
| 26 | themeManager *theme.Manager, | 26 | themeManager *theme.Manager, | ||
| 27 | colorResolver port.ColorSchemeResolver, | 27 | colorResolver port.ColorSchemeResolver, | ||
| 28 | logger zerolog.Logger, | 28 | logger zerolog.Logger, | ||
| 29 | - | handlerRegistrar func(ctx context.Context, router *MessageRouter, deps port.HandlerDependencies) error, | 29 | + | handlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, deps port.HandlerDependencies) error, |
| 30 | - | accentHandlerRegistrar func(ctx context.Context, router *MessageRouter, handler port.AccentKeyHandler) error, | 30 | + | accentHandlerRegistrar func(ctx context.Context, router port.WebUIHandlerRouter, handler port.AccentKeyHandler) error, |
| 31 | ) (*Engine, error) { | 31 | ) (*Engine, error) { | ||
| 32 | // --- Hardware survey and performance profile resolution --- | 32 | // --- Hardware survey and performance profile resolution --- | ||
| 33 | perfSettings := engineSurveyHardwareAndResolveProfile(ctx, cfg, logger) | 33 | perfSettings := engineSurveyHardwareAndResolveProfile(ctx, cfg, logger) | ||
D internal/infrastructure/webkit/handlers/register_test.go +0 -40
| @@ -1,40 +0,0 @@ | |||
| 1 | - | package handlers | |
| 2 | - | ||
| 3 | - | import ( | |
| 4 | - | "context" | |
| 5 | - | "testing" | |
| 6 | - | ||
| 7 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |
| 8 | - | "github.com/stretchr/testify/assert" | |
| 9 | - | "github.com/stretchr/testify/require" | |
| 10 | - | ) | |
| 11 | - | ||
| 12 | - | func TestRegisterAccentHandlers_NilRouter(t *testing.T) { | |
| 13 | - | ctx := context.Background() | |
| 14 | - | handler := &stubAccentHandler{} | |
| 15 | - | err := RegisterAccentHandlers(ctx, nil, handler) | |
| 16 | - | require.Error(t, err) | |
| 17 | - | assert.Contains(t, err.Error(), "router") | |
| 18 | - | } | |
| 19 | - | ||
| 20 | - | func TestRegisterAccentHandlers_NilHandler(t *testing.T) { | |
| 21 | - | ctx := context.Background() | |
| 22 | - | router := webkit.NewMessageRouter(ctx) | |
| 23 | - | err := RegisterAccentHandlers(ctx, router, nil) | |
| 24 | - | require.Error(t, err) | |
| 25 | - | assert.Contains(t, err.Error(), "handler") | |
| 26 | - | } | |
| 27 | - | ||
| 28 | - | func TestRegisterAccentHandlers_Success(t *testing.T) { | |
| 29 | - | ctx := context.Background() | |
| 30 | - | router := webkit.NewMessageRouter(ctx) | |
| 31 | - | handler := &stubAccentHandler{} | |
| 32 | - | err := RegisterAccentHandlers(ctx, router, handler) | |
| 33 | - | require.NoError(t, err) | |
| 34 | - | } | |
| 35 | - | ||
| 36 | - | // stubAccentHandler satisfies AccentKeyHandler for tests. | |
| 37 | - | type stubAccentHandler struct{} | |
| 38 | - | ||
| 39 | - | func (*stubAccentHandler) OnKeyPressed(_ context.Context, _ rune, _ bool) bool { return false } | |
| 40 | - | func (*stubAccentHandler) OnKeyReleased(_ context.Context, _ rune) {} | |
| @@ -1,40 +0,0 @@ | |||||
| 1 | - | package handlers | |||
| 2 | - | ||||
| 3 | - | import ( | |||
| 4 | - | "context" | |||
| 5 | - | "testing" | |||
| 6 | - | ||||
| 7 | - | "github.com/bnema/dumber/internal/infrastructure/webkit" | |||
| 8 | - | "github.com/stretchr/testify/assert" | |||
| 9 | - | "github.com/stretchr/testify/require" | |||
| 10 | - | ) | |||
| 11 | - | ||||
| 12 | - | func TestRegisterAccentHandlers_NilRouter(t *testing.T) { | |||
| 13 | - | ctx := context.Background() | |||
| 14 | - | handler := &stubAccentHandler{} | |||
| 15 | - | err := RegisterAccentHandlers(ctx, nil, handler) | |||
| 16 | - | require.Error(t, err) | |||
| 17 | - | assert.Contains(t, err.Error(), "router") | |||
| 18 | - | } | |||
| 19 | - | ||||
| 20 | - | func TestRegisterAccentHandlers_NilHandler(t *testing.T) { | |||
| 21 | - | ctx := context.Background() | |||
| 22 | - | router := webkit.NewMessageRouter(ctx) | |||
| 23 | - | err := RegisterAccentHandlers(ctx, router, nil) | |||
| 24 | - | require.Error(t, err) | |||
| 25 | - | assert.Contains(t, err.Error(), "handler") | |||
| 26 | - | } | |||
| 27 | - | ||||
| 28 | - | func TestRegisterAccentHandlers_Success(t *testing.T) { | |||
| 29 | - | ctx := context.Background() | |||
| 30 | - | router := webkit.NewMessageRouter(ctx) | |||
| 31 | - | handler := &stubAccentHandler{} | |||
| 32 | - | err := RegisterAccentHandlers(ctx, router, handler) | |||
| 33 | - | require.NoError(t, err) | |||
| 34 | - | } | |||
| 35 | - | ||||
| 36 | - | // stubAccentHandler satisfies AccentKeyHandler for tests. | |||
| 37 | - | type stubAccentHandler struct{} | |||
| 38 | - | ||||
| 39 | - | func (*stubAccentHandler) OnKeyPressed(_ context.Context, _ rune, _ bool) bool { return false } | |||
| 40 | - | func (*stubAccentHandler) OnKeyReleased(_ context.Context, _ rune) {} | |||
M internal/infrastructure/webkit/messaging.go +10 -11
| @@ -7,6 +7,7 @@ import ( | |||
| 7 | 7 | "fmt" | |
| 8 | 8 | "sync" | |
| 9 | 9 | ||
| 10 | + | "github.com/bnema/dumber/internal/application/port" | |
| 10 | 11 | "github.com/bnema/dumber/internal/logging" | |
| 11 | 12 | "github.com/bnema/puregotk-webkit/javascriptcore" | |
| 12 | 13 | "github.com/bnema/puregotk-webkit/webkit" | |
| @@ -20,18 +21,13 @@ type Message struct { | |||
| 20 | 21 | WebViewIDAlt uint64 `json:"webviewId,omitempty"` | |
| 21 | 22 | } | |
| 22 | 23 | ||
| 23 | - | // MessageHandler handles a decoded message payload. | |
| 24 | - | type MessageHandler interface { | |
| 25 | - | Handle(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) | |
| 26 | - | } | |
| 27 | - | ||
| 28 | - | // MessageHandlerFunc adapts a function to the MessageHandler interface. | |
| 29 | - | type MessageHandlerFunc func(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) | |
| 24 | + | // MessageHandler is an alias for port.WebUIMessageHandler. | |
| 25 | + | // Kept for backward compatibility within the webkit package. | |
| 26 | + | type MessageHandler = port.WebUIMessageHandler | |
| 30 | 27 | ||
| 31 | - | // Handle calls f(ctx, webviewID, payload). | |
| 32 | - | func (f MessageHandlerFunc) Handle(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) { | |
| 33 | - | return f(ctx, webviewID, payload) | |
| 34 | - | } | |
| 28 | + | // MessageHandlerFunc is an alias for port.WebUIMessageHandlerFunc. | |
| 29 | + | // Kept for backward compatibility within the webkit package. | |
| 30 | + | type MessageHandlerFunc = port.WebUIMessageHandlerFunc | |
| 35 | 31 | ||
| 36 | 32 | type handlerEntry struct { | |
| 37 | 33 | handler MessageHandler | |
| @@ -40,6 +36,9 @@ type handlerEntry struct { | |||
| 40 | 36 | world string | |
| 41 | 37 | } | |
| 42 | 38 | ||
| 39 | + | // Compile-time check that MessageRouter implements port.WebUIHandlerRouter. | |
| 40 | + | var _ port.WebUIHandlerRouter = (*MessageRouter)(nil) | |
| 41 | + | ||
| 43 | 42 | // MessageRouter dispatches script-message events to registered handlers. | |
| 44 | 43 | type MessageRouter struct { | |
| 45 | 44 | handlers map[string]handlerEntry | |
| @@ -7,6 +7,7 @@ import ( | |||||
| 7 | "fmt" | 7 | "fmt" | ||
| 8 | "sync" | 8 | "sync" | ||
| 9 | 9 | ||||
| 10 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 10 | "github.com/bnema/dumber/internal/logging" | 11 | "github.com/bnema/dumber/internal/logging" | ||
| 11 | "github.com/bnema/puregotk-webkit/javascriptcore" | 12 | "github.com/bnema/puregotk-webkit/javascriptcore" | ||
| 12 | "github.com/bnema/puregotk-webkit/webkit" | 13 | "github.com/bnema/puregotk-webkit/webkit" | ||
| @@ -20,18 +21,13 @@ type Message struct { | |||||
| 20 | WebViewIDAlt uint64 `json:"webviewId,omitempty"` | 21 | WebViewIDAlt uint64 `json:"webviewId,omitempty"` | ||
| 21 | } | 22 | } | ||
| 22 | 23 | ||||
| 23 | - | // MessageHandler handles a decoded message payload. | 24 | + | // MessageHandler is an alias for port.WebUIMessageHandler. |
| 24 | - | type MessageHandler interface { | 25 | + | // Kept for backward compatibility within the webkit package. |
| 25 | - | Handle(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) | 26 | + | type MessageHandler = port.WebUIMessageHandler |
| 26 | - | } | |||
| 27 | - | ||||
| 28 | - | // MessageHandlerFunc adapts a function to the MessageHandler interface. | |||
| 29 | - | type MessageHandlerFunc func(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) | |||
| 30 | 27 | ||||
| 31 | - | // Handle calls f(ctx, webviewID, payload). | 28 | + | // MessageHandlerFunc is an alias for port.WebUIMessageHandlerFunc. |
| 32 | - | func (f MessageHandlerFunc) Handle(ctx context.Context, webviewID WebViewID, payload json.RawMessage) (any, error) { | 29 | + | // Kept for backward compatibility within the webkit package. |
| 33 | - | return f(ctx, webviewID, payload) | 30 | + | type MessageHandlerFunc = port.WebUIMessageHandlerFunc |
| 34 | - | } | |||
| 35 | 31 | ||||
| 36 | type handlerEntry struct { | 32 | type handlerEntry struct { | ||
| 37 | handler MessageHandler | 33 | handler MessageHandler | ||
| @@ -40,6 +36,9 @@ type handlerEntry struct { | |||||
| 40 | world string | 36 | world string | ||
| 41 | } | 37 | } | ||
| 42 | 38 | ||||
| 39 | + | // Compile-time check that MessageRouter implements port.WebUIHandlerRouter. | |||
| 40 | + | var _ port.WebUIHandlerRouter = (*MessageRouter)(nil) | |||
| 41 | + | ||||
| 43 | // MessageRouter dispatches script-message events to registered handlers. | 42 | // MessageRouter dispatches script-message events to registered handlers. | ||
| 44 | type MessageRouter struct { | 43 | type MessageRouter struct { | ||
| 45 | handlers map[string]handlerEntry | 44 | handlers map[string]handlerEntry | ||