From ffe8681c27c661caadec8d0f532493d154414758 Mon Sep 17 00:00:00 2001
From: Jason Mulligan <jason.mulligan@avoidwork.com>
Date: Mon, 3 Oct 2016 08:16:57 -0400
Subject: [PATCH] Adding default error handling for throws within inline
 scripts, fixes #4

---
 lib/index.js        | 14 ++++++++++++--
 lib/worker.js       | 10 ++++++++--
 package.json        |  2 +-
 src/index.js        | 14 ++++++++++++--
 src/worker.js       | 12 +++++++++---
 test/worker_test.js | 30 ++++++++++++++++++++++++++++++
 6 files changed, 72 insertions(+), 10 deletions(-)

diff --git a/lib/index.js b/lib/index.js
index dd0e1a8..0c0b473 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 c1cf153..71addb1 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 5e83914..9ecc360 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 e532836..dd53ae5 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 bba70e5..0219f99 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 b793bc6..7a8346f 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 () {
-- 
GitLab