Skip to content

Browser Usage

hizi engine generator works in the browser using OPFS (Origin Private File System) for file storage. The same HiziEngineGenerator class is used in both Node.js and browser — environment detection is automatic.

Requirements

  • Must run in a dedicated Web Worker (required for OPFS sync access handles)
  • Server must set Cross-Origin-Isolation headers for OPFS access:
    • Cross-Origin-Opener-Policy: same-origin
    • Cross-Origin-Embedder-Policy: require-corp

Import

typescript
import { HiziEngineGenerator } from '@hizi.io/engine-generator';

Generating and Downloading

All files are plain JSONL during generation — no compression needed at runtime.

typescript
const generator = new HiziEngineGenerator();

// Start — writes to OPFS
await generator.start('/sim-output');

// Record results (same as Node.js)
for (const outcome of simulationResults) {
  generator.addResult(outcome.scenario, {
    win: outcome.win,
    metaTags: outcome.tags,
  });
}

// Finalize — writes entries to OPFS, closes scenario stream
await generator.end();

// Get generated file contents
const files = generator.getOutputFiles();
// Map { 'entries.jsonl' => '...', 'scenarios.jsonl' => '...' }

Compressing for Download

To produce brotli-compressed .br files in the browser, use brotli-wasm:

bash
npm install brotli-wasm
typescript
import brotliWasm from 'brotli-wasm';

const bw = await brotliWasm;
const compress = (data: string) =>
  bw.compress(new TextEncoder().encode(data), { quality: 9 });

const files = generator.getOutputFiles();
const entriesBr = compress(files.get('entries.jsonl')!);
const scenariosBr = compress(files.get('scenarios.jsonl')!);

Available Methods

Method / PropertyDescription
start(dir)Start streaming to OPFS
addResult()Record a game outcome (scenarios stream directly to disk)
end()Finalize output — write entries, close scenario stream
getOutputFiles()Get generated files as Map<string, string> (entries only)
outputDirectoryOPFS path (available after end()). Read scenarios from OPFS directly without loading into memory.