-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrunner.js
43 lines (41 loc) · 1012 Bytes
/
runner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/** @type Worker */
// @ts-ignore make believe ctx is a Worker
const ctx = self;
/**
* @param {{
* data: {
* moduleUrl: string,
* test: string,
* result: string
* }
* }} param0
*/
ctx.onmessage = async ({ data }) => {
const module = await import(data.moduleUrl);
for (const symbol in module) {
// @ts-ignore TS doesn't like us assigning arbitrary properties to
// self/globalThis, but we don't have a better way yet 🤷
ctx[symbol] = module[symbol];
}
const { test, result } = data;
const [actual, expected] = await Promise.allSettled([
new Promise((resolve, reject) => {
try {
resolve(eval?.(test));
} catch (e) {
reject(e);
}
}),
new Promise((resolve, reject) => {
try {
const code = result.trim().startsWith("throw ")
? result
: `(${result})`;
resolve(eval?.(code));
} catch (e) {
reject(e);
}
}),
]);
ctx.postMessage({ actual, expected });
};