diff --git a/src/main/backend/nanodevices.ts b/src/main/backend/nanodevices.ts index 5ba35a4..7df1612 100644 --- a/src/main/backend/nanodevices.ts +++ b/src/main/backend/nanodevices.ts @@ -9,7 +9,7 @@ const NANO_BAUD_RATE = 115200 class NanoDevices extends EventEmitter { all_nano_devices: { [key: string]: PortInfo } = {} - connected_nano_devices: { [key: string]: { port: SerialPort; data: string } } = {} + connected_nano_devices: { [key: string]: { port: SerialPort } } = {} _list() { return new Promise((resolve, reject) => { @@ -105,7 +105,7 @@ class NanoDevices extends EventEmitter { }) port.on('open', () => { resolve(nano_device.serialNumber) - this.connected_nano_devices[nano_device.serialNumber!] = { port: port, data: '' } + this.connected_nano_devices[nano_device.serialNumber!] = { port: port } this.emit('nanodevices:connected', nano_device.serialNumber) }) port.on('data', (data) => { diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index a153669..e5498df 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -1,8 +1,31 @@ -import { ElectronAPI } from '@electron-toolkit/preload' +export interface INanoDevicesAPI { + list_devices(): Promise + connect(deviceid: string): Promise + disconnect(deviceid: string): Promise + on_event( + eventid_filter: string, + callback: (eventid: string, deviceid: string, data: any) => void + ): void + send(deviceid: string, jsonstr: string): Promise +} + +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 } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 099f8bc..04213bc 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -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') +}) diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index 06d3de1..d66b21d 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -6,7 +6,7 @@ import Navbar from '@renderer/components/navbar/Navbar.vue' import { useStore } from '@renderer/store' import { useMessageHandlers } from '@renderer/device' -const { electron } = window +const { electronAPI, nanoDevicesAPI } = window const store = useStore() const menuActions = { @@ -15,7 +15,7 @@ const menuActions = { skin: () => store.switchPreviewDeviceModel() } -electron?.onMenu((key) => { +electronAPI.onMenu((key) => { console.log('menu', key) if (menuActions[key]) { menuActions[key]() @@ -26,24 +26,20 @@ store.fetchProfiles() // TODO remove me! // handle device events const handlers = useMessageHandlers(store) -window.nanodevices.on_event('device-attached', (evt, deviceid, data) => - store.device_attached(deviceid) -) -window.nanodevices.on_event('device-detached', (evt, deviceid, data) => - store.device_detached(deviceid) -) -window.nanodevices.on_event('device-error', (evt, deviceid, data) => { +nanoDevicesAPI.on_event('device-attached', (evt, deviceid, data) => store.device_attached(deviceid)) +nanoDevicesAPI.on_event('device-detached', (evt, deviceid, data) => store.device_detached(deviceid)) +nanoDevicesAPI.on_event('device-error', (evt, deviceid, data) => { /* TODO handle connection errors */ }) -window.nanodevices.on_event('connected', (evt, deviceid, data) => store.device_connected(deviceid)) -window.nanodevices.on_event('disconnected', (evt, deviceid, data) => +nanoDevicesAPI.on_event('connected', (evt, deviceid, data) => store.device_connected(deviceid)) +nanoDevicesAPI.on_event('disconnected', (evt, deviceid, data) => store.device_disconnected(deviceid) ) -window.nanodevices.on_event('update', (evt, deviceid, data) => { +nanoDevicesAPI.on_event('update', (evt, deviceid, data) => { handlers.handle_message(data) }) // get list of the currently attached devices -window.nanodevices.list_devices().then((devs) => store.init_devices(devs)) +nanoDevicesAPI.list_devices().then((devs) => store.init_devices(devs))