react-native-web-serial-api 0.1.0 → 0.2.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 (112) hide show
  1. package/README.md +188 -117
  2. package/TESTING.md +417 -176
  3. package/android/build.gradle +14 -0
  4. package/android/src/main/java/dev/webserialapi/NativeUsbSerialModule.java +74 -11
  5. package/android/src/main/java/dev/webserialapi/PortPickerActivity.java +61 -59
  6. package/bin/expose-serial.js +205 -0
  7. package/lib/commonjs/UsbSerial.js +1 -1
  8. package/lib/commonjs/WebSerial.js +110 -26
  9. package/lib/commonjs/WebSerial.js.map +1 -1
  10. package/lib/commonjs/index.js +2 -2
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/lib/event-target.js +3 -1
  13. package/lib/commonjs/lib/event-target.js.map +1 -1
  14. package/lib/commonjs/lib/web-streams.js +42 -0
  15. package/lib/commonjs/lib/web-streams.js.map +1 -0
  16. package/lib/commonjs/testing/device-fixture.js +70 -0
  17. package/lib/commonjs/testing/device-fixture.js.map +1 -0
  18. package/lib/commonjs/testing/expose.js +91 -0
  19. package/lib/commonjs/testing/expose.js.map +1 -0
  20. package/lib/commonjs/testing/harness.js +98 -0
  21. package/lib/commonjs/testing/harness.js.map +1 -0
  22. package/lib/commonjs/testing/{virtual-serial.js → in-memory-serial-transport.js} +66 -28
  23. package/lib/commonjs/testing/in-memory-serial-transport.js.map +1 -0
  24. package/lib/commonjs/testing/index.js +100 -17
  25. package/lib/commonjs/testing/index.js.map +1 -1
  26. package/lib/commonjs/testing/install-in-memory-serial-transport.js +54 -0
  27. package/lib/commonjs/testing/install-in-memory-serial-transport.js.map +1 -0
  28. package/lib/commonjs/testing/serial-client.js +277 -0
  29. package/lib/commonjs/testing/serial-client.js.map +1 -0
  30. package/lib/commonjs/testing/{serial-device.js → simulated-device.js} +17 -17
  31. package/lib/commonjs/testing/simulated-device.js.map +1 -0
  32. package/lib/commonjs/testing/test-suite.js +142 -0
  33. package/lib/commonjs/testing/test-suite.js.map +1 -0
  34. package/lib/commonjs/transport.js +3 -3
  35. package/lib/commonjs/websocket/WebSocketSerialTransport.js +659 -0
  36. package/lib/commonjs/websocket/WebSocketSerialTransport.js.map +1 -0
  37. package/lib/commonjs/websocket/bridge.js +234 -0
  38. package/lib/commonjs/websocket/bridge.js.map +1 -0
  39. package/lib/commonjs/websocket/index.js +33 -0
  40. package/lib/commonjs/websocket/index.js.map +1 -0
  41. package/lib/commonjs/websocket/protocol.js +55 -0
  42. package/lib/commonjs/websocket/protocol.js.map +1 -0
  43. package/lib/commonjs/websocket/serial-device-bridge.js +130 -0
  44. package/lib/commonjs/websocket/serial-device-bridge.js.map +1 -0
  45. package/lib/typescript/src/UsbSerial.d.ts +1 -1
  46. package/lib/typescript/src/WebSerial.d.ts +7 -7
  47. package/lib/typescript/src/WebSerial.d.ts.map +1 -1
  48. package/lib/typescript/src/index.d.ts +1 -1
  49. package/lib/typescript/src/index.d.ts.map +1 -1
  50. package/lib/typescript/src/lib/event-target.d.ts +2 -0
  51. package/lib/typescript/src/lib/event-target.d.ts.map +1 -1
  52. package/lib/typescript/src/lib/web-streams.d.ts +9 -0
  53. package/lib/typescript/src/lib/web-streams.d.ts.map +1 -0
  54. package/lib/typescript/src/testing/device-fixture.d.ts +70 -0
  55. package/lib/typescript/src/testing/device-fixture.d.ts.map +1 -0
  56. package/lib/typescript/src/testing/expose.d.ts +71 -0
  57. package/lib/typescript/src/testing/expose.d.ts.map +1 -0
  58. package/lib/typescript/src/testing/harness.d.ts +34 -0
  59. package/lib/typescript/src/testing/harness.d.ts.map +1 -0
  60. package/lib/typescript/src/testing/{virtual-serial.d.ts → in-memory-serial-transport.d.ts} +37 -26
  61. package/lib/typescript/src/testing/in-memory-serial-transport.d.ts.map +1 -0
  62. package/lib/typescript/src/testing/index.d.ts +18 -8
  63. package/lib/typescript/src/testing/index.d.ts.map +1 -1
  64. package/lib/typescript/src/testing/install-in-memory-serial-transport.d.ts +25 -0
  65. package/lib/typescript/src/testing/install-in-memory-serial-transport.d.ts.map +1 -0
  66. package/lib/typescript/src/testing/serial-client.d.ts +62 -0
  67. package/lib/typescript/src/testing/serial-client.d.ts.map +1 -0
  68. package/lib/typescript/src/testing/{serial-device.d.ts → simulated-device.d.ts} +23 -23
  69. package/lib/typescript/src/testing/simulated-device.d.ts.map +1 -0
  70. package/lib/typescript/src/testing/test-suite.d.ts +75 -0
  71. package/lib/typescript/src/testing/test-suite.d.ts.map +1 -0
  72. package/lib/typescript/src/transport.d.ts +3 -3
  73. package/lib/typescript/src/websocket/WebSocketSerialTransport.d.ts +111 -0
  74. package/lib/typescript/src/websocket/WebSocketSerialTransport.d.ts.map +1 -0
  75. package/lib/typescript/src/websocket/bridge.d.ts +66 -0
  76. package/lib/typescript/src/websocket/bridge.d.ts.map +1 -0
  77. package/lib/typescript/src/websocket/index.d.ts +19 -0
  78. package/lib/typescript/src/websocket/index.d.ts.map +1 -0
  79. package/lib/typescript/src/websocket/protocol.d.ts +64 -0
  80. package/lib/typescript/src/websocket/protocol.d.ts.map +1 -0
  81. package/lib/typescript/src/websocket/serial-device-bridge.d.ts +32 -0
  82. package/lib/typescript/src/websocket/serial-device-bridge.d.ts.map +1 -0
  83. package/package.json +21 -3
  84. package/src/UsbSerial.ts +1 -1
  85. package/src/WebSerial.ts +134 -35
  86. package/src/index.ts +4 -1
  87. package/src/lib/event-target.ts +12 -0
  88. package/src/lib/web-streams.ts +43 -0
  89. package/src/testing/device-fixture.ts +150 -0
  90. package/src/testing/expose.ts +147 -0
  91. package/src/testing/harness.ts +124 -0
  92. package/src/testing/{virtual-serial.ts → in-memory-serial-transport.ts} +95 -56
  93. package/src/testing/index.ts +69 -21
  94. package/src/testing/install-in-memory-serial-transport.ts +65 -0
  95. package/src/testing/serial-client.ts +313 -0
  96. package/src/testing/{serial-device.ts → simulated-device.ts} +23 -23
  97. package/src/testing/test-suite.ts +186 -0
  98. package/src/transport.ts +3 -3
  99. package/src/websocket/WebSocketSerialTransport.ts +796 -0
  100. package/src/websocket/bridge.ts +299 -0
  101. package/src/websocket/index.ts +38 -0
  102. package/src/websocket/protocol.ts +101 -0
  103. package/src/websocket/serial-device-bridge.ts +160 -0
  104. package/lib/commonjs/testing/install.js +0 -54
  105. package/lib/commonjs/testing/install.js.map +0 -1
  106. package/lib/commonjs/testing/serial-device.js.map +0 -1
  107. package/lib/commonjs/testing/virtual-serial.js.map +0 -1
  108. package/lib/typescript/src/testing/install.d.ts +0 -25
  109. package/lib/typescript/src/testing/install.d.ts.map +0 -1
  110. package/lib/typescript/src/testing/serial-device.d.ts.map +0 -1
  111. package/lib/typescript/src/testing/virtual-serial.d.ts.map +0 -1
  112. package/src/testing/install.ts +0 -65
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.exposeSimulatedDevice = exposeSimulatedDevice;
7
+ var _websocket = require("../websocket");
8
+ var _inMemorySerialTransport = require("./in-memory-serial-transport");
9
+ /**
10
+ * `exposeSimulatedDevice` — run a {@link SimulatedDevice} simulator behind a WebSocket
11
+ * server so a real app (on a device/emulator) can connect to it with
12
+ * `new Serial(new WebSocketSerialTransport(url))` and drive the *same* simulated
13
+ * peripheral your Jest tests drive. The test process keeps the
14
+ * {@link DeviceHandle} handle, so it can inject frames / move the GPS and
15
+ * `await whenOpened()` for the app to connect — turning an in-memory device
16
+ * suite into an on-device E2E without changing the device code.
17
+ *
18
+ * `ws` is an *optional* dependency: it is loaded lazily (and only in Node), via
19
+ * an indirect require so app bundlers never pull it into a mobile bundle. Pass
20
+ * `options.WebSocketServer` to inject your own (e.g. `import {WebSocketServer}
21
+ * from 'ws'`) and skip the lazy load entirely.
22
+ *
23
+ * @example
24
+ * import {WebSocketServer} from 'ws';
25
+ * const ex = exposeSimulatedDevice(new WMBusGateway('iU891A-XL'), {
26
+ * port: 8090,
27
+ * WebSocketServer,
28
+ * });
29
+ * // …app connects to ex.url…
30
+ * await ex.whenOpened();
31
+ * ex.simulatedDevice.addMeter(meter);
32
+ * meter.sendTelegram(); // the app receives the 0x20 telegram event
33
+ * await ex.close();
34
+ */
35
+
36
+ /** The `ws` WebSocketServer surface this helper uses. */
37
+
38
+ /** A `ws`-compatible `WebSocketServer` constructor. */
39
+
40
+ /** Resolve a `ws` WebSocketServer lazily, in Node only, invisibly to bundlers. */
41
+ function loadWebSocketServer() {
42
+ const specifier = 'ws';
43
+ const nodeRequire =
44
+ // @ts-ignore
45
+ typeof module !== 'undefined' &&
46
+ // @ts-ignore
47
+ typeof module.require === 'function' ?
48
+ // @ts-ignore
49
+ module.require.bind(module) : /* istanbul ignore next */undefined;
50
+ /* istanbul ignore next — only reachable in non-Node bundled environments */
51
+ if (!nodeRequire) {
52
+ throw new Error("exposeSimulatedDevice could not load 'ws'. Pass options.WebSocketServer, " + 'or run it in a Node process with the optional `ws` package installed.');
53
+ }
54
+ const ws = nodeRequire(specifier);
55
+ const Ctor = ws.WebSocketServer ?? ws.Server;
56
+ if (!Ctor) {
57
+ throw new Error("the 'ws' package did not export a WebSocketServer.");
58
+ }
59
+ return Ctor;
60
+ }
61
+ function exposeSimulatedDevice(simulatedDevice, options) {
62
+ const transport = new _inMemorySerialTransport.InMemorySerialTransport();
63
+ const device = transport.addDevice(simulatedDevice, {
64
+ hasPermission: true,
65
+ ...options.device
66
+ });
67
+ const Ctor = options.WebSocketServer ?? loadWebSocketServer();
68
+ const server = new Ctor({
69
+ port: options.port,
70
+ host: options.host
71
+ });
72
+ server.on('connection', socket => {
73
+ const serial = (0, _websocket.SimulatedDeviceToSerialLike)(transport, device);
74
+ (0, _websocket.attachBridge)(serial, socket, {
75
+ portInfo: (0, _websocket.portInfoFromDevice)(device),
76
+ readingByDefault: options.readingByDefault,
77
+ log: options.log
78
+ });
79
+ });
80
+ const host = options.host ?? 'localhost';
81
+ return {
82
+ url: `ws://${host}:${options.port}`,
83
+ transport,
84
+ device,
85
+ simulatedDevice,
86
+ whenOpened: () => device.whenOpened(),
87
+ whenClosed: () => device.whenClosed(),
88
+ close: () => new Promise(resolve => server.close(() => resolve()))
89
+ };
90
+ }
91
+ //# sourceMappingURL=expose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_websocket","require","_inMemorySerialTransport","loadWebSocketServer","specifier","nodeRequire","module","bind","undefined","Error","ws","Ctor","WebSocketServer","Server","exposeSimulatedDevice","simulatedDevice","options","transport","InMemorySerialTransport","device","addDevice","hasPermission","server","port","host","on","socket","serial","SimulatedDeviceToSerialLike","attachBridge","portInfo","portInfoFromDevice","readingByDefault","log","url","whenOpened","whenClosed","close","Promise","resolve"],"sourceRoot":"../../../src","sources":["testing/expose.ts"],"mappings":";;;;;;AA2BA,IAAAA,UAAA,GAAAC,OAAA;AAOA,IAAAC,wBAAA,GAAAD,OAAA;AAlCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA;;AAMA;;AAqCA;AACA,SAASE,mBAAmBA,CAAA,EAAwB;EAClD,MAAMC,SAAS,GAAG,IAAI;EACtB,MAAMC,WAAW;EACf;EACA,OAAOC,MAAM,KAAK,WAAW;EAC7B;EACA,OAAQA,MAAM,CAAyBL,OAAO,KAAK,UAAU;EACzD;EACCK,MAAM,CAAwCL,OAAO,CAACM,IAAI,CAACD,MAAM,CAAC,GACnE,0BAA2BE,SAAS;EAC1C;EACA,IAAI,CAACH,WAAW,EAAE;IAChB,MAAM,IAAII,KAAK,CACb,2EAA2E,GACzE,uEACJ,CAAC;EACH;EACA,MAAMC,EAAE,GAAGL,WAAW,CAACD,SAAS,CAG/B;EACD,MAAMO,IAAI,GAAGD,EAAE,CAACE,eAAe,IAAIF,EAAE,CAACG,MAAM;EAC5C,IAAI,CAACF,IAAI,EAAE;IACT,MAAM,IAAIF,KAAK,CAAC,oDAAoD,CAAC;EACvE;EACA,OAAOE,IAAI;AACb;AAEO,SAASG,qBAAqBA,CACnCC,eAAkB,EAClBC,OAAqC,EACnB;EAClB,MAAMC,SAAS,GAAG,IAAIC,gDAAuB,CAAC,CAAC;EAC/C,MAAMC,MAAM,GAAGF,SAAS,CAACG,SAAS,CAACL,eAAe,EAAE;IAClDM,aAAa,EAAE,IAAI;IACnB,GAAGL,OAAO,CAACG;EACb,CAAC,CAAC;EAEF,MAAMR,IAAI,GAAGK,OAAO,CAACJ,eAAe,IAAIT,mBAAmB,CAAC,CAAC;EAC7D,MAAMmB,MAAM,GAAG,IAAIX,IAAI,CAAC;IAACY,IAAI,EAAEP,OAAO,CAACO,IAAI;IAAEC,IAAI,EAAER,OAAO,CAACQ;EAAI,CAAC,CAAC;EACjEF,MAAM,CAACG,EAAE,CAAC,YAAY,EAAEC,MAAM,IAAI;IAChC,MAAMC,MAAM,GAAG,IAAAC,sCAA2B,EAACX,SAAS,EAAEE,MAAM,CAAC;IAC7D,IAAAU,uBAAY,EAACF,MAAM,EAAED,MAAM,EAAE;MAC3BI,QAAQ,EAAE,IAAAC,6BAAkB,EAACZ,MAAM,CAAC;MACpCa,gBAAgB,EAAEhB,OAAO,CAACgB,gBAAgB;MAC1CC,GAAG,EAAEjB,OAAO,CAACiB;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,MAAMT,IAAI,GAAGR,OAAO,CAACQ,IAAI,IAAI,WAAW;EACxC,OAAO;IACLU,GAAG,EAAE,QAAQV,IAAI,IAAIR,OAAO,CAACO,IAAI,EAAE;IACnCN,SAAS;IACTE,MAAM;IACNJ,eAAe;IACfoB,UAAU,EAAEA,CAAA,KAAMhB,MAAM,CAACgB,UAAU,CAAC,CAAC;IACrCC,UAAU,EAAEA,CAAA,KAAMjB,MAAM,CAACiB,UAAU,CAAC,CAAC;IACrCC,KAAK,EAAEA,CAAA,KAAM,IAAIC,OAAO,CAAOC,OAAO,IAAIjB,MAAM,CAACe,KAAK,CAAC,MAAME,OAAO,CAAC,CAAC,CAAC;EACzE,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assert = assert;
7
+ exports.assertEqual = assertEqual;
8
+ exports.assertRejects = assertRejects;
9
+ exports.bytesEqual = bytesEqual;
10
+ exports.errorMessage = errorMessage;
11
+ exports.readBytes = readBytes;
12
+ exports.withTimeout = withTimeout;
13
+ /**
14
+ * Tiny, dependency-free test helpers for driving serial devices — shared by the
15
+ * library's own conformance suite, the {@link SerialClient}, and consumers' app
16
+ * tests. Free of `jest` and `react-native`, so they run under any test runner
17
+ * and on a real device (e.g. an on-device Self-Test screen).
18
+ */
19
+
20
+ /** Throw `message` if `condition` is falsy. */
21
+ function assert(condition, message) {
22
+ if (!condition) throw new Error(message);
23
+ }
24
+
25
+ /** Throw if `actual !== expected`, including both values in the message. */
26
+ function assertEqual(actual, expected, message) {
27
+ if (actual !== expected) {
28
+ throw new Error(`${message} (expected ${String(expected)}, got ${String(actual)})`);
29
+ }
30
+ }
31
+
32
+ /** Byte-for-byte equality of two sequences. */
33
+ function bytesEqual(a, b) {
34
+ if (a.length !== b.length) return false;
35
+ for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
36
+ return true;
37
+ }
38
+
39
+ /** What {@link assertRejects} may additionally check about the thrown error. */
40
+
41
+ /** Assert `fn()` rejects (optionally matching the error name/type/message). */
42
+ async function assertRejects(fn, message, expected) {
43
+ try {
44
+ await fn();
45
+ } catch (e) {
46
+ const err = e;
47
+ if (expected?.name && err.name !== expected.name) {
48
+ throw new Error(`${message}: expected error "${expected.name}" but got "${err.name}"`);
49
+ }
50
+ if (expected?.type && !(err instanceof expected.type)) {
51
+ throw new Error(`${message}: expected a ${expected.type.name}`);
52
+ }
53
+ if (expected?.message !== undefined) {
54
+ const ok = expected.message instanceof RegExp ? expected.message.test(err.message) : err.message.includes(expected.message);
55
+ if (!ok) {
56
+ throw new Error(`${message}: expected the error message to match ${String(expected.message)}`);
57
+ }
58
+ }
59
+ return;
60
+ }
61
+ throw new Error(`${message}: expected a rejection but none occurred`);
62
+ }
63
+
64
+ /** Normalise any thrown value into a `"Name: message"` string. */
65
+ function errorMessage(e) {
66
+ return e instanceof Error ? `${e.name}: ${e.message}` : String(e);
67
+ }
68
+
69
+ /** Reject if `promise` doesn't settle within `ms`; `label` names it on timeout. */
70
+ function withTimeout(promise, ms, label) {
71
+ return new Promise((resolve, reject) => {
72
+ const timer = setTimeout(() => reject(new Error(`timed out: ${label}`)), ms);
73
+ promise.then(v => {
74
+ clearTimeout(timer);
75
+ resolve(v);
76
+ }, e => {
77
+ clearTimeout(timer);
78
+ reject(e);
79
+ });
80
+ });
81
+ }
82
+
83
+ /** The slice of `ReadableStreamDefaultReader` the helpers need. */
84
+
85
+ /** Read exactly `count` bytes from a reader (accumulating chunks), with a timeout. */
86
+ async function readBytes(reader, count, timeoutMs = 2000) {
87
+ const out = [];
88
+ while (out.length < count) {
89
+ const {
90
+ done,
91
+ value
92
+ } = await withTimeout(reader.read(), timeoutMs, `reading ${count} bytes (got ${out.length})`);
93
+ if (done) break;
94
+ if (value) out.push(...value);
95
+ }
96
+ return out;
97
+ }
98
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["assert","condition","message","Error","assertEqual","actual","expected","String","bytesEqual","a","b","length","i","assertRejects","fn","e","err","name","type","undefined","ok","RegExp","test","includes","errorMessage","withTimeout","promise","ms","label","Promise","resolve","reject","timer","setTimeout","then","v","clearTimeout","readBytes","reader","count","timeoutMs","out","done","value","read","push"],"sourceRoot":"../../../src","sources":["testing/harness.ts"],"mappings":"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","ignoreList":[]}
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.VirtualSerialTransport = exports.VirtualDevice = void 0;
6
+ exports.InMemorySerialTransport = exports.DeviceHandle = void 0;
7
7
  var _transport = require("../transport");
