novy-syndicate/src/worker/index.ts

32 lines
1.1 KiB
TypeScript

import { Actor, Assertion, Turn } from '../runtime/actor.js';
import { Relay, spawnRelay } from '../transport/relay.js';
import { Worker } from 'worker_threads';
import { fromInstance, Instance } from '../gen/worker.js';
import path from 'path';
export function spawnWorker(t: Turn, moduleName: string, arg: Assertion) {
const w = new Worker(path.join(__dirname, 'wload.js'));
const reenable = t.activeFacet.preventInertCheck();
spawnRelay(t, {
packetWriter: bs => w.postMessage(bs),
setup(t: Turn, r: Relay) {
w.on('message', bs => r.accept(bs));
w.on('error', err => Turn.for(t.activeFacet, t => t.crash(err)));
w.on('exit', code => Turn.for(t.activeFacet, t => {
if (code === 0) {
t.stopActor();
} else {
t.crash(new Error(`Worker crashed with code ${code}`));
}
}));
},
initialOid: 0,
}).then(factory => {
reenable();
new Actor(t => t.assert(factory, fromInstance(Instance({
name: moduleName,
argument: arg,
}))));
});
}