Pular para o conteúdo

Funcoes WASM

Funcoes WASM sao entradas de registro que executam codigo WebAssembly. Dois tipos de entrada estao disponiveis: function.wat para codigo WAT inline e function.wasm para binarios pre-compilados.

Defina funcoes WASM pequenas diretamente no seu _index.yaml usando o formato WebAssembly Text:

entries:
- name: answer
kind: function.wat
source: |
(module
(func (export "answer") (result i32)
i32.const 42
)
)
wit: |
answer: func() -> s32;
method: answer
pool:
type: inline

Para fontes WAT maiores, use uma referencia a arquivo:

- name: answer
kind: function.wat
source: file://answer.wat
wit: |
answer: func() -> s32;
method: answer
pool:
type: inline
CampoObrigatorioDescricao
sourceSimFonte WAT inline ou referencia file://
methodSimNome da funcao exportada a ser chamada
witNaoAssinatura WIT para modulos raw/core
poolNaoConfiguracao do pool de workers
transportNaoMapeamento de entrada/saida (padrao: payload)
importsNaoImports do host a habilitar (ex.: wasi:cli, wasi:io)
wasiNaoConfiguracao WASI (args, env, mounts)
limitsNaoLimites de execucao

Carregue binarios .wasm compilados a partir de uma entrada de sistema de arquivos:

entries:
- name: assets
kind: fs.directory
directory: ./wasm
- name: compute
kind: function.wasm
fs: myns:assets
path: /compute.wasm
hash: sha256:292b796376f8b4cc360acf2ea6b82d1084871c3607a079f30b446da8e5c984a4
method: compute
pool:
type: lazy
max_size: 4
CampoObrigatorioDescricao
fsSimID da entrada de sistema de arquivos contendo o binario
pathSimCaminho para o arquivo .wasm dentro do sistema de arquivos
hashSimHash SHA-256 para verificacao de integridade (sha256:...)
methodSimNome da funcao exportada a ser chamada
witNaoAssinatura WIT para modulos raw/core
poolNaoConfiguracao do pool de workers
transportNaoMapeamento de entrada/saida (padrao: payload)
importsNaoImports do host a habilitar
wasiNaoConfiguracao WASI
limitsNaoLimites de execucao

Cada funcao WASM usa um pool de instancias pre-compiladas. O tipo do pool controla a concorrencia e o uso de recursos.

TipoDescricao
inlineSincrono, single-threaded. Nova instancia por chamada.
lazyZero workers ociosos. Escala sob demanda ate max_size.
staticNumero fixo de workers com fila de requisicoes.
adaptivePool elastico com auto-escalonamento.
pool:
type: static
size: 4 # Total pool size
workers: 2 # Worker threads
buffer: 16 # Request queue buffer (default: workers * 64)
pool:
type: lazy
max_size: 8 # Maximum concurrent instances
pool:
type: adaptive
max_size: 16 # Upper scaling bound
warm_start: true # Pre-instantiate initial workers

O maximo padrao do pool elastico e 100 workers quando max_size nao e especificado.

Transportes controlam como entrada e saida sao mapeados entre o runtime e o modulo WASM.

TransporteDescricao
payloadMapeia payloads do runtime diretamente para argumentos de chamada WASM (padrao)
wasi-httpMapeia contexto de requisicao/resposta HTTP para argumentos e resultados WASM

O transporte padrao passa argumentos diretamente. Valores Lua sao transcodificados para tipos Go, depois rebaixados para tipos WIT:

- name: compute
kind: function.wasm
fs: myns:assets
path: /compute.wasm
hash: sha256:...
method: compute
pool:
type: inline
-- Arguments passed directly as WASM function parameters
local result, err = funcs.call("myns:compute", 6, 7)
-- result: 42

O transporte wasi-http mapeia requisicoes HTTP para WASM e escreve os resultados de volta na resposta HTTP. Use isso para expor funcoes WASM como endpoints HTTP:

- name: greet_wasm
kind: function.wasm
fs: myns:assets
path: /greet.wasm
hash: sha256:...
method: greet
transport: wasi-http
pool:
type: inline
- name: greet_endpoint
kind: http.endpoint
method: POST
path: /api/greet
func: greet_wasm

Defina um tempo maximo de execucao para uma funcao:

limits:
max_execution_ms: 5000 # 5 second timeout

Quando o limite e excedido, a execucao e cancelada e um erro e retornado.

Configure capacidades WASI para o modulo guest:

wasi:
args: ["--verbose"]
cwd: "/app"
env:
- id: myns:api_key
name: API_KEY
required: true
- id: myns:debug_mode
name: DEBUG
mounts:
- fs: myns:data_files
guest: /data
read_only: true
- fs: myns:output
guest: /output
CampoDescricao
argsArgumentos de linha de comando passados ao guest
cwdDiretorio de trabalho dentro do guest (deve ser absoluto)
envVariaveis de ambiente mapeadas de entradas env do registro
mountsMontagens de sistema de arquivos a partir de entradas de sistema de arquivos do registro

Variaveis de ambiente sao resolvidas a partir do registro de ambiente no momento da chamada. Variaveis obrigatorias causam um erro se nao forem encontradas.

Caminhos de montagem devem ser absolutos e unicos. Cada montagem mapeia uma entrada de sistema de arquivos do runtime para um caminho de diretorio do guest.

entries:
- name: wasm_binaries
kind: fs.directory
directory: ./wasm
- name: transform_users
kind: function.wasm
fs: myns:wasm_binaries
path: /mapper.wasm
hash: sha256:7304fc7d19778605458ae5804dae9a7343dcd3f5fc22bcc9415e98b5047192dd
method: transform-users
pool:
type: lazy
max_size: 4
- name: filter_active
kind: function.wasm
fs: myns:wasm_binaries
path: /mapper.wasm
hash: sha256:7304fc7d19778605458ae5804dae9a7343dcd3f5fc22bcc9415e98b5047192dd
method: filter-active
pool:
type: lazy
max_size: 4
local funcs = require("funcs")
local users = {
{id = 1, name = "Alice", tags = {"admin", "dev"}, active = true},
{id = 2, name = "Bob", tags = {"user"}, active = false},
{id = 3, name = "Carol", tags = {"dev"}, active = true},
}
-- Transform: adds display field and tag count
local transformed, err = funcs.call("myns:transform_users", users)
-- Filter: returns only active users
local active, err = funcs.call("myns:filter_active", users)

Componentes WASM que importam wasi:clocks e wasi:io podem usar relogios e polling. O mecanismo de yield assincrono se integra com o dispatcher do Wippy:

- name: sleep_ms
kind: function.wasm
fs: myns:wasm_binaries
path: /sleep_test.wasm
hash: sha256:...
method: "test-sleep#sleep-ms"
imports:
- wasi:io
- wasi:clocks
pool:
type: inline

O separador # no campo method referencia um metodo de interface: test-sleep#sleep-ms chama a funcao sleep-ms da interface test-sleep.