diff --git a/src/WorkerError.js b/src/WorkerError.js new file mode 100644 index 0000000..e2b9607 --- /dev/null +++ b/src/WorkerError.js @@ -0,0 +1,31 @@ +const stack = (err, worker, workerId) => { + const originError = err.stack + .split('\n') + .filter(line => line.trim().startsWith('at')); + + const workerError = worker + .split('\n') + .filter(line => line.trim().startsWith('at')); + + const diff = workerError.slice(0, workerError.length - originError.length).join('\n'); + + originError.unshift(diff); + originError.unshift(err.message); + originError.unshift(`Thread Loader (Worker ${workerId})`); + + return originError.join('\n'); +}; + +class WorkerError extends Error { + constructor(err, workerId) { + super(err); + this.name = err.name; + this.message = err.message; + + Error.captureStackTrace(this, this.constructor); + + this.stack = stack(err, this.stack, workerId); + } +} + +export default WorkerError; diff --git a/src/WorkerPool.js b/src/WorkerPool.js index 17bb761..0fd4406 100644 --- a/src/WorkerPool.js +++ b/src/WorkerPool.js @@ -4,6 +4,7 @@ import childProcess from 'child_process'; import asyncQueue from 'async/queue'; import asyncMapSeries from 'async/mapSeries'; import readBuffer from './readBuffer'; +import WorkerError from './WorkerError'; const workerPath = require.resolve('./worker'); @@ -183,14 +184,7 @@ class PoolWorker { } else { obj = arg; } - const err = new Error(obj.message); - err.message = obj.message; - if (obj.stack) { - err.stack = `${obj.stack}\n\tfrom thread-loader (worker ${this.id})\n${err.stack}`; - } - err.hideStack = obj.hideStack; - err.details = obj.details; - return err; + return new WorkerError(obj, this.id); } readBuffer(length, callback) { @@ -272,4 +266,3 @@ export default class WorkerPool { } } } -