
A minimal DuckDB WASM binding for browsers and Cloudflare Workers.
| Package | Environment | API Style |
|---|---|---|
| @ducklings/browser | Browsers | Asynchronous (Web Worker) |
| @ducklings/workers | Cloudflare Workers* | Asynchronous (Asyncify) |
Both packages provide the same async API, but use different mechanisms under the hood.
*The workers package requires a Cloudflare Workers Paid Plan due to WASM size (~9.7MB). Free plan limit is 3MB, paid plans support up to 10MB.
# For browsers
npm install @ducklings/browser
# For Cloudflare Workers
npm install @ducklings/workers
import { init, DuckDB } from '@ducklings/browser';
// Initialize the WASM module (runs in Web Worker)
await init();
// Create database and connection
const db = new DuckDB();
const conn = await db.connect();
// Execute queries (async)
const rows = await conn.query('SELECT 42 as answer');
console.log(rows); // [{ answer: 42 }]
// Clean up
await conn.close();
await db.close();
import { init, DuckDB } from '@ducklings/workers';
import wasmModule from '@ducklings/workers/wasm';
// Initialize with pre-compiled WASM module
await init({ wasmModule });
// Create database and connection
const db = new DuckDB();
const conn = db.connect();
// Execute queries (async)
const rows = await conn.query('SELECT 42 as answer');
console.log(rows); // [{ answer: 42 }]
// Clean up
conn.close();
db.close();
Both packages expose the same async API:
// Works in both packages
const rows = await conn.query('SELECT * FROM range(10)');
const table = await conn.queryArrow('SELECT * FROM range(10)');
const affected = await conn.execute('INSERT INTO t VALUES (1)');
const results = await stmt.run();