Discourse-Themenkomponenten unterstĂŒtzen jetzt Wasm 🎊

WebAssembly (Wasm) ist eine Technologie, die in allen modernen Browsern verfĂŒgbar ist und es Entwicklern ermöglicht, portable BinĂ€rprogramme auszuliefern.

Dies bedeutet, dass Entwickler fast jede Programmiersprache verwenden und das Web als Ziel haben können.

Im Kontext von Discourse eröffnet dies die Möglichkeit, eine ganze Reihe von Erweiterungen auszuliefern, die in der Vergangenheit nur fĂŒr Plugin-Ersteller verfĂŒgbar waren.

Beispiele hierfĂŒr könnten sein:

  • Bild-Wasserzeichen / -GrĂ¶ĂŸenĂ€nderung / -Zuschneidung
  • Graph-Generierung mit graphviz oder svgbob
  • Programmier-Sandboxes (z. B. BeitrĂ€ge, die eine Ruby-Laufzeitumgebung einbetten)
  • und vieles mehr

In der Vergangenheit wurde aufgrund der Discourse Content Security Policy der Zugriff auf Wasm gesperrt, außer bei Installationen mit lokalen Uploads und ohne CDN.

Neue Schnittstellen wurden auf der Client-Seite hinzugefĂŒgt, um die Auslieferung von JavaScript-Assets in einem Theme zu unterstĂŒtzen, die ĂŒber die lokale Domain bedingungslos erreichbar sind.

Dies ermöglicht Theme-Entwicklern, Wasm sauber zu hosten. Der Ablauf ist:

Komponente → lokaler Web Worker → Wasm gehostet auf CDN

Discourse svgbob ist ein End-to-End-Beispiel fĂŒr die neuen Muster. Die 2 wichtigsten Änderungen sind:

  1. Alle .js-Assets werden auch abseits des CDN auf dem lokalen Server verfĂŒgbar gemacht:
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. Die URL fĂŒr das lokale Asset ist ĂŒber settings.theme_uploads_local zugĂ€nglich.

Im obigen Beispiel also:

settings.theme_uploads_local.worker; // lokales Asset
settings.theme_uploads.worker; // CDN-Asset
36 „GefĂ€llt mir“

Nicht speziell wasm-bezogen, aber ich habe etwas anderes Interessantes an diesem Code gefunden, ist das neu?

In Ihrem Beispiel ist loadScript nicht mehr erforderlich? (Ich glaube, der Import ist ĂŒberflĂŒssig?):

und stattdessen wird das Worker-Skript JIT geladen, wenn festgestellt wird, dass der Worker nicht existiert?

unter Verwendung der URL, die aus der Asset-Referenz erstellt wurde.

Das ist ein schönes Muster und sehr hilfreich!

Ich habe jedoch eine Frage zu Workern.

Wenn ich ein Drittanbieter-Worker-Skript verwenden wĂŒrde, das importScripts()-Anweisungen enthĂ€lt, um zusĂ€tzliche Skripte in den globalen Geltungsbereich des Workers einzubinden, wie binde ich diese Skripte fĂŒr den Import in der Theme-Komponente ein?

Ich frage vielleicht: Wie fordere ich ein Skript von einer URL innerhalb einer Discourse-Theme-Komponente an?

2 „GefĂ€llt mir“

Was ich in diesem Szenario getan habe, ist die Verwendung von postMessage aus dem Haupt-JS-Skript mit den zu importierenden URLs. Dies wird im Nachrichtenhandler des Workers empfangen, der die empfangenen URLs mit importScript importieren kann.

2 „GefĂ€llt mir“

Danke Rafael! Haben Sie ein Open-Source-Beispiel als Referenz?

2 „GefĂ€llt mir“

Ich habe dieses gleiche Muster im Kern verwendet

6 „GefĂ€llt mir“

Ich benutze den Theme Creator, um eine neue Theme-Komponente zu erstellen, die wasm verwenden soll. Als Ausgangspunkt habe ich versucht, svgbob als Theme-Komponente hochzuladen. Das ist mir jedoch nicht erlaubt, da es eine wasm-Datei enthÀlt.

Ist das eine beabsichtigte EinschrÀnkung des Theme Creators? Oder kann man svgbob nicht einfach so installieren?

2 „GefĂ€llt mir“

Ich vermute, dass wir nur eine DateitypbeschrÀnkung im Theme Creator haben, die aufgehoben werden muss.

3 „GefĂ€llt mir“

Ich habe themecreator zurĂŒckgesetzt, um die Standardeinstellung „theme authorized extensions“ zu verwenden, die WASM einschließt. Es sollte jetzt funktionieren, @Heinenen.

(Ich bin mir nicht sicher, warum es auf einer nicht standardmĂ€ĂŸigen Einstellung war
 vielleicht fehlte in der Vergangenheit eine der gĂ€ngigen Erweiterungen :man_shrugging:)

2 „GefĂ€llt mir“

Ja, sehr cool, ich kann bestÀtigen, dass es jetzt funktioniert. Danke!

3 „GefĂ€llt mir“

Okay, es scheint, dass ich ein wenig zurĂŒckrudern muss, ich glaube nicht, dass es noch perfekt funktioniert.
Ich habe versucht, svgbob erneut hochzuladen, und das hat funktioniert.

Nachdem ich nun auch versucht habe, meine eigene wasm-Datei hochzuladen, die von MDN stammt, erhalte ich die Fehlermeldung:
Ein Fehler ist aufgetreten: Sie haben ungĂŒltige Parameter fĂŒr die Anfrage angegeben: String enthĂ€lt Null-Byte

Auf meinem Entwicklungscontainer ist dies kein Problem und ich kann dieselbe Datei problemlos hochladen.

2 „GefĂ€llt mir“

Ist es nicht ein Sicherheitsrisiko, eine BinĂ€rdatei von der Website auszufĂŒhren, das sorgfĂ€ltig abgewogen werden sollte? Das könnte ein Grund sein, warum es nicht standardmĂ€ĂŸig eingestellt war. Was denkst du, @Roman?

1 „GefĂ€llt mir“

Es ist in Themes standardmĂ€ĂŸig erlaubt. Es ist nur die Website-Einstellung auf discourse.theme-creator.io, die geĂ€ndert wurde. (Das ist eine normale Discourse-Website mit einem Plugin, das es jedem erlaubt, Themes hochzuladen und zu teilen).

WASM ist immer noch vom Browser isoliert, daher ist die SicherheitslĂŒcke gleichwertig mit einer .js-Datei.

4 „GefĂ€llt mir“