From 3a32e9c94f4200931486cdc0fa106dea4c4c7e7a Mon Sep 17 00:00:00 2001 From: Audrien Fontaine Date: Fri, 5 Sep 2025 14:31:41 +0200 Subject: [PATCH] Fix send() infinite loop on detached worker --- packages/duckdb-wasm/src/parallel/async_bindings.ts | 5 +++++ packages/duckdb-wasm/src/parallel/async_connection.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/duckdb-wasm/src/parallel/async_bindings.ts b/packages/duckdb-wasm/src/parallel/async_bindings.ts index 2e2b3dc72..b48b30511 100644 --- a/packages/duckdb-wasm/src/parallel/async_bindings.ts +++ b/packages/duckdb-wasm/src/parallel/async_bindings.ts @@ -310,6 +310,11 @@ export class AsyncDuckDB implements AsyncDuckDBBindings { this._pendingRequests.clear(); } + /** Is in detached state, no worker defined */ + public isDetached(): boolean { + return !this._worker; + } + /** Reset the duckdb */ public async reset(): Promise { const task = new WorkerTask(WorkerRequestType.RESET, null); diff --git a/packages/duckdb-wasm/src/parallel/async_connection.ts b/packages/duckdb-wasm/src/parallel/async_connection.ts index 89bec591f..6b1fc3d6a 100644 --- a/packages/duckdb-wasm/src/parallel/async_connection.ts +++ b/packages/duckdb-wasm/src/parallel/async_connection.ts @@ -62,6 +62,11 @@ export class AsyncDuckDBConnection { }); let header = await this._bindings.startPendingQuery(this._conn, text, allowStreamResult); while (header == null) { + // Avoid infinite loop on detached state + if (this._bindings.isDetached()) { + console.error('cannot send a message since the worker is not set!'); + return undefined as any; + } header = await this._bindings.pollPendingQuery(this._conn); } const iter = new AsyncResultStreamIterator(this._bindings, this._conn, header);