import { ipcRenderer, IpcRendererEvent } from 'electron'; export interface PreloadCastDevice { id: string; isSelected: boolean; name: string; } export interface PreloadCastLoadPayload { album?: null | string; artist?: null | string; artworkUrl?: null | string; contentType: string; contentUrl: string; positionSeconds?: number; title: string; } export interface PreloadCastState { deviceName: null | string; devices: PreloadCastDevice[]; isConnected: boolean; isScanning: boolean; status: 'blocked' | 'connected' | 'connecting' | 'disconnected' | 'no-devices' | 'unavailable'; } const startDiscovery = (): Promise => ipcRenderer.invoke('cast:start-discovery'); const stopDiscovery = (): Promise => ipcRenderer.invoke('cast:stop-discovery'); const getState = (): Promise => ipcRenderer.invoke('cast:get-state'); const connect = (deviceId?: string): Promise => ipcRenderer.invoke('cast:connect', deviceId); const disconnect = (): Promise => ipcRenderer.invoke('cast:disconnect'); const load = (payload: PreloadCastLoadPayload): Promise => ipcRenderer.invoke('cast:load', payload); const play = (): Promise => ipcRenderer.invoke('cast:play'); const pause = (): Promise => ipcRenderer.invoke('cast:pause'); const seek = (positionSeconds: number): Promise => ipcRenderer.invoke('cast:seek', positionSeconds); const openNetworkSettings = (): Promise => ipcRenderer.invoke('cast:open-network-settings'); /** Subscribe to main-pushed state; returns an unsubscribe fn. */ const onState = (cb: (state: PreloadCastState) => void): (() => void) => { const handler = (_event: IpcRendererEvent, state: PreloadCastState) => cb(state); ipcRenderer.on('cast:state', handler); return () => ipcRenderer.removeListener('cast:state', handler); }; export const cast = { connect, disconnect, getState, load, onState, openNetworkSettings, pause, play, seek, startDiscovery, stopDiscovery, }; export type Cast = typeof cast;