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 287710064..860fd9802 100644 --- a/packages/storage/src/persisted.ts +++ b/packages/storage/src/persisted.ts @@ -229,14 +229,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, ), ]; @@ -244,7 +244,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 { @@ -263,7 +263,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 bccc4ac43..174a7f103 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", () => { @@ -209,3 +209,57 @@ describe("makePersisted", () => { expect(signal()).toBe("init"); }); }); + +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", + }); + }); +});