Add typed ipc

This commit is contained in:
Robert Kossessa
2024-03-02 18:09:16 +01:00
parent bee6ab1076
commit 43b384dfef
8 changed files with 89 additions and 103 deletions

View File

@@ -1,8 +1,31 @@
import { ElectronAPI } from '@electron-toolkit/preload'
export interface INanoDevicesAPI {
list_devices(): Promise<string[]>
connect(deviceid: string): Promise<string>
disconnect(deviceid: string): Promise<string>
on_event(
eventid_filter: string,
callback: (eventid: string, deviceid: string, data: any) => void
): void
send(deviceid: string, jsonstr: string): Promise<void>
}
export interface IElectronAPI {
platform: NodeJS.Platform
isDevelopment: boolean
minimizeWindow: () => void
toggleMaximizeWindow: () => void
closeWindow: () => void
openExternal: (url: string) => void
onMaximized: (callback: () => void) => void
onUnmaximized: (callback: () => void) => void
onMenu: (callback: (key: string) => void) => void
openDevTools: () => void
reload: () => void
}
declare global {
interface Window {
electron: ElectronAPI
api: unknown
nanoDevicesAPI: INanoDevicesAPI
electronAPI: IElectronAPI
}
}

View File

@@ -1,61 +1,43 @@
import { contextBridge, ipcRenderer } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'
// Custom APIs for renderer
const api = {}
// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
if (process.contextIsolated) {
try {
// expose an API to choose available devices
contextBridge.exposeInMainWorld('nanodevices', {
list_devices() {
return ipcRenderer.invoke('nanodevices:list_devices')
},
connect(deviceid) {
return ipcRenderer.invoke('nanodevices:connect', deviceid)
},
disconnect(deviceid) {
return ipcRenderer.invoke('nanodevices:disconnect', deviceid)
},
on_event(eventid_filter, callback) {
console.log('attaching filter for ', eventid_filter)
ipcRenderer.on('nanodevices:event', (_event, eventid, deviceid, ...data) => {
console.log('Event in ipcRenderer ', eventid, deviceid, data)
if (eventid_filter == '*' || eventid_filter == eventid) {
callback(eventid, deviceid, ...data)
}
})
},
send(deviceid, jsonstr) {
return ipcRenderer.invoke('nanodevices:send', deviceid, jsonstr)
// expose an API to choose available devices
contextBridge.exposeInMainWorld('nanoDevicesAPI', {
list_devices() {
return ipcRenderer.invoke('nanodevices:list_devices')
},
connect(deviceid) {
return ipcRenderer.invoke('nanodevices:connect', deviceid)
},
disconnect(deviceid) {
return ipcRenderer.invoke('nanodevices:disconnect', deviceid)
},
on_event(eventid_filter, callback) {
console.log('attaching filter for ', eventid_filter)
ipcRenderer.on('nanodevices:event', (_event, eventid, deviceid, ...data) => {
console.log('Event in ipcRenderer ', eventid, deviceid, data)
if (eventid_filter == '*' || eventid_filter == eventid) {
callback(eventid, deviceid, ...data)
}
})
contextBridge.exposeInMainWorld('electron', {
platform: process.platform,
isDevelopment: process.env.NODE_ENV !== 'production',
minimizeWindow: () => ipcRenderer.send('electron:minimizeWindow'),
toggleMaximizeWindow: () => ipcRenderer.send('electron:toggleMaximizeWindow'),
closeWindow: () => ipcRenderer.send('electron:closeWindow'),
openExternal: (url) => ipcRenderer.send('electron:openExternal', url),
onMaximized: (callback) => ipcRenderer.on('electron:maximized', callback),
onUnmaximized: (callback) => ipcRenderer.on('electron:unmaximized', callback),
onMenu: (callback) =>
ipcRenderer.on('electron:menu', (event, key) => {
callback(key)
}),
openDevTools: () => ipcRenderer.send('electron:openDevTools'),
reload: () => ipcRenderer.send('electron:reload')
})
} catch (error) {
console.error(error)
},
send(deviceid, jsonstr) {
return ipcRenderer.invoke('nanodevices:send', deviceid, jsonstr)
}
} else {
// @ts-ignore (define in dts)
window.electron = electronAPI
// @ts-ignore (define in dts)
window.api = api
}
})
contextBridge.exposeInMainWorld('electronAPI', {
platform: process.platform,
isDevelopment: process.env.NODE_ENV !== 'production',
minimizeWindow: () => ipcRenderer.send('electron:minimizeWindow'),
toggleMaximizeWindow: () => ipcRenderer.send('electron:toggleMaximizeWindow'),
closeWindow: () => ipcRenderer.send('electron:closeWindow'),
openExternal: (url) => ipcRenderer.send('electron:openExternal', url),
onMaximized: (callback) => ipcRenderer.on('electron:maximized', callback),
onUnmaximized: (callback) => ipcRenderer.on('electron:unmaximized', callback),
onMenu: (callback) =>
ipcRenderer.on('electron:menu', (event, key) => {
callback(key)
}),
openDevTools: () => ipcRenderer.send('electron:openDevTools'),
reload: () => ipcRenderer.send('electron:reload')
})