diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index dc60b6ab909..61af6759cb5 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -102,6 +102,7 @@ export interface MessagePortLike { postMessage(message: any, transfer?: any[]): void; addEventListener(type: 'message', listener: (e: any) => any): void; removeEventListener(type: 'message', listener: (e: any) => any): void; + start(): void; } export interface IInitData { diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index aae769dac6b..8586be14a72 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -424,6 +424,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const that = this; let extension: vscode.Extension | undefined; + let messagePassingProtocol: vscode.MessagePassingProtocol | undefined; const messagePort = isProposedApiEnabled(extensionDescription, 'ipc') ? this._initData.messagePorts?.get(ExtensionIdentifier.toKey(extensionDescription.identifier)) : undefined; @@ -454,9 +455,21 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme return that.extensionRuntime; }, get environmentVariableCollection() { return that._extHostTerminalService.getEnvironmentVariableCollection(extensionDescription); }, - messagePassingProtocol: messagePort && { - onDidReceiveMessage: Event.fromDOMEventEmitter(messagePort, 'message', e => e.data), - postMessage: messagePort.postMessage.bind(messagePort) as any + get messagePassingProtocol() { + if (!messagePassingProtocol) { + if (!messagePort) { + return undefined; + } + + const onDidReceiveMessage = Event.buffer(Event.fromDOMEventEmitter(messagePort, 'message', e => e.data)); + messagePort.start(); + messagePassingProtocol = { + onDidReceiveMessage, + postMessage: messagePort.postMessage.bind(messagePort) as any + }; + } + + return messagePassingProtocol; } }); });