Skip to content
Snippets Groups Projects
worker.js 1.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • "use strict";
    
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    var fs = require("fs");
    var path = require("path");
    var vm = require("vm");
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    var noop = require(path.join(__dirname, "noop.js"));
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    function trim(arg) {
    	return arg.replace(/^(\s+|\t+|\n+)|(\s+|\t+|\n+)$/g, "");
    }
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    function explode(arg) {
    	return trim(arg).split(new RegExp("\\s*,\\s*"));
    }
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    function toFunction(arg) {
    	var args = trim(arg.replace(/^.*\(/, "").replace(/[\t|\r|\n|\"|\']+/g, "").replace(/\).*/, "")),
    	    body = trim(arg.replace(/^.*\{/, "").replace(/\}$/, ""));
    
    	return Function.apply(Function, explode(args).concat([body]));
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    // Bootstraps the Worker
    process.once("message", function (obj) {
    	var exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8"),
    	    sexp = undefined;
    
    	global.self = {
    
    		close: function close() {
    			process.exit(0);
    		},
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		postMessage: function postMessage(msg) {
    			process.send(JSON.stringify({ data: msg }));
    		},
    		onmessage: noop,
    		onerror: noop,
    		addEventListener: function addEventListener(event, fn) {
    			if (event === "message") {
    				global.onmessage = global.self.onmessage = fn;
    			}
    
    			if (event === "error") {
    				global.onerror = global.self.onerror = fn;
    			}
    		}
    	};
    
    	global.importScripts = function () {
    		var script = undefined,
    		    scripts = undefined;
    
    		for (var _len = arguments.length, files = Array(_len), _key = 0; _key < _len; _key++) {
    			files[_key] = arguments[_key];
    		}
    
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		if (files.length > 0) {
    			scripts = files.map(function (file) {
    				return fs.readFileSync(file, "utf8");
    			}).join("\n");
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    			script = vm.createScript(scripts);
    			script.runInThisContext();
    		}
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	};
    
    	Object.keys(global.self).forEach(function (key) {
    		global[key] = global.self[key];
    	});
    
    	process.on("message", function (msg) {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		(global.self.onmessage || global.onmessage || noop)(JSON.parse(msg));
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	});
    
    	process.on("error", function (err) {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		(global.self.onerror || global.onerror || noop)(err);
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	});
    
    	if (typeof exp === "function") {
    		exp();
    	} else {
    		sexp = vm.createScript(exp);
    		sexp.runInThisContext();
    	}
    });