silverbullet/packages/plugos/environments/webworker_sandbox.ts

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));
}