import { ipcMain } from 'electron'; import { ipcChannels, type IpcInvokeMap } from '../../shared/ipc/contracts'; type Handler = ( payload: IpcInvokeMap[K]['req'], ) => Promise | IpcInvokeMap[K]['res']; const handlers = new Map Promise>(); let licenseAssert: (() => void) | undefined; export function setLicenseAssert(fn: () => void): void { licenseAssert = fn; } function channelRequiresLicense(channel: string): boolean { if (channel.startsWith('license.')) return false; if (channel.startsWith('app.')) return false; if (channel === ipcChannels.windows.closeMultiWindow) return false; if (channel === ipcChannels.windows.togglePresentationFullscreen) return false; return true; } export function registerHandler(channel: K, handler: Handler) { const channelStr = channel as string; const wrap = channelRequiresLicense(channelStr); const inner = async (payload: unknown) => { if (wrap) { licenseAssert?.(); } return handler(payload as IpcInvokeMap[K]['req']); }; handlers.set(channelStr, inner); } export function installIpcRouter(): void { for (const [channel, handler] of handlers.entries()) { ipcMain.handle(channel, async (_event, payload: unknown) => handler(payload)); } }