File size: 2,023 Bytes
34cfb9f
 
d567792
 
 
 
34cfb9f
d567792
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34cfb9f
 
d567792
 
 
 
34cfb9f
d567792
34cfb9f
f1e16d2
 
 
 
 
 
 
34cfb9f
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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;