8000 GitHub - project-minigraf/minigraf-wasm: Browser WASM and WASI bindings for Minigraf — bi-temporal graph database · GitHub
[go: up one dir, main page]

Skip to content

About

Browser WASM and WASI bindings for Minigraf — bi-temporal graph database

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

minigraf (WebAssembly)

WebAssembly builds of Minigraf — zero-config, single-file, embedded bi-temporal graph database with Datalog queries.

Two packages are published from this repo:

Package Target Install
@minigraf/browser Browser (wasm-bindgen) npm install @minigraf/browser
@minigraf/wasi Node.js / WASI runtimes npm install @minigraf/wasi

Browser (@minigraf/browser)

import init, { BrowserDb } from '@minigraf/browser'

await init()

const db = await BrowserDb.open('mydb')   // IndexedDB-backed; or BrowserDb.openInMemory() for tests
await db.execute('(transact [[:alice :name "Alice"]])')

const result = JSON.parse(await db.execute('(query [:find ?n :where [?e :name ?n]])'))
console.log(result.results[0][0])  // "Alice"

execute() returns a Promise<string> containing JSON:

  • Query: {"variables": [...], "results": [[...], ...]}
  • Transact: {"transacted": <tx_id>}
  • Retract: {"retracted": <tx_id>}
  • Rule: {"ok": true}

Other methods:

Method Description
BrowserDb.open(name) Open or create a database persisted in IndexedDB (async).
BrowserDb.openInMemory() Open a non-persistent database. Data is lost when the page closes.
db.exportGraph() Serialise the database to a Uint8Array that is byte-compatible with native .graph files.
await db.importGraph(bytes) Replace the database with a .graph blob. The blob must be checkpointed, with no pending WAL sidecar.
await db.checkpoint() Flush dirty pages to IndexedDB. You only need it after bulk operations; execute() already writes through. Does nothing on in-memory databases.

@minigraf/browser does not run in Node.js. For server-side use, use minigraf.

WASI (@minigraf/wasi)

The package is the Minigraf REPL compiled to wasm32-wasip1, not a library: it reads Datalog commands from stdin and prints the results to stdout, over an in-memory database. In repl.mjs:

import { WASI } from "node:wasi";
import { startMinigrafWasi } from "@minigraf/wasi";

const wasi = new WASI({ version: "preview1", args: ["minigraf"], env: process.env });
await startMinigrafWasi(wasi);
printf '%s\n' '(transact [[:alice :name "Alice"]])' '(query [:find ?n :where [?e :name ?n]])' | node repl.mjs

For the browser, or for a database that persists, use @minigraf/browser, or minigraf in Node.js.

Building from source

Requires Rust stable toolchain and wasm-pack.

# Browser target
wasm-pack build --target web --features browser

# WASI target
cargo build --target wasm32-wasip1 --release

Cascade release

This repo receives a core-release repository_dispatch from the minigraf monorepo cascade whenever a new version of the minigraf core crate is published. The release workflow pins the new version, commits, tags, and publishes both npm packages.

License

MIT OR Apache-2.0

About

Browser WASM 51C9 and WASI bindings for Minigraf — bi-temporal graph database

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

0