better-auth
Version:
The most comprehensive authentication framework for TypeScript.
1 lines • 3.09 kB
Source Map (JSON)
{"version":3,"file":"broadcast-channel.mjs","names":["message: BroadcastMessage"],"sources":["../../src/client/broadcast-channel.ts"],"sourcesContent":["export interface BroadcastMessage {\n\tevent?: \"session\" | undefined;\n\tdata?: { trigger?: \"signout\" | \"getSession\" | \"updateUser\" } | undefined;\n\tclientId: string;\n\ttimestamp: number;\n}\n\nexport type BroadcastListener = (message: BroadcastMessage) => void;\n\nexport const kBroadcastChannel = Symbol.for(\"better-auth:broadcast-channel\");\n\nconst now = () => Math.floor(Date.now() / 1000);\n\nexport interface BroadcastChannel {\n\tpost(message: Record<string, unknown>): void;\n\tsubscribe(listener: BroadcastListener): () => void;\n\tsetup(): () => void;\n}\n\nclass WindowBroadcastChannel implements BroadcastChannel {\n\tlisteners = new Set<BroadcastListener>();\n\tprivate name: string;\n\n\tconstructor(name = \"better-auth.message\") {\n\t\tthis.name = name;\n\t}\n\n\tsubscribe(listener: BroadcastListener) {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\tpost(message: Record<string, unknown>) {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tthis.name,\n\t\t\t\tJSON.stringify({ ...message, timestamp: now() }),\n\t\t\t);\n\t\t} catch {}\n\t}\n\n\tsetup() {\n\t\tif (\n\t\t\ttypeof window === \"undefined\" ||\n\t\t\ttypeof window.addEventListener === \"undefined\"\n\t\t) {\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst handler = (event: StorageEvent) => {\n\t\t\tif (event.key !== this.name) return;\n\t\t\tconst message: BroadcastMessage = JSON.parse(event.newValue ?? \"{}\");\n\t\t\tif (message?.event !== \"session\" || !message?.data) return;\n\n\t\t\tthis.listeners.forEach((listener) => listener(message));\n\t\t};\n\n\t\twindow.addEventListener(\"storage\", handler);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"storage\", handler);\n\t\t};\n\t}\n}\n\nexport function getGlobalBroadcastChannel(name = \"better-auth.message\") {\n\tif (!(globalThis as any)[kBroadcastChannel]) {\n\t\t(globalThis as any)[kBroadcastChannel] = new WindowBroadcastChannel(name);\n\t}\n\treturn (globalThis as any)[kBroadcastChannel] as BroadcastChannel;\n}\n"],"mappings":";AASA,MAAa,oBAAoB,OAAO,IAAI,gCAAgC;AAE5E,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AAQ/C,IAAM,yBAAN,MAAyD;CACxD,4BAAY,IAAI,KAAwB;CACxC,AAAQ;CAER,YAAY,OAAO,uBAAuB;AACzC,OAAK,OAAO;;CAGb,UAAU,UAA6B;AACtC,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa;AACZ,QAAK,UAAU,OAAO,SAAS;;;CAIjC,KAAK,SAAkC;AACtC,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACH,gBAAa,QACZ,KAAK,MACL,KAAK,UAAU;IAAE,GAAG;IAAS,WAAW,KAAK;IAAE,CAAC,CAChD;UACM;;CAGT,QAAQ;AACP,MACC,OAAO,WAAW,eAClB,OAAO,OAAO,qBAAqB,YAEnC,cAAa;EAGd,MAAM,WAAW,UAAwB;AACxC,OAAI,MAAM,QAAQ,KAAK,KAAM;GAC7B,MAAMA,UAA4B,KAAK,MAAM,MAAM,YAAY,KAAK;AACpE,OAAI,SAAS,UAAU,aAAa,CAAC,SAAS,KAAM;AAEpD,QAAK,UAAU,SAAS,aAAa,SAAS,QAAQ,CAAC;;AAGxD,SAAO,iBAAiB,WAAW,QAAQ;AAE3C,eAAa;AACZ,UAAO,oBAAoB,WAAW,QAAQ;;;;AAKjD,SAAgB,0BAA0B,OAAO,uBAAuB;AACvE,KAAI,CAAE,WAAmB,mBACxB,CAAC,WAAmB,qBAAqB,IAAI,uBAAuB,KAAK;AAE1E,QAAQ,WAAmB"}