react-native-web-serial-api 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +23 -0
  2. package/TESTING.md +301 -0
  3. package/android/build.gradle +2 -2
  4. package/android/src/main/java/dev/webserialapi/NativeUsbSerialModule.java +7 -1
  5. package/lib/commonjs/UsbSerial.js +58 -26
  6. package/lib/commonjs/UsbSerial.js.map +1 -1
  7. package/lib/commonjs/WebSerial.js +169 -57
  8. package/lib/commonjs/WebSerial.js.map +1 -1
  9. package/lib/commonjs/index.js +13 -1
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/lib/dom-exception.js +176 -0
  12. package/lib/commonjs/lib/dom-exception.js.map +1 -0
  13. package/lib/commonjs/lib/event-target.js +138 -0
  14. package/lib/commonjs/lib/event-target.js.map +1 -0
  15. package/lib/commonjs/lib/promise.js +23 -0
  16. package/lib/commonjs/lib/promise.js.map +1 -0
  17. package/lib/commonjs/testing/index.js +70 -0
  18. package/lib/commonjs/testing/index.js.map +1 -0
  19. package/lib/commonjs/testing/install.js +54 -0
  20. package/lib/commonjs/testing/install.js.map +1 -0
  21. package/lib/commonjs/testing/serial-device.js +164 -0
  22. package/lib/commonjs/testing/serial-device.js.map +1 -0
  23. package/lib/commonjs/testing/virtual-serial.js +615 -0
  24. package/lib/commonjs/testing/virtual-serial.js.map +1 -0
  25. package/lib/commonjs/transport.js +61 -0
  26. package/lib/commonjs/transport.js.map +1 -0
  27. package/lib/typescript/src/UsbSerial.d.ts +24 -67
  28. package/lib/typescript/src/UsbSerial.d.ts.map +1 -1
  29. package/lib/typescript/src/WebSerial.d.ts +11 -2
  30. package/lib/typescript/src/WebSerial.d.ts.map +1 -1
  31. package/lib/typescript/src/index.d.ts +2 -0
  32. package/lib/typescript/src/index.d.ts.map +1 -1
  33. package/lib/typescript/src/lib/dom-exception.d.ts +100 -0
  34. package/lib/typescript/src/lib/dom-exception.d.ts.map +1 -0
  35. package/lib/typescript/src/lib/event-target.d.ts +53 -0
  36. package/lib/typescript/src/lib/event-target.d.ts.map +1 -0
  37. package/lib/typescript/src/lib/promise.d.ts +11 -0
  38. package/lib/typescript/src/lib/promise.d.ts.map +1 -0
  39. package/lib/typescript/src/testing/index.d.ts +23 -0
  40. package/lib/typescript/src/testing/index.d.ts.map +1 -0
  41. package/lib/typescript/src/testing/install.d.ts +25 -0
  42. package/lib/typescript/src/testing/install.d.ts.map +1 -0
  43. package/lib/typescript/src/testing/serial-device.d.ts +127 -0
  44. package/lib/typescript/src/testing/serial-device.d.ts.map +1 -0
  45. package/lib/typescript/src/testing/virtual-serial.d.ts +205 -0
  46. package/lib/typescript/src/testing/virtual-serial.d.ts.map +1 -0
  47. package/lib/typescript/src/transport.d.ts +131 -0
  48. package/lib/typescript/src/transport.d.ts.map +1 -0
  49. package/package.json +38 -2
  50. package/src/UsbSerial.ts +65 -90
  51. package/src/WebSerial.ts +227 -88
  52. package/src/index.ts +2 -7
  53. package/src/lib/dom-exception.ts +129 -60
  54. package/src/lib/event-target.ts +46 -21
  55. package/src/lib/promise.ts +7 -7
  56. package/src/testing/index.ts +42 -0
  57. package/src/testing/install.ts +65 -0
  58. package/src/testing/serial-device.ts +193 -0
  59. package/src/testing/virtual-serial.ts +801 -0
  60. package/src/transport.ts +200 -0
  61. package/babel.config.js +0 -3
  62. package/biome.json +0 -35
  63. package/example/.watchmanconfig +0 -1
  64. package/example/App.tsx +0 -71
  65. package/example/__tests__/App.test.tsx +0 -16
  66. package/example/__tests__/connectEvents.test.tsx +0 -81
  67. package/example/__tests__/getPorts.test.tsx +0 -140
  68. package/example/android/app/build.gradle +0 -120
  69. package/example/android/app/debug.keystore +0 -0
  70. package/example/android/app/proguard-rules.pro +0 -10
  71. package/example/android/app/src/debug/AndroidManifest.xml +0 -9
  72. package/example/android/app/src/main/AndroidManifest.xml +0 -38
  73. package/example/android/app/src/main/java/dev/uzlopak/MainActivity.kt +0 -22
  74. package/example/android/app/src/main/java/dev/uzlopak/MainApplication.kt +0 -41
  75. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +0 -37
  76. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  77. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  78. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  79. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  80. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  81. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  82. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  83. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  84. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  85. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  86. package/example/android/app/src/main/res/values/strings.xml +0 -3
  87. package/example/android/app/src/main/res/values/styles.xml +0 -9
  88. package/example/android/build.gradle +0 -22
  89. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  90. package/example/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  91. package/example/android/gradle.properties +0 -47
  92. package/example/android/gradlew +0 -252
  93. package/example/android/gradlew.bat +0 -94
  94. package/example/android/settings.gradle +0 -6
  95. package/example/app.json +0 -4
  96. package/example/babel.config.js +0 -21
  97. package/example/biome.json +0 -47
  98. package/example/deploy.sh +0 -11
  99. package/example/index.html +0 -26
  100. package/example/index.js +0 -9
  101. package/example/index.web.js +0 -8
  102. package/example/jest.config.js +0 -12
  103. package/example/metro.config.js +0 -58
  104. package/example/package-lock.json +0 -14510
  105. package/example/package.json +0 -48
  106. package/example/react-native.config.js +0 -17
  107. package/example/src/components/AppBar.tsx +0 -73
  108. package/example/src/components/Menu.tsx +0 -90
  109. package/example/src/components/SingleChoiceDialog.tsx +0 -120
  110. package/example/src/screens/ConnectScreen.tsx +0 -195
  111. package/example/src/screens/DevicesScreen.tsx +0 -248
  112. package/example/src/screens/TerminalScreen.tsx +0 -564
  113. package/example/src/settings.ts +0 -43
  114. package/example/src/theme.ts +0 -19
  115. package/example/src/util/TextUtil.ts +0 -129
  116. package/example/tsconfig.json +0 -10
  117. package/example/vite.config.mjs +0 -55
  118. package/scripts/deploy-release.sh +0 -127
  119. package/tsconfig.build.json +0 -7
  120. package/tsconfig.json +0 -20
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VirtualSerialTransport = exports.VirtualDevice = void 0;
7
+ var _transport = require("../transport");
8
+ /**
9
+ * VirtualSerialTransport — an in-memory {@link SerialTransport} for tests and
10
+ * on-device demos.
11
+ *
12
+ * It implements the exact same interface the production `UsbSerialModule` does,
13
+ * but talks to simulated devices instead of real USB hardware. Because it has
14
+ * **no `react-native` dependency**, the same instance drives:
15
+ *
16
+ * - Jest/Node unit tests and the conformance suite,
17
+ * - the example app's "virtual device" mode on a real Android device, and
18
+ * - the example app running in a browser (react-native-web).
19
+ *
20
+ * Inject it via `new Serial(transport)` or globally with `setUsbSerial(transport)`.
21
+ *
22
+ * @example
23
+ * const transport = new VirtualSerialTransport();
24
+ * transport.addDevice(new EchoDevice(), {hasPermission: true});
25
+ * const serial = new Serial(transport);
26
+ * const [port] = await serial.getPorts();
27
+ * await port.open({baudRate: 115200});
28
+ * // writes to port.writable now come back on port.readable (echo)
29
+ */
30
+
31
+ /** Transport-side knobs when registering a {@link SerialDevice}. */
32
+
33
+ /** Operations whose next invocation can be made to fail (error injection). */
34
+
35
+ function toByte(n) {
36
+ return n & 0xff;
37
+ }
38
+
39
+ /** Map the device's verbose input-signal names onto the internal short names. */
40
+ function mapInputSignals(s) {
41
+ const out = {};
42
+ if (s.dataCarrierDetect !== undefined) out.dcd = s.dataCarrierDetect;
43
+ if (s.clearToSend !== undefined) out.cts = s.clearToSend;
44
+ if (s.ringIndicator !== undefined) out.ri = s.ringIndicator;
45
+ if (s.dataSetReady !== undefined) out.dsr = s.dataSetReady;
46
+ return out;
47
+ }
48
+
49
+ /**
50
+ * A simulated USB-serial device. Returned by {@link VirtualSerialTransport.addDevice}.
51
+ * The mutable fields and the helper methods let a test or demo drive the device
52
+ * the way physical hardware (and a human plugging cables) otherwise would.
53
+ */
54
+ class VirtualDevice {
55
+ /** Reassigned on every (re)attach, mirroring Android's behaviour. */
56
+
57
+ attached = true;
58
+ isOpen = false;
59
+ reading = false;
60
+ /** The hosted behaviour. */
61
+
62
+ flowControl = 'NONE';
63
+ openOptions = null;
64
+
65
+ /**
66
+ * When non-null, the device delivers at most this many bytes before raising a
67
+ * `BufferOverrunError` — models a fixed-size receive buffer overflowing.
68
+ */
69
+ overrunLimit = null;
70
+
71
+ // @internal counters used by the transport.
72
+ _rxDelivered = 0;
73
+ _overran = false;
74
+ _hwWritten = 0;
75
+ output = {
76
+ dtr: false,
77
+ rts: false,
78
+ brk: false
79
+ };
80
+ input = {
81
+ dcd: false,
82
+ cts: false,
83
+ ri: false,
84
+ dsr: false
85
+ };
86
+
87
+ /** Every byte frame the host has written to this device, in order. */
88
+ written = [];
89
+ #fails = new Set();
90
+ #transport;
91
+ constructor(transport, deviceId, device, options) {
92
+ this.#transport = transport;
93
+ this.deviceId = deviceId;
94
+ this.serialDevice = device;
95
+ this.usbVendorId = device.usbVendorId;
96
+ this.usbProductId = device.usbProductId;
97
+ this.portNumber = options.portNumber ?? 0;
98
+ this.serialNumber = options.serialNumber ?? device.serialNumber ?? `VSERIAL-${device.usbVendorId.toString(16)}-${device.usbProductId.toString(16)}`;
99
+ this.hasPermission = options.hasPermission ?? false;
100
+ this.loopbackSignals = options.loopbackSignals ?? true;
101
+ this.flowControlThreshold = options.flowControlThreshold ?? 256;
102
+ }
103
+
104
+ /** Push inbound bytes to the host as if the device sent them unprompted. */
105
+ push(bytes) {
106
+ this.#transport._deliver(this, [...bytes].map(toByte));
107
+ }
108
+
109
+ /**
110
+ * Raise a read error on the host's readable stream. `name` is the W3C error
111
+ * type (e.g. "BreakError", "BufferOverrunError"); the current polyfill ignores
112
+ * it and surfaces "NetworkError" regardless (a documented spec gap).
113
+ */
114
+ emitError(message, name) {
115
+ this.#transport._error(this, message, name);
116
+ }
117
+
118
+ /**
119
+ * Make the device deliver at most `bytes` bytes and then raise a
120
+ * `BufferOverrunError`, modelling a receive buffer of that size overflowing.
121
+ */
122
+ overrunAfter(bytes) {
123
+ this.overrunLimit = bytes;
124
+ this._rxDelivered = 0;
125
+ this._overran = false;
126
+ return this;
127
+ }
128
+
129
+ /** Make the next call to `op` reject once (error injection). */
130
+ failNext(op) {
131
+ this.#fails.add(op);
132
+ return this;
133
+ }
134
+
135
+ /** @internal consume a queued failure for `op`. */
136
+ _consumeFail(op) {
137
+ if (this.#fails.has(op)) {
138
+ this.#fails.delete(op);
139
+ return true;
140
+ }
141
+ return false;
142
+ }
143
+
144
+ /** Directly set device-asserted input signals (DCD/CTS/RI/DSR). */
145
+ setInputSignals(signals) {
146
+ Object.assign(this.input, signals);
147
+ }
148
+
149
+ /** Physically attach (or re-attach) this device — fires "connect". */
150
+ attach() {
151
+ this.#transport.attach(this);
152
+ }
153
+
154
+ /** Physically detach this device — fires "disconnect". */
155
+ detach() {
156
+ this.#transport.detach(this);
157
+ }
158
+
159
+ /** Simulate an unplug while open: errors the open stream, then disconnects. */
160
+ loseDevice() {
161
+ this.#transport.loseDevice(this);
162
+ }
163
+ }
164
+ exports.VirtualDevice = VirtualDevice;
165
+ /**
166
+ * In-memory transport backing one or more {@link VirtualDevice}s.
167
+ */
168
+ class VirtualSerialTransport {
169
+ #devices = [];
170
+ #latencyMs;
171
+ #autoGrant;
172
+ #chunkSize;
173
+ #nextDeviceId = 1;
174
+ #dataListeners = new Set();
175
+ #errorListeners = new Set();
176
+ #connectListeners = new Set();
177
+ #disconnectListeners = new Set();
178
+
179
+ /** Scripts the next showPortPicker() outcome. */
180
+ #pendingPick = null;
181
+ constructor(options = {}) {
182
+ this.#latencyMs = options.latencyMs ?? 0;
183
+ this.#autoGrant = options.autoGrantPermission ?? true;
184
+ this.#chunkSize = options.chunkSize ?? 0;
185
+ for (const device of options.devices ?? []) this.addDevice(device);
186
+ }
187
+
188
+ // ── Device management ──────────────────────────────────────────────────────
189
+
190
+ /** All devices known to the transport (attached or not). */
191
+ get devices() {
192
+ return this.#devices;
193
+ }
194
+
195
+ /**
196
+ * Register a {@link SerialDevice}. It starts attached but does not fire
197
+ * "connect"; its identity (usbVendorId/usbProductId/serialNumber) is read from
198
+ * the device, and `options` carries the transport-side knobs.
199
+ */
200
+ addDevice(serialDevice, options = {}) {
201
+ const device = new VirtualDevice(this, this.#nextDeviceId++, serialDevice, options);
202
+ serialDevice._bind(this.#hostFor(device));
203
+ this.#devices.push(device);
204
+ return device;
205
+ }
206
+
207
+ /** The handle a hosted {@link SerialDevice} uses to talk back to the host. */
208
+ #hostFor(device) {
209
+ return {
210
+ get deviceId() {
211
+ return device.deviceId;
212
+ },
213
+ get portNumber() {
214
+ return device.portNumber;
215
+ },
216
+ get isOpen() {
217
+ return device.isOpen;
218
+ },
219
+ get openOptions() {
220
+ return device.openOptions;
221
+ },
222
+ send: bytes => this._deliver(device, bytes.map(toByte)),
223
+ raiseError: (message, name) => this._error(device, message, name),
224
+ setSignals: signals => device.setInputSignals(mapInputSignals(signals))
225
+ };
226
+ }
227
+
228
+ /** Invoke a device hook, isolating the transport from author errors. */
229
+ #invokeHook(fn) {
230
+ try {
231
+ const result = fn();
232
+ if (result && typeof result.then === 'function') {
233
+ result.catch(err => {
234
+ console.error('SerialDevice hook rejected:', err);
235
+ });
236
+ }
237
+ } catch (err) {
238
+ console.error('SerialDevice hook threw:', err);
239
+ }
240
+ }
241
+
242
+ /** Remove a device entirely; detaches it first if attached. */
243
+ removeDevice(device) {
244
+ if (device.attached) this.detach(device);
245
+ const i = this.#devices.indexOf(device);
246
+ if (i >= 0) this.#devices.splice(i, 1);
247
+ }
248
+
249
+ /** (Re)attach a device, assigning it a fresh deviceId, and fire "connect". */
250
+ attach(device) {
251
+ device.deviceId = this.#nextDeviceId++;
252
+ device.attached = true;
253
+ this.#emit(this.#connectListeners, {
254
+ deviceId: device.deviceId,
255
+ usbVendorId: device.usbVendorId,
256
+ usbProductId: device.usbProductId
257
+ });
258
+ }
259
+
260
+ /** Detach a device and fire "disconnect"; any open port becomes closed. */
261
+ detach(device) {
262
+ const {
263
+ deviceId,
264
+ usbVendorId,
265
+ usbProductId
266
+ } = device;
267
+ device.attached = false;
268
+ device.isOpen = false;
269
+ device.reading = false;
270
+ this.#emit(this.#disconnectListeners, {
271
+ deviceId,
272
+ usbVendorId,
273
+ usbProductId
274
+ });
275
+ }
276
+
277
+ /** Simulate an unplug while open: error the stream first, then disconnect. */
278
+ loseDevice(device) {
279
+ if (device.isOpen) this._error(device, 'Device disconnected');
280
+ this.detach(device);
281
+ }
282
+
283
+ /** Script the next showPortPicker() resolution (a device or a predicate). */
284
+ selectNextPort(target) {
285
+ this.#pendingPick = target;
286
+ }
287
+
288
+ /** Make the next showPortPicker() reject (user cancelled / no port). */
289
+ rejectNextPortPicker() {
290
+ this.#pendingPick = 'reject';
291
+ }
292
+
293
+ // ── Internal event helpers (called by VirtualDevice) ───────────────────────
294
+
295
+ /** @internal deliver inbound bytes to the host's readable stream. */
296
+ _deliver(device, data) {
297
+ if (!device.attached || !device.isOpen || !device.reading) return;
298
+ if (device.overrunLimit != null) {
299
+ if (device._overran) return; // buffer already overflowed; drop the rest
300
+ const remaining = device.overrunLimit - device._rxDelivered;
301
+ if (data.length > remaining) {
302
+ const head = data.slice(0, Math.max(0, remaining));
303
+ device._rxDelivered += head.length;
304
+ device._overran = true;
305
+ if (head.length) this.#emitData(device, head);
306
+ this._error(device, 'Receive buffer overrun', 'BufferOverrunError');
307
+ return;
308
+ }
309
+ device._rxDelivered += data.length;
310
+ }
311
+ this.#emitData(device, data);
312
+ }
313
+
314
+ /** @internal raise a read error for a device's open port. */
315
+ _error(device, message, name) {
316
+ const event = {
317
+ deviceId: device.deviceId,
318
+ portNumber: device.portNumber,
319
+ error: message,
320
+ errorName: name
321
+ };
322
+ this.#schedule(() => this.#emit(this.#errorListeners, event));
323
+ }
324
+
325
+ /** Deliver `data` as one or more onData events, honouring `chunkSize`. */
326
+ #emitData(device, data) {
327
+ const emitOne = slice => {
328
+ const event = {
329
+ deviceId: device.deviceId,
330
+ portNumber: device.portNumber,
331
+ data: slice
332
+ };
333
+ this.#schedule(() => this.#emit(this.#dataListeners, event));
334
+ };
335
+ const chunk = this.#chunkSize;
336
+ if (chunk && data.length > chunk) {
337
+ for (let i = 0; i < data.length; i += chunk) {
338
+ emitOne(data.slice(i, i + chunk));
339
+ }
340
+ } else {
341
+ emitOne(data);
342
+ }
343
+ }
344
+
345
+ // ── SerialTransport: discovery & permission ────────────────────────────────
346
+
347
+ findAllDrivers() {
348
+ const ports = this.#devices.filter(d => d.attached).map(this.#toPortId);
349
+ return this.#resolve(ports);
350
+ }
351
+ showPortPicker(filter, _labels) {
352
+ const pick = this.#pendingPick;
353
+ this.#pendingPick = null;
354
+ if (pick === 'reject') {
355
+ return this.#reject(new Error('No port selected'));
356
+ }
357
+ const candidates = this.#devices.filter(d => d.attached && this.#matchesFilters(d, filter));
358
+ let chosen;
359
+ if (typeof pick === 'function') {
360
+ chosen = candidates.find(pick);
361
+ } else if (pick) {
362
+ chosen = candidates.includes(pick) ? pick : undefined;
363
+ } else {
364
+ chosen = candidates[0];
365
+ }
366
+ if (!chosen) return this.#reject(new Error('No port selected'));
367
+ if (this.#autoGrant) chosen.hasPermission = true;
368
+ return this.#resolve(this.#toPortId(chosen));
369
+ }
370
+ requestPermission(deviceId) {
371
+ const device = this.#find(deviceId);
372
+ if (device) device.hasPermission = true;
373
+ return this.#resolve(!!device);
374
+ }
375
+
376
+ // ── SerialTransport: lifecycle ─────────────────────────────────────────────
377
+
378
+ open(deviceId, portNumber, options) {
379
+ const device = this.#find(deviceId, portNumber);
380
+ if (!device) return this.#reject(new Error('Device not found'));
381
+ if (device._consumeFail('open')) {
382
+ return this.#reject(new Error('open failed (injected)'));
383
+ }
384
+ device.isOpen = true;
385
+ device.openOptions = {
386
+ ..._transport.DEFAULT_OPEN_OPTIONS,
387
+ ...options
388
+ };
389
+ device._hwWritten = 0;
390
+ this.#invokeHook(() => device.serialDevice.onOpen(device.openOptions));
391
+ return this.#resolve();
392
+ }
393
+ close(deviceId, portNumber) {
394
+ const device = this.#find(deviceId, portNumber);
395
+ if (device?._consumeFail('close')) {
396
+ return this.#reject(new Error('close failed (injected)'));
397
+ }
398
+ if (device) {
399
+ device.isOpen = false;
400
+ device.reading = false;
401
+ this.#invokeHook(() => device.serialDevice.onClose());
402
+ }
403
+ return this.#resolve();
404
+ }
405
+ isOpen(deviceId, portNumber) {
406
+ return this.#find(deviceId, portNumber)?.isOpen ?? false;
407
+ }
408
+
409
+ // ── SerialTransport: I/O ───────────────────────────────────────────────────
410
+
411
+ write(deviceId, portNumber, data, _timeout) {
412
+ const device = this.#find(deviceId, portNumber);
413
+ if (!device?.isOpen) {
414
+ return this.#reject(new Error('Port is not open'));
415
+ }
416
+ if (device._consumeFail('write')) {
417
+ return this.#reject(new Error('write failed (injected)'));
418
+ }
419
+ const bytes = data.map(toByte);
420
+ device.written.push(bytes);
421
+ if (device.flowControl === 'RTS_CTS') device._hwWritten += bytes.length;
422
+ this.#invokeHook(() => device.serialDevice.onData(Uint8Array.from(bytes)));
423
+ return this.#resolve();
424
+ }
425
+ startReading(deviceId, portNumber) {
426
+ const device = this.#find(deviceId, portNumber);
427
+ if (device?._consumeFail('startReading')) {
428
+ return this.#reject(new Error('startReading failed (injected)'));
429
+ }
430
+ if (device) device.reading = true;
431
+ return this.#resolve();
432
+ }
433
+ stopReading(deviceId, portNumber) {
434
+ const device = this.#find(deviceId, portNumber);
435
+ if (device?._consumeFail('stopReading')) {
436
+ return this.#reject(new Error('stopReading failed (injected)'));
437
+ }
438
+ if (device) device.reading = false;
439
+ return this.#resolve();
440
+ }
441
+ setParameters(deviceId, portNumber, options) {
442
+ const device = this.#find(deviceId, portNumber);
443
+ if (device) device.openOptions = {
444
+ ..._transport.DEFAULT_OPEN_OPTIONS,
445
+ ...options
446
+ };
447
+ return this.#resolve();
448
+ }
449
+
450
+ // ── SerialTransport: control signals ───────────────────────────────────────
451
+
452
+ setDTR(deviceId, portNumber, value) {
453
+ return this.#setOutput(deviceId, portNumber, 'dtr', value);
454
+ }
455
+ setRTS(deviceId, portNumber, value) {
456
+ return this.#setOutput(deviceId, portNumber, 'rts', value);
457
+ }
458
+ setBreak(deviceId, portNumber, value) {
459
+ return this.#setOutput(deviceId, portNumber, 'brk', value);
460
+ }
461
+ getDTR(deviceId, portNumber) {
462
+ return this.#resolve(this.#find(deviceId, portNumber)?.output.dtr ?? false);
463
+ }
464
+ getRTS(deviceId, portNumber) {
465
+ return this.#resolve(this.#find(deviceId, portNumber)?.output.rts ?? false);
466
+ }
467
+ getCD(deviceId, portNumber) {
468
+ const device = this.#find(deviceId, portNumber);
469
+ if (device?._consumeFail('getSignals')) {
470
+ return this.#reject(new Error('getSignals failed (injected)'));
471
+ }
472
+ return this.#resolve(device?.input.dcd ?? false);
473
+ }
474
+ getCTS(deviceId, portNumber) {
475
+ const device = this.#find(deviceId, portNumber);
476
+ // Under hardware (RTS/CTS) flow control the device drives CTS itself,
477
+ // de-asserting it once its receive buffer fills (modelled by the byte
478
+ // threshold). Otherwise CTS just reflects the loopback wiring.
479
+ if (device && device.flowControl === 'RTS_CTS') {
480
+ return this.#resolve(device._hwWritten < device.flowControlThreshold);
481
+ }
482
+ return this.#resolve(device?.input.cts ?? false);
483
+ }
484
+ getRI(deviceId, portNumber) {
485
+ return this.#resolve(this.#find(deviceId, portNumber)?.input.ri ?? false);
486
+ }
487
+ getDSR(deviceId, portNumber) {
488
+ return this.#resolve(this.#find(deviceId, portNumber)?.input.dsr ?? false);
489
+ }
490
+ getControlLines(deviceId, portNumber) {
491
+ const device = this.#find(deviceId, portNumber);
492
+ const lines = [];
493
+ if (device) {
494
+ if (device.output.dtr) lines.push('DTR');
495
+ if (device.output.rts) lines.push('RTS');
496
+ if (device.input.cts) lines.push('CTS');
497
+ if (device.input.dsr) lines.push('DSR');
498
+ if (device.input.dcd) lines.push('CD');
499
+ if (device.input.ri) lines.push('RI');
500
+ }
501
+ return this.#resolve(lines);
502
+ }
503
+ getSupportedControlLines(_deviceId, _portNumber) {
504
+ return this.#resolve(['RTS', 'CTS', 'DTR', 'DSR', 'CD', 'RI']);
505
+ }
506
+
507
+ // ── SerialTransport: flow control & misc ───────────────────────────────────
508
+
509
+ setFlowControl(deviceId, portNumber, flowControl) {
510
+ const device = this.#find(deviceId, portNumber);
511
+ if (device) device.flowControl = flowControl;
512
+ return this.#resolve();
513
+ }
514
+ getFlowControl(deviceId, portNumber) {
515
+ return this.#resolve(this.#find(deviceId, portNumber)?.flowControl ?? 'NONE');
516
+ }
517
+ getSupportedFlowControl(_deviceId, _portNumber) {
518
+ return this.#resolve(['NONE', 'RTS_CTS']);
519
+ }
520
+ purgeHwBuffers(_deviceId, _portNumber, _purgeWriteBuffers, _purgeReadBuffers) {
521
+ return this.#resolve();
522
+ }
523
+ getSerial(deviceId, portNumber) {
524
+ return this.#resolve(this.#find(deviceId, portNumber)?.serialNumber ?? '');
525
+ }
526
+
527
+ // ── SerialTransport: subscriptions ─────────────────────────────────────────
528
+
529
+ onData(listener) {
530
+ return this.#subscribe(this.#dataListeners, listener);
531
+ }
532
+ onError(listener) {
533
+ return this.#subscribe(this.#errorListeners, listener);
534
+ }
535
+ onConnect(listener) {
536
+ return this.#subscribe(this.#connectListeners, listener);
537
+ }
538
+ onDisconnect(listener) {
539
+ return this.#subscribe(this.#disconnectListeners, listener);
540
+ }
541
+
542
+ // ── Private helpers ────────────────────────────────────────────────────────
543
+
544
+ #setOutput(deviceId, portNumber, key, value) {
545
+ const device = this.#find(deviceId, portNumber);
546
+ if (device?._consumeFail('setSignals')) {
547
+ return this.#reject(new Error('setSignals failed (injected)'));
548
+ }
549
+ if (device) {
550
+ device.output[key] = value;
551
+ if (device.loopbackSignals) {
552
+ if (key === 'dtr') {
553
+ device.input.dsr = value;
554
+ device.input.dcd = value;
555
+ } else if (key === 'rts') {
556
+ device.input.cts = value;
557
+ }
558
+ }
559
+ this.#invokeHook(() => device.serialDevice.onHostSignals({
560
+ dataTerminalReady: device.output.dtr,
561
+ requestToSend: device.output.rts,
562
+ break: device.output.brk
563
+ }));
564
+ }
565
+ return this.#resolve();
566
+ }
567
+ #toPortId = d => ({
568
+ deviceId: d.deviceId,
569
+ portNumber: d.portNumber,
570
+ usbVendorId: d.usbVendorId,
571
+ usbProductId: d.usbProductId,
572
+ hasPermission: d.hasPermission
573
+ });
574
+ #matchesFilters(device, filters) {
575
+ if (!filters || filters.length === 0) return true;
576
+ return filters.some(f => {
577
+ if (f.usbVendorId !== undefined && f.usbVendorId !== device.usbVendorId) {
578
+ return false;
579
+ }
580
+ if (f.usbProductId !== undefined && f.usbProductId !== device.usbProductId) {
581
+ return false;
582
+ }
583
+ return true;
584
+ });
585
+ }
586
+ #find(deviceId, portNumber) {
587
+ return this.#devices.find(d => d.attached && d.deviceId === deviceId && (portNumber === undefined || d.portNumber === portNumber));
588
+ }
589
+ #subscribe(set, listener) {
590
+ set.add(listener);
591
+ return {
592
+ remove: () => set.delete(listener)
593
+ };
594
+ }
595
+ #emit(set, event) {
596
+ for (const listener of [...set]) listener(event);
597
+ }
598
+ #schedule(fn) {
599
+ if (this.#latencyMs > 0) setTimeout(fn, this.#latencyMs);else queueMicrotask(fn);
600
+ }
601
+ #resolve(value) {
602
+ if (this.#latencyMs > 0) {
603
+ return new Promise(r => setTimeout(() => r(value), this.#latencyMs));
604
+ }
605
+ return Promise.resolve(value);
606
+ }
607
+ #reject(error) {
608
+ if (this.#latencyMs > 0) {
609
+ return new Promise((_, reject) => setTimeout(() => reject(error), this.#latencyMs));
610
+ }
611
+ return Promise.reject(error);
612
+ }
613
+ }
614
+ exports.VirtualSerialTransport = VirtualSerialTransport;
615
+ //# sourceMappingURL=virtual-serial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_transport","require","toByte","n","mapInputSignals","s","out","dataCarrierDetect","undefined","dcd","clearToSend","cts","ringIndicator","ri","dataSetReady","dsr","VirtualDevice","attached","isOpen","reading","flowControl","openOptions","overrunLimit","_rxDelivered","_overran","_hwWritten","output","dtr","rts","brk","input","written","fails","Set","transport","constructor","deviceId","device","options","serialDevice","usbVendorId","usbProductId","portNumber","serialNumber","toString","hasPermission","loopbackSignals","flowControlThreshold","push","bytes","_deliver","map","emitError","message","name","_error","overrunAfter","failNext","op","add","_consumeFail","has","delete","setInputSignals","signals","Object","assign","attach","detach","loseDevice","exports","VirtualSerialTransport","devices","latencyMs","autoGrant","chunkSize","nextDeviceId","dataListeners","errorListeners","connectListeners","disconnectListeners","pendingPick","autoGrantPermission","addDevice","_bind","hostFor","#hostFor","send","raiseError","setSignals","invokeHook","#invokeHook","fn","result","then","catch","err","console","error","removeDevice","i","indexOf","splice","emit","selectNextPort","target","rejectNextPortPicker","data","remaining","length","head","slice","Math","max","emitData","event","errorName","schedule","#emitData","emitOne","chunk","findAllDrivers","ports","filter","d","toPortId","resolve","showPortPicker","_labels","pick","reject","Error","candidates","matchesFilters","chosen","find","includes","requestPermission","open","DEFAULT_OPEN_OPTIONS","onOpen","close","onClose","write","_timeout","onData","Uint8Array","from","startReading","stopReading","setParameters","setDTR","value","setOutput","setRTS","setBreak","getDTR","getRTS","getCD","getCTS","getRI","getDSR","getControlLines","lines","getSupportedControlLines","_deviceId","_portNumber","setFlowControl","getFlowControl","getSupportedFlowControl","purgeHwBuffers","_purgeWriteBuffers","_purgeReadBuffers","getSerial","listener","subscribe","onError","onConnect","onDisconnect","#setOutput","key","onHostSignals","dataTerminalReady","requestToSend","break","#matchesFilters","filters","some","f","#find","#subscribe","set","remove","#emit","#schedule","setTimeout","queueMicrotask","#resolve","Promise","r","#reject","_"],"sourceRoot":"../../../src","sources":["testing/virtual-serial.ts"],"mappings":"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","ignoreList":[]}