@parity/product-sdk-local-storage 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +2 -0
- package/src/kv-store.ts +2 -0
- package/src/types.ts +2 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kv-store.ts"],"names":[],"mappings":";;;;AAMA,IAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAElC,SAAS,SAAS,MAAA,EAA0C;AACxD,EAAA,OAAO,MAAA,GAAS,CAAC,GAAA,KAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,CAAC,GAAA,KAAQ,GAAA;AAC3D;AAEA,SAAS,iBAAA,CACL,kBACA,WAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACH,MAAM,IAAI,GAAA,EAAK;AACX,MAAA,IAAI;AACA,QAAA,MAAM,QAAQ,MAAM,gBAAA,CAAiB,UAAA,CAAW,WAAA,CAAY,GAAG,CAAC,CAAA;AAEhE,QAAA,OAAO,KAAA,IAAS,IAAA;AAAA,MACpB,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,wBAAA,EAA0B,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO;AAClB,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,WAAA,CAAY,WAAA,CAAY,GAAG,GAAG,KAAK,CAAA;AAAA,MAC9D,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,yBAAA,EAA2B,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACzD;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAAK;AACd,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,KAAA,CAAM,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,MACjD,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,mBAAA,EAAqB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACnD;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,QAAW,GAAA,EAAgC;AAC7C,MAAA,IAAI;AACA,QAAA,MAAM,QAAQ,MAAM,gBAAA,CAAiB,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AAC9D,QAAA,OAAQ,KAAA,IAAS,IAAA;AAAA,MACrB,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,sBAAA,EAAwB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO;AACtB,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,SAAA,CAAU,WAAA,CAAY,GAAG,GAAG,KAAK,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,uBAAA,EAAyB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACvD;AAAA,IACJ;AAAA,GACJ;AACJ;AAUA,eAAsB,mBAAmB,OAAA,EAAsD;AAC3F,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAG5C,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC3B,IAAA,OAAO,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,EAAkB,WAAW,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,EAAoB;AAC9C,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO,iBAAA,CAAkB,aAAa,WAAW,CAAA;AACrD","file":"index.js","sourcesContent":["import { getHostLocalStorage } from \"@parity/product-sdk-host\";\nimport type { HostLocalStorage } from \"@parity/product-sdk-host\";\nimport { createLogger } from \"@parity/product-sdk-logger\";\n\nimport type { LocalKvStore, LocalKvStoreOptions } from \"./types.js\";\n\nconst log = createLogger(\"storage\");\n\nfunction prefixer(prefix?: string): (key: string) => string {\n return prefix ? (key) => `${prefix}:${key}` : (key) => key;\n}\n\nfunction createHostBackend(\n hostLocalStorage: HostLocalStorage,\n applyPrefix: (key: string) => string,\n): LocalKvStore {\n return {\n async get(key) {\n try {\n const value = await hostLocalStorage.readString(applyPrefix(key));\n // product-sdk decodes missing keys as \"\" — normalize to null\n return value || null;\n } catch (e) {\n log.warn(\"Host readString failed\", { key, error: e });\n return null;\n }\n },\n\n async set(key, value) {\n try {\n await hostLocalStorage.writeString(applyPrefix(key), value);\n } catch (e) {\n log.warn(\"Host writeString failed\", { key, error: e });\n }\n },\n\n async remove(key) {\n try {\n await hostLocalStorage.clear(applyPrefix(key));\n } catch (e) {\n log.warn(\"Host clear failed\", { key, error: e });\n }\n },\n\n async getJSON<T>(key: string): Promise<T | null> {\n try {\n const value = await hostLocalStorage.readJSON(applyPrefix(key));\n return (value ?? null) as T | null;\n } catch (e) {\n log.warn(\"Host readJSON failed\", { key, error: e });\n return null;\n }\n },\n\n async setJSON(key, value) {\n try {\n await hostLocalStorage.writeJSON(applyPrefix(key), value);\n } catch (e) {\n log.warn(\"Host writeJSON failed\", { key, error: e });\n }\n },\n };\n}\n\n/**\n * Create a key-value store.\n *\n * Uses the host localStorage when inside a container. The SDK is designed\n * to run exclusively inside a host container.\n *\n * @throws {Error} If host storage is unavailable (not inside a container).\n */\nexport async function createLocalKvStore(options?: LocalKvStoreOptions): Promise<LocalKvStore> {\n const applyPrefix = prefixer(options?.prefix);\n\n // Explicit host storage takes precedence\n if (options?.hostLocalStorage) {\n return createHostBackend(options.hostLocalStorage, applyPrefix);\n }\n\n // Auto-detect host storage\n const hostStorage = await getHostLocalStorage();\n if (!hostStorage) {\n throw new Error(\n \"Host storage unavailable. Ensure you are running inside a host container (Polkadot Browser / Desktop).\",\n );\n }\n\n return createHostBackend(hostStorage, applyPrefix);\n}\n\nif (import.meta.vitest) {\n const { test, expect, describe, beforeEach, vi } = import.meta.vitest;\n const { configure } = await import(\"@parity/product-sdk-logger\");\n\n // Silence logger during tests\n beforeEach(() => configure({ handler: () => {} }));\n\n function mockHostStorage(): HostLocalStorage & { data: Map<string, unknown> } {\n const data = new Map<string, unknown>();\n return {\n data,\n async readString(key) {\n return (data.get(key) as string) ?? \"\";\n },\n async writeString(key, value) {\n data.set(key, value);\n return undefined;\n },\n async readJSON(key) {\n return data.get(key) ?? null;\n },\n async writeJSON(key, value) {\n data.set(key, value);\n return undefined;\n },\n async readBytes(key) {\n return (data.get(key) as Uint8Array | undefined) ?? undefined;\n },\n async writeBytes(key, value) {\n data.set(key, value);\n return undefined;\n },\n async clear(key) {\n data.delete(key);\n return undefined;\n },\n };\n }\n\n describe(\"host backend\", () => {\n test(\"routes through host storage\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n await kv.set(\"key\", \"val\");\n expect(await kv.get(\"key\")).toBe(\"val\");\n });\n\n test(\"getJSON/setJSON routes through host\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n await kv.setJSON(\"obj\", { x: 42 });\n expect(await kv.getJSON(\"obj\")).toEqual({ x: 42 });\n });\n\n test(\"get returns null when host throws\", async () => {\n const host = mockHostStorage();\n host.readString = async () => {\n throw new Error(\"host error\");\n };\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.get(\"key\")).toBeNull();\n });\n\n test(\"getJSON returns null when host throws\", async () => {\n const host = mockHostStorage();\n host.readJSON = async () => {\n throw new Error(\"host error\");\n };\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.getJSON(\"key\")).toBeNull();\n });\n\n test(\"prefix applied to host keys\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, prefixer(\"app\"));\n await kv.set(\"key\", \"val\");\n expect(host.data.get(\"app:key\")).toBe(\"val\");\n });\n\n test(\"get returns null for missing key (empty string from host)\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n // host.readString returns \"\" for missing keys, should normalize to null\n expect(await kv.get(\"missing\")).toBeNull();\n });\n\n test(\"getJSON returns null for missing key (undefined from host)\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.getJSON(\"missing\")).toBeNull();\n });\n\n test(\"set silently catches host write errors\", async () => {\n const host = mockHostStorage();\n host.writeString = async () => {\n throw new Error(\"quota\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.set(\"key\", \"val\")).resolves.toBeUndefined();\n });\n\n test(\"setJSON silently catches host write errors\", async () => {\n const host = mockHostStorage();\n host.writeJSON = async () => {\n throw new Error(\"quota\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.setJSON(\"key\", { a: 1 })).resolves.toBeUndefined();\n });\n\n test(\"remove silently catches host clear errors\", async () => {\n const host = mockHostStorage();\n host.clear = async () => {\n throw new Error(\"fail\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.remove(\"key\")).resolves.toBeUndefined();\n });\n });\n\n describe(\"createLocalKvStore\", () => {\n test(\"uses explicit hostLocalStorage when provided\", async () => {\n const host = mockHostStorage();\n const kv = await createLocalKvStore({ hostLocalStorage: host, prefix: \"test\" });\n await kv.set(\"k\", \"v\");\n expect(host.data.get(\"test:k\")).toBe(\"v\");\n });\n\n test(\"throws when host storage unavailable\", async () => {\n const hostMod = await import(\"@parity/product-sdk-host\");\n vi.spyOn(hostMod, \"getHostLocalStorage\").mockResolvedValue(null);\n try {\n await expect(createLocalKvStore({ prefix: \"app\" })).rejects.toThrow(\n /Host storage unavailable/,\n );\n } finally {\n vi.restoreAllMocks();\n }\n });\n\n test(\"auto-detects host storage when available\", async () => {\n const host = mockHostStorage();\n const hostMod = await import(\"@parity/product-sdk-host\");\n vi.spyOn(hostMod, \"getHostLocalStorage\").mockResolvedValue(host);\n try {\n const kv = await createLocalKvStore({ prefix: \"auto\" });\n await kv.set(\"k\", \"v\");\n expect(host.data.get(\"auto:k\")).toBe(\"v\");\n } finally {\n vi.restoreAllMocks();\n }\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/kv-store.ts"],"names":[],"mappings":";;;;AAQA,IAAM,GAAA,GAAM,aAAa,SAAS,CAAA;AAElC,SAAS,SAAS,MAAA,EAA0C;AACxD,EAAA,OAAO,MAAA,GAAS,CAAC,GAAA,KAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,CAAC,GAAA,KAAQ,GAAA;AAC3D;AAEA,SAAS,iBAAA,CACL,kBACA,WAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACH,MAAM,IAAI,GAAA,EAAK;AACX,MAAA,IAAI;AACA,QAAA,MAAM,QAAQ,MAAM,gBAAA,CAAiB,UAAA,CAAW,WAAA,CAAY,GAAG,CAAC,CAAA;AAEhE,QAAA,OAAO,KAAA,IAAS,IAAA;AAAA,MACpB,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,wBAAA,EAA0B,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO;AAClB,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,WAAA,CAAY,WAAA,CAAY,GAAG,GAAG,KAAK,CAAA;AAAA,MAC9D,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,yBAAA,EAA2B,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACzD;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAO,GAAA,EAAK;AACd,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,KAAA,CAAM,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,MACjD,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,mBAAA,EAAqB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACnD;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,QAAW,GAAA,EAAgC;AAC7C,MAAA,IAAI;AACA,QAAA,MAAM,QAAQ,MAAM,gBAAA,CAAiB,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AAC9D,QAAA,OAAQ,KAAA,IAAS,IAAA;AAAA,MACrB,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,sBAAA,EAAwB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO;AACtB,MAAA,IAAI;AACA,QAAA,MAAM,gBAAA,CAAiB,SAAA,CAAU,WAAA,CAAY,GAAG,GAAG,KAAK,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACR,QAAA,GAAA,CAAI,KAAK,uBAAA,EAAyB,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACvD;AAAA,IACJ;AAAA,GACJ;AACJ;AAUA,eAAsB,mBAAmB,OAAA,EAAsD;AAC3F,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAG5C,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC3B,IAAA,OAAO,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,EAAkB,WAAW,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,EAAoB;AAC9C,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO,iBAAA,CAAkB,aAAa,WAAW,CAAA;AACrD","file":"index.js","sourcesContent":["// Copyright 2026 Parity Technologies (UK) Ltd.\n// SPDX-License-Identifier: Apache-2.0\nimport { getHostLocalStorage } from \"@parity/product-sdk-host\";\nimport type { HostLocalStorage } from \"@parity/product-sdk-host\";\nimport { createLogger } from \"@parity/product-sdk-logger\";\n\nimport type { LocalKvStore, LocalKvStoreOptions } from \"./types.js\";\n\nconst log = createLogger(\"storage\");\n\nfunction prefixer(prefix?: string): (key: string) => string {\n return prefix ? (key) => `${prefix}:${key}` : (key) => key;\n}\n\nfunction createHostBackend(\n hostLocalStorage: HostLocalStorage,\n applyPrefix: (key: string) => string,\n): LocalKvStore {\n return {\n async get(key) {\n try {\n const value = await hostLocalStorage.readString(applyPrefix(key));\n // product-sdk decodes missing keys as \"\" — normalize to null\n return value || null;\n } catch (e) {\n log.warn(\"Host readString failed\", { key, error: e });\n return null;\n }\n },\n\n async set(key, value) {\n try {\n await hostLocalStorage.writeString(applyPrefix(key), value);\n } catch (e) {\n log.warn(\"Host writeString failed\", { key, error: e });\n }\n },\n\n async remove(key) {\n try {\n await hostLocalStorage.clear(applyPrefix(key));\n } catch (e) {\n log.warn(\"Host clear failed\", { key, error: e });\n }\n },\n\n async getJSON<T>(key: string): Promise<T | null> {\n try {\n const value = await hostLocalStorage.readJSON(applyPrefix(key));\n return (value ?? null) as T | null;\n } catch (e) {\n log.warn(\"Host readJSON failed\", { key, error: e });\n return null;\n }\n },\n\n async setJSON(key, value) {\n try {\n await hostLocalStorage.writeJSON(applyPrefix(key), value);\n } catch (e) {\n log.warn(\"Host writeJSON failed\", { key, error: e });\n }\n },\n };\n}\n\n/**\n * Create a key-value store.\n *\n * Uses the host localStorage when inside a container. The SDK is designed\n * to run exclusively inside a host container.\n *\n * @throws {Error} If host storage is unavailable (not inside a container).\n */\nexport async function createLocalKvStore(options?: LocalKvStoreOptions): Promise<LocalKvStore> {\n const applyPrefix = prefixer(options?.prefix);\n\n // Explicit host storage takes precedence\n if (options?.hostLocalStorage) {\n return createHostBackend(options.hostLocalStorage, applyPrefix);\n }\n\n // Auto-detect host storage\n const hostStorage = await getHostLocalStorage();\n if (!hostStorage) {\n throw new Error(\n \"Host storage unavailable. Ensure you are running inside a host container (Polkadot Browser / Desktop).\",\n );\n }\n\n return createHostBackend(hostStorage, applyPrefix);\n}\n\nif (import.meta.vitest) {\n const { test, expect, describe, beforeEach, vi } = import.meta.vitest;\n const { configure } = await import(\"@parity/product-sdk-logger\");\n\n // Silence logger during tests\n beforeEach(() => configure({ handler: () => {} }));\n\n function mockHostStorage(): HostLocalStorage & { data: Map<string, unknown> } {\n const data = new Map<string, unknown>();\n return {\n data,\n async readString(key) {\n return (data.get(key) as string) ?? \"\";\n },\n async writeString(key, value) {\n data.set(key, value);\n return undefined;\n },\n async readJSON(key) {\n return data.get(key) ?? null;\n },\n async writeJSON(key, value) {\n data.set(key, value);\n return undefined;\n },\n async readBytes(key) {\n return (data.get(key) as Uint8Array | undefined) ?? undefined;\n },\n async writeBytes(key, value) {\n data.set(key, value);\n return undefined;\n },\n async clear(key) {\n data.delete(key);\n return undefined;\n },\n };\n }\n\n describe(\"host backend\", () => {\n test(\"routes through host storage\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n await kv.set(\"key\", \"val\");\n expect(await kv.get(\"key\")).toBe(\"val\");\n });\n\n test(\"getJSON/setJSON routes through host\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n await kv.setJSON(\"obj\", { x: 42 });\n expect(await kv.getJSON(\"obj\")).toEqual({ x: 42 });\n });\n\n test(\"get returns null when host throws\", async () => {\n const host = mockHostStorage();\n host.readString = async () => {\n throw new Error(\"host error\");\n };\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.get(\"key\")).toBeNull();\n });\n\n test(\"getJSON returns null when host throws\", async () => {\n const host = mockHostStorage();\n host.readJSON = async () => {\n throw new Error(\"host error\");\n };\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.getJSON(\"key\")).toBeNull();\n });\n\n test(\"prefix applied to host keys\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, prefixer(\"app\"));\n await kv.set(\"key\", \"val\");\n expect(host.data.get(\"app:key\")).toBe(\"val\");\n });\n\n test(\"get returns null for missing key (empty string from host)\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n // host.readString returns \"\" for missing keys, should normalize to null\n expect(await kv.get(\"missing\")).toBeNull();\n });\n\n test(\"getJSON returns null for missing key (undefined from host)\", async () => {\n const host = mockHostStorage();\n const kv = createHostBackend(host, (k) => k);\n expect(await kv.getJSON(\"missing\")).toBeNull();\n });\n\n test(\"set silently catches host write errors\", async () => {\n const host = mockHostStorage();\n host.writeString = async () => {\n throw new Error(\"quota\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.set(\"key\", \"val\")).resolves.toBeUndefined();\n });\n\n test(\"setJSON silently catches host write errors\", async () => {\n const host = mockHostStorage();\n host.writeJSON = async () => {\n throw new Error(\"quota\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.setJSON(\"key\", { a: 1 })).resolves.toBeUndefined();\n });\n\n test(\"remove silently catches host clear errors\", async () => {\n const host = mockHostStorage();\n host.clear = async () => {\n throw new Error(\"fail\");\n };\n const kv = createHostBackend(host, (k) => k);\n await expect(kv.remove(\"key\")).resolves.toBeUndefined();\n });\n });\n\n describe(\"createLocalKvStore\", () => {\n test(\"uses explicit hostLocalStorage when provided\", async () => {\n const host = mockHostStorage();\n const kv = await createLocalKvStore({ hostLocalStorage: host, prefix: \"test\" });\n await kv.set(\"k\", \"v\");\n expect(host.data.get(\"test:k\")).toBe(\"v\");\n });\n\n test(\"throws when host storage unavailable\", async () => {\n const hostMod = await import(\"@parity/product-sdk-host\");\n vi.spyOn(hostMod, \"getHostLocalStorage\").mockResolvedValue(null);\n try {\n await expect(createLocalKvStore({ prefix: \"app\" })).rejects.toThrow(\n /Host storage unavailable/,\n );\n } finally {\n vi.restoreAllMocks();\n }\n });\n\n test(\"auto-detects host storage when available\", async () => {\n const host = mockHostStorage();\n const hostMod = await import(\"@parity/product-sdk-host\");\n vi.spyOn(hostMod, \"getHostLocalStorage\").mockResolvedValue(host);\n try {\n const kv = await createLocalKvStore({ prefix: \"auto\" });\n await kv.set(\"k\", \"v\");\n expect(host.data.get(\"auto:k\")).toBe(\"v\");\n } finally {\n vi.restoreAllMocks();\n }\n });\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parity/product-sdk-local-storage",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Key-value local storage abstraction with automatic host/browser backend detection",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@parity/product-sdk-logger": "0.1.1",
|
|
22
|
-
"@parity/product-sdk-host": "0.
|
|
22
|
+
"@parity/product-sdk-host": "0.6.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"typescript": "^5.7.0",
|
package/src/index.ts
CHANGED
package/src/kv-store.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Copyright 2026 Parity Technologies (UK) Ltd.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
1
3
|
import { getHostLocalStorage } from "@parity/product-sdk-host";
|
|
2
4
|
import type { HostLocalStorage } from "@parity/product-sdk-host";
|
|
3
5
|
import { createLogger } from "@parity/product-sdk-logger";
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Copyright 2026 Parity Technologies (UK) Ltd.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
1
3
|
import type { HostLocalStorage } from "@parity/product-sdk-host";
|
|
2
4
|
|
|
3
5
|
/** Async string local key-value store, with `getJSON`/`setJSON` for structured values. Returned by {@link createLocalKvStore}. */
|