Skip to content

Commit a64cef7

Browse files
committed
refactor: Use strategy pattern instead of case in webviewMessageHandler
1 parent c608392 commit a64cef7

27 files changed

+399
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { WebviewMessage } from "../../../shared/WebviewMessage"
2+
import { registerAutoApprovalHandler } from "./auto-approval"
3+
import { registerNotificationHandler } from "./notification"
4+
import { IWebviewMessageHandler, IWebviewMessageHandlerRegistry } from "./types"
5+
6+
/**
7+
* Singleton registry for managing webview message handlers
8+
* This class maintains a mapping of message types to their respective handlers
9+
*/
10+
export class WebviewMessageHandlerRegistry implements IWebviewMessageHandlerRegistry {
11+
private static instance: WebviewMessageHandlerRegistry
12+
private handlers: Map<WebviewMessage["type"], IWebviewMessageHandler> = new Map()
13+
14+
private constructor() {
15+
this.registerAllHandlers()
16+
}
17+
18+
/**
19+
* Get the singleton instance of the registry
20+
*/
21+
public static getInstance(): WebviewMessageHandlerRegistry {
22+
if (!WebviewMessageHandlerRegistry.instance) {
23+
WebviewMessageHandlerRegistry.instance = new WebviewMessageHandlerRegistry()
24+
}
25+
return WebviewMessageHandlerRegistry.instance
26+
}
27+
28+
/**
29+
* Register a handler for a specific message type
30+
* @param messageType The message type to handle
31+
* @param handler The handler instance
32+
*/
33+
public registerHandler(messageType: WebviewMessage["type"], handler: IWebviewMessageHandler): void {
34+
if (this.handlers.has(messageType)) {
35+
console.warn(`Handler for message type '${messageType}' is already registered. Overwriting.`)
36+
}
37+
this.handlers.set(messageType, handler)
38+
}
39+
40+
/**
41+
* Get a handler for a specific message type
42+
* @param messageType The message type
43+
* @returns The handler instance or undefined if not found
44+
*/
45+
public getHandler(messageType: WebviewMessage["type"]): IWebviewMessageHandler | undefined {
46+
return this.handlers.get(messageType)
47+
}
48+
49+
/**
50+
* Get all registered message types
51+
* @returns Array of registered message types
52+
*/
53+
public getRegisteredTypes(): WebviewMessage["type"][] {
54+
return Array.from(this.handlers.keys())
55+
}
56+
57+
/**
58+
* Check if a message type has a registered handler
59+
* @param messageType The message type to check
60+
* @returns True if handler exists, false otherwise
61+
*/
62+
public hasHandler(messageType: WebviewMessage["type"]): boolean {
63+
return this.handlers.has(messageType)
64+
}
65+
66+
/**
67+
* Register all handlers - this method will be expanded as handlers are created
68+
*/
69+
private registerAllHandlers(): void {
70+
registerAutoApprovalHandler(this)
71+
registerNotificationHandler(this)
72+
}
73+
74+
/**
75+
* Get registry statistics for debugging
76+
* @returns Object containing registry statistics
77+
*/
78+
public getStats(): { totalHandlers: number; registeredTypes: WebviewMessage["type"][] } {
79+
return {
80+
totalHandlers: this.handlers.size,
81+
registeredTypes: this.getRegisteredTypes(),
82+
}
83+
}
84+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AllowedMaxCostHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("allowedMaxCost", message.value)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AllowedMaxRequestsHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("allowedMaxRequests", message.value)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowBrowserHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowBrowser", message.bool ?? undefined)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowExecuteHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowExecute", message.bool ?? undefined)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowFollowupQuestionsHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowFollowupQuestions", message.bool ?? false)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowMcpHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowMcp", message.bool)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowModeSwitchHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowModeSwitch", message.bool)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowReadOnlyHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowReadOnly", message.bool ?? undefined)
8+
await provider.postStateToWebview()
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IWebviewMessageHandler } from "../types"
2+
import { ClineProvider } from "../../ClineProvider"
3+
import { WebviewMessage } from "../../../../shared/WebviewMessage"
4+
5+
export class AlwaysAllowReadOnlyOutsideWorkspaceHandler implements IWebviewMessageHandler {
6+
async handle(provider: ClineProvider, message: WebviewMessage): Promise<void> {
7+
await provider.contextProxy.setValue("alwaysAllowReadOnlyOutsideWorkspace", message.bool ?? undefined)
8+
await provider.postStateToWebview()
9+
}
10+
}

0 commit comments

Comments
 (0)