diff --git a/lib/index.js b/lib/index.js index dd0e1a8e9234ec8d37746967e5be467fd9a44ae5..0c0b473c780c31e63bd041d0e66183f10a98d6f4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -29,8 +29,18 @@ var Worker = (function () { }); this.child.on("message", function (msg) { - if (_this.onmessage) { - _this.onmessage.call(_this, JSON.parse(msg)); + var message = JSON.parse(msg); + var error = undefined; + + if (!message.error && _this.onmessage) { + _this.onmessage.call(_this, message); + } + + if (message.error && _this.onerror) { + error = new Error(message.error); + error.stack = message.stack; + + _this.onerror.call(_this, error); } }); diff --git a/lib/worker.js b/lib/worker.js index c1cf153c7a9f0441cb1bde6c56c0f074420c2c10..71addb117b8fb17d08d530a8e22d9b1a228616ea 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -33,7 +33,9 @@ process.once("message", function (obj) { process.send(JSON.stringify({ data: msg })); }, onmessage: void 0, - onerror: void 0, + onerror: function onerror(err) { + process.send(JSON.stringify({ error: err.message, stack: err.stack })); + }, addEventListener: function addEventListener(event, fn) { if (events.test(event)) { global["on" + event] = global.self["on" + event] = fn; @@ -66,7 +68,11 @@ process.once("message", function (obj) { }); process.on("message", function (msg) { - (global.onmessage || global.self.onmessage || noop)(JSON.parse(msg)); + try { + (global.onmessage || global.self.onmessage || noop)(JSON.parse(msg)); + } catch (err) { + (global.onerror || global.self.onerror || noop)(err); + } }); process.on("error", function (err) { diff --git a/package.json b/package.json index 5e83914b49238824161885c1116cf622f6207206..9ecc360b02070d202dc563312cd0f99ee2a5dec1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tiny-worker", - "version": "1.1.6", + "version": "1.1.7", "description": "Tiny WebWorker for Server", "main": "lib/index.js", "scripts": { diff --git a/src/index.js b/src/index.js index e5328367c8992e030bff0d7108061e470b4892ff..dd53ae5e330d682d1b1ea0b69e68f2d1eb384048 100644 --- a/src/index.js +++ b/src/index.js @@ -19,8 +19,18 @@ class Worker { }); this.child.on("message", msg => { - if (this.onmessage) { - this.onmessage.call(this, JSON.parse(msg)); + const message = JSON.parse(msg); + let error; + + if (!message.error && this.onmessage) { + this.onmessage.call(this, message); + } + + if (message.error && this.onerror) { + error = new Error(message.error); + error.stack = message.stack; + + this.onerror.call(this, error); } }); diff --git a/src/worker.js b/src/worker.js index bba70e55b1116a1b8e4d3e7b0b980bec92968899..0219f9927c74d03178ef8e281a39fd01804b33f7 100644 --- a/src/worker.js +++ b/src/worker.js @@ -21,7 +21,7 @@ function toFunction (arg) { // Bootstraps the Worker process.once("message", obj => { - let exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8"); + const exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8"); global.self = { close: () => { @@ -31,7 +31,9 @@ process.once("message", obj => { process.send(JSON.stringify({data: msg})); }, onmessage: void 0, - onerror: void 0, + onerror: err => { + process.send(JSON.stringify({error: err.message, stack: err.stack})); + }, addEventListener: (event, fn) => { if (events.test(event)) { global["on" + event] = global.self["on" + event] = fn; @@ -60,7 +62,11 @@ process.once("message", obj => { }); process.on("message", msg => { - (global.onmessage || global.self.onmessage || noop)(JSON.parse(msg)); + try { + (global.onmessage || global.self.onmessage || noop)(JSON.parse(msg)); + } catch (err) { + (global.onerror || global.self.onerror || noop)(err); + } }); process.on("error", err => { diff --git a/test/worker_test.js b/test/worker_test.js index b793bc603cfd41d6f103f5aff9d0059e0e0190f8..7a8346f81f265d1b9f598197756ff50338a02fb5 100644 --- a/test/worker_test.js +++ b/test/worker_test.js @@ -53,6 +53,36 @@ exports["inline script"] = { } }; +exports["inline script - error"] = { + setUp: function (done) { + this.worker = new Worker(function () { + self.onmessage = function (ev) { + throw new Error(ev.data); + }; + }); + this.msg = "Something went wrong"; + this.response = ""; + + done(); + }, + test: function (test) { + var self = this; + + test.expect(3); + test.notEqual(this.msg, this.response, "Should not match"); + + this.worker.onerror = function (err) { + self.response = err.message; + self.worker.terminate(); + test.equal(self.msg, self.response, "Should be a match"); + test.notEqual(err.stack, undefined, "Should not be a match"); + test.done(); + }; + + this.worker.postMessage(this.msg); + } +}; + exports["inline script - require"] = { setUp: function (done) { this.worker = new Worker(function () {