Skip to content

Commit 0645ecc

Browse files
authored
Message catching added to test server (RooCodeInc#2797)
* added message catching to test server * added message catching to test server * fixing logger initialization * fixed race condition * adding logging * removed redundant if condition
1 parent 3a6f0c2 commit 0645ecc

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

src/extension.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ export function activate(context: vscode.ExtensionContext) {
397397
}),
398398
)
399399

400+
// Set up test server if in test mode
401+
if (IS_TEST === "true") {
402+
createTestServer(sidebarWebview)
403+
}
404+
400405
return createClineAPI(outputChannel, sidebarWebview.controller)
401406
}
402407

@@ -428,8 +433,3 @@ if (IS_DEV && IS_DEV !== "false") {
428433
vscode.commands.executeCommand("workbench.action.reloadWindow")
429434
})
430435
}
431-
432-
// Set up test server if in test mode
433-
if (IS_TEST && IS_TEST === "true") {
434-
createTestServer()
435-
}

src/services/test/TestServer.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import * as http from "http"
2+
import * as vscode from "vscode"
23
import { Logger } from "../../services/logging/Logger"
34
import { WebviewProvider } from "../../core/webview"
45

56
let testServer: http.Server | undefined
7+
let messageCatcherDisposable: vscode.Disposable | undefined
68

79
/**
810
* Creates and starts an HTTP server for test automation
11+
* @param webviewProvider The webview provider instance to use for message catching
912
* @returns The created HTTP server instance
1013
*/
11-
export function createTestServer(): http.Server {
14+
export function createTestServer(webviewProvider?: WebviewProvider): http.Server {
1215
const PORT = 9876
1316

1417
testServer = http.createServer((req, res) => {
@@ -97,9 +100,45 @@ export function createTestServer(): http.Server {
97100
Logger.log(`Test server error: ${error}`)
98101
})
99102

103+
// Set up message catcher for the provided webview instance or try to get the visible one
104+
if (webviewProvider) {
105+
messageCatcherDisposable = createMessageCatcher(webviewProvider)
106+
} else {
107+
const visibleWebview = WebviewProvider.getVisibleInstance()
108+
if (visibleWebview) {
109+
messageCatcherDisposable = createMessageCatcher(visibleWebview)
110+
} else {
111+
Logger.log("No visible webview instance found for message catcher")
112+
}
113+
}
114+
100115
return testServer
101116
}
102117

118+
/**
119+
* Creates a message catcher that logs all messages sent to the webview
120+
* @param webviewProvider The webview provider instance
121+
* @returns A disposable that can be used to clean up the message catcher
122+
*/
123+
export function createMessageCatcher(webviewProvider: WebviewProvider): vscode.Disposable {
124+
Logger.log("Cline message catcher registered")
125+
126+
if (webviewProvider && webviewProvider.controller) {
127+
const originalPostMessageToWebview = webviewProvider.controller.postMessageToWebview
128+
webviewProvider.controller.postMessageToWebview = async (message) => {
129+
Logger.log("Cline message received: " + message.type)
130+
return originalPostMessageToWebview.call(webviewProvider.controller, message)
131+
}
132+
} else {
133+
Logger.log("No visible webview instance found for message catcher")
134+
}
135+
136+
return new vscode.Disposable(() => {
137+
// Cleanup function if needed
138+
Logger.log("Cline message catcher disposed")
139+
})
140+
}
141+
103142
/**
104143
* Shuts down the test server if it exists
105144
*/
@@ -109,4 +148,10 @@ export function shutdownTestServer() {
109148
Logger.log("Test server shut down")
110149
testServer = undefined
111150
}
151+
152+
// Dispose of the message catcher if it exists
153+
if (messageCatcherDisposable) {
154+
messageCatcherDisposable.dispose()
155+
messageCatcherDisposable = undefined
156+
}
112157
}

0 commit comments

Comments
 (0)