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), getDir: () => ipcRenderer.invoke('library:getDir'), pickDir: () => ipcRenderer.invoke('library:pickDir'), setDir: (dir, migrate) => ipcRenderer.invoke('library:setDir', dir, migrate), scan: () => ipcRenderer.invoke('library:scan'), onChanged: (cb) => ipcRenderer.on('library:changed', () => cb()) }, settings: { get: (key, def) => ipcRenderer.invoke('settings:get', key, def), set: (key, value) => ipcRenderer.invoke('settings:set', key, value) }, downloadFile: (url, suggestName, entryId, extraHeaders, meta) => ipcRenderer.invoke('download:file', url, suggestName, entryId, extraHeaders, meta), zlib: { hasCreds: () => ipcRenderer.invoke('zlib:hasCreds'), login: (email, password) => ipcRenderer.invoke('zlib:login', email, password), logout: () => ipcRenderer.invoke('zlib:logout') }, semanticScholar: { keyStatus: () => ipcRenderer.invoke('semanticScholar:keyStatus'), setKey: (key) => ipcRenderer.invoke('semanticScholar:setKey', key), clearKey: () => ipcRenderer.invoke('semanticScholar:clearKey') }, 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'), checkUpdate: () => ipcRenderer.invoke('app:checkUpdate'), minimize: () => ipcRenderer.send('win:minimize'), maximize: () => ipcRenderer.send('win:maximize'), close: () => ipcRenderer.send('win:close') });