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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
import { expect, test } from "bun:test";
import { bunEnv, bunExe } from "harness";
import path from "path";
test("worker", done => {
const worker = new Worker(new URL("worker-fixture.js", import.meta.url).href, {
smol: true,
});
expect(worker.threadId).toBe(1);
worker.postMessage("hello");
worker.onerror = e => {
done(e.error);
};
worker.onmessage = e => {
try {
expect(e.data).toEqual("initial message");
} catch (e) {
done(e);
} finally {
worker.terminate();
done();
}
worker.terminate();
done();
};
});
test("worker-env", done => {
const worker = new Worker(new URL("worker-fixture-env.js", import.meta.url).href, {
env: {
hello: "world",
another_key: 123 as any,
},
});
worker.postMessage("hello");
worker.onerror = e => {
done(e.error);
};
worker.onmessage = e => {
try {
expect(e.data).toEqual({
env: {
hello: "world",
another_key: "123",
},
hello: "world",
});
} catch (e) {
done(e);
} finally {
worker.terminate();
done();
}
};
});
test("worker-env with a lot of properties", done => {
const obj: any = {};
for (let i = 0; i < 1000; i++) {
obj["prop " + i] = Math.random().toString();
}
const worker = new Worker(new URL("worker-fixture-env.js", import.meta.url).href, {
env: obj,
});
worker.postMessage("hello");
worker.onerror = e => {
done(e.error);
};
worker.onmessage = e => {
try {
expect(e.data).toEqual({
env: obj,
hello: undefined,
});
} catch (e) {
done(e);
} finally {
worker.terminate();
done();
}
};
});
test("sending 50 messages should just work", done => {
const worker = new Worker(new URL("worker-fixture-many-messages.js", import.meta.url).href, {});
worker.postMessage("initial message");
worker.addEventListener("message", ({ data }) => {
if (data.done) {
worker.terminate();
done();
} else {
worker.postMessage({ i: data.i + 1 });
}
});
});
test("worker by default will not close the event loop", done => {
const x = Bun.spawn({
cmd: [bunExe(), path.join(import.meta.dir, "many-messages-event-loop.js")],
env: bunEnv,
stdio: ["inherit", "pipe", "inherit"],
});
const timer = setTimeout(() => {
x.kill();
done(new Error("timeout"));
}, 1000);
x.exited.then(async code => {
clearTimeout(timer);
if (code !== 0) {
done(new Error("exited with non-zero code"));
} else {
const text = await new Response(x.stdout).text();
if (text.includes("done")) {
console.log({ text });
done(new Error("event loop killed early"));
} else {
done();
}
}
});
});
|