Spaces:
Running
Running
import * as duckdb from "@duckdb/duckdb-wasm"; | |
const production = import.meta.env.PROD; | |
const makeUrl = (path: string) => | |
`https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm/dist/${path}`; | |
const MANUAL_BUNDLES: | |
| duckdb.DuckDBBundles | |
| (() => Promise<duckdb.DuckDBBundles>) = production | |
? { | |
mvp: { | |
mainModule: makeUrl("duckdb-mvp.wasm"), | |
mainWorker: makeUrl("duckdb-browser-mvp.worker.js"), | |
}, | |
eh: { | |
mainModule: makeUrl("duckdb-eh.wasm"), | |
mainWorker: makeUrl("duckdb-browser-eh.worker.js"), | |
}, | |
} | |
: async () => ({ | |
mvp: { | |
mainModule: ( | |
await import("@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url") | |
).default, | |
mainWorker: ( | |
await import( | |
"@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js?url" | |
) | |
).default, | |
}, | |
eh: { | |
mainModule: ( | |
await import("@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url") | |
).default, | |
mainWorker: ( | |
await import( | |
"@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js?url" | |
) | |
).default, | |
}, | |
}); | |
// https://duckdb.org/docs/api/wasm/instantiation#vite | |
export const createDb = async () => { | |
const bundles = | |
typeof MANUAL_BUNDLES === "function" | |
? await MANUAL_BUNDLES() | |
: MANUAL_BUNDLES; | |
// Select a bundle based on browser checks | |
const bundle = await duckdb.selectBundle(bundles); | |
// Instantiate the asynchronus version of DuckDB-wasm | |
let wk = bundle.mainWorker!; | |
if (wk.startsWith("http") && production) { | |
// fetch worker contents, convert to base64, inject into worker | |
const blob = await fetch(wk).then((r) => r.text()); | |
wk = `data:text/javascript;base64,${btoa(blob)}`; | |
} | |
const worker = new Worker(wk); | |
const logger = new duckdb.ConsoleLogger(); | |
const db = new duckdb.AsyncDuckDB(logger, worker); | |
await db.instantiate(bundle.mainModule, bundle.pthreadWorker); | |
return db; | |
}; | |
export type DuckDB = typeof duckdb; | |