Skip to main content
Version: v1.0.0

JavaScript and TypeScript

The zova-js package provides synchronous and queued asynchronous Node-API bindings with bundled TypeScript declarations. It uses the same native Zova engine and file format as the other bindings.

Install

bun add zova-js
# or
npm install zova-js

Prebuilt packages support Node.js 22 and 24 and Bun on:

  • macOS arm64 and x86_64;
  • glibc Linux arm64 and x86_64; and
  • Windows x86_64 with MSVC.

Electron, Deno, browser use of this native addon, musl Linux, and Windows arm64 are not claimed. A supported prebuilt installation does not need Zig, Rust, a C compiler, or an install-time native download. Browser applications can use the separate experimental WebAssembly package.

Synchronous database

Database exposes SQL statements, transactions, savepoints, in-memory databases, backup and restore, binary KV, app events, objects, typed vectors, public graph operations, format probe/migration, and bundled extension lifecycle.

import { Database, Step } from "zova-js";

const db = Database.create("app.zova");
db.exec("create table notes(id integer primary key, body text not null)");

const insert = db.prepare("insert into notes(body) values (?1)");
insert.bindText(1, "hello");
if (insert.step() !== Step.Done) {
throw new Error("insert did not finish");
}
insert.close();

db.transaction((transaction) => {
transaction.exec("insert into notes(body) values ('committed')");
});

db.close();

Transaction and savepoint callbacks are synchronous. Returning a Promise is rejected before commit, and throwing rolls the scope back.

Queued asynchronous database

AsyncDatabase runs native work on the Node worker pool while preserving FIFO order for each database. It rejects new work after closing begins, waits for already queued work, and closes once.

import { AsyncDatabase } from "zova-js";

const db = AsyncDatabase.create("app.zova");
await db.exec("create table notes(body text)");
const objectId = await db.putObject(
new TextEncoder().encode("large bytes"),
);
const bytes = await db.getObject(objectId);
console.log(bytes.byteLength);
await db.close();

Queued operations include backup, compact, restore, format probe/migration, KV and event operations, vector batches and searches, and graph batches and walks. Async transaction callbacks and prepared statement handles are not exposed.

Data mappings

Zova valueJavaScript value
SQL integer, count, or identitybigint
blob or object bytesUint8Array
f32 vectorFloat32Array
raw f16 elementsUint16Array
i8 vectorInt8Array
nullable SQL datanull
absent optionundefined

Ownership and errors

Close Statement, ObjectWriter, and Database values explicitly. Node-API finalizers are fallback cleanup, not the primary lifecycle.

Native failures are exposed as ZovaError with the Zova status name, numeric status, and native message.

import { Database, ZovaError } from "zova-js";

const db = Database.create("app.zova");

try {
db.exec("select * from missing");
} catch (error) {
if (error instanceof ZovaError) {
console.error(error.code, error.status, error.message);
}
}

db.close();

Advanced opaque graph keys, topology scans, edge payloads, and fresh-build sessions remain stable low-level C ABI and raw zova-sys capabilities. Their omission from the high-level JavaScript API is deliberate.