Broadcast session-list mutations from scratch windows so the main sidebar refreshes without manual reloads.
25 lines
1 KiB
TypeScript
25 lines
1 KiB
TypeScript
// Cross-window session-list sync. Each desktop window is its own renderer
|
|
// process with its own gateway socket and session store, so a mutation in one
|
|
// (e.g. a new chat started in the compact pop-out) never reaches another
|
|
// window. This bus pings every window to re-pull the shared session list; the
|
|
// data already lives in the backend, the other window just doesn't know to look.
|
|
const CHANNEL = 'hermes:sessions'
|
|
|
|
const channel = typeof BroadcastChannel === 'undefined' ? null : new BroadcastChannel(CHANNEL)
|
|
|
|
// A window that mutated the session list (created / titled a chat) tells the
|
|
// others to refresh. A BroadcastChannel never delivers to its own poster, so the
|
|
// caller refreshes locally as it already does.
|
|
export function broadcastSessionsChanged(): void {
|
|
channel?.postMessage(1)
|
|
}
|
|
|
|
export function onSessionsChanged(handler: () => void): () => void {
|
|
if (!channel) {
|
|
return () => {}
|
|
}
|
|
|
|
channel.addEventListener('message', handler)
|
|
|
|
return () => channel.removeEventListener('message', handler)
|
|
}
|