From a0267f460dd8fab56a3ea5dccd39e2817680cd0b Mon Sep 17 00:00:00 2001 From: sergioperezcheco Date: Sun, 11 Oct 2026 22:31:37 +0800 Subject: [PATCH] fix: reset worker database reference after close Follow up on the null-reset proposed by WilliamStephens in #216; preserve the explicit reopening behavior added in #379. Assisted-by: Hermes Signed-off-by: sergioperezcheco --- src/worker.js | 1 + test/test_worker.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/worker.js b/src/worker.js index 2447180e..e5b1dae6 100644 --- a/src/worker.js +++ b/src/worker.js @@ -71,6 +71,7 @@ function onModuleReady(SQL) { case "close": if (db) { db.close(); + db = null; } return postMessage({ id: data["id"] diff --git a/test/test_worker.js b/test/test_worker.js index 8eaf1a9e..aaac5511 100644 --- a/test/test_worker.js +++ b/test/test_worker.js @@ -134,6 +134,20 @@ exports.test = async function test(SQL, assert) { for (let i = 0; i < header.length; i++) actual += String.fromCharCode(data.buffer[i]); assert.equal(actual, header, 'Data returned is an SQLite database file'); + // Closing returns the worker to its initial, lazily initialized state. + await worker.postMessage({ action: "close" }); + await worker.postMessage({ action: "close" }); + data = await worker.postMessage({ + action: "exec", + sql: "SELECT count(*) AS count FROM sqlite_master WHERE name = 'test'" + }); + assert.deepEqual(data.results, [{ columns: ['count'], values: [[0]] }], + 'exec after close creates a fresh database'); + await worker.postMessage({ action: "close" }); + data = await worker.postMessage({ action: "each", sql: "SELECT 7 AS value" }); + assert.deepEqual(data.row, { value: 7 }, + 'each after close creates a fresh database'); + // test worker properly opens db after closing await worker.postMessage({ action: "close" }); await worker.postMessage({ action: "open" });