diff options
| author | Raashid Anwar <raashid12anwar@gmail.com> | 2023-12-05 23:46:47 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-05 10:16:47 -0800 |
| commit | cac17267fbe83f25181c4f8503c01b92694c46be (patch) | |
| tree | 213ee5a7a24f613455757f434fb501fe69f8ff6f | |
| parent | 4a9f42950140b36b1916ab0e0320d721223b1095 (diff) | |
fix(ext/kv): throw error if already closed (#21459)
If KV is closed and tries to listen queue should throw an error
closes #20991
| -rw-r--r-- | cli/tests/integration/js_unit_tests.rs | 1 | ||||
| -rw-r--r-- | cli/tests/unit/kv_queue_test.ts | 13 | ||||
| -rw-r--r-- | ext/kv/01_db.ts | 6 |
3 files changed, 20 insertions, 0 deletions
diff --git a/cli/tests/integration/js_unit_tests.rs b/cli/tests/integration/js_unit_tests.rs index d4a56b63e..bdab48926 100644 --- a/cli/tests/integration/js_unit_tests.rs +++ b/cli/tests/integration/js_unit_tests.rs @@ -48,6 +48,7 @@ util::unit_test_factory!( jupyter_test, kv_test, kv_queue_test_no_db_close, + kv_queue_test, kv_queue_undelivered_test, link_test, make_temp_test, diff --git a/cli/tests/unit/kv_queue_test.ts b/cli/tests/unit/kv_queue_test.ts new file mode 100644 index 000000000..86b9d21a8 --- /dev/null +++ b/cli/tests/unit/kv_queue_test.ts @@ -0,0 +1,13 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +import { assertEquals, assertFalse } from "./test_util.ts"; + +Deno.test({}, async function queueTestDbClose() { + const db: Deno.Kv = await Deno.openKv(":memory:"); + db.close(); + try { + await db.listenQueue(() => {}); + assertFalse(false); + } catch (e) { + assertEquals(e.message, "already closed"); + } +}); diff --git a/ext/kv/01_db.ts b/ext/kv/01_db.ts index 73deee27f..2b0e141f8 100644 --- a/ext/kv/01_db.ts +++ b/ext/kv/01_db.ts @@ -64,6 +64,7 @@ const kvSymbol = Symbol("KvRid"); class Kv { #rid: number; + #isClosed: boolean; constructor(rid: number = undefined, symbol: symbol = undefined) { if (kvSymbol !== symbol) { @@ -72,6 +73,7 @@ class Kv { ); } this.#rid = rid; + this.#isClosed = false; } atomic() { @@ -251,6 +253,9 @@ class Kv { async listenQueue( handler: (message: unknown) => Promise<void> | void, ): Promise<void> { + if (this.#isClosed) { + throw new Error("already closed"); + } const finishMessageOps = new Map<number, Promise<void>>(); while (true) { // Wait for the next message. @@ -366,6 +371,7 @@ class Kv { close() { core.close(this.#rid); + this.#isClosed = true; } [SymbolDispose]() { |
