es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para usar el Polyfill performance.now en el entorno de WebAssembly de Cloudflare Workers

    Si 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 de performance.now.

    Para usar el polyfill, debes hacer lo siguiente:

    1. Incluye el polyfill performance.now en tu script de Cloudflare worker. Puedes usar la implementación proporcionada en este gist. Por ejemplo:
    const performanceNow = (() => {
      if ("performance" in self === false) {
        return Date.now;
      }
    
      if ("now" in performance === false) {
        const now = () => {
          return Date.now() - performance.timing.navigationStart;
        };
        return now;
      }
    
      return () => performance.now();
    })();
    
    function polyfillPerformanceNow(node) {
      node.performance = {
        now: performanceNow,
      };
    }
    
    1. Importa la función polyfillPerformanceNow en tu código del módulo de WebAssembly. Por ejemplo:
    import { polyfillPerformanceNow } from './polyfill.js';
    import init from './index_bg.wasm';
    
    // Llama al módulo de WebAssembly
    async function run() {
      const wasm = await init();
    
      // Polyfill performance.now en la instancia de WebAssembly
      const memory = wasm.instance.exports.memory;
      const performance_node = { memory };
      polyfillPerformanceNow(performance_node);
    
      // Llama a tu función `key.authenticate(claims)` aquí
      // y debería usar el performance.now() polyfilled del objeto performance_node.
    }
    
    run();
    
    1. Al llamar a la función polyfillPerformanceNow, pasa un objeto que tenga una propiedad memory. En el ejemplo anterior, este objeto es performance_node, que tiene una propiedad memory que es el objeto de memoria de WebAssembly.

    2. Después de llamar a polyfillPerformanceNow, deberías poder llamar a tu función key.authenticate(claims) y debería usar el performance.now() polyfilled del objeto performance_node.

Comments are closed.