8
8
  /**
9
- * VirtualSerialTransport — an in-memory {@link SerialTransport} for tests and
9
+ * InMemorySerialTransport — an in-memory {@link SerialTransport} for tests and
10
10
  * on-device demos.
11
11
  *
12
12
  * It implements the exact same interface the production `UsbSerialModule` does,
@@ -20,15 +20,15 @@ var _transport = require("../transport");
20
20
  * Inject it via `new Serial(transport)` or globally with `setUsbSerial(transport)`.
21
21
  *
22
22
  * @example
23
- * const transport = new VirtualSerialTransport();
24
- * transport.addDevice(new EchoDevice(), {hasPermission: true});
23
+ * const transport = new InMemorySerialTransport();
24
+ * transport.addDevice(new LoopbackDevice(), {hasPermission: true});
25
25
  * const serial = new Serial(transport);
26
26
  * const [port] = await serial.getPorts();
27
27
  * await port.open({baudRate: 115200});
28
28
  * // writes to port.writable now come back on port.readable (echo)
29
29
  */
30
30
 
31
- /** Transport-side knobs when registering a {@link SerialDevice}. */
31
+ /** Transport-side knobs when registering a {@link SimulatedDevice}. */
32
32
 
33
33
  /** Operations whose next invocation can be made to fail (error injection). */
