Zum Inhalt springen

WASM-Funktionen

WASM-Funktionen sind Registry-Eintraege, die WebAssembly-Code ausfuehren. Zwei Entry Kinds stehen zur Verfuegung: function.wat fuer Inline-WAT-Quellcode und function.wasm fuer vorkompilierte Binaries.

Definieren Sie kleine WASM-Funktionen direkt in Ihrer _index.yaml im WebAssembly-Text-Format:

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

Fuer groessere WAT-Quellen verwenden Sie eine Dateireferenz:

- name: answer
kind: function.wat
source: file://answer.wat
wit: |
answer: func() -> s32;
method: answer
pool:
type: inline
FieldRequiredBeschreibung
sourceYesInline-WAT-Quellcode oder file://-Referenz
methodYesName der exportierten Funktion, die aufgerufen wird
witNoWIT-Signatur fuer Raw/Core-Module
poolNoWorker-Pool-Konfiguration
transportNoInput/Output-Mapping (Standard: payload)
importsNoHost-Imports zum Aktivieren (z.B. wasi:cli, wasi:io)
wasiNoWASI-Konfiguration (args, env, mounts)
limitsNoAusfuehrungslimits

Laden Sie kompilierte .wasm-Binaries aus einem Dateisystem-Eintrag:

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
FieldRequiredBeschreibung
fsYesDateisystem-Entry-ID, die das Binary enthaelt
pathYesPfad zur .wasm-Datei innerhalb des Dateisystems
hashYesSHA-256-Hash zur Integritaetspruefung (sha256:...)
methodYesName der exportierten Funktion, die aufgerufen wird
witNoWIT-Signatur fuer Raw/Core-Module
poolNoWorker-Pool-Konfiguration
transportNoInput/Output-Mapping (Standard: payload)
importsNoHost-Imports zum Aktivieren
wasiNoWASI-Konfiguration
limitsNoAusfuehrungslimits

Jede WASM-Funktion verwendet einen Pool vorkompilierter Instanzen. Der Pool-Typ steuert Nebenlaeufigkeit und Ressourcenverbrauch.

TypeBeschreibung
inlineSynchron, single-threaded. Neue Instanz pro Aufruf.
lazyKeine Idle-Worker. Skaliert bei Bedarf bis max_size.
staticFeste Anzahl von Workern mit Request-Queue.
adaptiveAutomatisch skalierende elastische Pools.
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

Das Standard-Maximum fuer elastische Pools betraegt 100 Worker, wenn max_size nicht angegeben ist.

Transports steuern, wie Input und Output zwischen der Runtime und dem WASM-Modul abgebildet werden.

TransportBeschreibung
payloadBildet Runtime-Payloads direkt auf WASM-Aufrufargumente ab (Standard)
wasi-httpBildet HTTP-Request/Response-Kontext auf WASM-Argumente und -Ergebnisse ab

Der Standard-Transport uebergibt Argumente direkt. Lua-Werte werden in Go-Typen transkodiert und dann in WIT-Typen abgesenkt:

- 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

Der wasi-http-Transport bildet HTTP-Requests auf WASM ab und schreibt Ergebnisse zurueck in die HTTP-Response. Verwenden Sie ihn, um WASM-Funktionen als HTTP-Endpunkte bereitzustellen:

- 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

Legen Sie eine maximale Ausfuehrungszeit fuer eine Funktion fest:

limits:
max_execution_ms: 5000 # 5 second timeout

Wenn das Limit ueberschritten wird, wird die Ausfuehrung abgebrochen und ein Fehler zurueckgegeben.

Konfigurieren Sie WASI-Faehigkeiten fuer das Guest-Modul:

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
FieldBeschreibung
argsKommandozeilenargumente, die an den Guest uebergeben werden
cwdArbeitsverzeichnis innerhalb des Guest (muss absolut sein)
envUmgebungsvariablen, abgebildet aus Registry-Env-Eintraegen
mountsDateisystem-Mounts aus Registry-Dateisystem-Eintraegen

Umgebungsvariablen werden zum Aufrufzeitpunkt aus der Umgebungs-Registry aufgeloest. Erforderliche Variablen verursachen einen Fehler, wenn sie nicht gefunden werden.

Mount-Pfade muessen absolut und eindeutig sein. Jeder Mount bildet einen Runtime-Dateisystem-Eintrag auf einen Guest-Verzeichnispfad ab.

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)

WASM-Komponenten, die wasi:clocks und wasi:io importieren, koennen Clocks und Polling verwenden. Der asynchrone Yield-Mechanismus integriert sich in den Wippy-Dispatcher:

- 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

Der #-Separator im method-Feld referenziert eine Interface-Methode: test-sleep#sleep-ms ruft die Funktion sleep-ms aus dem Interface test-sleep auf.