WASM関数

WASM関数はWebAssemblyコードを実行するレジストリエントリです。インラインWATソース用のfunction.watとプリコンパイル済みバイナリ用のfunction.wasmの2つのエントリ種別が利用できます。

インラインWAT関数

WebAssembly Textフォーマットを使用して、_index.yaml内に小さなWASM関数を直接定義できます:

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

より大きなWATソースにはファイル参照を使用してください:

  - name: answer
    kind: function.wat
    source: file://answer.wat
    wit: |
      answer: func() -> s32;      
    method: answer
    pool:
      type: inline

WAT設定フィールド

フィールド 必須 説明
source Yes インラインWATソースまたはfile://参照
method Yes 呼び出すエクスポート関数名
wit No Raw/コアモジュール用のWITシグネチャ
pool No ワーカープール設定
transport No 入出力マッピング(デフォルト: payload
imports No 有効にするホストインポート(例: wasi:cliwasi:io
wasi No WASI設定(args、env、mounts)
limits No 実行制限

プリコンパイル済みWASM関数

ファイルシステムエントリからコンパイル済みの.wasmバイナリをロードします:

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

WASM設定フィールド

フィールド 必須 説明
fs Yes バイナリを含むファイルシステムエントリID
path Yes ファイルシステム内の.wasmファイルへのパス
hash Yes 整合性検証用のSHA-256ハッシュ(sha256:...
method Yes 呼び出すエクスポート関数名
wit No Raw/コアモジュール用のWITシグネチャ
pool No ワーカープール設定
transport No 入出力マッピング(デフォルト: payload
imports No 有効にするホストインポート
wasi No WASI設定
limits No 実行制限

ワーカープール

各WASM関数はプリコンパイル済みインスタンスのプールを使用します。プールタイプにより並行性とリソース使用量が制御されます。

タイプ 説明
inline 同期、シングルスレッド。呼び出しごとに新しいインスタンスを作成。
lazy アイドルワーカーゼロ。max_sizeまでオンデマンドでスケール。
static リクエストキュー付きの固定数ワーカー。
adaptive 自動スケーリングの弾力的プール。

プール設定

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

max_sizeが指定されていない場合、デフォルトの弾力的プール最大値は100ワーカーです。

トランスポート

トランスポートはランタイムとWASMモジュール間の入出力マッピング方法を制御します。

トランスポート 説明
payload ランタイムペイロードをWASM呼び出し引数に直接マッピング(デフォルト)
wasi-http HTTPリクエスト/レスポンスコンテキストをWASMの引数と結果にマッピング

Payloadトランスポート

デフォルトのトランスポートは引数を直接渡します。Lua値はGo型にトランスコードされ、次に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

WASI HTTPトランスポート

wasi-httpトランスポートはHTTPリクエストをWASMにマッピングし、結果をHTTPレスポンスに書き戻します。WASM関数を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

実行制限

関数の最大実行時間を設定します:

limits:
  max_execution_ms: 5000   # 5 second timeout

制限を超過すると、実行がキャンセルされエラーが返されます。

WASI設定

ゲストモジュールのWASI機能を設定します:

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
フィールド 説明
args ゲストに渡されるコマンドライン引数
cwd ゲスト内の作業ディレクトリ(絶対パスであること)
env レジストリ環境エントリからマッピングされる環境変数
mounts レジストリファイルシステムエントリからのファイルシステムマウント

環境変数は呼び出し時に環境レジストリから解決されます。必須変数が見つからない場合はエラーになります。

マウントパスは絶対パスかつ一意でなければなりません。各マウントはランタイムファイルシステムエントリをゲストディレクトリパスにマッピングします。

使用例

データ変換パイプライン

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)

WASI Clocksによる非同期スリープ

wasi:clockswasi:ioをインポートするWASMコンポーネントはクロックとポーリングを使用できます。非同期yieldメカニズムは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

methodフィールドの#セパレータはインターフェースメソッドを参照します: test-sleep#sleep-mstest-sleepインターフェースのsleep-ms関数を呼び出します。

関連項目