[id: string]: any;
}
let workers: WorkerMap = {};
+let dyingWorkerQueue: WorkerMap = {};
Object.defineProperty(global, 'serviceType', {
value: wrt.getServiceModel(),
writable: false
});
+function checkDyingWorker() {
+ let dyingWorkers = Object.keys(dyingWorkerQueue);
+ if (dyingWorkers.length) {
+ let workerId = dyingWorkers[0];
+ if (dyingWorkerQueue[workerId] === 'will-terminate') {
+ dyingWorkerQueue[workerId] = 'terminated';
+ workers[workerId].terminate();
+ }
+ }
+}
+
function createWorker(id: string, startService: string, filename: string) {
if (workers[id]) {
workers[id].postMessage({ type: 'wake' });
});
workers[id].on('message', (message: string) => {
if (message === 'will-terminate') {
- workers[id].terminate();
+ dyingWorkerQueue[id] = message;
+ checkDyingWorker();
}
});
workers[id].on('exit', (code: number) => {
wrt.tv?.serviceUmount(id);
+ delete dyingWorkerQueue[id];
delete workers[id];
let runningServices = Object.keys(workers);
- console.debug(`exit code(${code}), remain services(${runningServices})`);
+ console.debug(`${id} terminated, remain services(${runningServices})`);
+ checkDyingWorker();
});
}