Last active
December 15, 2016 23:10
-
-
Save Driptap/6da911a442ea3c1a7b0a3486097746da to your computer and use it in GitHub Desktop.
Simple web workers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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