Skip to content

Using duckdb-wasm with deno #29942

@plutonium-239

Description

@plutonium-239

Version: Deno 2.3.7

Followed up from #23656
cc @bartlomieju

Setup:

deno init
...
deno add npm:@duckdb/duckdb-wasm
-> Add npm:@duckdb/duckdb-wasm@1.29.1-dev132.0

main.ts

import duckdb from '@duckdb/duckdb-wasm';

async function setupDB() {
const JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);

// Instantiate the asynchronus version of DuckDB-Wasm
const worker = new Worker(bundle.mainWorker!, { type: "module" });
const logger = new duckdb.ConsoleLogger();
const db = new duckdb.AsyncDuckDB(logger, worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
const con = await db.connect()
return con
}

const con = await setupDB();

const res = await con.query(`
SELECT * FROM generate_series(1, 100) t(v)
`);

console.log(res)

Running this (deno run main.ts) results in:

error: Uncaught (in worker "") (in promise) ReferenceError: global is not defined

error: Uncaught (in worker "") (in promise) ReferenceError: global is not defined
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:515362
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:524182
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:634
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:748915
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:765065

info: global is not available in the global scope in Deno.
hint: Use globalThis instead, or assign globalThis.global \= globalThis,
      or run again with \--unstable\-node\-globals flag to add this global.

ErrorEvent {
bubbles: false,
cancelable: true,
composed: false,
currentTarget: Worker { onerror: null, onmessage: null, onmessageerror: null },
defaultPrevented: false,
eventPhase: 2,
srcElement: null,
target: Worker { onerror: null, onmessage: null, onmessageerror: null },
returnValue: true,
timeStamp: 0,
type: "error",
message: "Uncaught (in promise) ReferenceError: global is not defined",
filename: "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js",
lineno: 1,
colno: 515362,
error: null
}
error in duckdb worker: Uncaught (in promise) ReferenceError: global is not defined
error: Uncaught (in promise) Error: Unhandled error in child worker.
at Worker.#pollControl (ext:runtime/11_workers.js:204:19)
at eventLoopTick (ext:core/01_core.js:178:7)

Running this with --unstable-node-globals:

error: Uncaught (in worker "") (in promise) TypeError: Cannot read properties of undefined (reading 'from')

error: Uncaught (in worker "") (in promise) TypeError: Cannot read properties of undefined (reading 'from')
at b (https://cdn.jsdelivr.net/npm/@duckdb/duckdb\-wasm@1.29.1\-dev132.0/dist/duckdb\-browser\-eh.worker.js:1:516993)
at h (https://cdn.jsdelivr.net/npm/@duckdb/duckdb\-wasm@1.29.1\-dev132.0/dist/duckdb\-browser\-eh.worker.js:1:516770)
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:524028
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:524182
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:634
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:748915
at https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js:1:765065
ErrorEvent {
bubbles: false,
cancelable: true,
composed: false,
currentTarget: Worker { onerror: null, onmessage: null, onmessageerror: null },
defaultPrevented: false,
eventPhase: 2,
srcElement: null,
target: Worker { onerror: null, onmessage: null, onmessageerror: null },
returnValue: true,
timeStamp: 0,
type: "error",
message: "Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'from')",
filename: "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.29.1-dev132.0/dist/duckdb-browser-eh.worker.js",
lineno: 1,
colno: 516993,
error: null
}
error in duckdb worker: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'from')
error: Uncaught (in promise) Error: Unhandled error in child worker.
at Worker.#pollControl (ext:runtime/11_workers.js:204:19)
at eventLoopTick (ext:core/01_core.js:178:7)

This is because it is trying to read Buffer.from, and Buffer is undefined. This can be seen through the un-minified version in the source map.

Where the error occurs (in the minified file):

b=function(S,T){var E=Uc(),w=Oc().Buffer,P=T?"sha224":"sha256",L;w.from&&!t.JS_SHA256_NO_BUFFER_FROM?L=w.from:L=function(D){return new w(D)};var M=function(D){if(typeof D=="string")return E.createHash(P).update(D,"utf8").digest("hex");if(D==null)throw new Error(o);return D.constructor===ArrayBuffer&&(D=new Uint8Array(D))
^

This corresponds to this in the expanded source:

ImageUsing recover-source I found that this comes from js-sha256/src/sha256.js line 87.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions