Skip to content

Instantly share code, notes, and snippets.

@Driptap
Last active December 15, 2016 23:10
Show Gist options
  • Save Driptap/6da911a442ea3c1a7b0a3486097746da to your computer and use it in GitHub Desktop.
Save Driptap/6da911a442ea3c1a7b0a3486097746da to your computer and use it in GitHub Desktop.
Simple web workers
var App = App || {};
/* ===================================== WEB WORKERS LISTENER ========================*/
App.workers = function(options) {
"use strict";
var that = {},
_storage = localStorage,
_storedConfig = _storage.getItem('workers_config'),
_config = (_storedConfig) ? _storedConfig : {
// storedKey: 'val'
},
_workers = {
workerOne: 'path/to/workerOne.js'
},
_updateConfig = function (worker, args) {
for (var key in args)
_config[worker][key] = args[key];
};
// Callback when a message is recieved
that.messageRecieved = function(e) {
// Custom event with the name of the worker is created and dispatched
var _event = new CustomEvent('worker:' + e.data.workerName, {
'detail': e.data
});
if (typeof e.data.type !== 'undefined')
switch(true) {
case e.data.type === 'error':
that.errored(e.data);
break;
case e.data.type === 'store':
_updateConfig(e.data.workerName, e.data.args);
break;
}
window.dispatchEvent(_event);
};
// Error callback when an error is recieved from a worker
that.errored = function(e) {
console.log(e);
};
// Registers workers
for (var worker in _workers) {
var _worker = _workers[worker];
that[worker] = new Worker(_worker, worker);
that[worker].onmessage = that.messageRecieved;
that[worker].onerror = that.errored;
that[worker].postMessage({cmd: 'initialize', args: _config[worker]});
}
return that;
};
/* ======================= WORKER ============================================*/
var workerOne = workerOne || {},
_createWorkerMsg = function(obj) {
"use strict";
return {
workerName: 'workerOne',
message: obj
};
};
_createWorkerErr = function(msg) {
"use strict";
return {
workerName: 'workerOne',
message: msg,
type: 'error'
};
};
// Stored configuration
worker.conf = {
defaultVal: 1
};
// Routes message
worker.route = function(e) {
"use strict";
var data = e.data;
switch (data.cmd) {
case 'initialize':
// Initializes the error checking loop
worker.initialize(data.args);
break;
default:
// Unknown command message
self.postMessage(
systemErrorsClient.createMessage('Unknown command: ' + data.msg)
);
break;
}
};
worker.initialize = function(args) {
"use strict";
if (worker.initialized === true) worker.isInitialized();
if (args)
for (var arg in args)
_conf[arg] = args[arg];
worker.initialized = true;
worker.isInitialized();
};
worker.isInitialized = function () {
self.postMessage(_createWorkerMsg('initialized'));
};
// Listens for messages from frontend and calls route on the message
self.addEventListener('message', worker.route, false);
/*============================================================= USAGE */
// Instantiate
var _worker = App.workers();
// Listen wherever
window.addEventListener('worker:workerOne', function (res) {
console.log(res.workerName + ' says ' + res.message);
});
// Post wherever
_worker.workerOne.postMessage({hello: 'world'});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment