Skip to content

Instantly share code, notes, and snippets.

@LorisSigrist
Last active July 3, 2024 13:50
Show Gist options
  • Save LorisSigrist/cb2c263df64382cd04229c93bea4214d to your computer and use it in GitHub Desktop.
Save LorisSigrist/cb2c263df64382cd04229c93bea4214d to your computer and use it in GitHub Desktop.
VsCode WebView to Comlink Endpoint
import * as vscode from "vscode"
import * as Comlink from "comlink"
type MessageEvent = Parameters<typeof listener>[0]
function webviewEndpoint(webview: vscode.Webview): Comlink.Endpoint {
const listeners = new Map<any, vscode.Disposable>()
return {
// NO OWNERSHIPT TRANSFERS POSSIBLE
postMessage(message) {
webview.postMessage(message)
},
// we just assume the "type" is always "message". Comlink also does this with the node adapter
addEventListener(_, listener) {
const disposeable = webview.onDidReceiveMessage((data) => {
if ("handleEvent" in listener) {
listener.handleEvent({ data } as MessageEvent)
} else {
listener({ data } as MessageEvent)
}
})
listeners.set(listener, disposeable)
},
removeEventListener(_, listener) {
const disposeable = listeners.get(listener)
if (disposeable) {
disposeable.dispose()
listeners.delete(listener)
}
},
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment