Les composants de thème Discourse prennent désormais en charge Wasm 🎊

WebAssembly (Wasm) est une technologie livrée dans tous les navigateurs modernes qui permet aux développeurs de livrer des programmes binaires portables.

Cela signifie que les développeurs peuvent utiliser presque n’importe quel langage de programmation et cibler le web.

Dans le contexte de Discourse, cela ouvre la porte à la livraison d’un ensemble assez riche d’extensions qui n’étaient disponibles que pour les créateurs de plugins par le passé.

Les exemples pourraient être :

  • Filigrane / redimensionnement / recadrage d’images
  • Génération de graphiques à l’aide de graphviz ou svgbob
  • Bac à sable de programmation (par exemple : des publications qui intègrent un runtime Ruby)
  • et bien plus encore

Par le passé, en raison de la Politique de sécurité du contenu de Discourse, l’accès à Wasm était désactivé, sauf pour les installations avec des téléchargements locaux et sans CDN.

De nouvelles interfaces ont été ajoutées côté client pour prendre en charge la livraison d’actifs JavaScript dans un thème qui sont inconditionnellement accessibles via le domaine local.

Cela permet aux développeurs de thèmes d’héberger proprement Wasm, le flux est le suivant :

composant → worker web local → Wasm hébergé sur CDN

Discourse svgbob est un exemple de bout en bout des nouveaux modèles, les 2 changements clés sont :

  1. Tous les actifs .js sont également rendus disponibles hors CDN sur le serveur local :
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. L’URL de l’actif local est accessible via settings.theme_uploads_local

Donc, dans l’exemple ci-dessus :

settings.theme_uploads_local.worker ; // actif local
settings.theme_uploads.worker ; // actif cdn
36 « J'aime »

Pas spécifiquement lié au wasm, mais j’ai trouvé autre chose d’intéressant dans ce code, est-ce nouveau ?

Dans votre exemple, loadScript n’est plus requis ? (Je pense que l’importation est redondante ?) :

et au lieu de cela, le script worker est chargé JIT lorsque l’on constate que le worker n’existe pas ?

en utilisant l’URL construite à partir de la référence de l’asset.

C’est un beau modèle et très utile !

Cependant, j’ai une question concernant les workers.

Si j’utilisais un script worker tiers, et que celui-ci contenait des instructions importScripts() pour inclure des scripts supplémentaires dans la portée globale du worker, comment inclure ces scripts pour les importer dans le composant de thème ?

Je demande peut-être : comment requérir un script depuis une URL dans un composant de thème Discourse ?

2 « J'aime »

Ce que j’ai fait dans ce scénario est d’utiliser un postMessage du script JS principal avec les URL à importer. Ceci est reçu par le gestionnaire de messages sur le worker qui peut importScript les URL reçues.

2 « J'aime »

Merci Rafael ! Avez-vous un exemple open source à titre de référence ?

2 « J'aime »

J’ai utilisé ce même modèle dans le noyau

6 « J'aime »

J’utilise le theme creator pour créer un nouveau composant de thème qui est censé utiliser wasm. Comme point de départ, j’ai essayé de téléverser svgbob en tant que composant de thème. Cependant, je ne suis pas autorisé à le faire, car il contient un fichier wasm.

Est-ce une limitation intentionnelle du theme creator ? Ou ne peut-on pas simplement installer svgbob tel quel ?

2 « J'aime »

Je soupçonne que nous avons juste une limitation du type de fichier sur le créateur de thème qui doit être levée.

3 « J'aime »

J’ai réinitialisé themecreator pour utiliser les « extensions autorisées du thème » par défaut, qui incluent WASM. Cela devrait donc fonctionner maintenant @Heinenen.

(Je ne suis pas sûr pourquoi il était sur un réglage non par défaut… peut-être qu’une des extensions courantes manquait par le passé :man_shrugging:)

2 « J'aime »

Oui, très cool, je peux confirmer que cela fonctionne maintenant. Merci !

3 « J'aime »

D’accord, il semble que je doive revenir un peu en arrière, je ne pense pas que cela fonctionne encore parfaitement.
J’ai essayé de téléverser à nouveau svgbob et cela a fonctionné.

Après avoir également essayé de téléverser mon propre fichier wasm, provenant de MDN, j’obtiens l’erreur :
Une erreur s'est produite : Vous avez fourni des paramètres invalides à la requête : la chaîne contient un octet nul

Sur mon conteneur de développement, ce n’est pas un problème et je peux téléverser le même fichier sans problème.

2 « J'aime »

N’est-ce pas qu’exécuter un binaire depuis le site Web constitue une exposition à la sécurité qui devrait être choisie avec soin ? C’est peut-être la raison pour laquelle ce n’était pas le réglage par défaut. Qu’en pensez-vous @Roman ?

1 « J'aime »

C’est autorisé par défaut dans les thèmes. C’est juste le paramètre du site sur discourse.theme-creator.io qui a été modifié. (c’est un site discourse ordinaire, avec un plugin qui permet à quiconque de télécharger et de partager des thèmes).

WASM est toujours isolé par le navigateur, donc l’exposition à la sécurité est équivalente à un fichier .js.

4 « J'aime »