Add typed ipc
This commit is contained in:
29
src/preload/index.d.ts
vendored
29
src/preload/index.d.ts
vendored
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user