diff --git a/javascript/olm_post.js b/javascript/olm_post.js
index df1c4819c6ab425f89168223ed729df0e507aca9..60876b14864bce5215b6acce7490b2ce13c7f091 100644
--- a/javascript/olm_post.js
+++ b/javascript/olm_post.js
@@ -15,7 +15,7 @@ function array_from_string(string) {
 function random_stack(size) {
     var ptr = stack(size);
     var array = new Uint8Array(Module['HEAPU8'].buffer, ptr, size);
-    window.crypto.getRandomValues(array);
+    get_random_values(array);
     return ptr;
 }
 
@@ -139,7 +139,7 @@ Account.prototype['unpickle'] = restore_stack(function(key, pickle) {
     var key_array = array_from_string(key);
     var key_buffer = stack(key_array);
     var pickle_array = array_from_string(pickle);
-    var pickle_buffer = stack(pickle_length);
+    var pickle_buffer = stack(pickle_array);
     account_method(Module['_olm_unpickle_account'])(
         this.ptr, key_buffer, key_array.length, pickle_buffer,
         pickle_array.length
@@ -280,5 +280,7 @@ Session.prototype['decrypt'] = restore_stack(function(
     return Pointer_stringify(plaintext_buffer, plaintext_length);
 });
 
-return {"Account": Account, "Session": Session};
+olm_exports["Account"] = Account;
+olm_exports["Session"] = Session;
+
 }();
diff --git a/javascript/olm_pre.js b/javascript/olm_pre.js
index c7b0d5e66f9ca3a874e9598dbcb55fe4024024e4..5a348af2781925c1f17242b91b3cbdb711210754 100644
--- a/javascript/olm_pre.js
+++ b/javascript/olm_pre.js
@@ -1 +1,29 @@
-Olm = function() {
+var olm_exports = {};
+var get_random_values;
+if (typeof(window) !== 'undefined') {
+    // We've been imported directly into a browser.
+    window["Olm"] = olm_exports;
+    get_random_values = function(buf) {
+        window.crypto.getRandomValues(buf);
+    };
+} else if (global.window) {
+    // We're running with browserify
+    global.window["Olm"] = olm_exports;
+    get_random_values = function(buf) {
+        window.crypto.getRandomValues(buf);
+    };
+} else if (module["exports"]) {
+    // We're running in node.
+    module["exports"] = olm_exports;
+    var nodeCrypto = require("crypto");
+    get_random_values = function(buf) {
+        var bytes = nodeCrypto.randomBytes(buf.length);
+        buf.set(bytes);
+    }
+} else {
+    throw new Error("Cannot find global to attach library to");
+}
+
+var init = function() {
+    var module; // Shadow the Node 'module' object so that emscripten won't try
+                // to fiddle with it.