Skip to content

Commit 1686678

Browse files
refactor: use awaitable post to pass messages (#388)
1 parent 8357029 commit 1686678

4 files changed

Lines changed: 20 additions & 40 deletions

File tree

packages/dom-evaluator/src/dom-test-evaluator.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,18 @@ ${rawTest}`);
196196
async handleMessage(
197197
e: CodeEvent | TestEvent | InitEvent<InitTestFrameOptions>,
198198
): Promise<void> {
199+
const respond = (msg: unknown) => e.ports[0].postMessage(msg);
199200
if (e.data.type === "test") {
200201
const result = await this.#runTest!(e.data.value);
201202
const msg = { type: "result" as const, value: result };
202-
postCloneableMessage((msg) => e.ports[0].postMessage(msg), msg);
203+
postCloneableMessage(respond, msg);
203204
} else if (e.data.type === "init") {
204205
await this.init(e.data.value);
205-
self.parent.postMessage(READY_MESSAGE, "*");
206+
respond(READY_MESSAGE);
206207
} else if (e.data.type === "code") {
207208
// This is used to run arbitrary non-test code, such as the afterAll hook.
208209
await this.runCode(e.data.value);
209-
e.ports[0].postMessage({ type: "code" });
210+
respond({ type: "code" });
210211
}
211212
}
212213
}

packages/javascript-evaluator/src/javascript-test-evaluator.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,18 @@ ${test};`);
121121
async handleMessage(
122122
e: TestEvent | InitEvent<InitWorkerOptions> | CodeEvent,
123123
): Promise<void> {
124+
const respond = (msg: unknown) => e.ports[0].postMessage(msg);
124125
if (e.data.type === "test") {
125126
const result = await this.#runTest!(e.data.value);
126127
const msg = { type: "result" as const, value: result };
127-
postCloneableMessage((msg) => e.ports[0].postMessage(msg), msg);
128+
postCloneableMessage(respond, msg);
128129
} else if (e.data.type === "init") {
129130
this.init(e.data.value);
130-
postMessage(READY_MESSAGE);
131+
respond(READY_MESSAGE);
131132
} else if (e.data.type === "code") {
132133
// This is used to run arbitrary non-test code, such as the afterAll hook.
133134
await this.runCode(e.data.value);
134-
e.ports[0].postMessage({ type: "code" });
135+
respond({ type: "code" });
135136
}
136137
}
137138
}

packages/main/src/test-runner.ts

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ReadyEvent } from "../../shared/src/interfaces/test-runner";
21
import type {
32
InitEvent,
43
TestEvent,
@@ -123,28 +122,15 @@ ${opts.source}`;
123122
document.body.appendChild(this.#testEvaluator);
124123
await isReady;
125124

126-
const isInitialized = new Promise((resolve) => {
127-
const listener = (event: ReadyEvent) => {
128-
if (
129-
event.origin === "null" &&
130-
event.source === this.#testEvaluator.contentWindow &&
131-
event.data.type === "ready"
132-
) {
133-
window.removeEventListener("message", listener);
134-
resolve(true);
135-
}
136-
};
137-
138-
window.addEventListener("message", listener);
139-
});
140-
141125
const msg: InitEvent<InitTestFrameOptions>["data"] = {
142126
type: "init",
143127
value: opts,
144128
};
145-
this.#testEvaluator.contentWindow?.postMessage(msg, "*");
146129

147-
await isInitialized;
130+
await post({
131+
messenger: this.#testEvaluator.contentWindow!,
132+
message: msg,
133+
});
148134
}
149135

150136
runTest(test: string) {
@@ -208,23 +194,14 @@ export class WorkerTestRunner implements Runner {
208194

209195
async init(opts: InitWorkerOptions) {
210196
this.#opts = opts;
211-
const isInitialized = new Promise((resolve) => {
212-
const listener = (event: ReadyEvent) => {
213-
if (event.data.type === "ready") {
214-
this.#testEvaluator.removeEventListener("message", listener);
215-
resolve(true);
216-
}
217-
};
218-
219-
this.#testEvaluator.addEventListener("message", listener);
220-
});
221-
222197
const msg: InitEvent<InitWorkerOptions>["data"] = {
223198
type: "init",
224199
value: opts,
225200
};
226-
this.#testEvaluator.postMessage(msg);
227-
await isInitialized;
201+
await post({
202+
messenger: this.#testEvaluator,
203+
message: msg,
204+
});
228205
}
229206

230207
async #recreateRunner() {

packages/python-evaluator/src/python-test-evaluator.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,17 +230,18 @@ class PythonTestEvaluator implements TestEvaluator {
230230
async handleMessage(
231231
e: TestEvent | InitEvent<InitWorkerOptions> | CodeEvent,
232232
): Promise<void> {
233+
const respond = (msg: unknown) => e.ports[0].postMessage(msg);
233234
if (e.data.type === "test") {
234235
const result = await this.#runTest!(e.data.value);
235236
const msg = { type: "result" as const, value: result };
236-
postCloneableMessage((msg) => e.ports[0].postMessage(msg), msg);
237+
postCloneableMessage(respond, msg);
237238
} else if (e.data.type === "init") {
238239
await this.init(e.data.value);
239-
postMessage(READY_MESSAGE);
240+
respond(READY_MESSAGE);
240241
} else if (e.data.type === "code") {
241242
// This is used to run arbitrary non-test code, such as the afterAll hook.
242243
await this.runCode(e.data.value);
243-
e.ports[0].postMessage({ type: "code" });
244+
respond({ type: "code" });
244245
}
245246
}
246247
}

0 commit comments

Comments
 (0)