import { contextBridge, ipcRenderer } from 'electron'; import { IPC_CHANNELS } from './shared/ipc/contracts'; import type { AnimeBrowserAPI, AnimeBrowserBridgeState, AnimeBrowserDetails, AnimeBrowserEpisode, AnimeBrowserPlayRequest, AnimeBrowserPlayResult, AnimeBrowserSearchResult, AnimeBrowserSearchUpdate, AnimeBrowserSnapshot, AvailableExtensionsResult, SourcePreferenceView, } from './types/anime-browser'; const request = IPC_CHANNELS.request; const animeBrowserAPI: AnimeBrowserAPI = { getSnapshot: (): Promise => ipcRenderer.invoke(request.animeBrowserGetSnapshot), ensureBridge: (): Promise => ipcRenderer.invoke(request.animeBrowserEnsureBridge), selectSource: (sourceId: string): Promise => ipcRenderer.invoke(request.animeBrowserSelectSource, sourceId), search: (query: string, page?: number): Promise => ipcRenderer.invoke(request.animeBrowserSearch, query, page), getPopular: (page?: number): Promise => ipcRenderer.invoke(request.animeBrowserGetPopular, page), getDetails: (animeUrl: string, sourceId?: string): Promise => ipcRenderer.invoke(request.animeBrowserGetDetails, animeUrl, sourceId), getEpisodes: (animeUrl: string, sourceId?: string): Promise => ipcRenderer.invoke(request.animeBrowserGetEpisodes, animeUrl, sourceId), playEpisode: (playRequest: AnimeBrowserPlayRequest): Promise => ipcRenderer.invoke(request.animeBrowserPlayEpisode, playRequest), getPreferences: (sourceId: string): Promise => ipcRenderer.invoke(request.animeBrowserGetPreferences, sourceId), setPreference: ( sourceId: string, key: string, value: string | string[] | boolean, ): Promise => ipcRenderer.invoke(request.animeBrowserSetPreference, sourceId, key, value), listAvailableExtensions: (): Promise => ipcRenderer.invoke(request.animeBrowserListAvailableExtensions), installExtension: (pkg: string): Promise => ipcRenderer.invoke(request.animeBrowserInstallExtension, pkg), removeExtension: (pkg: string): Promise => ipcRenderer.invoke(request.animeBrowserRemoveExtension, pkg), rescanExtensions: (): Promise => ipcRenderer.invoke(request.animeBrowserRescanExtensions), addRepo: (url: string): Promise => ipcRenderer.invoke(request.animeBrowserAddRepo, url), removeRepo: (url: string): Promise => ipcRenderer.invoke(request.animeBrowserRemoveRepo, url), onBridgeState: (listener: (state: AnimeBrowserBridgeState) => void): (() => void) => { const handler = (_event: unknown, state: AnimeBrowserBridgeState): void => listener(state); ipcRenderer.on(IPC_CHANNELS.event.animeBrowserBridgeState, handler); return () => ipcRenderer.removeListener(IPC_CHANNELS.event.animeBrowserBridgeState, handler); }, onSearchUpdate: (listener: (update: AnimeBrowserSearchUpdate) => void): (() => void) => { const handler = (_event: unknown, update: AnimeBrowserSearchUpdate): void => listener(update); ipcRenderer.on(IPC_CHANNELS.event.animeBrowserSearchUpdate, handler); return () => ipcRenderer.removeListener(IPC_CHANNELS.event.animeBrowserSearchUpdate, handler); }, }; contextBridge.exposeInMainWorld('animeBrowserAPI', animeBrowserAPI);