Last active
July 3, 2024 13:50
-
-
Save LorisSigrist/cb2c263df64382cd04229c93bea4214d to your computer and use it in GitHub Desktop.
VsCode WebView to Comlink Endpoint
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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