From d905f20cadfd95b927027a3c597d578db606984e Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Wed, 3 May 2023 23:08:42 +0200 Subject: [PATCH] fix(ext/kv): throw on the Kv constructor (#18978) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #18963 --------- Co-authored-by: Bartek IwaƄczuk --- cli/tests/unit/kv_test.ts | 6 ++++++ ext/kv/01_db.ts | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/cli/tests/unit/kv_test.ts b/cli/tests/unit/kv_test.ts index 3a3476857a..3c5efa5887 100644 --- a/cli/tests/unit/kv_test.ts +++ b/cli/tests/unit/kv_test.ts @@ -1256,6 +1256,12 @@ dbTest("keys must be arrays", async (db) => { ); }); +Deno.test("Deno.Kv constructor throws", () => { + assertThrows(() => { + new Deno.Kv(); + }); +}); + // This function is never called, it is just used to check that all the types // are behaving as expected. async function _typeCheckingTests() { diff --git a/ext/kv/01_db.ts b/ext/kv/01_db.ts index ca37aa8401..f8181cc2e7 100644 --- a/ext/kv/01_db.ts +++ b/ext/kv/01_db.ts @@ -23,7 +23,7 @@ const encodeCursor: ( async function openKv(path: string) { const rid = await core.opAsync("op_kv_database_open", path); - return new Kv(rid); + return new Kv(rid, kvSymbol); } interface RawKvEntry { @@ -43,10 +43,17 @@ type RawValue = { value: bigint; }; +const kvSymbol = Symbol("KvRid"); + class Kv { #rid: number; - constructor(rid: number) { + constructor(rid: number = undefined, symbol: symbol = undefined) { + if (kvSymbol !== symbol) { + throw new TypeError( + "Deno.Kv can not be constructed, use Deno.openKv instead.", + ); + } this.#rid = rid; }