import { describe, expect, it } from "bun:test"; import { NoyaManager } from "../NoyaManager"; import { EmbeddedToParentMessage, ParentToEmbeddedMessage, ParentFrameMessageHandler, } from "../sync/parentFrameMessages"; import { parentFrameSync } from "../sync/parentFrameSync"; describe("parentFrameSync host storage", () => { it("bridges requests and responses through the parent frame", async () => { const postedMessages: EmbeddedToParentMessage[] = []; let handleParentMessage: | ((event: MessageEvent>) => void) | undefined; const messageHandler: ParentFrameMessageHandler = { postMessage: (message) => { postedMessages.push(message as EmbeddedToParentMessage); }, addMessageListener: (handler) => { handleParentMessage = handler; return () => { handleParentMessage = undefined; }; }, }; const manager = new NoyaManager(null); const destroy = parentFrameSync({ origin: "https://noya.example", messageHandler, })({ noyaManager: manager }); const getPromise = manager.hostStorageManager.getItem("theme"); const requestMessage = postedMessages.find( (message) => message.type === "application.localStorage.request" ); expect(requestMessage).toMatchObject({ type: "application.localStorage.request", payload: { operation: "getItem", key: "theme", }, }); if (requestMessage?.type !== "application.localStorage.request") { throw new Error("Expected a host storage request"); } handleParentMessage?.( new MessageEvent("message", { origin: "https://noya.example", data: { type: "application.localStorage.result", payload: { id: requestMessage.payload.id, type: "success", value: "dark", }, }, }) ); expect(await getPromise).toBe("dark"); destroy(); }); });