From 1acd44a3aa5c6d7c979500992e81f4e1abc458dc Mon Sep 17 00:00:00 2001 From: Mark Keller <7525285+keller-mark@users.noreply.github.com> Date: Fri, 23 Aug 2024 08:53:57 -0400 Subject: [PATCH 1/3] Update ReferenceStore, add test, add changeset --- .changeset/odd-ties-clap.md | 5 +++++ packages/storage/__tests__/ref.test.ts | 27 ++++++++++++++++++++++++++ packages/storage/src/ref.ts | 16 +++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 .changeset/odd-ties-clap.md create mode 100644 packages/storage/__tests__/ref.test.ts diff --git a/.changeset/odd-ties-clap.md b/.changeset/odd-ties-clap.md new file mode 100644 index 00000000..b44ca7ad --- /dev/null +++ b/.changeset/odd-ties-clap.md @@ -0,0 +1,5 @@ +--- +"@zarrita/storage": patch +--- + +Enable creation of ReferenceStore via non-async functions. diff --git a/packages/storage/__tests__/ref.test.ts b/packages/storage/__tests__/ref.test.ts new file mode 100644 index 00000000..aad39b72 --- /dev/null +++ b/packages/storage/__tests__/ref.test.ts @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +import ReferenceStore from "../src/ref.js"; + +describe("ReferenceStore", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("store creation is not async", async () => { + let spec = Promise.resolve({ + version: 1, + refs: { + ".zgroup": '{"zarr_format":2}', + ".zattrs": '{"encoding-type":"anndat…oding-version":"0.1.0"}' + }, + }); + let store = ReferenceStore.fromSpec(spec); + let bytes = await store.get("/.zgroup"); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(JSON.parse(new TextDecoder().decode(bytes))).toMatchInlineSnapshot(` + { + "zarr_format": 2, + } + `); + }); +}); diff --git a/packages/storage/src/ref.ts b/packages/storage/src/ref.ts index f48b9a51..5abc4b97 100644 --- a/packages/storage/src/ref.ts +++ b/packages/storage/src/ref.ts @@ -40,12 +40,12 @@ interface ReferenceStoreOptions { /** @experimental */ class ReferenceStore implements AsyncReadable { - #refs: Map; + #refs: Promise>; #opts: ReferenceStoreOptions; #overrides: RequestInit; constructor( - refs: Map, + refs: Promise>, opts: ReferenceStoreOptions = {}, ) { this.#refs = refs; @@ -57,7 +57,7 @@ class ReferenceStore implements AsyncReadable { key: AbsolutePath, opts: RequestInit = {}, ): Promise { - let ref = this.#refs.get(strip_prefix(key)); + let ref = (await this.#refs).get(strip_prefix(key)); if (!ref) return; @@ -91,19 +91,19 @@ class ReferenceStore implements AsyncReadable { } static fromSpec( - spec: Record, + spec: Promise>, opts?: ReferenceStoreOptions, ): ReferenceStore { // @ts-expect-error - TS doesn't like the type of `parse` - let refs = parse(spec); + let refs = spec.then((spec) => parse(spec)); return new ReferenceStore(refs, opts); } - static async fromUrl( + static fromUrl( url: string | URL, opts?: ReferenceStoreOptions, - ): Promise { - let spec = await fetch(url, opts?.overrides).then((res) => res.json()); + ): ReferenceStore { + let spec = fetch(url, opts?.overrides).then((res) => res.json()); return ReferenceStore.fromSpec(spec, opts); } } From 195a52fd798dcb126aeb16d80be9fc85fb4456ec Mon Sep 17 00:00:00 2001 From: Mark Keller <7525285+keller-mark@users.noreply.github.com> Date: Fri, 23 Aug 2024 08:55:52 -0400 Subject: [PATCH 2/3] Format --- packages/storage/__tests__/ref.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/storage/__tests__/ref.test.ts b/packages/storage/__tests__/ref.test.ts index aad39b72..5f6c6e81 100644 --- a/packages/storage/__tests__/ref.test.ts +++ b/packages/storage/__tests__/ref.test.ts @@ -8,13 +8,13 @@ describe("ReferenceStore", () => { }); it("store creation is not async", async () => { - let spec = Promise.resolve({ - version: 1, - refs: { - ".zgroup": '{"zarr_format":2}', - ".zattrs": '{"encoding-type":"anndat…oding-version":"0.1.0"}' - }, - }); + let spec = Promise.resolve({ + version: 1, + refs: { + ".zgroup": '{"zarr_format":2}', + ".zattrs": '{"encoding-type":"anndat…oding-version":"0.1.0"}', + }, + }); let store = ReferenceStore.fromSpec(spec); let bytes = await store.get("/.zgroup"); expect(bytes).toBeInstanceOf(Uint8Array); From 8ad0ddf79dc8338838ceca08f92ce32a54868635 Mon Sep 17 00:00:00 2001 From: Mark Keller <7525285+keller-mark@users.noreply.github.com> Date: Fri, 23 Aug 2024 09:46:51 -0400 Subject: [PATCH 3/3] Pr feedback --- packages/storage/__tests__/ref.test.ts | 17 +++++++++++++++++ packages/storage/src/ref.ts | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/storage/__tests__/ref.test.ts b/packages/storage/__tests__/ref.test.ts index 5f6c6e81..a30cf1c8 100644 --- a/packages/storage/__tests__/ref.test.ts +++ b/packages/storage/__tests__/ref.test.ts @@ -24,4 +24,21 @@ describe("ReferenceStore", () => { } `); }); + it("store creation can still accept a non-promise", async () => { + let spec = { + version: 1, + refs: { + ".zgroup": '{"zarr_format":2}', + ".zattrs": '{"encoding-type":"anndat…oding-version":"0.1.0"}', + }, + }; + let store = ReferenceStore.fromSpec(spec); + let bytes = await store.get("/.zgroup"); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(JSON.parse(new TextDecoder().decode(bytes))).toMatchInlineSnapshot(` + { + "zarr_format": 2, + } + `); + }); }); diff --git a/packages/storage/src/ref.ts b/packages/storage/src/ref.ts index 5abc4b97..ca1f860b 100644 --- a/packages/storage/src/ref.ts +++ b/packages/storage/src/ref.ts @@ -45,10 +45,10 @@ class ReferenceStore implements AsyncReadable { #overrides: RequestInit; constructor( - refs: Promise>, + refs: Promise> | Map, opts: ReferenceStoreOptions = {}, ) { - this.#refs = refs; + this.#refs = Promise.resolve(refs); this.#opts = opts; this.#overrides = opts.overrides || {}; } @@ -91,11 +91,11 @@ class ReferenceStore implements AsyncReadable { } static fromSpec( - spec: Promise>, + spec: Promise> | Record, opts?: ReferenceStoreOptions, ): ReferenceStore { // @ts-expect-error - TS doesn't like the type of `parse` - let refs = spec.then((spec) => parse(spec)); + let refs = Promise.resolve(spec).then((spec) => parse(spec)); return new ReferenceStore(refs, opts); }