From 122867c45c7f41b82a550a9665d34b7dda1c3ffa Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 21 Sep 2018 16:01:51 +0100 Subject: WebAssembly support! Quite a lot going on in this PR: * Updates to support recent emscripten, switching to WASM which is now the default * Use emscripten's MODULARIZE option rather than wrapping it ourself, since doing so in pre-post js doesn't work anymore. * Most changes are moving the emscripten runtime functions to top-level calls rather than in the Module object. * Get rid of duplicated NULL_BYTE_PADDING_LENGTH * Fix ciphertext_length used without being declared * Fix things that caused the closure compiler to error, eg. using OLM_OPTIONS without a declaration. * Wait until module is inited to do OLM_ERROR = olm_error() The main BREAKING CHANGE here is that the module now needs to initialise asyncronously (because it has to load the wasm file). require()ing olm now gives a function which needs to be called to create an instance. The resulting object has a promise-like then() method that can be used to detect when the module is ready. (We could use MODULARIZE_INSTANCE to return the module directly as before, rather than the function, but then we don't get the .then() method). --- javascript/olm_pre.js | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'javascript/olm_pre.js') diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js index ae7aba5..5e8ed12 100644 --- a/javascript/olm_pre.js +++ b/javascript/olm_pre.js @@ -1,10 +1,8 @@ var olm_exports = {}; var get_random_values; -var process; // Shadow the process object so that emscripten won't get - // confused by browserify if (typeof(window) !== 'undefined') { - // We've in a browser (directly, via browserify, or via webpack). + // We're in a browser (directly, via browserify, or via webpack). get_random_values = function(buf) { window.crypto.getRandomValues(buf); }; @@ -12,7 +10,9 @@ if (typeof(window) !== 'undefined') { // We're running in node. var nodeCrypto = require("crypto"); get_random_values = function(buf) { - var bytes = nodeCrypto.randomBytes(buf.length); + // [''] syntax needed here rather than '.' to prevent + // closure compiler from mangling the import(!) + var bytes = nodeCrypto['randomBytes'](buf.length); buf.set(bytes); }; process = global["process"]; @@ -20,14 +20,23 @@ if (typeof(window) !== 'undefined') { throw new Error("Cannot find global to attach library to"); } -(function() { - /* applications should define OLM_OPTIONS in the environment to override - * emscripten module settings */ - var Module = {}; - if (typeof(OLM_OPTIONS) !== 'undefined') { - for (var key in OLM_OPTIONS) { - if (OLM_OPTIONS.hasOwnProperty(key)) { - Module[key] = OLM_OPTIONS[key]; - } +/* applications should define OLM_OPTIONS in the environment to override + * emscripten module settings (we still need to (re) declare the variable + * otherwise the closure compiler becomes sad). + */ +var OLM_OPTIONS; +if (typeof(OLM_OPTIONS) !== 'undefined') { + for (var olm_option_key in OLM_OPTIONS) { + if (OLM_OPTIONS.hasOwnProperty(olm_option_key)) { + Module[olm_option_key] = OLM_OPTIONS[olm_option_key]; } } +} + +/* The 'length' argument to Pointer_stringify doesn't work if the input + * includes characters >= 128, which makes Pointer_stringify unreliable. We + * could use it on strings which are known to be ascii, but that seems + * dangerous. Instead we add a NULL character to all of our strings and just + * use UTF8ToString. + */ +var NULL_BYTE_PADDING_LENGTH = 1; -- cgit v1.2.3 From 5e87db615a5e430627b17da5dfbd52f0ef7f4db9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 21 Sep 2018 16:35:17 +0100 Subject: Make OLM_OPTIONS work again The closure compiler was just renaming the variable so it never would have picked them up. Make it an extern so it knows what to do. --- javascript/olm_pre.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'javascript/olm_pre.js') diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js index 5e8ed12..673b868 100644 --- a/javascript/olm_pre.js +++ b/javascript/olm_pre.js @@ -21,10 +21,8 @@ if (typeof(window) !== 'undefined') { } /* applications should define OLM_OPTIONS in the environment to override - * emscripten module settings (we still need to (re) declare the variable - * otherwise the closure compiler becomes sad). + * emscripten module settings */ -var OLM_OPTIONS; if (typeof(OLM_OPTIONS) !== 'undefined') { for (var olm_option_key in OLM_OPTIONS) { if (OLM_OPTIONS.hasOwnProperty(olm_option_key)) { -- cgit v1.2.3 From 263b94428a24caaa5b899ed7f73b896620e6cdf4 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 25 Sep 2018 17:13:29 +0100 Subject: Another day, another interface Change the interface again, hopefully this time a bit more normal. Now we wrap the emscripten module completely and just expose the high level objects. The olm library export is now imported as normal (ie. returns a module rather than a function returning a module) but has an `init` method which *must* be called. This returns a promise which resolves when the module is ready. It also rejects if the module failed to set up, unlike before (and unlike the promise-not-a-promise that emscripten returns). Generally catch failures to init the module. --- javascript/olm_pre.js | 1 - 1 file changed, 1 deletion(-) (limited to 'javascript/olm_pre.js') diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js index 673b868..4feff97 100644 --- a/javascript/olm_pre.js +++ b/javascript/olm_pre.js @@ -1,4 +1,3 @@ -var olm_exports = {}; var get_random_values; if (typeof(window) !== 'undefined') { -- cgit v1.2.3 From 602c00a8d658e8510e37e841dd06c70f276d0f00 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 4 Oct 2018 20:09:54 +0100 Subject: Dual-build wasm and asm.js olm --- javascript/olm_pre.js | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'javascript/olm_pre.js') diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js index 4feff97..18d836d 100644 --- a/javascript/olm_pre.js +++ b/javascript/olm_pre.js @@ -37,3 +37,12 @@ if (typeof(OLM_OPTIONS) !== 'undefined') { * use UTF8ToString. */ var NULL_BYTE_PADDING_LENGTH = 1; + +Module['onRuntimeInitialized'] = function() { + OLM_ERROR = Module['_olm_error'](); + if (onInitSuccess) onInitSuccess(); +}; + +Module['onAbort'] = function(err) { + if (onInitFail) onInitFail(err); +}; -- cgit v1.2.3