# "WASM Processes" _Path: en/wasm/processes_ > "Run stateful WASM actors under a Wippy process host with process.wasm." ## Table of Contents - WASM Processes ## Content # WASM Processes A `process.wasm` entry creates a persistent, isolated WASM actor under a Wippy process host. One module instance lives for the PID lifetime, keeps its guest state between messages, and participates in spawning, monitoring, messaging, and supervised shutdown. **Classification: process configuration and lifecycle reference.** Binary-backed blocks assume an external component build and application-owned filesystem, process host, environment, and policy entries. Placeholder hashes must be replaced with the exact binary digest. ## Entry Configuration ```yaml entries: - name: wasm_binaries kind: fs.directory directory: ./wasm - name: compute_worker kind: process.wasm fs: myns:wasm_binaries path: /worker.wasm hash: sha256:292b796376f8b4cc360acf2ea6b82d1084871c3607a079f30b446da8e5c984a4 method: run imports: - wippy:actor - wasi:io - wasi:poll options: limits: memory_bytes: 67108864 mailbox: capacity: 128 bytes: 8388608 message_bytes: 1048576 ``` ### Configuration Fields | Field | Required | Description | |-------|----------|-------------| | `fs` | Yes | Filesystem entry ID containing the binary | | `path` | Yes | Path to `.wasm` file within the filesystem | | `hash` | Yes | SHA-256 hash for integrity verification | | `method` | Yes | Exported function name to execute | | `transport` | No | Invocation transport: `payload` (default) or `wasi-http` | | `wit` | No | WIT signature for raw/core modules | | `imports` | No | Host imports to enable | | `wasi` | No | WASI configuration (`args`, `cwd`, `env`, and `mounts`) | | `options` | No | Actor controls: `worker_class`, `limits`, and `mailbox` | `process.wasm` actors own one instance for their whole PID lifetime, so function pooling does not apply. A root `pool` block is rejected. Put actor limits under `options.limits`; the old root `limits` and `meta.options` spellings are accepted temporarily with a deprecation warning. ## Stateful Actors and Messaging Import `wippy:actor` in a component guest to access the current PID and its bounded mailbox. The `wippy:actor/process@0.1.0` interface provides: | Function | Behavior | |----------|----------| | `self()` | Return the current actor PID as a string | | `send(target, topic, payloads)` | Send a policy-checked message to another PID | | `try-receive()` | Return the next message immediately, or `none` | | `receive()` | Suspend until a message is available | | `subscribe()` | Return a `wasi:io/poll` pollable for mailbox readiness | Messages contain the sender PID, a topic, and up to 16 payloads. Payload formats are `bytes`, UTF-8 `text`, and UTF-8 `json`. Sending is authorized as `process.send` against the target PID. Mailbox admission rejects malformed, oversized, and over-capacity messages before the guest receives them. The guest normally exports a long-running `run` function. For example: ```wit package example:worker; world worker { import wippy:actor/process@0.1.0; import wasi:io/poll@0.2.8; export run: func() -> result<_, string>; } ``` Inside `run`, call `receive()` in a loop, update guest state, and use `send()` to reply to `message.from`. Returning from `run` exits the process. ## Actor Controls Configure persistent resource and mailbox budgets under `options`: ```yaml options: worker_class: wasm limits: memory_bytes: 67108864 host_buffer_bytes: 8388608 asyncify_stack_bytes: 65536 max_execution_ms: 0 max_open_sockets: 16 socket_timeout_ms: 30000 mailbox: capacity: 128 bytes: 8388608 message_bytes: 1048576 ``` | Field | Default | Description | |-------|---------|-------------| | `worker_class` | `wasm` | Dedicated scheduler worker class; `wasm` is currently the only supported value | | `limits.memory_bytes` | 64 MiB | Guest linear-memory ceiling; a positive 64 KiB multiple, at most 4 GiB | | `limits.host_buffer_bytes` | unlimited | Accounted resident host-buffer ceiling; `0` disables this byte ceiling | | `limits.asyncify_stack_bytes` | runtime default (64 KiB) | Owned suspension storage for a core module | | `limits.max_execution_ms` | unlimited | Wall-clock lifetime for the actor; `0` means no deadline | | `limits.max_open_sockets` | 16 | Concurrent open sockets owned by the actor | | `limits.socket_timeout_ms` | 30000 | Socket operation timeout in milliseconds | | `mailbox.capacity` | 128 | Maximum queued messages | | `mailbox.bytes` | 8 MiB | Aggregate queued-message budget | | `mailbox.message_bytes` | 1 MiB | Per-message budget, including framing overhead | `mailbox.message_bytes` cannot exceed `mailbox.bytes`. The capacity must also fit the byte budget's minimum 256-byte accounting per queued message. Unknown fields and invalid values fail entry admission. ## CLI Commands Register a WASM process as a named command with `meta.command`: ```yaml - name: greet kind: process.wasm meta: command: name: greet short: Greet someone via WASM fs: myns:wasm_binaries path: /component.wasm hash: sha256:... method: greet ``` Run it with: ```bash wippy run greet ``` List available commands: ```bash wippy run list ``` | Field | Required | Description | |-------|----------|-------------| | `name` | Yes | Command name used with `wippy run ` | | `short` | No | Short description shown in `wippy run list` | | `main` | No | Mark the entry as the default command for a pack or hub module | | `use_case` | No | Entrypoint category; defaults to `run` | | `security` | No | Security context applied only when the trusted terminal launcher starts this command | A `terminal.host` must be present for CLI commands to work; it is the process host that runs the command. ## Process Lifecycle WASM processes follow the Init/Step/Close lifecycle model: 1. **Init** - Call context, method, and input arguments are captured 2. **Step** - The first step instantiates and starts the module. Later steps advance dispatcher-bridged operations; a synchronous execution can complete in the first step. 3. **Close** - Instance resources are released ## Spawning from Lua Spawn a WASM process and monitor it for completion: ```lua local errors = require("errors") -- Spawn with monitoring local pid, err = process.spawn_monitored( "myns:compute_worker", -- entry ID "myns:processes", -- process host 6, 7 -- arguments passed to the WASM function ) if err then return nil, err end -- Wait for the process to complete local events = process.events() while true do local event, open = events:receive() if not open then return nil, errors.new("process event channel closed") end if event.kind == process.event.EXIT and event.from == pid then local result = event.result.value -- return value from the WASM function return result, event.result.error end end ``` ## Async Execution WASM actors yield for host operations that the runtime bridges through the dispatcher, including mailbox receive/send, polling, clocks, sockets, DNS, filesystem streams, and outgoing HTTP. The scheduler suspends the process until the pending operation completes, then resumes the same guest instance: ```yaml - name: http_worker kind: process.wasm fs: myns:wasm_binaries path: /http_worker.wasm hash: sha256:... method: run imports: - wasi:io - wasi:cli - wasi:http wasi: env: - id: myns:api_url name: API_URL required: true ``` The yield/resume mechanism is transparent to an asyncified core module or a component using the supported pollable interfaces. ## WASI Configuration Processes support the same WASI configuration as functions: ```yaml - name: file_processor kind: process.wasm fs: myns:wasm_binaries path: /processor.wasm hash: sha256:... method: process imports: - wasi:cli - wasi:io - wasi:clocks - wasi:filesystem wasi: args: ["--input", "/data/input.csv"] cwd: "/app" env: - id: myns:output_format name: OUTPUT_FORMAT mounts: - fs: myns:input_data guest: /data read_only: true - fs: myns:output_dir guest: /output ``` ## See Also - [Overview](wasm/overview.md) - WebAssembly runtime overview - [Functions](wasm/functions.md) - WASM function configuration - [Host Functions](wasm/hosts.md) - Available host interfaces - [Process Model](concepts/process-model.md) - Process lifecycle - [Supervision](guides/supervision.md) - Process supervision trees ## Navigation Previous: "Host Functions" (wasm/hosts) Next: "Framework" (framework/overview)