notebooks: stablize createRendererMessaging

Closes #123601
This commit is contained in:
Connor Peet
2021-07-19 15:18:13 -07:00
parent 5e7c82a05a
commit 7422b951b4
4 changed files with 72 additions and 51 deletions

View File

@@ -9,8 +9,9 @@ import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebo
import { ExtHostNotebookEditor } from 'vs/workbench/api/common/extHostNotebookEditor';
import * as vscode from 'vscode';
export class ExtHostNotebookRenderers implements ExtHostNotebookRenderersShape {
private readonly _rendererMessageEmitters = new Map<string /* rendererId */, Emitter<vscode.NotebookRendererMessage<any>>>();
private readonly _rendererMessageEmitters = new Map<string /* rendererId */, Emitter<vscode.NotebookRendererMessage>>();
private readonly proxy: MainThreadNotebookRenderersShape;
constructor(mainContext: IMainContext, private readonly _extHostNotebook: ExtHostNotebookController) {
@@ -22,12 +23,24 @@ export class ExtHostNotebookRenderers implements ExtHostNotebookRenderersShape {
this._rendererMessageEmitters.get(rendererId)?.fire({ editor: editor.apiEditor, message });
}
public createRendererMessaging<TSend, TRecv>(rendererId: string): vscode.NotebookRendererMessaging<TSend, TRecv> {
const messaging: vscode.NotebookRendererMessaging<TSend, TRecv> = {
onDidReceiveMessage: (...args) =>
this.getOrCreateEmitterFor(rendererId).event(...args),
postMessage: (editor, message) => {
const extHostEditor = ExtHostNotebookEditor.apiEditorsToExtHost.get(editor);
public createRendererMessaging(notebookEditorVisible: boolean, rendererId: string): vscode.NotebookRendererMessaging {
// In the stable API, the editor is given as an empty object, and this map
// is used to maintain references. This can be removed after editor finalization.
const notebookEditorAliases = new WeakMap<{}, vscode.NotebookEditor>();
const messaging: vscode.NotebookRendererMessaging = {
onDidReceiveMessage: (listener, thisArg, disposables) => {
const wrappedListener = notebookEditorVisible ? listener : (evt: vscode.NotebookRendererMessage) => {
const obj = {};
notebookEditorAliases.set(obj, evt.editor);
listener({ editor: obj as vscode.NotebookEditor, message: evt.message });
};
return this.getOrCreateEmitterFor(rendererId).event(wrappedListener, thisArg, disposables);
},
postMessage: (editorOrAlias, message) => {
const editor = notebookEditorVisible ? editorOrAlias : notebookEditorAliases.get(editorOrAlias);
const extHostEditor = editor && ExtHostNotebookEditor.apiEditorsToExtHost.get(editor);
if (!extHostEditor) {
throw new Error(`The first argument to postMessage() must be a NotebookEditor`);
}