34
34
 
@@ -47,11 +47,11 @@ function mapInputSignals(s) {
47
47
  }
48
48
 
49
49
  /**
50
- * A simulated USB-serial device. Returned by {@link VirtualSerialTransport.addDevice}.
50
+ * A simulated USB-serial device. Returned by {@link InMemorySerialTransport.addDevice}.
51
51
  * The mutable fields and the helper methods let a test or demo drive the device
52
52
  * the way physical hardware (and a human plugging cables) otherwise would.
53
53
  */
54
- class VirtualDevice {
54
+ class DeviceHandle {
55
55
  /** Reassigned on every (re)attach, mirroring Android's behaviour. */
56
56
 
57
57
  attached = true;
@@ -91,7 +91,7 @@ class VirtualDevice {
91
91
  constructor(transport, deviceId, device, options) {
92
92
  this.#transport = transport;
93
93
  this.deviceId = deviceId;
94
- this.serialDevice = device;
94
+ this.simulatedDevice = device;
95
95
  this.usbVendorId = device.usbVendorId;
96
96
  this.usbProductId = device.usbProductId;
97
97
  this.portNumber = options.portNumber ?? 0;
@@ -160,12 +160,45 @@ class VirtualDevice {
160
160
  loseDevice() {
161
161
  this.#transport.loseDevice(this);
162
162
  }
163
+ #openWaiters = new Set();
164
+ #closeWaiters = new Set();
165
+
166
+ /**
167
+ * Resolve when the host opens this port (immediately if already open). Lets a
168
+ * test `await` the app connecting before driving the device.
169
+ */
170
+ whenOpened() {
171
+ if (this.isOpen && this.openOptions) {
172
+ return Promise.resolve(this.openOptions);
173
+ }
174
+ return new Promise(resolve => this.#openWaiters.add(resolve));
175
+ }
176
+
177
+ /** Resolve when the host closes this port (immediately if not open). */
178
+ whenClosed() {
179
+ if (!this.isOpen) {
180
+ return Promise.resolve();
181
+ }
182
+ return new Promise(resolve => this.#closeWaiters.add(resolve));
183
+ }
184
+
185
+ /** @internal The transport calls this right after the port opens. */
186
+ _notifyOpen(options) {
187
+ for (const waiter of [...this.#openWaiters]) waiter(options);
188
+ this.#openWaiters.clear();
189
+ }
190
+
191
+ /** @internal The transport calls this right after the port closes/detaches. */
192
+ _notifyClose() {
193
+ for (const waiter of [...this.#closeWaiters]) waiter();
194
+ this.#closeWaiters.clear();
195
+ }
163
196
  }
164
- exports.VirtualDevice = VirtualDevice;
197
+ exports.DeviceHandle = DeviceHandle;
165
198
  /**
166
- * In-memory transport backing one or more {@link VirtualDevice}s.
199
+ * In-memory transport backing one or more {@link DeviceHandle}s.
167
200
  */
168
- class VirtualSerialTransport {
201
+ class InMemorySerialTransport {
169
202
  #devices = [];
170
203
  #latencyMs;
171
204
  #autoGrant;
@@ -193,18 +226,18 @@ class VirtualSerialTransport {
193
226
  }
194
227
 
195
228
  /**
196
- * Register a {@link SerialDevice}. It starts attached but does not fire
229
+ * Register a {@link SimulatedDevice}. It starts attached but does not fire
197
230
  * "connect"; its identity (usbVendorId/usbProductId/serialNumber) is read from
198
231
  * the device, and `options` carries the transport-side knobs.
199
232
  */
200
- addDevice(serialDevice, options = {}) {
201
- const device = new VirtualDevice(this, this.#nextDeviceId++, serialDevice, options);
202
- serialDevice._bind(this.#hostFor(device));
233
+ addDevice(simulatedDevice, options = {}) {
234
+ const device = new DeviceHandle(this, this.#nextDeviceId++, simulatedDevice, options);
235
+ simulatedDevice._bind(this.#hostFor(device));
203
236
  this.#devices.push(device);
204
237
  return device;
205
238
  }
206
239
 
207
- /** The handle a hosted {@link SerialDevice} uses to talk back to the host. */
240
+ /** The handle a hosted {@link SimulatedDevice} uses to talk back to the host. */
208
241
  #hostFor(device) {
209
242
  return {
210
243
  get deviceId() {
@@ -231,11 +264,11 @@ class VirtualSerialTransport {
231
264
  const result = fn();
232
265
  if (result && typeof result.then === 'function') {
233
266
  result.catch(err => {
234
- console.error('SerialDevice hook rejected:', err);
267
+ console.error('SimulatedDevice hook rejected:', err);
235
268
  });
236
269
  }
237
270
  } catch (err) {
238
- console.error('SerialDevice hook threw:', err);
271
+ console.error('SimulatedDevice hook threw:', err);
239
272
  }
240
273
  }
241
274
 
@@ -258,26 +291,29 @@ class VirtualSerialTransport {
258
291
  }
259
292
 
260
293
  /** Detach a device and fire "disconnect"; any open port becomes closed. */
261
- detach(device) {
294
+ detach(device, lost = false) {
262
295
  const {
263
296
  deviceId,
264
297
  usbVendorId,
265
298
  usbProductId
266
299
  } = device;
300
+ const wasOpen = device.isOpen;
267
301
  device.attached = false;
268
302
  device.isOpen = false;
269
303
  device.reading = false;
304
+ if (wasOpen) device._notifyClose();
270
305
  this.#emit(this.#disconnectListeners, {
271
306
  deviceId,
272
307
  usbVendorId,
273
- usbProductId
308
+ usbProductId,
309
+ lost
274
310
  });
275
311
  }
276
312
 
277
313
  /** Simulate an unplug while open: error the stream first, then disconnect. */
278
314
  loseDevice(device) {
279
315
  if (device.isOpen) this._error(device, 'Device disconnected');
280
- this.detach(device);
316
+ this.detach(device, true);
281
317
  }
282
318
 
283
319
  /** Script the next showPortPicker() resolution (a device or a predicate). */
@@ -290,7 +326,7 @@ class VirtualSerialTransport {
290
326
  this.#pendingPick = 'reject';
291
327
  }
292
328
 
293
- // ── Internal event helpers (called by VirtualDevice) ───────────────────────
329
+ // ── Internal event helpers (called by DeviceHandle) ──────────────────────────────
294
330
 
295
331
  /** @internal deliver inbound bytes to the host's readable stream. */
296
332
  _deliver(device, data) {
@@ -387,7 +423,8 @@ class VirtualSerialTransport {
387
423
  ...options
388
424
  };
389
425
  device._hwWritten = 0;
390
- this.#invokeHook(() => device.serialDevice.onOpen(device.openOptions));
426
+ this.#invokeHook(() => device.simulatedDevice.onOpen(device.openOptions));
427
+ device._notifyOpen(device.openOptions);
391
428
  return this.#resolve();
392
429
  }
393
430
  close(deviceId, portNumber) {
@@ -398,7 +435,8 @@ class VirtualSerialTransport {
398
435
  if (device) {
399
436
  device.isOpen = false;
400
437
  device.reading = false;
401
- this.#invokeHook(() => device.serialDevice.onClose());
438
+ this.#invokeHook(() => device.simulatedDevice.onClose());
439
+ device._notifyClose();
402
440
  }
403
441
  return this.#resolve();
404
442
  }
@@ -419,7 +457,7 @@ class VirtualSerialTransport {
419
457
  const bytes = data.map(toByte);
420
458
  device.written.push(bytes);
421
459
  if (device.flowControl === 'RTS_CTS') device._hwWritten += bytes.length;
422
- this.#invokeHook(() => device.serialDevice.onData(Uint8Array.from(bytes)));
460
+ this.#invokeHook(() => device.simulatedDevice.onData(Uint8Array.from(bytes)));
423
461
  return this.#resolve();
424
462
  }
425
463
  startReading(deviceId, portNumber) {
@@ -556,7 +594,7 @@ class VirtualSerialTransport {
556
594
  device.input.cts = value;
557
595
  }
558
596
  }
559
- this.#invokeHook(() => device.serialDevice.onHostSignals({
597
+ this.#invokeHook(() => device.simulatedDevice.onHostSignals({
560
598
  dataTerminalReady: device.output.dtr,
561
599
  requestToSend: device.output.rts,
562
600
  break: device.output.brk
@@ -611,5 +649,5 @@ class VirtualSerialTransport {
611
649
  return Promise.reject(error);
612
650
  }
613
651
  }
614
- exports.VirtualSerialTransport = VirtualSerialTransport;
615
- //# sourceMappingURL=virtual-serial.js.map
652
+ exports.InMemorySerialTransport = InMemorySerialTransport;
653
+ //# sourceMappingURL=in-memory-serial-transport.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","DeviceHandle","attached","isOpen","reading","flowControl","openOptions","overrunLimit","_rxDelivered","_overran","_hwWritten","output","dtr","rts","brk","input","written","fails","Set","transport","constructor","deviceId","device","options","simulatedDevice","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","openWaiters","closeWaiters","whenOpened","Promise","resolve","whenClosed","_notifyOpen","waiter","clear","_notifyClose","exports","InMemorySerialTransport","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","lost","wasOpen","selectNextPort","target","rejectNextPortPicker","data","remaining","length","head","slice","Math","max","emitData","event","errorName","schedule","#emitData","emitOne","chunk","findAllDrivers","ports","filter","d","toPortId","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","r","#reject","_"],"sourceRoot":"../../../src","sources":["testing/in-memory-serial-transport.ts"],"mappings":";;;;;;AAoCA,IAAAA,UAAA,GAAAC,OAAA;AApCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsBA;;AA4CA;;AAaA,SAASC,MAAMA,CAACC,CAAS,EAAU;EACjC,OAAOA,CAAC,GAAG,IAAI;AACjB;;AAEA;AACA,SAASC,eAAeA,CAACC,CAAqB,EAAyB;EACrE,MAAMC,GAA0B,GAAG,CAAC,CAAC;EACrC,IAAID,CAAC,CAACE,iBAAiB,KAAKC,SAAS,EAAEF,GAAG,CAACG,GAAG,GAAGJ,CAAC,CAACE,iBAAiB;EACpE,IAAIF,CAAC,CAACK,WAAW,KAAKF,SAAS,EAAEF,GAAG,CAACK,GAAG,GAAGN,CAAC,CAACK,WAAW;EACxD,IAAIL,CAAC,CAACO,aAAa,KAAKJ,SAAS,EAAEF,GAAG,CAACO,EAAE,GAAGR,CAAC,CAACO,aAAa;EAC3D,IAAIP,CAAC,CAACS,YAAY,KAAKN,SAAS,EAAEF,GAAG,CAACS,GAAG,GAAGV,CAAC,CAACS,YAAY;EAC1D,OAAOR,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACO,MAAMU,YAAY,CAAC;EAMxB;;EAEAC,QAAQ,GAAG,IAAI;EAEfC,MAAM,GAAG,KAAK;EACdC,OAAO,GAAG,KAAK;EACf;;EAGAC,WAAW,GAAgB,MAAM;EAEjCC,WAAW,GAAiC,IAAI;;EAEhD;AACF;AACA;AACA;EACEC,YAAY,GAAkB,IAAI;;EAElC;EACAC,YAAY,GAAG,CAAC;EAChBC,QAAQ,GAAG,KAAK;EAChBC,UAAU,GAAG,CAAC;EAELC,MAAM,GAAkB;IAACC,GAAG,EAAE,KAAK;IAAEC,GAAG,EAAE,KAAK;IAAEC,GAAG,EAAE;EAAK,CAAC;EAC5DC,KAAK,GAAiB;IAC7BrB,GAAG,EAAE,KAAK;IACVE,GAAG,EAAE,KAAK;IACVE,EAAE,EAAE,KAAK;IACTE,GAAG,EAAE;EACP,CAAC;;EAED;EACSgB,OAAO,GAAe,EAAE;EAExB,CAACC,KAAK,GAAG,IAAIC,GAAG,CAAa,CAAC;EAC9B,CAACC,SAAS;EAEnBC,WAAWA,CACTD,SAAkC,EAClCE,QAAgB,EAChBC,MAAuB,EACvBC,OAAsB,EACtB;IACA,IAAI,CAAC,CAACJ,SAAS,GAAGA,SAAS;IAC3B,IAAI,CAACE,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACG,eAAe,GAAGF,MAAM;IAC7B,IAAI,CAACG,WAAW,GAAGH,MAAM,CAACG,WAAW;IACrC,IAAI,CAACC,YAAY,GAAGJ,MAAM,CAACI,YAAY;IACvC,IAAI,CAACC,UAAU,GAAGJ,OAAO,CAACI,UAAU,IAAI,CAAC;IACzC,IAAI,CAACC,YAAY,GACfL,OAAO,CAACK,YAAY,IACpBN,MAAM,CAACM,YAAY,IACnB,WAAWN,MAAM,CAACG,WAAW,CAACI,QAAQ,CAAC,EAAE,CAAC,IAAIP,MAAM,CAACI,YAAY,CAACG,QAAQ,CAAC,EAAE,CAAC,EAAE;IAClF,IAAI,CAACC,aAAa,GAAGP,OAAO,CAACO,aAAa,IAAI,KAAK;IACnD,IAAI,CAACC,eAAe,GAAGR,OAAO,CAACQ,eAAe,IAAI,IAAI;IACtD,IAAI,CAACC,oBAAoB,GAAGT,OAAO,CAACS,oBAAoB,IAAI,GAAG;EACjE;;EAEA;EACAC,IAAIA,CAACC,KAA4B,EAAQ;IACvC,IAAI,CAAC,CAACf,SAAS,CAACgB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAGD,KAAK,CAAC,CAACE,GAAG,CAACjD,MAAM,CAAC,CAAC;EACxD;;EAEA;AACF;AACA;AACA;AACA;EACEkD,SAASA,CAACC,OAAe,EAAEC,IAAa,EAAQ;IAC9C,IAAI,CAAC,CAACpB,SAAS,CAACqB,MAAM,CAAC,IAAI,EAAEF,OAAO,EAAEC,IAAI,CAAC;EAC7C;;EAEA;AACF;AACA;AACA;EACEE,YAAYA,CAACP,KAAa,EAAQ;IAChC,IAAI,CAAC3B,YAAY,GAAG2B,KAAK;IACzB,IAAI,CAAC1B,YAAY,GAAG,CAAC;IACrB,IAAI,CAACC,QAAQ,GAAG,KAAK;IACrB,OAAO,IAAI;EACb;;EAEA;EACAiC,QAAQA,CAACC,EAAc,EAAQ;IAC7B,IAAI,CAAC,CAAC1B,KAAK,CAAC2B,GAAG,CAACD,EAAE,CAAC;IACnB,OAAO,IAAI;EACb;;EAEA;EACAE,YAAYA,CAACF,EAAc,EAAW;IACpC,IAAI,IAAI,CAAC,CAAC1B,KAAK,CAAC6B,GAAG,CAACH,EAAE,CAAC,EAAE;MACvB,IAAI,CAAC,CAAC1B,KAAK,CAAC8B,MAAM,CAACJ,EAAE,CAAC;MACtB,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;;EAEA;EACAK,eAAeA,CAACC,OAA8B,EAAQ;IACpDC,MAAM,CAACC,MAAM,CAAC,IAAI,CAACpC,KAAK,EAAEkC,OAAO,CAAC;EACpC;;EAEA;EACAG,MAAMA,CAAA,EAAS;IACb,IAAI,CAAC,CAACjC,SAAS,CAACiC,MAAM,CAAC,IAAI,CAAC;EAC9B;;EAEA;EACAC,MAAMA,CAAA,EAAS;IACb,IAAI,CAAC,CAAClC,SAAS,CAACkC,MAAM,CAAC,IAAI,CAAC;EAC9B;;EAEA;EACAC,UAAUA,CAAA,EAAS;IACjB,IAAI,CAAC,CAACnC,SAAS,CAACmC,UAAU,CAAC,IAAI,CAAC;EAClC;EAES,CAACC,WAAW,GAAG,IAAIrC,GAAG,CAA2C,CAAC;EAClE,CAACsC,YAAY,GAAG,IAAItC,GAAG,CAAa,CAAC;;EAE9C;AACF;AACA;AACA;EACEuC,UAAUA,CAAA,EAAmC;IAC3C,IAAI,IAAI,CAACtD,MAAM,IAAI,IAAI,CAACG,WAAW,EAAE;MACnC,OAAOoD,OAAO,CAACC,OAAO,CAAC,IAAI,CAACrD,WAAW,CAAC;IAC1C;IACA,OAAO,IAAIoD,OAAO,CAACC,OAAO,IAAI,IAAI,CAAC,CAACJ,WAAW,CAACX,GAAG,CAACe,OAAO,CAAC,CAAC;EAC/D;;EAEA;EACAC,UAAUA,CAAA,EAAkB;IAC1B,IAAI,CAAC,IAAI,CAACzD,MAAM,EAAE;MAChB,OAAOuD,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B;IACA,OAAO,IAAID,OAAO,CAACC,OAAO,IAAI,IAAI,CAAC,CAACH,YAAY,CAACZ,GAAG,CAACe,OAAO,CAAC,CAAC;EAChE;;EAEA;EACAE,WAAWA,CAACtC,OAA8B,EAAQ;IAChD,KAAK,MAAMuC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAACP,WAAW,CAAC,EAAEO,MAAM,CAACvC,OAAO,CAAC;IAC5D,IAAI,CAAC,CAACgC,WAAW,CAACQ,KAAK,CAAC,CAAC;EAC3B;;EAEA;EACAC,YAAYA,CAAA,EAAS;IACnB,KAAK,MAAMF,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAACN,YAAY,CAAC,EAAEM,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,CAACN,YAAY,CAACO,KAAK,CAAC,CAAC;EAC5B;AACF;AAACE,OAAA,CAAAhE,YAAA,GAAAA,YAAA;AAID;AACA;AACA;AACO,MAAMiE,uBAAuB,CAA4B;EACrD,CAACC,OAAO,GAAmB,EAAE;EAC7B,CAACC,SAAS;EACV,CAACC,SAAS;EACV,CAACC,SAAS;EACnB,CAACC,YAAY,GAAG,CAAC;EAER,CAACC,aAAa,GAAG,IAAItD,GAAG,CAAsB,CAAC;EAC/C,CAACuD,cAAc,GAAG,IAAIvD,GAAG,CAAuB,CAAC;EACjD,CAACwD,gBAAgB,GAAG,IAAIxD,GAAG,CAAyB,CAAC;EACrD,CAACyD,mBAAmB,GAAG,IAAIzD,GAAG,CAAyB,CAAC;;EAEjE;EACA,CAAC0D,WAAW,GAID,IAAI;EAEfxD,WAAWA,CAACG,OAAuC,GAAG,CAAC,CAAC,EAAE;IACxD,IAAI,CAAC,CAAC6C,SAAS,GAAG7C,OAAO,CAAC6C,SAAS,IAAI,CAAC;IACxC,IAAI,CAAC,CAACC,SAAS,GAAG9C,OAAO,CAACsD,mBAAmB,IAAI,IAAI;IACrD,IAAI,CAAC,CAACP,SAAS,GAAG/C,OAAO,CAAC+C,SAAS,IAAI,CAAC;IACxC,KAAK,MAAMhD,MAAM,IAAIC,OAAO,CAAC4C,OAAO,IAAI,EAAE,EAAE,IAAI,CAACW,SAAS,CAACxD,MAAM,CAAC;EACpE;;EAEA;;EAEA;EACA,IAAI6C,OAAOA,CAAA,EAA4B;IACrC,OAAO,IAAI,CAAC,CAACA,OAAO;EACtB;;EAEA;AACF;AACA;AACA;AACA;EACEW,SAASA,CACPtD,eAAgC,EAChCD,OAAsB,GAAG,CAAC,CAAC,EACb;IACd,MAAMD,MAAM,GAAG,IAAIrB,YAAY,CAC7B,IAAI,EACJ,IAAI,CAAC,CAACsE,YAAY,EAAE,EACpB/C,eAAe,EACfD,OACF,CAAC;IACDC,eAAe,CAACuD,KAAK,CAAC,IAAI,CAAC,CAACC,OAAO,CAAC1D,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC6C,OAAO,CAAClC,IAAI,CAACX,MAAM,CAAC;IAC1B,OAAOA,MAAM;EACf;;EAEA;EACA,CAAC0D,OAAOC,CAAC3D,MAAoB,EAAuB;IAClD,OAAO;MACL,IAAID,QAAQA,CAAA,EAAG;QACb,OAAOC,MAAM,CAACD,QAAQ;MACxB,CAAC;MACD,IAAIM,UAAUA,CAAA,EAAG;QACf,OAAOL,MAAM,CAACK,UAAU;MAC1B,CAAC;MACD,IAAIxB,MAAMA,CAAA,EAAG;QACX,OAAOmB,MAAM,CAACnB,MAAM;MACtB,CAAC;MACD,IAAIG,WAAWA,CAAA,EAAG;QAChB,OAAOgB,MAAM,CAAChB,WAAW;MAC3B,CAAC;MACD4E,IAAI,EAAEhD,KAAK,IAAI,IAAI,CAACC,QAAQ,CAACb,MAAM,EAAEY,KAAK,CAACE,GAAG,CAACjD,MAAM,CAAC,CAAC;MACvDgG,UAAU,EAAEA,CAAC7C,OAAO,EAAEC,IAAI,KAAK,IAAI,CAACC,MAAM,CAAClB,MAAM,EAAEgB,OAAO,EAAEC,IAAI,CAAC;MACjE6C,UAAU,EAAEnC,OAAO,IAAI3B,MAAM,CAAC0B,eAAe,CAAC3D,eAAe,CAAC4D,OAAO,CAAC;IACxE,CAAC;EACH;;EAEA;EACA,CAACoC,UAAUC,CAACC,EAA8B,EAAQ;IAChD,IAAI;MACF,MAAMC,MAAM,GAAGD,EAAE,CAAC,CAAC;MACnB,IAAIC,MAAM,IAAI,OAAQA,MAAM,CAAmBC,IAAI,KAAK,UAAU,EAAE;QACjED,MAAM,CAAmBE,KAAK,CAAEC,GAAY,IAAK;UAChDC,OAAO,CAACC,KAAK,CAAC,gCAAgC,EAAEF,GAAG,CAAC;QACtD,CAAC,CAAC;MACJ;IACF,CAAC,CAAC,OAAOA,GAAG,EAAE;MACZC,OAAO,CAACC,KAAK,CAAC,6BAA6B,EAAEF,GAAG,CAAC;IACnD;EACF;;EAEA;EACAG,YAAYA,CAACxE,MAAoB,EAAQ;IACvC,IAAIA,MAAM,CAACpB,QAAQ,EAAE,IAAI,CAACmD,MAAM,CAAC/B,MAAM,CAAC;IACxC,MAAMyE,CAAC,GAAG,IAAI,CAAC,CAAC5B,OAAO,CAAC6B,OAAO,CAAC1E,MAAM,CAAC;IACvC,IAAIyE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC5B,OAAO,CAAC8B,MAAM,CAACF,CAAC,EAAE,CAAC,CAAC;EACxC;;EAEA;EACA3C,MAAMA,CAAC9B,MAAoB,EAAQ;IACjCA,MAAM,CAACD,QAAQ,GAAG,IAAI,CAAC,CAACkD,YAAY,EAAE;IACtCjD,MAAM,CAACpB,QAAQ,GAAG,IAAI;IACtB,IAAI,CAAC,CAACgG,IAAI,CAAC,IAAI,CAAC,CAACxB,gBAAgB,EAAE;MACjCrD,QAAQ,EAAEC,MAAM,CAACD,QAAQ;MACzBI,WAAW,EAAEH,MAAM,CAACG,WAAW;MAC/BC,YAAY,EAAEJ,MAAM,CAACI;IACvB,CAAC,CAAC;EACJ;;EAEA;EACA2B,MAAMA,CAAC/B,MAAoB,EAAE6E,IAAI,GAAG,KAAK,EAAQ;IAC/C,MAAM;MAAC9E,QAAQ;MAAEI,WAAW;MAAEC;IAAY,CAAC,GAAGJ,MAAM;IACpD,MAAM8E,OAAO,GAAG9E,MAAM,CAACnB,MAAM;IAC7BmB,MAAM,CAACpB,QAAQ,GAAG,KAAK;IACvBoB,MAAM,CAACnB,MAAM,GAAG,KAAK;IACrBmB,MAAM,CAAClB,OAAO,GAAG,KAAK;IACtB,IAAIgG,OAAO,EAAE9E,MAAM,CAAC0C,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,CAACkC,IAAI,CAAC,IAAI,CAAC,CAACvB,mBAAmB,EAAE;MACpCtD,QAAQ;MACRI,WAAW;MACXC,YAAY;MACZyE;IACF,CAAC,CAAC;EACJ;;EAEA;EACA7C,UAAUA,CAAChC,MAAoB,EAAQ;IACrC,IAAIA,MAAM,CAACnB,MAAM,EAAE,IAAI,CAACqC,MAAM,CAAClB,MAAM,EAAE,qBAAqB,CAAC;IAC7D,IAAI,CAAC+B,MAAM,CAAC/B,MAAM,EAAE,IAAI,CAAC;EAC3B;;EAEA;EACA+E,cAAcA,CAACC,MAAqD,EAAQ;IAC1E,IAAI,CAAC,CAAC1B,WAAW,GAAG0B,MAAM;EAC5B;;EAEA;EACAC,oBAAoBA,CAAA,EAAS;IAC3B,IAAI,CAAC,CAAC3B,WAAW,GAAG,QAAQ;EAC9B;;EAEA;;EAEA;EACAzC,QAAQA,CAACb,MAAoB,EAAEkF,IAAc,EAAQ;IACnD,IAAI,CAAClF,MAAM,CAACpB,QAAQ,IAAI,CAACoB,MAAM,CAACnB,MAAM,IAAI,CAACmB,MAAM,CAAClB,OAAO,EAAE;IAE3D,IAAIkB,MAAM,CAACf,YAAY,IAAI,IAAI,EAAE;MAC/B,IAAIe,MAAM,CAACb,QAAQ,EAAE,OAAO,CAAC;MAC7B,MAAMgG,SAAS,GAAGnF,MAAM,CAACf,YAAY,GAAGe,MAAM,CAACd,YAAY;MAC3D,IAAIgG,IAAI,CAACE,MAAM,GAAGD,SAAS,EAAE;QAC3B,MAAME,IAAI,GAAGH,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEL,SAAS,CAAC,CAAC;QAClDnF,MAAM,CAACd,YAAY,IAAImG,IAAI,CAACD,MAAM;QAClCpF,MAAM,CAACb,QAAQ,GAAG,IAAI;QACtB,IAAIkG,IAAI,CAACD,MAAM,EAAE,IAAI,CAAC,CAACK,QAAQ,CAACzF,MAAM,EAAEqF,IAAI,CAAC;QAC7C,IAAI,CAACnE,MAAM,CAAClB,MAAM,EAAE,wBAAwB,EAAE,oBAAoB,CAAC;QACnE;MACF;MACAA,MAAM,CAACd,YAAY,IAAIgG,IAAI,CAACE,MAAM;IACpC;IAEA,IAAI,CAAC,CAACK,QAAQ,CAACzF,MAAM,EAAEkF,IAAI,CAAC;EAC9B;;EAEA;EACAhE,MAAMA,CAAClB,MAAoB,EAAEgB,OAAe,EAAEC,IAAa,EAAQ;IACjE,MAAMyE,KAAiB,GAAG;MACxB3F,QAAQ,EAAEC,MAAM,CAACD,QAAQ;MACzBM,UAAU,EAAEL,MAAM,CAACK,UAAU;MAC7BkE,KAAK,EAAEvD,OAAO;MACd2E,SAAS,EAAE1E;IACb,CAAC;IACD,IAAI,CAAC,CAAC2E,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAChB,IAAI,CAAC,IAAI,CAAC,CAACzB,cAAc,EAAEuC,KAAK,CAAC,CAAC;EAC/D;;EAEA;EACA,CAACD,QAAQI,CAAC7F,MAAoB,EAAEkF,IAAc,EAAQ;IACpD,MAAMY,OAAO,GAAIR,KAAe,IAAK;MACnC,MAAMI,KAAgB,GAAG;QACvB3F,QAAQ,EAAEC,MAAM,CAACD,QAAQ;QACzBM,UAAU,EAAEL,MAAM,CAACK,UAAU;QAC7B6E,IAAI,EAAEI;MACR,CAAC;MACD,IAAI,CAAC,CAACM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAChB,IAAI,CAAC,IAAI,CAAC,CAAC1B,aAAa,EAAEwC,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,MAAMK,KAAK,GAAG,IAAI,CAAC,CAAC/C,SAAS;IAC7B,IAAI+C,KAAK,IAAIb,IAAI,CAACE,MAAM,GAAGW,KAAK,EAAE;MAChC,KAAK,IAAItB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGS,IAAI,CAACE,MAAM,EAAEX,CAAC,IAAIsB,KAAK,EAAE;QAC3CD,OAAO,CAACZ,IAAI,CAACI,KAAK,CAACb,CAAC,EAAEA,CAAC,GAAGsB,KAAK,CAAC,CAAC;MACnC;IACF,CAAC,MAAM;MACLD,OAAO,CAACZ,IAAI,CAAC;IACf;EACF;;EAEA;;EAEAc,cAAcA,CAAA,EAAmC;IAC/C,MAAMC,KAAK,GAAG,IAAI,CAAC,CAACpD,OAAO,CAACqD,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACvH,QAAQ,CAAC,CAACkC,GAAG,CAAC,IAAI,CAAC,CAACsF,QAAQ,CAAC;IACvE,OAAO,IAAI,CAAC,CAAC/D,OAAO,CAAC4D,KAAK,CAAC;EAC7B;EAEAI,cAAcA,CACZH,MAAiC,EACjCI,OAA0B,EACT;IACjB,MAAMC,IAAI,GAAG,IAAI,CAAC,CAACjD,WAAW;IAC9B,IAAI,CAAC,CAACA,WAAW,GAAG,IAAI;IAExB,IAAIiD,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,IAAI,CAAC,CAACC,MAAM,CAAC,IAAIC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD;IAEA,MAAMC,UAAU,GAAG,IAAI,CAAC,CAAC7D,OAAO,CAACqD,MAAM,CACrCC,CAAC,IAAIA,CAAC,CAACvH,QAAQ,IAAI,IAAI,CAAC,CAAC+H,cAAc,CAACR,CAAC,EAAED,MAAM,CACnD,CAAC;IAED,IAAIU,MAAgC;IACpC,IAAI,OAAOL,IAAI,KAAK,UAAU,EAAE;MAC9BK,MAAM,GAAGF,UAAU,CAACG,IAAI,CAACN,IAAI,CAAC;IAChC,CAAC,MAAM,IAAIA,IAAI,EAAE;MACfK,MAAM,GAAGF,UAAU,CAACI,QAAQ,CAACP,IAAI,CAAC,GAAGA,IAAI,GAAGpI,SAAS;IACvD,CAAC,MAAM;MACLyI,MAAM,GAAGF,UAAU,CAAC,CAAC,CAAC;IACxB;IAEA,IAAI,CAACE,MAAM,EAAE,OAAO,IAAI,CAAC,CAACJ,MAAM,CAAC,IAAIC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,CAAC1D,SAAS,EAAE6D,MAAM,CAACpG,aAAa,GAAG,IAAI;IAChD,OAAO,IAAI,CAAC,CAAC6B,OAAO,CAAC,IAAI,CAAC,CAAC+D,QAAQ,CAACQ,MAAM,CAAC,CAAC;EAC9C;EAEAG,iBAAiBA,CAAChH,QAAgB,EAAoB;IACpD,MAAMC,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,CAAC;IACnC,IAAIC,MAAM,EAAEA,MAAM,CAACQ,aAAa,GAAG,IAAI;IACvC,OAAO,IAAI,CAAC,CAAC6B,OAAO,CAAC,CAAC,CAACrC,MAAM,CAAC;EAChC;;EAEA;;EAEAgH,IAAIA,CACFjH,QAAgB,EAChBM,UAAkB,EAClBJ,OAAoB,EACL;IACf,MAAMD,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAI,CAACL,MAAM,EAAE,OAAO,IAAI,CAAC,CAACwG,MAAM,CAAC,IAAIC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/D,IAAIzG,MAAM,CAACuB,YAAY,CAAC,MAAM,CAAC,EAAE;MAC/B,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC1D;IACAzG,MAAM,CAACnB,MAAM,GAAG,IAAI;IACpBmB,MAAM,CAAChB,WAAW,GAAG;MAAC,GAAGiI,+BAAoB;MAAE,GAAGhH;IAAO,CAAC;IAC1DD,MAAM,CAACZ,UAAU,GAAG,CAAC;IACrB,IAAI,CAAC,CAAC2E,UAAU,CAAC,MAAM/D,MAAM,CAACE,eAAe,CAACgH,MAAM,CAAClH,MAAM,CAAChB,WAAY,CAAC,CAAC;IAC1EgB,MAAM,CAACuC,WAAW,CAACvC,MAAM,CAAChB,WAAW,CAAC;IACtC,OAAO,IAAI,CAAC,CAACqD,OAAO,CAAC,CAAC;EACxB;EAEA8E,KAAKA,CAACpH,QAAgB,EAAEM,UAAkB,EAAiB;IACzD,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEuB,YAAY,CAAC,OAAO,CAAC,EAAE;MACjC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC3D;IACA,IAAIzG,MAAM,EAAE;MACVA,MAAM,CAACnB,MAAM,GAAG,KAAK;MACrBmB,MAAM,CAAClB,OAAO,GAAG,KAAK;MACtB,IAAI,CAAC,CAACiF,UAAU,CAAC,MAAM/D,MAAM,CAACE,eAAe,CAACkH,OAAO,CAAC,CAAC,CAAC;MACxDpH,MAAM,CAAC0C,YAAY,CAAC,CAAC;IACvB;IACA,OAAO,IAAI,CAAC,CAACL,OAAO,CAAC,CAAC;EACxB;EAEAxD,MAAMA,CAACkB,QAAgB,EAAEM,UAAkB,EAAW;IACpD,OAAO,IAAI,CAAC,CAACwG,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAExB,MAAM,IAAI,KAAK;EAC1D;;EAEA;;EAEAwI,KAAKA,CACHtH,QAAgB,EAChBM,UAAkB,EAClB6E,IAAc,EACdoC,QAAiB,EACF;IACf,MAAMtH,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAI,CAACL,MAAM,EAAEnB,MAAM,EAAE;MACnB,OAAO,IAAI,CAAC,CAAC2H,MAAM,CAAC,IAAIC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD;IACA,IAAIzG,MAAM,CAACuB,YAAY,CAAC,OAAO,CAAC,EAAE;MAChC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC3D;IACA,MAAM7F,KAAK,GAAGsE,IAAI,CAACpE,GAAG,CAACjD,MAAM,CAAC;IAC9BmC,MAAM,CAACN,OAAO,CAACiB,IAAI,CAACC,KAAK,CAAC;IAC1B,IAAIZ,MAAM,CAACjB,WAAW,KAAK,SAAS,EAAEiB,MAAM,CAACZ,UAAU,IAAIwB,KAAK,CAACwE,MAAM;IACvE,IAAI,CAAC,CAACrB,UAAU,CAAC,MACf/D,MAAM,CAACE,eAAe,CAACqH,MAAM,CAACC,UAAU,CAACC,IAAI,CAAC7G,KAAK,CAAC,CACtD,CAAC;IACD,OAAO,IAAI,CAAC,CAACyB,OAAO,CAAC,CAAC;EACxB;EAEAqF,YAAYA,CAAC3H,QAAgB,EAAEM,UAAkB,EAAiB;IAChE,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEuB,YAAY,CAAC,cAAc,CAAC,EAAE;MACxC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClE;IACA,IAAIzG,MAAM,EAAEA,MAAM,CAAClB,OAAO,GAAG,IAAI;IACjC,OAAO,IAAI,CAAC,CAACuD,OAAO,CAAC,CAAC;EACxB;EAEAsF,WAAWA,CAAC5H,QAAgB,EAAEM,UAAkB,EAAiB;IAC/D,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEuB,YAAY,CAAC,aAAa,CAAC,EAAE;MACvC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACjE;IACA,IAAIzG,MAAM,EAAEA,MAAM,CAAClB,OAAO,GAAG,KAAK;IAClC,OAAO,IAAI,CAAC,CAACuD,OAAO,CAAC,CAAC;EACxB;EAEAuF,aAAaA,CACX7H,QAAgB,EAChBM,UAAkB,EAClBJ,OAAoB,EACL;IACf,MAAMD,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEA,MAAM,CAAChB,WAAW,GAAG;MAAC,GAAGiI,+BAAoB;MAAE,GAAGhH;IAAO,CAAC;IACtE,OAAO,IAAI,CAAC,CAACoC,OAAO,CAAC,CAAC;EACxB;;EAEA;;EAEAwF,MAAMA,CAAC9H,QAAgB,EAAEM,UAAkB,EAAEyH,KAAc,EAAiB;IAC1E,OAAO,IAAI,CAAC,CAACC,SAAS,CAAChI,QAAQ,EAAEM,UAAU,EAAE,KAAK,EAAEyH,KAAK,CAAC;EAC5D;EAEAE,MAAMA,CAACjI,QAAgB,EAAEM,UAAkB,EAAEyH,KAAc,EAAiB;IAC1E,OAAO,IAAI,CAAC,CAACC,SAAS,CAAChI,QAAQ,EAAEM,UAAU,EAAE,KAAK,EAAEyH,KAAK,CAAC;EAC5D;EAEAG,QAAQA,CACNlI,QAAgB,EAChBM,UAAkB,EAClByH,KAAc,EACC;IACf,OAAO,IAAI,CAAC,CAACC,SAAS,CAAChI,QAAQ,EAAEM,UAAU,EAAE,KAAK,EAAEyH,KAAK,CAAC;EAC5D;EAEAI,MAAMA,CAACnI,QAAgB,EAAEM,UAAkB,EAAoB;IAC7D,OAAO,IAAI,CAAC,CAACgC,OAAO,CAAC,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEhB,MAAM,CAACC,GAAG,IAAI,KAAK,CAAC;EAC7E;EAEA6I,MAAMA,CAACpI,QAAgB,EAAEM,UAAkB,EAAoB;IAC7D,OAAO,IAAI,CAAC,CAACgC,OAAO,CAAC,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEhB,MAAM,CAACE,GAAG,IAAI,KAAK,CAAC;EAC7E;EAEA6I,KAAKA,CAACrI,QAAgB,EAAEM,UAAkB,EAAoB;IAC5D,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEuB,YAAY,CAAC,YAAY,CAAC,EAAE;MACtC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE;IACA,OAAO,IAAI,CAAC,CAACpE,OAAO,CAACrC,MAAM,EAAEP,KAAK,CAACrB,GAAG,IAAI,KAAK,CAAC;EAClD;EAEAiK,MAAMA,CAACtI,QAAgB,EAAEM,UAAkB,EAAoB;IAC7D,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C;IACA;IACA;IACA,IAAIL,MAAM,IAAIA,MAAM,CAACjB,WAAW,KAAK,SAAS,EAAE;MAC9C,OAAO,IAAI,CAAC,CAACsD,OAAO,CAACrC,MAAM,CAACZ,UAAU,GAAGY,MAAM,CAACU,oBAAoB,CAAC;IACvE;IACA,OAAO,IAAI,CAAC,CAAC2B,OAAO,CAACrC,MAAM,EAAEP,KAAK,CAACnB,GAAG,IAAI,KAAK,CAAC;EAClD;EAEAgK,KAAKA,CAACvI,QAAgB,EAAEM,UAAkB,EAAoB;IAC5D,OAAO,IAAI,CAAC,CAACgC,OAAO,CAAC,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEZ,KAAK,CAACjB,EAAE,IAAI,KAAK,CAAC;EAC3E;EAEA+J,MAAMA,CAACxI,QAAgB,EAAEM,UAAkB,EAAoB;IAC7D,OAAO,IAAI,CAAC,CAACgC,OAAO,CAAC,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEZ,KAAK,CAACf,GAAG,IAAI,KAAK,CAAC;EAC5E;EAEA8J,eAAeA,CACbzI,QAAgB,EAChBM,UAAkB,EACM;IACxB,MAAML,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,MAAMoI,KAAoB,GAAG,EAAE;IAC/B,IAAIzI,MAAM,EAAE;MACV,IAAIA,MAAM,CAACX,MAAM,CAACC,GAAG,EAAEmJ,KAAK,CAAC9H,IAAI,CAAC,KAAK,CAAC;MACxC,IAAIX,MAAM,CAACX,MAAM,CAACE,GAAG,EAAEkJ,KAAK,CAAC9H,IAAI,CAAC,KAAK,CAAC;MACxC,IAAIX,MAAM,CAACP,KAAK,CAACnB,GAAG,EAAEmK,KAAK,CAAC9H,IAAI,CAAC,KAAK,CAAC;MACvC,IAAIX,MAAM,CAACP,KAAK,CAACf,GAAG,EAAE+J,KAAK,CAAC9H,IAAI,CAAC,KAAK,CAAC;MACvC,IAAIX,MAAM,CAACP,KAAK,CAACrB,GAAG,EAAEqK,KAAK,CAAC9H,IAAI,CAAC,IAAI,CAAC;MACtC,IAAIX,MAAM,CAACP,KAAK,CAACjB,EAAE,EAAEiK,KAAK,CAAC9H,IAAI,CAAC,IAAI,CAAC;IACvC;IACA,OAAO,IAAI,CAAC,CAAC0B,OAAO,CAACoG,KAAK,CAAC;EAC7B;EAEAC,wBAAwBA,CACtBC,SAAiB,EACjBC,WAAmB,EACK;IACxB,OAAO,IAAI,CAAC,CAACvG,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EAChE;;EAEA;;EAEAwG,cAAcA,CACZ9I,QAAgB,EAChBM,UAAkB,EAClBtB,WAAwB,EACT;IACf,MAAMiB,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEA,MAAM,CAACjB,WAAW,GAAGA,WAAW;IAC5C,OAAO,IAAI,CAAC,CAACsD,OAAO,CAAC,CAAC;EACxB;EAEAyG,cAAcA,CAAC/I,QAAgB,EAAEM,UAAkB,EAAwB;IACzE,OAAO,IAAI,CAAC,CAACgC,OAAO,CAClB,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEtB,WAAW,IAAI,MACnD,CAAC;EACH;EAEAgK,uBAAuBA,CACrBJ,SAAiB,EACjBC,WAAmB,EACK;IACxB,OAAO,IAAI,CAAC,CAACvG,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;EAC3C;EAEA2G,cAAcA,CACZL,SAAiB,EACjBC,WAAmB,EACnBK,kBAA2B,EAC3BC,iBAA0B,EACX;IACf,OAAO,IAAI,CAAC,CAAC7G,OAAO,CAAC,CAAC;EACxB;EAEA8G,SAASA,CAACpJ,QAAgB,EAAEM,UAAkB,EAAmB;IAC/D,OAAO,IAAI,CAAC,CAACgC,OAAO,CAAC,IAAI,CAAC,CAACwE,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC,EAAEC,YAAY,IAAI,EAAE,CAAC;EAC5E;;EAEA;;EAEAiH,MAAMA,CAAC6B,QAA6B,EAAgB;IAClD,OAAO,IAAI,CAAC,CAACC,SAAS,CAAC,IAAI,CAAC,CAACnG,aAAa,EAAEkG,QAAQ,CAAC;EACvD;EAEAE,OAAOA,CAACF,QAA8B,EAAgB;IACpD,OAAO,IAAI,CAAC,CAACC,SAAS,CAAC,IAAI,CAAC,CAAClG,cAAc,EAAEiG,QAAQ,CAAC;EACxD;EAEAG,SAASA,CAACH,QAAgC,EAAgB;IACxD,OAAO,IAAI,CAAC,CAACC,SAAS,CAAC,IAAI,CAAC,CAACjG,gBAAgB,EAAEgG,QAAQ,CAAC;EAC1D;EAEAI,YAAYA,CAACJ,QAAgC,EAAgB;IAC3D,OAAO,IAAI,CAAC,CAACC,SAAS,CAAC,IAAI,CAAC,CAAChG,mBAAmB,EAAE+F,QAAQ,CAAC;EAC7D;;EAEA;;EAEA,CAACrB,SAAS0B,CACR1J,QAAgB,EAChBM,UAAkB,EAClBqJ,GAAwB,EACxB5B,KAAc,EACC;IACf,MAAM9H,MAAM,GAAG,IAAI,CAAC,CAAC6G,IAAI,CAAC9G,QAAQ,EAAEM,UAAU,CAAC;IAC/C,IAAIL,MAAM,EAAEuB,YAAY,CAAC,YAAY,CAAC,EAAE;MACtC,OAAO,IAAI,CAAC,CAACiF,MAAM,CAAC,IAAIC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE;IACA,IAAIzG,MAAM,EAAE;MACVA,MAAM,CAACX,MAAM,CAACqK,GAAG,CAAC,GAAG5B,KAAK;MAC1B,IAAI9H,MAAM,CAACS,eAAe,EAAE;QAC1B,IAAIiJ,GAAG,KAAK,KAAK,EAAE;UACjB1J,MAAM,CAACP,KAAK,CAACf,GAAG,GAAGoJ,KAAK;UACxB9H,MAAM,CAACP,KAAK,CAACrB,GAAG,GAAG0J,KAAK;QAC1B,CAAC,MAAM,IAAI4B,GAAG,KAAK,KAAK,EAAE;UACxB1J,MAAM,CAACP,KAAK,CAACnB,GAAG,GAAGwJ,KAAK;QAC1B;MACF;MACA,IAAI,CAAC,CAAC/D,UAAU,CAAC,MACf/D,MAAM,CAACE,eAAe,CAACyJ,aAAa,CAAC;QACnCC,iBAAiB,EAAE5J,MAAM,CAACX,MAAM,CAACC,GAAG;QACpCuK,aAAa,EAAE7J,MAAM,CAACX,MAAM,CAACE,GAAG;QAChCuK,KAAK,EAAE9J,MAAM,CAACX,MAAM,CAACG;MACvB,CAAC,CACH,CAAC;IACH;IACA,OAAO,IAAI,CAAC,CAAC6C,OAAO,CAAC,CAAC;EACxB;EAEA,CAAC+D,QAAQ,GAAID,CAAe,KAAc;IACxCpG,QAAQ,EAAEoG,CAAC,CAACpG,QAAQ;IACpBM,UAAU,EAAE8F,CAAC,CAAC9F,UAAU;IACxBF,WAAW,EAAEgG,CAAC,CAAChG,WAAW;IAC1BC,YAAY,EAAE+F,CAAC,CAAC/F,YAAY;IAC5BI,aAAa,EAAE2F,CAAC,CAAC3F;EACnB,CAAC,CAAC;EAEF,CAACmG,cAAcoD,CACb/J,MAAoB,EACpBgK,OAAkC,EACzB;IACT,IAAI,CAACA,OAAO,IAAIA,OAAO,CAAC5E,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IACjD,OAAO4E,OAAO,CAACC,IAAI,CAACC,CAAC,IAAI;MACvB,IAAIA,CAAC,CAAC/J,WAAW,KAAKhC,SAAS,IAAI+L,CAAC,CAAC/J,WAAW,KAAKH,MAAM,CAACG,WAAW,EAAE;QACvE,OAAO,KAAK;MACd;MACA,IACE+J,CAAC,CAAC9J,YAAY,KAAKjC,SAAS,IAC5B+L,CAAC,CAAC9J,YAAY,KAAKJ,MAAM,CAACI,YAAY,EACtC;QACA,OAAO,KAAK;MACd;MACA,OAAO,IAAI;IACb,CAAC,CAAC;EACJ;EAEA,CAACyG,IAAIsD,CAACpK,QAAgB,EAAEM,UAAmB,EAA4B;IACrE,OAAO,IAAI,CAAC,CAACwC,OAAO,CAACgE,IAAI,CACvBV,CAAC,IACCA,CAAC,CAACvH,QAAQ,IACVuH,CAAC,CAACpG,QAAQ,KAAKA,QAAQ,KACtBM,UAAU,KAAKlC,SAAS,IAAIgI,CAAC,CAAC9F,UAAU,KAAKA,UAAU,CAC5D,CAAC;EACH;EAEA,CAACgJ,SAASe,CAAIC,GAAqB,EAAEjB,QAAqB,EAAgB;IACxEiB,GAAG,CAAC/I,GAAG,CAAC8H,QAAQ,CAAC;IACjB,OAAO;MAACkB,MAAM,EAAEA,CAAA,KAAMD,GAAG,CAAC5I,MAAM,CAAC2H,QAAQ;IAAC,CAAC;EAC7C;EAEA,CAACxE,IAAI2F,CAAIF,GAAqB,EAAE3E,KAAQ,EAAQ;IAC9C,KAAK,MAAM0D,QAAQ,IAAI,CAAC,GAAGiB,GAAG,CAAC,EAAEjB,QAAQ,CAAC1D,KAAK,CAAC;EAClD;EAEA,CAACE,QAAQ4E,CAACvG,EAAc,EAAQ;IAC9B,IAAI,IAAI,CAAC,CAACnB,SAAS,GAAG,CAAC,EAAE2H,UAAU,CAACxG,EAAE,EAAE,IAAI,CAAC,CAACnB,SAAS,CAAC,CAAC,KACpD4H,cAAc,CAACzG,EAAE,CAAC;EACzB;EAEA,CAAC5B,OAAOsI,CAAI7C,KAAS,EAAc;IACjC,IAAI,IAAI,CAAC,CAAChF,SAAS,GAAG,CAAC,EAAE;MACvB,OAAO,IAAIV,OAAO,CAACwI,CAAC,IAAIH,UAAU,CAAC,MAAMG,CAAC,CAAC9C,KAAU,CAAC,EAAE,IAAI,CAAC,CAAChF,SAAS,CAAC,CAAC;IAC3E;IACA,OAAOV,OAAO,CAACC,OAAO,CAACyF,KAAU,CAAC;EACpC;EAEA,CAACtB,MAAMqE,CAACtG,KAAY,EAAkB;IACpC,IAAI,IAAI,CAAC,CAACzB,SAAS,GAAG,CAAC,EAAE;MACvB,OAAO,IAAIV,OAAO,CAAC,CAAC0I,CAAC,EAAEtE,MAAM,KAC3BiE,UAAU,CAAC,MAAMjE,MAAM,CAACjC,KAAK,CAAC,EAAE,IAAI,CAAC,CAACzB,SAAS,CACjD,CAAC;IACH;IACA,OAAOV,OAAO,CAACoE,MAAM,CAACjC,KAAK,CAAC;EAC9B;AACF;AAAC5B,OAAA,CAAAC,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -3,40 +3,100 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "EchoDevice", {
6
+ Object.defineProperty(exports, "DeviceHandle", {
7
7
  enumerable: true,
8
8
  get: function () {
9
- return _serialDevice.EchoDevice;
9
+ return _inMemorySerialTransport.DeviceHandle;
10
10
  }
11
11
  });
12
- Object.defineProperty(exports, "LineDevice", {
12
+ Object.defineProperty(exports, "InMemorySerialTransport", {
13
13
  enumerable: true,
14
14
  get: function () {
15
- return _serialDevice.LineDevice;
15
+ return _inMemorySerialTransport.InMemorySerialTransport;
16
16
  }
17
17
  });
18
- Object.defineProperty(exports, "SerialDevice", {
18
+ Object.defineProperty(exports, "LineBufferedDevice", {
19
19
  enumerable: true,
20
20
  get: function () {
21
- return _serialDevice.SerialDevice;
21
+ return _simulatedDevice.LineBufferedDevice;
22
22
  }
23
23
  });
24
- Object.defineProperty(exports, "SilentDevice", {
24
+ Object.defineProperty(exports, "LoopbackDevice", {
25
25
  enumerable: true,
26
26
  get: function () {
27
- return _serialDevice.SilentDevice;
27
+ return _simulatedDevice.LoopbackDevice;
28
28
  }
29
29
  });
30
- Object.defineProperty(exports, "VirtualDevice", {
30
+ Object.defineProperty(exports, "SerialClient", {
31
31
  enumerable: true,
32
32
  get: function () {
33
- return _virtualSerial.VirtualDevice;
33
+ return _serialClient.SerialClient;
34
34
  }
35
35
  });
36
- Object.defineProperty(exports, "VirtualSerialTransport", {
36
+ Object.defineProperty(exports, "SimulatedDevice", {
37
37
  enumerable: true,
38
38
  get: function () {
39
- return _virtualSerial.VirtualSerialTransport;
39
+ return _simulatedDevice.SimulatedDevice;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "SinkDevice", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _simulatedDevice.SinkDevice;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "assert", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _harness.assert;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "assertEqual", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _harness.assertEqual;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "assertRejects", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _harness.assertRejects;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "bytesEqual", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _harness.bytesEqual;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "compareTestResults", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _testSuite.compareTestResults;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "createDeviceFixture", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _deviceFixture.createDeviceFixture;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "createSerialClient", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _serialClient.createSerialClient;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "errorMessage", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _harness.errorMessage;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "exposeSimulatedDevice", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _expose.exposeSimulatedDevice;
40
100
  }
41
101
  });
42
102
  Object.defineProperty(exports, "getUsbSerial", {
@@ -45,10 +105,16 @@ Object.defineProperty(exports, "getUsbSerial", {
45
105
  return _UsbSerial.getUsbSerial;
46
106
  }
47
107
  });
48
- Object.defineProperty(exports, "installSerialMock", {
108
+ Object.defineProperty(exports, "installInMemorySerialTransport", {
49
109
  enumerable: true,
50
110
  get: function () {
51
- return _install.installSerialMock;
111
+ return _installInMemorySerialTransport.installInMemorySerialTransport;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "readBytes", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _harness.readBytes;
52
118
  }
53
119
  });
54
120
  Object.defineProperty(exports, "resetUsbSerial", {
@@ -57,14 +123,31 @@ Object.defineProperty(exports, "resetUsbSerial", {
57
123
  return _UsbSerial.resetUsbSerial;
58
124
  }
59
125
  });
126
+ Object.defineProperty(exports, "runTestSuite", {
127
+ enumerable: true,
128
+ get: function () {
129
+ return _testSuite.runTestSuite;
130
+ }
131
+ });
60
132
  Object.defineProperty(exports, "setUsbSerial", {
61
133
  enumerable: true,
62
134
  get: function () {
63
135
  return _UsbSerial.setUsbSerial;
64
136
  }
65
137
  });
138
+ Object.defineProperty(exports, "withTimeout", {
139
+ enumerable: true,
140
+ get: function () {
141
+ return _harness.withTimeout;
142
+ }
143
+ });
66
144
  var _UsbSerial = require("../UsbSerial");
67
- var _install = require("./install");
68
- var _serialDevice = require("./serial-device");
69
- var _virtualSerial = require("./virtual-serial");
145
+ var _deviceFixture = require("./device-fixture");
146
+ var _expose = require("./expose");
147
+ var _harness = require("./harness");
148
+ var _inMemorySerialTransport = require("./in-memory-serial-transport");
149
+ var _installInMemorySerialTransport = require("./install-in-memory-serial-transport");
150
+ var _serialClient = require("./serial-client");
151
+ var _simulatedDevice = require("./simulated-device");
152
+ var _testSuite = require("./test-suite");
70
153
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_UsbSerial","require","_install","_serialDevice","_virtualSerial"],"sourceRoot":"../../../src","sources":["testing/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAAA,UAAA,GAAAC,OAAA;AAGA,IAAAC,QAAA,GAAAD,OAAA;AASA,IAAAE,aAAA,GAAAF,OAAA;AAWA,IAAAG,cAAA,GAAAH,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_UsbSerial","require","_deviceFixture","_expose","_harness","_inMemorySerialTransport","_installInMemorySerialTransport","_serialClient","_simulatedDevice","_testSuite"],"sourceRoot":"../../../src","sources":["testing/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAAA,UAAA,GAAAC,OAAA;AAOA,IAAAC,cAAA,GAAAD,OAAA;AASA,IAAAE,OAAA,GAAAF,OAAA;AAGA,IAAAG,QAAA,GAAAH,OAAA;AAcA,IAAAI,wBAAA,GAAAJ,OAAA;AASA,IAAAK,+BAAA,GAAAL,OAAA;AAGA,IAAAM,aAAA,GAAAN,OAAA;AAYA,IAAAO,gBAAA,GAAAP,OAAA;AAcA,IAAAQ,UAAA,GAAAR,OAAA","ignoreList":[]}