const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('api', { sources: { list: () => ipcRenderer.invoke('sources:list'), browse: (sourceId, page) => ipcRenderer.invoke('source:list', sourceId, page), search: (sourceId, keyword, page) => ipcRenderer.invoke('source:search', sourceId, keyword, page), detail: (sourceId, postId) => ipcRenderer.invoke('source:detail', sourceId, postId), download: (sourceId, postId) => ipcRenderer.invoke('source:download', sourceId, postId) }, library: { list: () => ipcRenderer.invoke('library:list'), get: (id) => ipcRenderer.invoke('library:get', id), findBySource: (sourceId, postId) => ipcRenderer.invoke('library:findBySource', sourceId, postId), add: (item) => ipcRenderer.invoke('library:add', item), update: (id, patch) => ipcRenderer.invoke('library:update', id, patch), remove: (id, deleteFiles) => ipcRenderer.invoke('library:remove', id, deleteFiles), onChanged: (cb) => ipcRenderer.on('library:changed', () => cb()) }, downloadFile: (url, suggestName, entryId, extraHeaders) => ipcRenderer.invoke('download:file', url, suggestName, entryId, extraHeaders), zlib: { hasCreds: () => ipcRenderer.invoke('zlib:hasCreds'), login: (email, password) => ipcRenderer.invoke('zlib:login', email, password), logout: () => ipcRenderer.invoke('zlib:logout') }, proxy: { get: () => ipcRenderer.invoke('proxy:get'), set: (url) => ipcRenderer.invoke('proxy:set', url) }, pickFile: () => ipcRenderer.invoke('dialog:pickFile'), openPath: (p) => ipcRenderer.invoke('shell:openPath', p), showItem: (p) => ipcRenderer.invoke('shell:showItem', p), openExternal: (url) => ipcRenderer.invoke('shell:openExternal', url), copy: (text) => ipcRenderer.invoke('copy', text), getVersion: () => ipcRenderer.invoke('app:version'), minimize: () => ipcRenderer.send('win:minimize'), maximize: () => ipcRenderer.send('win:maximize'), close: () => ipcRenderer.send('win:close') });