ol-ext
Version:
A set of cool extensions for OpenLayers (ol) in node modules structure
59 lines (56 loc) • 1.78 kB
JavaScript
/** Worker helper to create a worker from code
* @constructor
* @param {function} mainFn main worker function
* @param {object} options
* @param {function} [options.onMessage] a callback function to get worker result
*/
var ol_ext_Worker = class olextWorker {
constructor(mainFn, options) {
// Convert to function
var mainStr = mainFn.toString().replace(/^.*\(/, 'function(');
var lib = '';
for (let i in options.lib) {
lib += '\nvar ' + i + ' = ' + options.lib[i].toString().replace(/^.*\(/, 'function(') + ';';
}
// Code
var lines = ['var mainFn = ' + mainStr + lib + `
self.addEventListener("message", function(event) {
var result = mainFn(event);
self.postMessage(result);
});`];
// console.log(lines[0])
this.code_ = URL.createObjectURL(new Blob(lines, { type: 'text/javascript' }));
this.onMessage_ = options.onMessage;
this.start();
}
/** Terminate current worker and start a new one
*/
start() {
if (this.worker)
this.worker.terminate();
this.worker = new Worker(this.code_);
this.worker.addEventListener('message', function (e) {
this.onMessage_(e.data);
}.bind(this));
}
/** Terminate a worker */
terminate() {
this.worker.terminate();
}
/** Post a new message to the worker
* @param {object} message
* @param {boolean} [restart=false] stop the worker and restart a new one
*/
postMessage(message, restart) {
if (restart)
this.start();
this.worker.postMessage(message);
}
/** Set onMessage callback
* @param {function} fn a callback function to get worker result
*/
onMessage(fn) {
this.onMessage_ = fn;
}
}
export default ol_ext_Worker