提交 1fb86647 编写于 作者: J Johannes Rieken

support nested worker when running without iframe

上级 4dce6723
......@@ -30,6 +30,7 @@ import { canceled, onUnexpectedError } from 'vs/base/common/errors';
import { Barrier } from 'vs/base/common/async';
import { FileAccess } from 'vs/base/common/network';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
import { NewWorkerMessage, TerminateWorkerMessage } from 'vs/workbench/services/extensions/common/polyfillNestedWorker.protocol';
export interface IWebWorkerExtensionHostInitData {
readonly autoStart: boolean;
......@@ -224,15 +225,42 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
const barrier = new Barrier();
let port!: MessagePort;
const nestedWorker = new Map<string, Worker>();
worker.onmessage = (event) => {
const { data } = event;
if (barrier.isOpen() || !(data instanceof MessagePort)) {
const data: MessagePort | NewWorkerMessage | TerminateWorkerMessage = event.data;
if (data instanceof MessagePort) {
// receiving a message port which is used to communicate
// with the web worker extension host
if (barrier.isOpen()) {
console.warn('UNEXPECTED message', event);
this._onDidExit.fire([ExtensionHostExitCode.UnexpectedError, 'received a message port AFTER opening the barrier']);
return;
}
port = data;
barrier.open();
} else if (data?.type === '_newWorker') {
// receiving a message to create a new nested/child worker
const worker = new Worker(data.url, data.options);
worker.postMessage(data.port, [data.port]);
nestedWorker.set(data.id, worker);
} else if (data?.type === '_terminateWorker') {
// receiving a message to terminate nested/child worker
if (nestedWorker.has(data.id)) {
nestedWorker.get(data.id)!.terminate();
nestedWorker.delete(data.id);
}
} else {
// all other messages are an error
console.warn('UNEXPECTED message', event);
this._onDidExit.fire([ExtensionHostExitCode.UnexpectedError, 'UNEXPECTED message']);
return;
}
port = data;
barrier.open();
};
// await MessagePort and use it to directly communicate
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export interface NewWorkerMessage {
type: '_newWorker';
id: string;
port: MessagePort;
url: string;
options: WorkerOptions | undefined
}
export interface TerminateWorkerMessage {
type: '_terminateWorker';
id: string;
}
......@@ -3,6 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { NewWorkerMessage, TerminateWorkerMessage } from 'vs/workbench/services/extensions/common/polyfillNestedWorker.protocol';
declare function postMessage(data: any, transferables?: Transferable[]): void;
......@@ -53,19 +54,6 @@ const _bootstrapFnSource = (function _bootstrapFn(workerUrl: string) {
}).toString();
interface NewWorkerMessage {
type: '_newWorker';
id: string;
port: MessagePort;
url: string;
options: WorkerOptions | undefined
}
interface TerminateWorkerMessage {
type: '_terminateWorker';
id: string;
}
export class NestedWorker extends EventTarget implements Worker {
onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null = null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册