From 99b7631557b3fd21708bb875062e76267371db15 Mon Sep 17 00:00:00 2001 From: Alex Lohr Date: Sun, 19 Jul 2026 18:23:27 +0200 Subject: [PATCH] fix: storage sync url specification --- .changeset/jolly-states-train.md | 5 +++ packages/storage/src/persisted.ts | 8 ++-- packages/storage/test/persisted.test.ts | 56 ++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 .changeset/jolly-states-train.md diff --git a/.changeset/jolly-states-train.md b/.changeset/jolly-states-train.md new file mode 100644 index 000000000..69be79b61 --- /dev/null +++ b/.changeset/jolly-states-train.md @@ -0,0 +1,5 @@ +--- +"@solid-primitives/storage": patch +--- + +sync API: allow for url specification diff --git a/packages/storage/src/persisted.ts b/packages/storage/src/persisted.ts index d58af53db..33aa8d2e1 100644 --- a/packages/storage/src/persisted.ts +++ b/packages/storage/src/persisted.ts @@ -223,14 +223,14 @@ export const storageSync: PersistenceSyncAPI = [ /** * messageSync - synchronize over post message or broadcast channel API */ -export const messageSync = (channel: Window | BroadcastChannel = window): PersistenceSyncAPI => [ +export const messageSync = (channel: Window | BroadcastChannel = window, url = globalThis.location?.href): PersistenceSyncAPI => [ (subscriber: PersistenceSyncCallback) => channel.addEventListener("message", ev => { subscriber((ev as MessageEvent).data); }), (key, newValue) => channel.postMessage( - { key, newValue, timeStamp: Date.now(), url: location.href }, + { key, newValue, timeStamp: Date.now(), url }, location.origin, ), ]; @@ -238,7 +238,7 @@ export const messageSync = (channel: Window | BroadcastChannel = window): Persis /** * wsSync - syncronize persisted storage via web socket */ -export const wsSync = (ws: WebSocket, warnOnError: boolean = !!DEV): PersistenceSyncAPI => [ +export const wsSync = (ws: WebSocket, warnOnError: boolean = !!DEV, url = globalThis.location?.href): PersistenceSyncAPI => [ (subscriber: PersistenceSyncCallback) => ws.addEventListener("message", (ev: MessageEvent) => { try { @@ -257,7 +257,7 @@ export const wsSync = (ws: WebSocket, warnOnError: boolean = !!DEV): Persistence key, newValue, timeStamp: +new Date(), - ...(globalThis.window ? { url: location.href } : {}), + ...(url ? { url } : {}), }), ), ]; diff --git a/packages/storage/test/persisted.test.ts b/packages/storage/test/persisted.test.ts index c5aae9fab..ab7b9ed23 100644 --- a/packages/storage/test/persisted.test.ts +++ b/packages/storage/test/persisted.test.ts @@ -9,7 +9,7 @@ import { latest, refresh, } from "solid-js"; -import { makePersisted } from "../src/persisted.js"; +import { makePersisted, messageSync, storageSync, wsSync, type PersistenceSyncData } from "../src/persisted.js"; import { type AsyncStorage } from "../src/index.js"; describe("makePersisted", () => { @@ -195,3 +195,57 @@ describe("makePersisted", () => { expect(init).toBe(promise); }); }); + +describe("storageSync", () => { + it("receives messages", () => { + const [message, subscriber] = createSignal(); + storageSync[0](subscriber); + const event = new StorageEvent( + "storage", + { key: "test9", newValue: "received", timeStamp: Date.now(), url: "https://storage.solid-primitives.org" } + ); + window.dispatchEvent(event); + flush(); + expect(message()).toEqual(event); + }); +}); + +describe("messageSync", () => { + it("sends and receives messages", async () => { + const [message, subscriber] = createSignal(); + const sync = messageSync(window, "https://storage.solid-primitives.org"); + sync[0](subscriber); + sync[1]("test10", "sent and received"); + await new Promise(r => setTimeout(r, 100)); + flush(); + expect(message()).toEqual({ + key: "test10", + newValue: "sent and received", + timeStamp: expect.any(Number), + url: "https://storage.solid-primitives.org", + }); + }); +}); + +describe("wsSync", () => { + it("sends and receives messages", async () => { + const mockWs = { + addEventListener: (name: string, handler: (ev: unknown) => void) => { + expect(name).toBe("message"); + mockWs.send = (data) => handler(new MessageEvent("message", { data })); + }, + }; + const [message, subscriber] = createSignal(); + const sync = wsSync(mockWs, true, "https://storage.solid-primitives.org"); + sync[0](subscriber); + sync[1]("test11", "sent and received"); + await new Promise(r => setTimeout(r, 100)); + flush(); + expect(message()).toEqual({ + key: "test11", + newValue: "sent and received", + timeStamp: expect.any(Number), + url: "https://storage.solid-primitives.org", + }); + }); +});