Componentes de tema do Discourse agora suportam Wasm 🎊

WebAssembly (Wasm) é uma tecnologia que vem em todos os navegadores modernos e permite que os desenvolvedores enviem programas binários portáteis.

Isso significa que os desenvolvedores podem usar quase qualquer linguagem de programação e ter como alvo a web.

No contexto do Discourse, isso abre as portas para o envio de um conjunto bastante rico de extensões que antes estavam disponíveis apenas para criadores de plugins.

Exemplos podem ser:

  • Marca d’água / redimensionamento / corte de imagens
  • Geração de gráficos usando graphviz ou svgbob
  • Sandboxes de programação (por exemplo: posts que incorporam um runtime Ruby)
  • e muito mais

No passado, devido à Content Security Policy do Discourse, o acesso ao Wasm foi desativado, exceto para instalações com uploads locais e sem CDN.

Novas interfaces foram adicionadas ao lado do cliente para suportar o envio de ativos JavaScript em um tema que são incondicionalmente alcançáveis ​​via domínio local.

Isso permite que os desenvolvedores de temas hospedem Wasm de forma limpa, o fluxo é:

componente → worker web local → Wasm hospedado em CDN

Discourse svgbob é um exemplo ponta a ponta dos novos padrões, as 2 principais mudanças são:

  1. Todos os ativos .js também são disponibilizados fora da CDN no servidor local:
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. A URL para o ativo local é acessível via settings.theme_uploads_local

Portanto, no exemplo acima:

settings.theme_uploads_local.worker; // ativo local
settings.theme_uploads.worker; // ativo cdn
36 curtidas

Não especificamente relacionado a wasm, mas encontrei outra coisa interessante sobre este código, é novo?

No seu exemplo, loadScript não é mais necessário? (Acredito que a importação seja redundante?):

e em vez disso, o script do worker é carregado JIT quando se descobre que o worker não existe?

usando a URL construída a partir da referência do asset.

Esse é um padrão legal e muito útil!

No entanto, tenho uma pergunta sobre workers.

Se eu usasse um script de worker de terceiros, e ele contivesse instruções importScripts() para incluir scripts adicionais no escopo global do worker, como incluo esses scripts para importação dentro do componente de tema?

Talvez eu esteja perguntando: como exigimos um script de uma URL dentro de um Componente de Tema do Discourse?

2 curtidas

O que fiz neste cenário é usar um postMessage do script JS principal com os URLs a serem importados. Isso é recebido no manipulador de mensagens no worker que pode importScript os URLs recebidos.

2 curtidas

Obrigado, Rafael!. Você tem um exemplo de código aberto para referência?

2 curtidas

Eu usei este mesmo padrão no core

6 curtidas

Estou usando o theme creator para criar um novo componente de tema que deve usar wasm. Como ponto de partida, tentei fazer o upload do svgbob como um componente de tema. No entanto, não tenho permissão para fazer isso, pois ele contém um arquivo wasm.

Essa é uma limitação intencional do theme creator? Ou não se pode simplesmente instalar o svgbob como está?

2 curtidas

Suspeito que apenas tenhamos uma limitação no tipo de arquivo no criador de temas que precisa ser removida.

3 curtidas

Eu redefini o themecreator para usar as ‘extensões autorizadas de tema’ padrão, que incluem WASM. Então deve funcionar agora @Heinenen.

(não tenho certeza por que estava em uma configuração não padrão… talvez no passado uma das extensões comuns estivesse faltando :man_shrugging:)

2 curtidas

Sim, muito legal, posso confirmar que agora funciona. Obrigado!

3 curtidas

Ok, parece que preciso voltar um pouco, não acho que esteja funcionando perfeitamente ainda.
Tentei fazer o upload do svgbob novamente e isso funcionou.

Depois de também tentar fazer o upload do meu próprio wasm-file, retirado do MDN, recebo o erro:
An error occurred: You supplied invalid parameters to the request: string contains null byte

No meu contêiner de desenvolvimento, isso não é um problema e posso fazer o upload do mesmo arquivo sem problemas.

2 curtidas

Não é a execução de um binário do site uma exposição de segurança que deve ser escolhida com cuidado? Esse pode ser um motivo pelo qual não era o padrão. O que você acha @Roman?

1 curtida

Ele é permitido em temas por padrão. Foi apenas a configuração do site em discourse.theme-creator.io que foi alterada. (esse é um site discourse comum, com um plugin que permite que qualquer pessoa carregue e compartilhe temas).

O WASM ainda é isolado pelo navegador, então a exposição de segurança é equivalente a um arquivo .js.

4 curtidas