import cp from 'child_process' import { Request } from './Task' export interface Executor { execute(task: Request): Promise } export type ExecutorFactory = () => Executor export class PromiseExecutor implements Executor { constructor(readonly execute: (task: Request) => Promise) {} } export class SubprocessExecutor implements Executor { process: cp.ChildProcess constructor(protected sourceFile: string) { this.process = cp.fork(sourceFile) } async execute(task: Request): Promise { return new Promise((resolve, reject) => { this.process.once('response_' + task.id, message => { if (message.error) { reject(message.error) } else { resolve(message.result) } }) this.process!.send(task) }) } shutdown() { this.process.kill('SIGKILL') } }