Skip to content

Commit 7308e7a

Browse files
committed
isolate use of promise constructor
1 parent 3f1d5d9 commit 7308e7a

1 file changed

Lines changed: 42 additions & 39 deletions

File tree

src/dictionary/parallel_parser.ts

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,47 +23,50 @@ class ParserWorker {
2323
[Symbol.dispose]() {
2424
this.#worker.terminate();
2525
}
26-
parse(position: number, source: string): Promise<Dictionary> {
26+
#rawParse(position: number, source: string): Promise<Dictionary> {
27+
return new Promise((resolve, reject) => {
28+
const messageCallback = (event: MessageEvent) => {
29+
const result = event.data as Result;
30+
switch (result.type) {
31+
case "value":
32+
resolve(result.value);
33+
this.#cachedSource = source;
34+
this.#cachedDictionary = result.value;
35+
break;
36+
case "error":
37+
reject(
38+
new AggregateError(
39+
result.error.map((result) =>
40+
new PositionedError(result.message, {
41+
position: mapNullable(
42+
result.position,
43+
({ position: offsetPosition, length }) => ({
44+
position: position + offsetPosition,
45+
length,
46+
}),
47+
) ?? undefined,
48+
})
49+
),
50+
),
51+
);
52+
break;
53+
}
54+
this.#worker.removeEventListener("message", messageCallback);
55+
};
56+
this.#worker.addEventListener("message", messageCallback);
57+
const errorCallback = (event: ErrorEvent) => {
58+
reject(event.error);
59+
this.#worker.removeEventListener("error", errorCallback);
60+
};
61+
this.#worker.addEventListener("error", errorCallback);
62+
this.#worker.postMessage(source);
63+
});
64+
}
65+
async parse(position: number, source: string): Promise<Dictionary> {
2766
if (this.#cachedSource === source) {
28-
return Promise.resolve(this.#cachedDictionary);
67+
return this.#cachedDictionary;
2968
} else {
30-
return new Promise((resolve, reject) => {
31-
const messageCallback = (event: MessageEvent) => {
32-
const result = event.data as Result;
33-
switch (result.type) {
34-
case "value":
35-
resolve(result.value);
36-
this.#cachedSource = source;
37-
this.#cachedDictionary = result.value;
38-
break;
39-
case "error":
40-
reject(
41-
new AggregateError(
42-
result.error.map((result) =>
43-
new PositionedError(result.message, {
44-
position: mapNullable(
45-
result.position,
46-
({ position: offsetPosition, length }) => ({
47-
position: position + offsetPosition,
48-
length,
49-
}),
50-
) ?? undefined,
51-
})
52-
),
53-
),
54-
);
55-
break;
56-
}
57-
this.#worker.removeEventListener("message", messageCallback);
58-
};
59-
this.#worker.addEventListener("message", messageCallback);
60-
const errorCallback = (event: ErrorEvent) => {
61-
reject(event.error);
62-
this.#worker.removeEventListener("error", errorCallback);
63-
};
64-
this.#worker.addEventListener("error", errorCallback);
65-
this.#worker.postMessage(source);
66-
});
69+
return await this.#rawParse(position, source);
6770
}
6871
}
6972
}

0 commit comments

Comments
 (0)