feat(preload): allowlist updater:* and crash:* channels, expose API

This commit is contained in:
2026-06-08 06:20:59 +05:30
parent b1b9aa3727
commit f85c1a8107
2 changed files with 53 additions and 1 deletions
+31 -1
View File
@@ -135,6 +135,16 @@ const ALLOWED_SEND_CHANNELS = [
'app:open-external', 'app:open-external',
'app:show-save-dialog', 'app:show-save-dialog',
// Updater
'updater:check',
'updater:install',
'updater:get-state',
// Crash reporter
'crash:read',
'crash:open-dir',
'crash:delete',
// Git diff // Git diff
'git-diff', 'git-diff',
@@ -231,6 +241,9 @@ const ALLOWED_RECEIVE_CHANNELS = [
'print-preview-styled', 'print-preview-styled',
'clear-recent-files', 'clear-recent-files',
// Updater
'updater:status',
// File dialog / directory listing // File dialog / directory listing
'list-directory', 'list-directory',
'pick-folder', 'pick-folder',
@@ -439,7 +452,24 @@ contextBridge.exposeInMainWorld('electronAPI', {
quit: () => ipcRenderer.send('app:quit'), quit: () => ipcRenderer.send('app:quit'),
openExternal: (url) => ipcRenderer.send('app:open-external', url), openExternal: (url) => ipcRenderer.send('app:open-external', url),
showSaveDialog: (args) => ipcRenderer.invoke('app:show-save-dialog', args), showSaveDialog: (args) => ipcRenderer.invoke('app:show-save-dialog', args),
} },
updater: {
check: () => ipcRenderer.invoke('updater:check'),
install: () => ipcRenderer.invoke('updater:install'),
getState: () => ipcRenderer.invoke('updater:get-state'),
onStatus: (cb) => {
const subscription = (_event, payload) => cb(payload);
ipcRenderer.on('updater:status', subscription);
return () => ipcRenderer.removeListener('updater:status', subscription);
},
},
crash: {
read: () => ipcRenderer.invoke('crash:read'),
openDir: () => ipcRenderer.send('crash:open-dir'),
delete: (filename) => ipcRenderer.invoke('crash:delete', filename),
},
}); });
// Log successful preload initialization // Log successful preload initialization
+22
View File
@@ -117,4 +117,26 @@ export const ipc = {
return window.electronAPI.on(channel, callback as (...a: any[]) => void); return window.electronAPI.on(channel, callback as (...a: any[]) => void);
}, },
}, },
updater: {
check: (): Promise<IpcResult<void | ChannelMissing>> =>
safeCall('updater', 'check'),
install: (): Promise<IpcResult<void | ChannelMissing>> =>
safeCall('updater', 'install'),
getState: (): Promise<IpcResult<unknown | ChannelMissing>> =>
safeCall('updater', 'getState'),
onStatus: (cb: (payload: unknown) => void): (() => void) => {
if (typeof window === 'undefined' || !window.electronAPI?.updater?.onStatus) {
return () => {};
}
return window.electronAPI.updater.onStatus(cb);
},
},
crash: {
read: (): Promise<IpcResult<unknown | ChannelMissing>> =>
safeCall('crash', 'read'),
openDir: (): Promise<IpcResult<void | ChannelMissing>> =>
safeCall('crash', 'openDir'),
delete: (filename: string): Promise<IpcResult<void | ChannelMissing>> =>
safeCall('crash', 'delete', filename),
},
}; };