Skip to content
Snippets Groups Projects
worker.js 1.61 KiB
Newer Older
  • Learn to ignore specific revisions
  • const fs = require("fs"),
    	path = require("path"),
    	vm = require("vm"),
    	noop = require(path.join(__dirname, "noop.js")),
    	events = /^(error|message)$/;
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    function toFunction (arg) {
    
    	var __worker_evaluated_function_ = null;
    
    Daniele Di Sarli's avatar
    Daniele Di Sarli committed
    	eval("__worker_evaluated_function_ = (" + arg + ")"); // eslint-disable-line no-eval
    
    	return __worker_evaluated_function_;
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    // Bootstraps the Worker
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    process.once("message", obj => {
    
    	const exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8");
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    
    	global.self = {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		close: () => {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		postMessage: msg => {
    
    			process.send(JSON.stringify({data: msg}, null, 0));
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		},
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		onmessage: void 0,
    
    			process.send(JSON.stringify({error: err.message, stack: err.stack}, null, 0));
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		addEventListener: (event, fn) => {
    
    			if (events.test(event)) {
    				global["on" + event] = global.self["on" + event] = fn;
    			}
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	global.importScripts = (...files) => {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		if (files.length > 0) {
    
    			vm.createScript(files.map(file => fs.readFileSync(file, "utf8")).join("\n")).runInThisContext();
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		}
    
    	Object.keys(global.self).forEach(key => {
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    		global[key] = global.self[key];
    	});
    
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	process.on("message", msg => {
    
    		try {
    			(global.onmessage || global.self.onmessage || noop)(JSON.parse(msg));
    		} catch (err) {
    			(global.onerror || global.self.onerror || noop)(err);
    		}
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	process.on("error", err => {
    
    		(global.onerror || global.self.onerror || noop)(err);
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	});
    
    	if (typeof exp === "function") {
    		exp();
    	} else {
    
    		vm.createScript(exp).runInThisContext();
    
    Jason Mulligan's avatar
    Jason Mulligan committed
    	}
    });