/* v8 ignore start */ import {platform} from "node:os"; import {type AutoDetectTypes, autoDetect, type OpenOptionsFromBinding, type SetOptions} from "@serialport/bindings-cpp"; // This file was copied from https://github.com/serialport/node-serialport/blob/master/packages/serialport/lib/serialport.ts. import {type ErrorCallback, type OpenOptions, SerialPortStream, type StreamOptions} from "@serialport/stream"; const DetectedBinding = autoDetect(); export type SerialPortOpenOptions = Omit, "binding"> & OpenOptionsFromBinding; export class SerialPort extends SerialPortStream { static list = DetectedBinding.list; static readonly binding = DetectedBinding; constructor(options: SerialPortOpenOptions, openCallback?: ErrorCallback) { const opts: OpenOptions = { binding: DetectedBinding as T, ...options, }; if (platform() === "win32") { // this controls `DTR` on "open", whereas on Unix, it's on "close" // https://github.com/serialport/bindings-cpp/blob/19820c39fbbedc1b5f09d6508b5ef1268df3d455/src/serialport_win.cpp#L123-L127 // https://github.com/serialport/bindings-cpp/blob/19820c39fbbedc1b5f09d6508b5ef1268df3d455/src/serialport_unix.cpp#L254-L256 opts.hupcl = false; } super(opts, openCallback); } public async asyncOpen(): Promise { return await new Promise((resolve, reject): void => { this.open((err) => (err ? reject(err) : resolve())); }); } public async asyncClose(): Promise { return await new Promise((resolve, reject): void => { this.close((err) => (err ? reject(err) : resolve())); }); } public async asyncFlush(): Promise { return await new Promise((resolve, reject): void => { this.flush((err) => (err ? reject(err) : resolve())); }); } public async asyncFlushAndClose(): Promise { await this.asyncFlush(); await this.asyncClose(); } public async asyncGet(): Promise<{cts: boolean; dsr: boolean; dcd: boolean}> { return await new Promise((resolve, reject): void => { // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress` this.get((err, options?) => (err ? reject(err) : resolve(options!))); }); } public async asyncSet(options: SetOptions): Promise { return await new Promise((resolve, reject): void => { this.set(options, (err) => (err ? reject(err) : resolve())); }); } }