/* * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause */ import type { AutoDetectTypes, SetOptions, UpdateOptions, } from '@serialport/bindings-cpp'; import type { SerialPortOpenOptions } from 'serialport'; import { broadcast, onBroadcasted } from './infrastructure/mainToRenderer'; import { handle, handleWithSender, invoke, } from './infrastructure/rendererToMain'; const channel = { // ************** // Commands (from the renderer processes of apps to the main process) // ************** open: 'serialport:open', close: 'serialport:close', write: 'serialport:write', update: 'serialport:update', set: 'serialport:set', // ************** // Queries (from the renderer processes of apps to the main process) // ************** isOpen: 'serialport:is-open', getOptions: 'serialport:get-options', // ************** // Callbacks (from the the main process to the renderer processes of apps) // ************** onClosed: 'serialport:on-close', onUpdated: 'serialport:on-update', onSet: 'serialport:on-set', onChanged: 'serialport:on-changed', // Would be nice to rename the next two channels, but we cannot change the // string because it would break interoperability between apps and launchers onDataReived: 'serialport:on-data', onDataWritten: 'serialport:on-write', }; export type OverwriteOptions = { overwrite?: boolean; settingsLocked?: boolean; }; // ************** // Commands (from the renderer processes of apps to the main process) // ************** type Open = ( options: SerialPortOpenOptions, overwriteOptions: OverwriteOptions, ) => void; const open = invoke(channel.open); const registerOpen = handleWithSender(channel.open); type Close = (path: string) => void; const close = invoke(channel.close); const registerClose = handleWithSender(channel.close); type Write = (path: string, data: string | number[] | Buffer) => void; const write = invoke(channel.write); const registerWrite = handle(channel.write); type Update = (path: string, options: UpdateOptions) => void; const update = invoke(channel.update); const registerUpdate = handle(channel.update); type Set = (path: string, set: SetOptions) => void; const set = invoke(channel.set); const registerSet = handle(channel.set); // ************** // Queries (from the renderer processes of apps to the main process) // ************** type IsOpen = (path: string) => boolean; const isOpen = invoke(channel.isOpen); const registerIsOpen = handle(channel.isOpen); type GetOptions = ( path: string, ) => SerialPortOpenOptions | undefined; const getOptions = invoke(channel.getOptions); const registerGetOptions = handle(channel.getOptions); // ************** // Callbacks (from the the main process to the renderer processes of apps) // ************** type OnDataReceived = (data: unknown) => void; const broadcastDataReceived = broadcast(channel.onDataReived); const registerOnDataReceived = (path: string) => onBroadcasted(channel.onDataReived, path); type OnDataWritten = (data: string | number[] | Buffer) => void; const broadcastDataWritten = broadcast(channel.onDataWritten); const registerOnDataWritten = (path: string) => onBroadcasted(channel.onDataWritten, path); type OnClosed = () => void; const broadcastClosed = broadcast(channel.onClosed); const registerOnClosed = (path: string) => onBroadcasted(channel.onClosed, path); type OnUpdate = (newOptions: UpdateOptions) => void; const broadcastUpdated = broadcast(channel.onUpdated); const registerOnUpdated = (path: string) => onBroadcasted(channel.onUpdated, path); type OnSet = (newOptions: SetOptions) => void; const broadcastSet = broadcast(channel.onSet); const registerOnSet = (path: string) => onBroadcasted(channel.onSet, path); type OnChanged = (newOptions: SerialPortOpenOptions) => void; const broadcastChanged = broadcast(channel.onChanged); const registerOnChanged = (path: string) => onBroadcasted(channel.onChanged, path); export const inRenderer = { broadcastChanged, broadcastClosed, broadcastDataReceived, broadcastDataWritten, broadcastSet, broadcastUpdated, }; export const forRenderer = { registerClose, registerGetOptions, registerIsOpen, registerOpen, registerSet, registerUpdate, registerWrite, }; export const inMain = { open, close, write, update, set, isOpen, getOptions, }; export const forMain = { registerOnDataReceived, registerOnDataWritten, registerOnClosed, registerOnUpdated, registerOnSet, registerOnChanged, };