11import * as http from "http"
2+ import * as vscode from "vscode"
23import { Logger } from "../../services/logging/Logger"
34import { WebviewProvider } from "../../core/webview"
45
56let 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