39 lines
939 B
TypeScript
39 lines
939 B
TypeScript
import { safeRun } from "../util";
|
|
import { Sandbox } from "../sandbox";
|
|
import { WorkerLike } from "./worker";
|
|
import { Plug } from "../plug";
|
|
|
|
class WebWorkerWrapper implements WorkerLike {
|
|
private worker: Worker;
|
|
onMessage?: (message: any) => Promise<void>;
|
|
ready: Promise<void>;
|
|
|
|
constructor(worker: Worker) {
|
|
this.worker = worker;
|
|
this.worker.addEventListener("message", (evt: any) => {
|
|
let data = evt.data;
|
|
if (!data) return;
|
|
safeRun(async () => {
|
|
await this.onMessage!(data);
|
|
});
|
|
});
|
|
this.ready = Promise.resolve();
|
|
}
|
|
postMessage(message: any): void {
|
|
this.worker.postMessage(message);
|
|
}
|
|
|
|
terminate() {
|
|
return this.worker.terminate();
|
|
}
|
|
}
|
|
|
|
// @ts-ignore
|
|
import SandboxWorker from "web-worker:./sandbox_worker";
|
|
|
|
export function createSandbox(plug: Plug<any>) {
|
|
let worker = new SandboxWorker();
|
|
|
|
return new Sandbox(plug, new WebWorkerWrapper(worker));
|
|
}
|