2022-03-20 08:56:28 +00:00
|
|
|
import { Worker } from "worker_threads";
|
2022-03-23 14:41:12 +00:00
|
|
|
import { safeRun } from "../util";
|
2022-03-20 08:56:28 +00:00
|
|
|
|
|
|
|
// @ts-ignore
|
2022-03-21 14:21:34 +00:00
|
|
|
import workerCode from "bundle-text:./node_worker.ts";
|
2022-03-23 14:41:12 +00:00
|
|
|
import { Sandbox } from "../sandbox";
|
|
|
|
import { WorkerLike } from "./worker";
|
2022-03-25 11:03:06 +00:00
|
|
|
import { Plug } from "../plug";
|
2022-03-20 08:56:28 +00:00
|
|
|
|
|
|
|
class NodeWorkerWrapper implements WorkerLike {
|
|
|
|
onMessage?: (message: any) => Promise<void>;
|
|
|
|
private worker: Worker;
|
2022-03-21 14:21:34 +00:00
|
|
|
ready: Promise<void>;
|
2022-03-20 08:56:28 +00:00
|
|
|
|
|
|
|
constructor(worker: Worker) {
|
|
|
|
this.worker = worker;
|
|
|
|
worker.on("message", (message: any) => {
|
|
|
|
safeRun(async () => {
|
|
|
|
await this.onMessage!(message);
|
|
|
|
});
|
|
|
|
});
|
2022-03-21 14:21:34 +00:00
|
|
|
this.ready = new Promise((resolve) => {
|
|
|
|
worker.once("online", resolve);
|
|
|
|
});
|
2022-03-20 08:56:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
postMessage(message: any): void {
|
|
|
|
this.worker.postMessage(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
terminate(): void {
|
|
|
|
this.worker.terminate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-25 11:03:06 +00:00
|
|
|
export function createSandbox(plug: Plug<any>) {
|
2022-03-21 14:21:34 +00:00
|
|
|
let worker = new Worker(workerCode, {
|
|
|
|
eval: true,
|
|
|
|
});
|
2022-03-20 08:56:28 +00:00
|
|
|
return new Sandbox(
|
2022-03-25 11:03:06 +00:00
|
|
|
plug,
|
2022-03-20 08:56:28 +00:00
|
|
|
new NodeWorkerWrapper(
|
|
|
|
new Worker(workerCode, {
|
|
|
|
eval: true,
|
|
|
|
})
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|