/* Contrat IPC : une seule source de vérité pour le preload (window.orbe) et les handlers du processus principal. */ import type { AppInfo, Collection, Game, ScannerId, Settings } from './types' import type { ThemeManifest } from './theme' export interface ScanReport { added: number updated: number uninstalled: number merged: number failed: ScannerId[] total: number } export interface ManualGameInput { name: string exe: string args?: string workDir?: string } export interface FsEntry { name: string; path: string; dir: boolean } export interface FsListing { dir: string; parent: string | null; entries: FsEntry[] } export type FsFilter = 'exe' | 'image' | 'dir' export interface ThemeEntry { manifest: ThemeManifest base: string // URL de base des fichiers du thème (orbe-theme:///) builtin: boolean warnings: string[] } export interface Api { 'app:info': () => Promise 'library:list': () => Promise 'library:update': (id: string, patch: Partial>) => Promise 'library:rescan': () => Promise 'library:addManual': (input: ManualGameInput) => Promise 'library:remove': (id: string) => Promise 'fs:list': (dir: string, filter: FsFilter) => Promise 'collections:list': () => Promise 'collections:create': (name: string) => Promise 'collections:rename': (id: string, name: string) => Promise 'collections:delete': (id: string) => Promise 'settings:get': () => Promise 'settings:set': (patch: Partial) => Promise 'themes:list': () => Promise } /* Événements poussés par le processus principal vers l'interface */ export interface Events { 'library:changed': Game[] 'scan:state': { running: boolean; report?: ScanReport } 'settings:changed': Settings 'themes:changed': { id: string; themes: ThemeEntry[] } } export type Channel = keyof Api export type EventName = keyof Events export const CHANNELS = [ 'app:info', 'library:list', 'library:update', 'library:rescan', 'library:addManual', 'library:remove', 'fs:list', 'collections:list', 'collections:create', 'collections:rename', 'collections:delete', 'settings:get', 'settings:set', 'themes:list' ] as const satisfies readonly Channel[] export const EVENTS = ['library:changed', 'scan:state', 'settings:changed', 'themes:changed'] as const satisfies readonly EventName[] /* Ce que l'interface voit dans window.orbe */ export type OrbeApi = Api & { on: (event: E, cb: (payload: Events[E]) => void) => () => void }