CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-wasmer--wasi

Isomorphic JavaScript library for interacting with WASI modules across Node.js, browsers, and Deno

Pending
Overview
Eval results
Files

wasi-runtime.mddocs/

WASI Runtime

Core runtime management for executing WebAssembly modules with WASI (WebAssembly System Interface) support. The WASI class handles the complete lifecycle of WebAssembly program execution, providing system interface capabilities, I/O management, and environment configuration.

Capabilities

WASI Class

Main class for managing WASI WebAssembly execution environments.

/**
 * WASI execution environment for WebAssembly modules
 */
class WASI {
  /**
   * Create a new WASI instance with configuration
   * @param config - WASI configuration options
   */
  constructor(config: WasiConfig);
  
  /** Access to the in-memory filesystem */
  readonly fs: MemFS;
  
  /**
   * Get WASI imports for a WebAssembly module
   * @param module - WebAssembly module to get imports for
   * @returns Object containing WASI imports for instantiation
   */
  getImports(module: WebAssembly.Module): object;
  
  /**
   * Instantiate a WebAssembly module with WASI support
   * @param module_or_instance - WebAssembly module or existing instance
   * @param imports - Additional imports to merge with WASI imports
   * @returns WebAssembly instance ready for execution
   */
  instantiate(module_or_instance: any, imports?: object): WebAssembly.Instance;
  
  /**
   * Start WASI program execution
   * @param instance - Optional WebAssembly instance (if not provided, uses last instantiated)
   * @returns Exit code from the WASI program (0 for success)
   */
  start(instance?: WebAssembly.Instance): number;
  
  /**
   * Get stdout buffer and clear it
   * @returns Stdout content as Uint8Array
   */
  getStdoutBuffer(): Uint8Array;
  
  /**
   * Get stdout as string and clear it
   * @returns Stdout content as UTF-8 string
   */
  getStdoutString(): string;
  
  /**
   * Get stderr buffer and clear it
   * @returns Stderr content as Uint8Array
   */
  getStderrBuffer(): Uint8Array;
  
  /**
   * Get stderr as string and clear it
   * @returns Stderr content as UTF-8 string
   */
  getStderrString(): string;
  
  /**
   * Set stdin buffer for program input
   * @param buf - Input data as Uint8Array
   */
  setStdinBuffer(buf: Uint8Array): void;
  
  /**
   * Set stdin string for program input
   * @param input - Input data as UTF-8 string
   */
  setStdinString(input: string): void;
  
  /**
   * Free WebAssembly resources
   * Call when done with the WASI instance to clean up memory
   */
  free(): void;
}

Usage Examples:

import { init, WASI } from "@wasmer/wasi";

await init();

// Basic WASI execution
const wasi = new WASI({
  args: ["program", "--verbose"],
  env: { DEBUG: "1" }
});

const module = await WebAssembly.compileStreaming(fetch("program.wasm"));
await wasi.instantiate(module, {});
const exitCode = wasi.start();

if (exitCode !== 0) {
  console.error("Program failed:", wasi.getStderrString());
} else {
  console.log("Output:", wasi.getStdoutString());
}

// Advanced usage with custom imports
const customImports = {
  env: {
    custom_function: () => console.log("Called from WASM!")
  }
};

const wasiImports = wasi.getImports(module);
const instance = await WebAssembly.instantiate(module, {
  ...wasiImports,
  ...customImports
});

wasi.instantiate(instance);
wasi.start();

Configuration

WASI configuration options for customizing the execution environment.

/**
 * Configuration options for WASI instance
 */
interface WasiConfig {
  /** 
   * Command-line arguments passed to the WASI executable
   * First argument is typically the program name
   */
  readonly args?: string[];
  
  /** 
   * Additional environment variables made available to the WASI executable
   * Merged with any existing environment
   */
  readonly env?: Record<string, string>;
  
  /** 
   * Preopened directories mapped from virtual paths to host paths
   * Currently used for configuration but may have limited host access in browser environments
   */
  readonly preopens?: Record<string, string>;
  
  /** 
   * Custom in-memory filesystem instance
   * If not provided, a new empty filesystem is created
   */
  readonly fs?: MemFS;
}

Configuration Examples:

// Basic configuration
const basicConfig = {
  args: ["myprogram"],
  env: {
    HOME: "/home/user",
    PATH: "/usr/bin"
  }
};

// With custom filesystem
import { MemFS } from "@wasmer/wasi";
const fs = new MemFS();
fs.createDir("/app");
fs.createDir("/data");

const advancedConfig = {
  args: ["dataprocessor", "--input", "/data/input.txt"],
  env: {
    WORKER_THREADS: "4",
    LOG_LEVEL: "info"
  },
  fs: fs
};

const wasi = new WASI(advancedConfig);

Standard I/O Operations

WASI provides comprehensive standard input/output/error handling with both binary and string interfaces.

// Output retrieval (these methods flush/clear the buffers)
getStdoutBuffer(): Uint8Array;
getStdoutString(): string;
getStderrBuffer(): Uint8Array;
getStderrString(): string;

// Input provision
setStdinBuffer(buf: Uint8Array): void;
setStdinString(input: string): void;

I/O Examples:

// Providing input to a program
wasi.setStdinString("Hello, WASI program!\nThis is input data.\n");

// Or using binary data
const binaryInput = new TextEncoder().encode("Binary input data");
wasi.setStdinBuffer(binaryInput);

// Running and capturing output
const exitCode = wasi.start();

// Get output (these calls clear the buffers)
const stdout = wasi.getStdoutString();
const stderr = wasi.getStderrString();

console.log("Program output:", stdout);
if (stderr) {
  console.error("Program errors:", stderr);
}

// For binary output handling
const stdoutBytes = wasi.getStdoutBuffer();
const stderrBytes = wasi.getStderrBuffer();

Error Handling

/**
 * Error class representing aborted WASI instruction execution
 */
class WasmerRuntimeError extends Error {
  // Standard Error properties available
}

Common error scenarios:

  • Initialization Error: Calling WASI methods before init()
  • Module Instantiation Error: Invalid WebAssembly module or missing imports
  • Runtime Error: WASI program crashes or invalid system calls
  • Invalid Instance Error: Calling start() without proper instantiation

Error Handling Examples:

try {
  await init();
  const wasi = new WASI({ args: ["program"] });
  
  const module = await WebAssembly.compileStreaming(fetch("program.wasm"));
  await wasi.instantiate(module, {});
  
  const exitCode = wasi.start();
  
  if (exitCode !== 0) {
    const stderr = wasi.getStderrString();
    throw new Error(`Program exited with code ${exitCode}: ${stderr}`);
  }
  
} catch (error) {
  if (error instanceof WasmerRuntimeError) {
    console.error("WASI runtime error:", error.message);
  } else {
    console.error("General error:", error);
  }
}

Install with Tessl CLI

npx tessl i tessl/npm-wasmer--wasi

docs

filesystem.md

index.md

wasi-runtime.md

tile.json