Skip to content

Commit a4495aa

Browse files
authored
Monaco editor webworker fixes (microsoft#254951)
1 parent bd8ade5 commit a4495aa

File tree

6 files changed

+45
-27
lines changed

6 files changed

+45
-27
lines changed

src/vs/base/browser/webWorkerFactory.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,14 @@ class WebWorker extends Disposable implements IWebWorker {
129129
private readonly _onError = this._register(new Emitter<any>());
130130
public readonly onError = this._onError.event;
131131

132-
constructor(descriptorOrWorker: IWebWorkerDescriptor | Worker) {
132+
constructor(descriptorOrWorker: IWebWorkerDescriptor | Worker | Promise<Worker>) {
133133
super();
134134
this.id = ++WebWorker.LAST_WORKER_ID;
135135
const workerOrPromise = (
136136
descriptorOrWorker instanceof Worker
137-
? descriptorOrWorker
138-
: getWorker(descriptorOrWorker, this.id)
137+
? descriptorOrWorker :
138+
'then' in descriptorOrWorker ? descriptorOrWorker
139+
: getWorker(descriptorOrWorker, this.id)
139140
);
140141
if (isPromiseLike(workerOrPromise)) {
141142
this.worker = workerOrPromise;
@@ -197,8 +198,8 @@ export class WebWorkerDescriptor implements IWebWorkerDescriptor {
197198
}
198199

199200
export function createWebWorker<T extends object>(esmModuleLocation: URI, label: string | undefined): IWebWorkerClient<T>;
200-
export function createWebWorker<T extends object>(workerDescriptor: IWebWorkerDescriptor | Worker): IWebWorkerClient<T>;
201-
export function createWebWorker<T extends object>(arg0: URI | IWebWorkerDescriptor | Worker, arg1?: string | undefined): IWebWorkerClient<T> {
201+
export function createWebWorker<T extends object>(workerDescriptor: IWebWorkerDescriptor | Worker | Promise<Worker>): IWebWorkerClient<T>;
202+
export function createWebWorker<T extends object>(arg0: URI | IWebWorkerDescriptor | Worker | Promise<Worker>, arg1?: string | undefined): IWebWorkerClient<T> {
202203
const workerDescriptorOrWorker = (URI.isUri(arg0) ? new WebWorkerDescriptor(arg0, arg1) : arg0);
203204
return new WebWorkerClient<T>(new WebWorker(workerDescriptorOrWorker));
204205
}

src/vs/editor/browser/services/editorWorkerService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ export class EditorWorkerClient extends Disposable implements IEditorWorkerClien
427427
private _disposed = false;
428428

429429
constructor(
430-
private readonly _workerDescriptorOrWorker: IWebWorkerDescriptor | Worker,
430+
private readonly _workerDescriptorOrWorker: IWebWorkerDescriptor | Worker | Promise<Worker>,
431431
keepIdleModels: boolean,
432432
@IModelService modelService: IModelService,
433433
) {

src/vs/editor/common/services/editorWebWorker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export interface IMirrorModel extends IMirrorTextModel {
3838
getValue(): string;
3939
}
4040

41-
export interface IWorkerContext<H = undefined> {
41+
export interface IWorkerContext<H = {}> {
4242
/**
4343
* A proxy to the main thread host object.
4444
*/

src/vs/editor/editor.worker.start.ts

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,37 @@ import { EditorWorkerHost } from './common/services/editorWorkerHost.js';
1212
* @skipMangle
1313
* @internal
1414
*/
15-
export function start<THost extends object, TClient extends object>(client: TClient): IWorkerContext<THost> {
16-
const webWorkerServer = initialize(() => new EditorWorker(client));
17-
const editorWorkerHost = EditorWorkerHost.getChannel(webWorkerServer);
18-
const host = new Proxy({}, {
19-
get(target, prop, receiver) {
20-
if (typeof prop !== 'string') {
21-
throw new Error(`Not supported`);
15+
export function start<THost extends object, TClient extends object>(createClient: (ctx: IWorkerContext<THost>) => TClient): TClient {
16+
let client: TClient | undefined;
17+
const webWorkerServer = initialize((workerServer) => {
18+
const editorWorkerHost = EditorWorkerHost.getChannel(workerServer);
19+
20+
const host = new Proxy({}, {
21+
get(target, prop, receiver) {
22+
if (prop === 'then') {
23+
// Don't forward the call when the proxy is returned in an async function and the runtime tries to .then it.
24+
return undefined;
25+
}
26+
if (typeof prop !== 'string') {
27+
throw new Error(`Not supported`);
28+
}
29+
return (...args: unknown[]) => {
30+
return editorWorkerHost.$fhr(prop, args);
31+
};
32+
}
33+
});
34+
35+
const ctx: IWorkerContext<THost> = {
36+
host: host as THost,
37+
getMirrorModels: () => {
38+
return webWorkerServer.requestHandler.getModels();
2239
}
23-
return (...args: unknown[]) => {
24-
return editorWorkerHost.$fhr(prop, args);
25-
};
26-
}
40+
};
41+
42+
client = createClient(ctx);
43+
44+
return new EditorWorker(client);
2745
});
2846

29-
return {
30-
host: host as THost,
31-
getMirrorModels: () => {
32-
return webWorkerServer.requestHandler.getModels();
33-
}
34-
};
47+
return client!;
3548
}

src/vs/editor/standalone/browser/standaloneWebWorker.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export interface IInternalWebWorkerOptions {
3838
/**
3939
* The worker.
4040
*/
41-
worker: Worker;
41+
worker: Worker | Promise<Worker>;
4242
/**
4343
* An object that can be used by the web worker to make calls back to the main thread.
4444
*/
@@ -61,6 +61,10 @@ class MonacoWebWorkerImpl<T extends object> extends EditorWorkerClient implement
6161
this._foreignProxy = this._getProxy().then(proxy => {
6262
return new Proxy({}, {
6363
get(target, prop, receiver) {
64+
if (prop === 'then') {
65+
// Don't forward the call when the proxy is returned in an async function and the runtime tries to .then it.
66+
return undefined;
67+
}
6468
if (typeof prop !== 'string') {
6569
throw new Error(`Not supported`);
6670
}

src/vs/monaco.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,7 @@ declare namespace monaco.editor {
12231223
/**
12241224
* The worker.
12251225
*/
1226-
worker: Worker;
1226+
worker: Worker | Promise<Worker>;
12271227
/**
12281228
* An object that can be used by the web worker to make calls back to the main thread.
12291229
*/
@@ -8542,7 +8542,7 @@ declare namespace monaco.worker {
85428542
getValue(): string;
85438543
}
85448544

8545-
export interface IWorkerContext<H = undefined> {
8545+
export interface IWorkerContext<H = {}> {
85468546
/**
85478547
* A proxy to the main thread host object.
85488548
*/

0 commit comments

Comments
 (0)