Cómo hacer un polyfill para performance.now en Rust WebAssembly.
Estoy intentando usar la biblioteca “jwt_simple” en una ejecución de runtime de Cloudflare Workers WebAssembly. Siguiendo el ejemplo básico en la documentación enlazada, todo funciona bien hasta que se ejecuta “key.authenticate(claims)?”, momento en el cual se genera la siguiente traza de stack en mi terminal que ejecuta wrangler:
ReferenceError: performance no está definido
en __wbg_now_63f780680ee9cc56 (./index_bg.mjs:331:15)
en wasm://wasm/001926f2:wasm-function[264]:0x252a9
en wasm://wasm/001926f2:wasm-function[409]:0x2925d
en wasm://wasm/001926f2:wasm-function[167]:0x1fb99
en wasm://wasm/001926f2:wasm-function[410]:0x292b9
en wasm://wasm/001926f2:wasm-function[284]:0x25ea0
en wasm://wasm/001926f2:wasm-function[132]:0x1cbd9
en wasm://wasm/001926f2:wasm-function[38]:0x9bbc
en wasm://wasm/001926f2:wasm-function[143]:0x1dc3b
en wasm://wasm/001926f2:wasm-function[106]:0x19ccb en la línea 330, columna 13
Sospecho que esto se debe a que cuando “key.authenticate” intenta verificar que el JWT siga siendo válido, llama a “performance.now”, que según este post del foro, no es proporcionado por Cloudflare Workers para prevenir ataques de temporización. No entiendo completamente cómo funciona WebAssembly, pero sé que puedo cargar “performance.now” en JavaScript como se hace aquí.
¿Cómo puedo utilizar esta carga en un entorno de WebAssembly?
davy.ai
Solución para usar el Polyfill
performance.now
en el entorno de WebAssembly de Cloudflare WorkersSi sospechas que el error generado en tu terminal se debe a que
performance.now
no está definido en tu tiempo de ejecución de WebAssembly de Cloudflare Workers, puedes usar un polyfill para proporcionar una definición deperformance.now
.Para usar el polyfill, debes hacer lo siguiente:
performance.now
en tu script de Cloudflare worker. Puedes usar la implementación proporcionada en este gist. Por ejemplo:polyfillPerformanceNow
en tu código del módulo de WebAssembly. Por ejemplo:Al llamar a la función
polyfillPerformanceNow
, pasa un objeto que tenga una propiedadmemory
. En el ejemplo anterior, este objeto esperformance_node
, que tiene una propiedadmemory
que es el objeto de memoria de WebAssembly.Después de llamar a
polyfillPerformanceNow
, deberías poder llamar a tu funciónkey.authenticate(claims)
y debería usar elperformance.now()
polyfilled del objetoperformance_node
.