UNPKG

workway

Version:

A general purpose, Web Worker driven, remote namespace with classes and methods.

95 lines (80 loc) 2.75 kB
window.workway = (function (Worker, workway, SECRET) { /*! Copyright 2018 Andrea Giammarchi - @WebReflection * * Permission to use, copy, modify, and/or distribute this software * for any purpose with or without fee is hereby granted, * provided that the above copyright notice * and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // ${JSON} var instances = []; var sockets = new WeakMap(); addEventListener( 'beforeunload', function () { while (instances.length) instances[0].terminate(); }, false ); function NodeWorker(ep) { var socket = io({JSON: Flatted}); var self = new EventTarget; self.postMessage = this.postMessage; self.terminate = this.terminate; instances.push(self); sockets.set(self, socket); socket.on(SECRET + ':error', this.onerror.bind(self)); socket.on(SECRET + ':message', this.onmessage.bind(self)); socket.emit(SECRET + ':setup', ep); return self; } function createEvent(type) { var event = document.createEvent('Event'); event.initEvent(type, false, true); event.stopImmediatePropagation = event.stopImmediatePropagation || event.stopPropagation; return event; } NodeWorker.prototype = { onerror: function (error) { var event = createEvent('error'); event.message = error.message; event.stack = error.stack; this.dispatchEvent(event); if (this.onerror) this.onerror(event); }, onmessage: function (data) { var event = createEvent('message'); event.data = data; this.dispatchEvent(event); if (this.onmessage) this.onmessage(event); }, postMessage: function (message) { sockets.get(this).emit(SECRET, message); }, terminate: function () { instances.splice(instances.indexOf(this), 1); sockets.get(this).disconnect(); } }; return function (file) { if (/^node:\/\/([\w._-]+)/.test(file)) { file = RegExp.$1; window.Worker = NodeWorker; var promise = workway(file); window.Worker = Worker; return promise; } else return workway(file); }; }(Worker, workway, '${SECRET}'));