From ac27924f683f87582d47645da5bc7164df5e2bd4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Oct 2025 14:52:21 -0500 Subject: [PATCH] use wasm_bindgen properly in CrossOrigin version --- static/proofOfWorker_CrossOrigin.js | 350 ++++++++++++++++++---------- wasm_build/build_wasm.sh | 33 ++- 2 files changed, 242 insertions(+), 141 deletions(-) diff --git a/static/proofOfWorker_CrossOrigin.js b/static/proofOfWorker_CrossOrigin.js index 4e41bff..2a1b30a 100644 --- a/static/proofOfWorker_CrossOrigin.js +++ b/static/proofOfWorker_CrossOrigin.js @@ -145,6 +145,232 @@ function base64ToHex(str) { } return result; } +let wasm_bindgen; +(function() { + const __exports = {}; + let script_src; + if (typeof document !== 'undefined' && document.currentScript !== null) { + script_src = new URL(document.currentScript.src, location.href).toString(); + } + + let WASM_VECTOR_LEN = 0; + + let cachedUint8ArrayMemory0 = null; + + function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; + } + + const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + + const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); + } + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + }); + + function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; + } + + const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + + if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + + function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); + } + /** + * @param {string} password + * @param {string} salt + * @param {number} n + * @param {number} r + * @param {number} p + * @param {number} dklen + * @returns {string} + */ + __exports.scrypt = function(password, salt, n, r, p, dklen) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(salt, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.scrypt(ptr0, len0, ptr1, len1, n, r, p, dklen); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + }; + + async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } + } + + function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }; + + return imports; + } + + function __wbg_init_memory(imports, memory) { + + } + + function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; + } + + function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); + } + + async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined' && typeof script_src !== 'undefined') { + module_or_path = script_src.replace(/\.js$/, '_bg.wasm'); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); + } + + wasm_bindgen = Object.assign(__wbg_init, { initSync }, __exports); + +})(); + // https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64 its at 60% in oct 2025 @@ -163,126 +389,8 @@ const base64WASM = "AGFzbQEAAAABVw1gAn9/AGACf38Bf2ADf39/AX9gA39/fwBgAX8AYAR/f39/ const wasmBinary = Uint8Array.fromBase64(base64WASM); -scryptPromise = WebAssembly.instantiate(wasmBinary, {}).then(instantiatedModule => { - wasm = instantiatedModule.instance.exports; + +scrypt = wasm_bindgen.scrypt; +scryptPromise = wasm_bindgen({module_or_path: wasmBinary}); - - - let WASM_VECTOR_LEN = 0; - - let cachedUint8ArrayMemory0 = null; - - function getUint8ArrayMemory0() { - if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { - cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8ArrayMemory0; - } - - const lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder; - - let cachedTextEncoder = new lTextEncoder('utf-8'); - - const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); - } - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; - }); - - function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8ArrayMemory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; - } - - const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; - - let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - - cachedTextDecoder.decode(); - - function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); - } - /** - * @param {string} password - * @param {string} salt - * @param {number} n - * @param {number} r - * @param {number} p - * @param {number} dklen - * @returns {string} - */ - scrypt = function(password, salt, n, r, p, dklen) { - let deferred3_0; - let deferred3_1; - try { - const ptr0 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(salt, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ret = wasm.scrypt(ptr0, len0, ptr1, len1, n, r, p, dklen); - deferred3_0 = ret[0]; - deferred3_1 = ret[1]; - return getStringFromWasm0(ret[0], ret[1]); - } finally { - wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); - } - } - - function __wbindgen_init_externref_table() { - const table = wasm.__wbindgen_export_0; - const offset = table.grow(4); - table.set(0, undefined); - table.set(offset + 0, undefined); - table.set(offset + 1, null); - table.set(offset + 2, true); - table.set(offset + 3, false); - ; - }; - - -}); - diff --git a/wasm_build/build_wasm.sh b/wasm_build/build_wasm.sh index ade6199..c68e894 100755 --- a/wasm_build/build_wasm.sh +++ b/wasm_build/build_wasm.sh @@ -67,6 +67,7 @@ scryptPromise = wasm_bindgen({module_or_path: "/static/scrypt.wasm"}); ## This is neccesary when the pow-bot-deterrent static assets can't be hosted on the same origin ## However, it also means that the site can't use a content-security-policy which restricts external javascript + echo ' // THIS FILE IS GENERATED AUTOMATICALLY // Dont edit this file by hand. @@ -75,8 +76,13 @@ echo ' cat ../proofOfWorkerStub.js | tail -n +6 >> ../static/proofOfWorker_CrossOrigin.js +# wasm was defined at the top of proofOfWorker.js, so don't define it again. +cat scrypt-wasm/pkg/scrypt_wasm.js | grep -v 'let wasm = ' >> ../static/proofOfWorker_CrossOrigin.js + +# see: https://rustwasm.github.io/docs/wasm-bindgen/examples/without-a-bundler.html echo ' + // https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64 its at 60% in oct 2025 if (!Uint8Array.fromBase64) { Uint8Array.fromBase64 = function(base64String) { @@ -93,27 +99,14 @@ const base64WASM = "'"$(cat ../static/scrypt.wasm | base64 -w 0)"'"; const wasmBinary = Uint8Array.fromBase64(base64WASM); -scryptPromise = WebAssembly.instantiate(wasmBinary, {}).then(instantiatedModule => { - wasm = instantiatedModule.instance.exports; + +scrypt = wasm_bindgen.scrypt; +scryptPromise = wasm_bindgen({module_or_path: wasmBinary}); ' >> ../static/proofOfWorker_CrossOrigin.js -# wasm was defined at the top of proofOfWorker.js, so don't define it again. -# tail -n +5 skips the first 4 lines. -# we are trying to skip all of: -# -# let wasm; -# export function __wbg_set_wasm(val) { -# wasm = val; -# } -# -cat scrypt-wasm/pkg/scrypt_wasm_bg.js | tail -n +5 \ - | sed 's/export function scrypt/scrypt = function/' \ - | sed 's/^export //' \ - | sed -E 's/^/ /' >> ../static/proofOfWorker_CrossOrigin.js - -echo ' -}); -' >> ../static/proofOfWorker_CrossOrigin.js -echo "Build successful!" \ No newline at end of file + + + +