-
-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathworker.ts
More file actions
40 lines (35 loc) · 1.2 KB
/
worker.ts
File metadata and controls
40 lines (35 loc) · 1.2 KB
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
/// <reference lib="WebWorker" />
import { startWorkerEnv } from "./worker-runtime";
import { generateRandomAppId } from "./app-id";
const pyodideUrl = "https://cdn.jsdelivr.net/pyodide/v0.29.3/full/pyodide.mjs";
if ("postMessage" in self) {
// Dedicated worker
self.onmessage = startWorkerEnv(pyodideUrl, (event, transfer) =>
transfer
? (self as DedicatedWorkerGlobalScope).postMessage(event, transfer)
: (self as DedicatedWorkerGlobalScope).postMessage(event),
);
} else {
// Shared worker
const existingAppIds: string[] = [];
(self as SharedWorkerGlobalScope).onconnect = (event: MessageEvent): void => {
// Generate app ID and ensure it's unique.
let appId: string;
do {
appId = generateRandomAppId(4);
} while (existingAppIds.includes(appId));
existingAppIds.push(appId);
console.debug("SharedWorker mode.", { appId });
const sharedWorkerPort = event.ports[0];
sharedWorkerPort.onmessage = startWorkerEnv(
pyodideUrl,
(event, transfer) =>
transfer
? sharedWorkerPort.postMessage(event, transfer)
: sharedWorkerPort.postMessage(event),
undefined,
appId,
);
sharedWorkerPort.start();
};
}