diff --git a/src/main.ts b/src/main.ts index aa150f1..941459a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3770,10 +3770,13 @@ async function runLiveStatusBatchPoll(): Promise { } } - if (mainWindow) { - const snapshot: Record = {}; - for (const [k, v] of liveStatusByLogin.entries()) snapshot[k] = v; - mainWindow.webContents.send('live-status-batch-update', { changes, snapshot }); + if (mainWindow && changes.length > 0) { + // Renderer only consumes `changes` — initial state comes via + // the get-live-status-snapshot IPC at boot. Don't ship the + // full map on every tick (was ~1.5KB JSON per 60s with zero + // consumer-side use). Also skip the broadcast entirely when + // nothing actually changed. + mainWindow.webContents.send('live-status-batch-update', { changes }); } } catch (e) { appendDebugLog('live-status-poll-failed', String(e)); diff --git a/src/preload.ts b/src/preload.ts index 1d28b59..380a3d2 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -94,7 +94,7 @@ contextBridge.exposeInMainWorld('api', { getStreamerProfile: (login: string, forceRefresh?: boolean) => ipcRenderer.invoke('get-streamer-profile', login, forceRefresh), getVodStoryboard: (vodId: string) => ipcRenderer.invoke('get-vod-storyboard', vodId), getLiveStatusSnapshot: () => ipcRenderer.invoke('get-live-status-snapshot'), - onLiveStatusBatchUpdate: (callback: (info: { changes: Array<{ login: string; isLive: boolean }>; snapshot: Record }) => void) => { + onLiveStatusBatchUpdate: (callback: (info: { changes: Array<{ login: string; isLive: boolean }> }) => void) => { ipcRenderer.on('live-status-batch-update', (_, info) => callback(info)); }, searchArchive: (filter: Record) => ipcRenderer.invoke('search-archive', filter), diff --git a/src/renderer-globals.d.ts b/src/renderer-globals.d.ts index d412943..ba97604 100644 --- a/src/renderer-globals.d.ts +++ b/src/renderer-globals.d.ts @@ -347,7 +347,7 @@ interface ApiBridge { getStreamerProfile(login: string, forceRefresh?: boolean): Promise; getVodStoryboard(vodId: string): Promise; getLiveStatusSnapshot(): Promise>; - onLiveStatusBatchUpdate(callback: (info: { changes: Array<{ login: string; isLive: boolean }>; snapshot: Record }) => void): void; + onLiveStatusBatchUpdate(callback: (info: { changes: Array<{ login: string; isLive: boolean }> }) => void): void; searchArchive(filter: { query?: string; type?: 'all' | 'live' | 'vod' | 'chat' | 'events';