Unverified Commit 8cde5f39 authored by Hong Minhee's avatar Hong Minhee
Browse files

Implement list() method in DenoKvStore

parent 29ec5532
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
-------------
+41 −0
Original line number Diff line number Diff line
@@ -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();
});

+29 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
import type {
  KvKey,
  KvStore,
  KvStoreListEntry,
  KvStoreListOptions,
  KvStoreSetOptions,
  MessageQueue,
  MessageQueueEnqueueOptions,
@@ -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,
      };
    }
  }
}

/**