UNPKG

multiprocessing

Version:
55 lines (50 loc) 1.28 kB
'use strict' const jsonUtils = require('./json-utils') const jobFns = {} const isPromise = obj => obj && typeof obj.then === 'function' function processData(argList, jobId, index) { function sendErr(err) { process.send({ jobId: jobId, error: err.message, stack: err.stack }) } function sendSucess(res, offset) { process.send({ jobId : jobId, index : index + offset, result : jsonUtils.safeStringify(res), jobDone : offset === argList.length - 1 }) } function handlePromise(promise, offset) { return promise.then(res => sendSucess(res, offset), sendErr) } try { const fn = jobFns[jobId] argList.forEach((args, offset) => { const res = fn(args) return isPromise(res) ? handlePromise(res, offset) : sendSucess(res, offset) }) } catch (err) { return sendErr(err) } } process.on('message', data => { if (data.argList) { processData(jsonUtils.safeParse(data.argList), data.jobId, data.index) } if (data.deregisterJob) { delete jobFns[data.jobId] return } if (data.modulePath) { jobFns[data.jobId] = require(data.modulePath) } if (data.fnStr) { let fn eval('fn =' + data.fnStr) // eslint-disable-line jobFns[data.jobId] = fn } })