Los componentes de tema de Discourse ahora soportan Wasm 🎊

WebAssembly (Wasm) es una tecnología que se incluye en todos los navegadores modernos y que permite a los desarrolladores distribuir programas binarios portátiles.

Esto significa que los desarrolladores pueden usar casi cualquier lenguaje de programación y tener como objetivo la web.

En el contexto de Discourse, esto abre la puerta a la distribución de un conjunto bastante rico de extensiones que en el pasado solo estaban disponibles para los creadores de plugins.

Los ejemplos podrían ser:

  • Marca de agua / redimensionamiento / recorte de imágenes
  • Generación de gráficos usando graphviz o svgbob
  • Entornos de programación aislados (por ejemplo: publicaciones que incrustan un tiempo de ejecución de Ruby)
  • y mucho más

En el pasado, debido a la Política de Seguridad de Contenido de Discourse, el acceso a Wasm se cerró excepto para instalaciones con cargas locales y sin CDN.

Se agregaron nuevas interfaces al lado del cliente para admitir la distribución de activos de JavaScript en un tema que son incondicionalmente accesibles a través del dominio local.

Esto permite a los desarrolladores de temas alojar Wasm de manera limpia, el flujo es:

componente → trabajador web local → Wasm alojado en CDN

Discourse svgbob es un ejemplo de extremo a extremo de los nuevos patrones, los 2 cambios clave son:

  1. Todos los activos .js también están disponibles fuera de la CDN en el servidor local:
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. La URL del activo local es accesible a través de settings.theme_uploads_local

Entonces, en el ejemplo anterior:

settings.theme_uploads_local.worker; // activo local
settings.theme_uploads.worker; // activo cdn
36 Me gusta

No está relacionado específicamente con wasm, pero encontré algo más interesante sobre este código, ¿es nuevo?

En tu ejemplo, ¿loadScript ya no es necesario? (Creo que la importación es redundante):

¿y en su lugar el script del trabajador se carga JIT cuando se descubre que el trabajador no existe?

usando la URL construida a partir de la referencia del activo.

¡Ese es un patrón agradable y muy útil!

Sin embargo, tengo una pregunta sobre los trabajadores.

Si usara un script de trabajador de terceros, y este contuviera declaraciones [importScripts()](https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/importScripts) para incluir scripts adicionales en el ámbito global del trabajador, ¿cómo incluyo esos scripts para importarlos dentro del componente del tema?

Podría estar preguntando: ¿cómo requerimos un script desde una URL dentro de un componente de tema de Discourse?

2 Me gusta

Lo que hice en este escenario es usar un postMessage desde el script principal de JS con las URL a importar. Esto se recibe en el manejador de mensajes del worker que puede importScript las URL recibidas.

2 Me gusta

¡Gracias Rafael! ¿Tienes un ejemplo de código abierto para referenciar?

2 Me gusta

Usé este mismo patrón en el núcleo

6 Me gusta

Estoy usando el creador de temas para crear un nuevo componente de tema que se supone que usa wasm. Como punto de partida, intenté subir svgbob como un componente de tema. Sin embargo, no se me permite hacerlo, porque contiene un archivo wasm.

¿Es esa una limitación intencionada del creador de temas? ¿O no se puede simplemente instalar svgbob tal cual?

2 Me gusta

Sospecho que solo tenemos una limitación en el tipo de archivo en el creador de temas que necesita ser levantada.

3 Me gusta

Restablecí themecreator para usar las ‘extensiones autorizadas de temas’ predeterminadas, que incluyen WASM. Así que debería funcionar ahora @Heinenen.

(no estoy seguro de por qué estaba en una configuración no predeterminada… tal vez en el pasado faltaba una de las extensiones comunes :man_shrugging:)

2 Me gusta

Sí, muy bien, puedo confirmar que ahora funciona. ¡Gracias!

3 Me gusta

De acuerdo, parece que tengo que retroceder un poco, no creo que funcione perfectamente todavía.
Volví a intentar subir svgbob y eso funcionó.

Después de intentar también subir mi propio wasm-file, tomado de MDN, obtengo el error:
Ocurrió un error: Se suministraron parámetros inválidos a la solicitud: la cadena contiene un byte nulo

En mi contenedor de desarrollo, esto no es un problema y puedo subir el mismo archivo sin ningún problema.

2 Me gusta

¿No es ejecutar un binario desde el sitio web una exposición de seguridad que debe elegirse con cuidado? Esa puede ser la razón por la que no era el valor predeterminado. ¿Qué opinas @Roman?

1 me gusta

Está permitido en los temas por defecto. Es solo la configuración del sitio en discourse.theme-creator.io la que se ha cambiado. (ese es un sitio de discourse normal, con un plugin que permite a cualquiera subir y compartir temas).

WASM todavía está aislado por el navegador, por lo que la exposición de seguridad es equivalente a un archivo .js.

4 Me gusta