🧰 TypeScript Binding — Setup

This guide shows how to install the TypeScript binding and choose a transport. Vulfram runs in different environments via transports:

  • WASM for browsers
  • Bun FFI for Bun
  • N-API for Node.js

Install

npm / pnpm / yarn

bash
npm i @vulfram/engine @vulfram/transport-wasm

For Node.js or Bun, use the corresponding transport package instead:

bash
npm i @vulfram/engine @vulfram/transport-napi
bash
npm i @vulfram/engine @vulfram/transport-bun

Workspace (monorepo)

If you are working inside the Vulfram monorepo, use workspace dependencies:

json
{
  "dependencies": {
    "@vulfram/engine": "workspace:*",
    "@vulfram/transport-wasm": "workspace:*"
  }
}

Pick a Transport

Browser (WASM)

ts
import { initEngine } from '@vulfram/engine';
import { initWasmTransport, transportWasm } from '@vulfram/transport-wasm';

await initWasmTransport();
initEngine({ transport: transportWasm });

Node.js (N-API)

ts
import { initEngine } from '@vulfram/engine';
import { transportNapi } from '@vulfram/transport-napi';

initEngine({ transport: transportNapi });

Bun (FFI)

ts
import { initEngine } from '@vulfram/engine';
import { transportBunFfi } from '@vulfram/transport-bun';

initEngine({ transport: transportBunFfi });

Minimal Project Skeleton (WASM)

ts
import {
  initEngine,
  createWorld,
  createWindow,
  tick,
} from '@vulfram/engine';
import { initWasmTransport, transportWasm } from '@vulfram/transport-wasm';

const WORLD_ID = 1;

await initWasmTransport();
initEngine({ transport: transportWasm });

createWorld(WORLD_ID);
createWindow(WORLD_ID, {
  title: 'Vulfram WASM',
  size: [960, 540],
  position: [0, 0],
  resizable: true,
  canvasId: 'vulfram-canvas',
});

let last = performance.now();
function frame(now: number) {
  const dt = now - last;
  last = now;
  tick(now, dt);
  requestAnimationFrame(frame);
}
requestAnimationFrame(frame);

Runtime Notes

  • Call initEngine once per process.
  • Call tick once per frame; this drives event processing and command flushing.
  • Always call createWorld before calling createWindow or any entity/resource APIs.
Documentation Vulfram Core