Merge pull request #462 from openpgpjs/worker-cleanup

Cleanup and document worker.js
This commit is contained in:
Tankred Hase 2016-05-24 17:59:33 +02:00
commit 377b81a121

View File

@ -27,39 +27,73 @@ var MAX_SIZE_RANDOM_BUFFER = 60000;
openpgp.crypto.random.randomBuffer.init(MAX_SIZE_RANDOM_BUFFER);
self.onmessage = function (event) {
var msg = event.data || {},
options = msg.options || {};
/**
* Handle messages from the main window.
* @param {Object} event Contains event type and data
*/
self.onmessage = function(event) {
var msg = event.data || {};
switch (msg.event) {
case 'configure':
for (var i in msg.config) {
openpgp.config[i] = msg.config[i];
}
configure(msg.config);
break;
case 'seed-random':
if (!(msg.buf instanceof Uint8Array)) {
msg.buf = new Uint8Array(msg.buf);
}
openpgp.crypto.random.randomBuffer.set(msg.buf);
seedRandom(msg.buf);
break;
default:
if (typeof openpgp[msg.event] !== 'function') {
throw new Error('Unknown Worker Event');
}
// parse cloned packets
openpgp[msg.event](openpgp.packet.clone.parseClonedPackets(options, msg.event)).then(function(data) {
// clone packets (for web worker structured cloning algorithm)
response({ event:'method-return', data:openpgp.packet.clone.clonePackets(data) });
}).catch(function(e) {
response({ event:'method-return', err:e.message });
});
delegate(msg.event, msg.options || {});
}
};
/**
* Set config from main context to worker context.
* @param {Object} config The openpgp configuration
*/
function configure(config) {
for (var i in config) {
openpgp.config[i] = config[i];
}
}
/**
* Seed the library with entropy gathered window.crypto.getRandomValues
* as this api is only avalible in the main window.
* @param {ArrayBuffer} buffer Some random bytes
*/
function seedRandom(buffer) {
if (!(buffer instanceof Uint8Array)) {
buffer = new Uint8Array(buffer);
}
openpgp.crypto.random.randomBuffer.set(buffer);
}
/**
* Generic proxy function that handles all commands from the public api.
* @param {String} method The public api function to be delegated to the worker thread
* @param {Object} options The api function's options
*/
function delegate(method, options) {
if (typeof openpgp[method] !== 'function') {
response({ event:'method-return', err:'Unknown Worker Event' });
return;
}
// parse cloned packets
options = openpgp.packet.clone.parseClonedPackets(options, method);
openpgp[method](options).then(function(data) {
// clone packets (for web worker structured cloning algorithm)
response({ event:'method-return', data:openpgp.packet.clone.clonePackets(data) });
}).catch(function(e) {
response({ event:'method-return', err:e.message });
});
}
/**
* Respond to the main window.
* @param {Object} event Contains event type and data
*/
function response(event) {
if (openpgp.crypto.random.randomBuffer.size < MIN_SIZE_RANDOM_BUFFER) {
self.postMessage({event: 'request-seed'});