import type { PortInfo } from 'serialport' import BindingAbstract from '@serialport/binding-abstract' import { v4 as uuid } from 'uuid' function genWebSerialPortPath() { return '/wsp/' + uuid(); } function webSerialPortToPortInfo(virtualPath: string, wsp: SerialPort): PortInfo { const { usbVendorId, usbProductId } = wsp.getInfo(); return { path: virtualPath, vendorId: usbVendorId?.toString(16), productId: usbProductId?.toString(16), } } class WebSerialBinding extends BindingAbstract { static portFilters = undefined; static wspMap: Map = new Map(); static requestPort() { return navigator.serial .requestPort({ filters: WebSerialBinding.portFilters }) .then((port) => { const wspList = Array.from(WebSerialBinding.wspMap.values()) if (!wspList.includes(port)) { const virtualPath = genWebSerialPortPath() WebSerialBinding.wspMap.set(virtualPath, port); } return port; }) } static async list() { return Array.from(WebSerialBinding.wspMap.entries()) .map(([virtualPath, wsp]) => webSerialPortToPortInfo(virtualPath, wsp)) } } export default WebSerialBinding;