Loading CHANGES.md +4 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,10 @@ To be released. - Implemented `list()` method in `RedisKvStore`. [[#498]] ### @fedify/denokv - Implemented `list()` method in `DenoKvStore`. [[#498]] Version 1.9.2 ------------- Loading packages/denokv/src/mod.test.ts +41 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,47 @@ Deno.test("DenoKvStore", async (t) => { assertEquals(await store.get(["foo", "bar"]), "baz"); }); await t.step("list()", async () => { await store.set(["prefix", "a"], "value-a"); await store.set(["prefix", "b"], "value-b"); await store.set(["prefix", "nested", "c"], "value-c"); await store.set(["other", "x"], "value-x"); const entries: { key: Deno.KvKey; value: unknown }[] = []; for await (const entry of store.list!({ prefix: ["prefix"] })) { entries.push(entry); } assertEquals(entries.length, 3); assertEquals( entries.find((e) => e.key[1] === "a")?.value, "value-a", ); // Cleanup await store.delete(["prefix", "a"]); await store.delete(["prefix", "b"]); await store.delete(["prefix", "nested", "c"]); await store.delete(["other", "x"]); }); await t.step("list() - single element key", async () => { await store.set(["a"], "value-a"); await store.set(["b"], "value-b"); const entries: { key: Deno.KvKey; value: unknown }[] = []; for await (const entry of store.list!({ prefix: ["a"] })) { entries.push(entry); } assertEquals(entries.length, 1); assertEquals(entries[0].value, "value-a"); // Cleanup await store.delete(["a"]); await store.delete(["b"]); }); kv.close(); }); Loading packages/denokv/src/mod.ts +29 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ import type { KvKey, KvStore, KvStoreListEntry, KvStoreListOptions, KvStoreSetOptions, MessageQueue, MessageQueueEnqueueOptions, Loading Loading @@ -93,6 +95,33 @@ export class DenoKvStore implements KvStore { if (result.ok) return true; } } /** * {@inheritDoc KvStore.list} * @since 1.10.0 */ async *list( options: KvStoreListOptions, ): AsyncIterable<KvStoreListEntry> { // First, check if the exact prefix key exists const exactEntry = await this.#kv.get(options.prefix); if (exactEntry.value != null) { yield { key: options.prefix, value: exactEntry.value, }; } // Then list all keys starting with the prefix const entries = this.#kv.list({ prefix: options.prefix }); for await (const entry of entries) { if (entry.value == null) continue; yield { key: entry.key as KvKey, value: entry.value, }; } } } /** Loading Loading
CHANGES.md +4 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,10 @@ To be released. - Implemented `list()` method in `RedisKvStore`. [[#498]] ### @fedify/denokv - Implemented `list()` method in `DenoKvStore`. [[#498]] Version 1.9.2 ------------- Loading
packages/denokv/src/mod.test.ts +41 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,47 @@ Deno.test("DenoKvStore", async (t) => { assertEquals(await store.get(["foo", "bar"]), "baz"); }); await t.step("list()", async () => { await store.set(["prefix", "a"], "value-a"); await store.set(["prefix", "b"], "value-b"); await store.set(["prefix", "nested", "c"], "value-c"); await store.set(["other", "x"], "value-x"); const entries: { key: Deno.KvKey; value: unknown }[] = []; for await (const entry of store.list!({ prefix: ["prefix"] })) { entries.push(entry); } assertEquals(entries.length, 3); assertEquals( entries.find((e) => e.key[1] === "a")?.value, "value-a", ); // Cleanup await store.delete(["prefix", "a"]); await store.delete(["prefix", "b"]); await store.delete(["prefix", "nested", "c"]); await store.delete(["other", "x"]); }); await t.step("list() - single element key", async () => { await store.set(["a"], "value-a"); await store.set(["b"], "value-b"); const entries: { key: Deno.KvKey; value: unknown }[] = []; for await (const entry of store.list!({ prefix: ["a"] })) { entries.push(entry); } assertEquals(entries.length, 1); assertEquals(entries[0].value, "value-a"); // Cleanup await store.delete(["a"]); await store.delete(["b"]); }); kv.close(); }); Loading
packages/denokv/src/mod.ts +29 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ import type { KvKey, KvStore, KvStoreListEntry, KvStoreListOptions, KvStoreSetOptions, MessageQueue, MessageQueueEnqueueOptions, Loading Loading @@ -93,6 +95,33 @@ export class DenoKvStore implements KvStore { if (result.ok) return true; } } /** * {@inheritDoc KvStore.list} * @since 1.10.0 */ async *list( options: KvStoreListOptions, ): AsyncIterable<KvStoreListEntry> { // First, check if the exact prefix key exists const exactEntry = await this.#kv.get(options.prefix); if (exactEntry.value != null) { yield { key: options.prefix, value: exactEntry.value, }; } // Then list all keys starting with the prefix const entries = this.#kv.list({ prefix: options.prefix }); for await (const entry of entries) { if (entry.value == null) continue; yield { key: entry.key as KvKey, value: entry.value, }; } } } /** Loading