@ya-modbus/cli 0.6.0 → 0.7.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 (207) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/bin/ya-modbus.d.ts.map +1 -0
  3. package/dist/cjs/bin/ya-modbus.js +12 -0
  4. package/dist/cjs/bin/ya-modbus.js.map +1 -0
  5. package/dist/cjs/package.json +1 -0
  6. package/dist/cjs/src/commands/discover.d.ts.map +1 -0
  7. package/dist/cjs/src/commands/discover.js +196 -0
  8. package/dist/cjs/src/commands/discover.js.map +1 -0
  9. package/dist/cjs/src/commands/list-devices.d.ts.map +1 -0
  10. package/dist/cjs/src/commands/list-devices.js +79 -0
  11. package/dist/cjs/src/commands/list-devices.js.map +1 -0
  12. package/dist/cjs/src/commands/read.d.ts.map +1 -0
  13. package/dist/cjs/src/commands/read.js +79 -0
  14. package/dist/cjs/src/commands/read.js.map +1 -0
  15. package/dist/cjs/src/commands/show-defaults.d.ts.map +1 -0
  16. package/dist/cjs/src/commands/show-defaults.js +51 -0
  17. package/dist/cjs/src/commands/show-defaults.js.map +1 -0
  18. package/dist/cjs/src/commands/write.d.ts.map +1 -0
  19. package/dist/cjs/src/commands/write.js +65 -0
  20. package/dist/cjs/src/commands/write.js.map +1 -0
  21. package/dist/cjs/src/discovery/constants.d.ts.map +1 -0
  22. package/dist/cjs/src/discovery/constants.js +48 -0
  23. package/dist/cjs/src/discovery/constants.js.map +1 -0
  24. package/dist/cjs/src/discovery/device-identifier.d.ts.map +1 -0
  25. package/dist/cjs/src/discovery/device-identifier.js +196 -0
  26. package/dist/cjs/src/discovery/device-identifier.js.map +1 -0
  27. package/dist/cjs/src/discovery/parameter-generator-utils.d.ts.map +1 -0
  28. package/dist/cjs/src/discovery/parameter-generator-utils.js +63 -0
  29. package/dist/cjs/src/discovery/parameter-generator-utils.js.map +1 -0
  30. package/dist/cjs/src/discovery/parameter-generator.d.ts.map +1 -0
  31. package/dist/cjs/src/discovery/parameter-generator.js +188 -0
  32. package/dist/cjs/src/discovery/parameter-generator.js.map +1 -0
  33. package/dist/cjs/src/discovery/progress.d.ts.map +1 -0
  34. package/dist/cjs/src/discovery/progress.js +59 -0
  35. package/dist/cjs/src/discovery/progress.js.map +1 -0
  36. package/dist/cjs/src/discovery/scanner.d.ts.map +1 -0
  37. package/dist/cjs/src/discovery/scanner.js +147 -0
  38. package/dist/cjs/src/discovery/scanner.js.map +1 -0
  39. package/dist/cjs/src/formatters/discovery-results.d.ts.map +1 -0
  40. package/dist/cjs/src/formatters/discovery-results.js +62 -0
  41. package/dist/cjs/src/formatters/discovery-results.js.map +1 -0
  42. package/dist/cjs/src/formatters/json.d.ts.map +1 -0
  43. package/dist/cjs/src/formatters/json.js +36 -0
  44. package/dist/cjs/src/formatters/json.js.map +1 -0
  45. package/dist/cjs/src/formatters/performance.d.ts.map +1 -0
  46. package/dist/cjs/src/formatters/performance.js +28 -0
  47. package/dist/cjs/src/formatters/performance.js.map +1 -0
  48. package/dist/cjs/src/formatters/table.d.ts.map +1 -0
  49. package/dist/cjs/src/formatters/table.js +95 -0
  50. package/dist/cjs/src/formatters/table.js.map +1 -0
  51. package/dist/cjs/src/index.d.ts.map +1 -0
  52. package/dist/cjs/src/index.js +157 -0
  53. package/dist/cjs/src/index.js.map +1 -0
  54. package/dist/cjs/src/utils/commands.d.ts.map +1 -0
  55. package/dist/cjs/src/utils/commands.js +421 -0
  56. package/dist/cjs/src/utils/commands.js.map +1 -0
  57. package/dist/cjs/src/utils/object-utils.d.ts.map +1 -0
  58. package/dist/cjs/src/utils/object-utils.js +31 -0
  59. package/dist/cjs/src/utils/object-utils.js.map +1 -0
  60. package/dist/cjs/src/utils/validation.d.ts.map +1 -0
  61. package/dist/cjs/src/utils/validation.js +165 -0
  62. package/dist/cjs/src/utils/validation.js.map +1 -0
  63. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  64. package/dist/esm/bin/ya-modbus.d.ts +9 -0
  65. package/dist/esm/bin/ya-modbus.d.ts.map +1 -0
  66. package/dist/esm/bin/ya-modbus.js.map +1 -0
  67. package/dist/esm/package.json +1 -0
  68. package/dist/esm/src/commands/discover.d.ts +25 -0
  69. package/dist/esm/src/commands/discover.d.ts.map +1 -0
  70. package/dist/esm/src/commands/discover.js.map +1 -0
  71. package/dist/esm/src/commands/list-devices.d.ts +21 -0
  72. package/dist/esm/src/commands/list-devices.d.ts.map +1 -0
  73. package/dist/esm/src/commands/list-devices.js.map +1 -0
  74. package/dist/esm/src/commands/read.d.ts +25 -0
  75. package/dist/esm/src/commands/read.d.ts.map +1 -0
  76. package/dist/esm/src/commands/read.js.map +1 -0
  77. package/dist/esm/src/commands/show-defaults.d.ts +21 -0
  78. package/dist/esm/src/commands/show-defaults.d.ts.map +1 -0
  79. package/dist/esm/src/commands/show-defaults.js.map +1 -0
  80. package/dist/esm/src/commands/write.d.ts +26 -0
  81. package/dist/esm/src/commands/write.d.ts.map +1 -0
  82. package/dist/esm/src/commands/write.js.map +1 -0
  83. package/dist/esm/src/discovery/constants.d.ts +37 -0
  84. package/dist/esm/src/discovery/constants.d.ts.map +1 -0
  85. package/dist/esm/src/discovery/constants.js.map +1 -0
  86. package/dist/esm/src/discovery/device-identifier.d.ts +52 -0
  87. package/dist/esm/src/discovery/device-identifier.d.ts.map +1 -0
  88. package/dist/esm/src/discovery/device-identifier.js.map +1 -0
  89. package/dist/esm/src/discovery/parameter-generator-utils.d.ts +29 -0
  90. package/dist/esm/src/discovery/parameter-generator-utils.d.ts.map +1 -0
  91. package/dist/esm/src/discovery/parameter-generator-utils.js.map +1 -0
  92. package/dist/esm/src/discovery/parameter-generator.d.ts +97 -0
  93. package/dist/esm/src/discovery/parameter-generator.d.ts.map +1 -0
  94. package/dist/esm/src/discovery/parameter-generator.js.map +1 -0
  95. package/dist/esm/src/discovery/progress.d.ts +24 -0
  96. package/dist/esm/src/discovery/progress.d.ts.map +1 -0
  97. package/dist/{src → esm/src}/discovery/progress.js +2 -4
  98. package/dist/esm/src/discovery/progress.js.map +1 -0
  99. package/dist/esm/src/discovery/scanner.d.ts +46 -0
  100. package/dist/esm/src/discovery/scanner.d.ts.map +1 -0
  101. package/dist/esm/src/discovery/scanner.js.map +1 -0
  102. package/dist/esm/src/formatters/discovery-results.d.ts +10 -0
  103. package/dist/esm/src/formatters/discovery-results.d.ts.map +1 -0
  104. package/dist/esm/src/formatters/discovery-results.js.map +1 -0
  105. package/dist/esm/src/formatters/json.d.ts +30 -0
  106. package/dist/esm/src/formatters/json.d.ts.map +1 -0
  107. package/dist/esm/src/formatters/json.js.map +1 -0
  108. package/dist/esm/src/formatters/performance.d.ts +19 -0
  109. package/dist/esm/src/formatters/performance.d.ts.map +1 -0
  110. package/dist/esm/src/formatters/performance.js.map +1 -0
  111. package/dist/esm/src/formatters/table.d.ts +10 -0
  112. package/dist/esm/src/formatters/table.d.ts.map +1 -0
  113. package/dist/esm/src/formatters/table.js.map +1 -0
  114. package/dist/esm/src/index.d.ts +5 -0
  115. package/dist/esm/src/index.d.ts.map +1 -0
  116. package/dist/esm/src/index.js.map +1 -0
  117. package/dist/esm/src/utils/commands.d.ts +191 -0
  118. package/dist/esm/src/utils/commands.d.ts.map +1 -0
  119. package/dist/esm/src/utils/commands.js.map +1 -0
  120. package/dist/esm/src/utils/object-utils.d.ts +20 -0
  121. package/dist/esm/src/utils/object-utils.d.ts.map +1 -0
  122. package/dist/esm/src/utils/object-utils.js.map +1 -0
  123. package/dist/esm/src/utils/validation.d.ts +70 -0
  124. package/dist/esm/src/utils/validation.d.ts.map +1 -0
  125. package/dist/{src → esm/src}/utils/validation.js +0 -3
  126. package/dist/esm/src/utils/validation.js.map +1 -0
  127. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  128. package/package.json +26 -9
  129. package/dist/bin/ya-modbus.d.ts.map +0 -1
  130. package/dist/bin/ya-modbus.js.map +0 -1
  131. package/dist/src/commands/discover.d.ts.map +0 -1
  132. package/dist/src/commands/discover.js.map +0 -1
  133. package/dist/src/commands/list-devices.d.ts.map +0 -1
  134. package/dist/src/commands/list-devices.js.map +0 -1
  135. package/dist/src/commands/read.d.ts.map +0 -1
  136. package/dist/src/commands/read.js.map +0 -1
  137. package/dist/src/commands/show-defaults.d.ts.map +0 -1
  138. package/dist/src/commands/show-defaults.js.map +0 -1
  139. package/dist/src/commands/write.d.ts.map +0 -1
  140. package/dist/src/commands/write.js.map +0 -1
  141. package/dist/src/discovery/constants.d.ts.map +0 -1
  142. package/dist/src/discovery/constants.js.map +0 -1
  143. package/dist/src/discovery/device-identifier.d.ts.map +0 -1
  144. package/dist/src/discovery/device-identifier.js.map +0 -1
  145. package/dist/src/discovery/parameter-generator-utils.d.ts.map +0 -1
  146. package/dist/src/discovery/parameter-generator-utils.js.map +0 -1
  147. package/dist/src/discovery/parameter-generator.d.ts.map +0 -1
  148. package/dist/src/discovery/parameter-generator.js.map +0 -1
  149. package/dist/src/discovery/progress.d.ts.map +0 -1
  150. package/dist/src/discovery/progress.js.map +0 -1
  151. package/dist/src/discovery/scanner.d.ts.map +0 -1
  152. package/dist/src/discovery/scanner.js.map +0 -1
  153. package/dist/src/formatters/discovery-results.d.ts.map +0 -1
  154. package/dist/src/formatters/discovery-results.js.map +0 -1
  155. package/dist/src/formatters/json.d.ts.map +0 -1
  156. package/dist/src/formatters/json.js.map +0 -1
  157. package/dist/src/formatters/performance.d.ts.map +0 -1
  158. package/dist/src/formatters/performance.js.map +0 -1
  159. package/dist/src/formatters/table.d.ts.map +0 -1
  160. package/dist/src/formatters/table.js.map +0 -1
  161. package/dist/src/index.d.ts.map +0 -1
  162. package/dist/src/index.js.map +0 -1
  163. package/dist/src/utils/commands.d.ts.map +0 -1
  164. package/dist/src/utils/commands.js.map +0 -1
  165. package/dist/src/utils/object-utils.d.ts.map +0 -1
  166. package/dist/src/utils/object-utils.js.map +0 -1
  167. package/dist/src/utils/validation.d.ts.map +0 -1
  168. package/dist/src/utils/validation.js.map +0 -1
  169. package/dist/tsconfig.tsbuildinfo +0 -1
  170. /package/dist/{bin → cjs/bin}/ya-modbus.d.ts +0 -0
  171. /package/dist/{src → cjs/src}/commands/discover.d.ts +0 -0
  172. /package/dist/{src → cjs/src}/commands/list-devices.d.ts +0 -0
  173. /package/dist/{src → cjs/src}/commands/read.d.ts +0 -0
  174. /package/dist/{src → cjs/src}/commands/show-defaults.d.ts +0 -0
  175. /package/dist/{src → cjs/src}/commands/write.d.ts +0 -0
  176. /package/dist/{src → cjs/src}/discovery/constants.d.ts +0 -0
  177. /package/dist/{src → cjs/src}/discovery/device-identifier.d.ts +0 -0
  178. /package/dist/{src → cjs/src}/discovery/parameter-generator-utils.d.ts +0 -0
  179. /package/dist/{src → cjs/src}/discovery/parameter-generator.d.ts +0 -0
  180. /package/dist/{src → cjs/src}/discovery/progress.d.ts +0 -0
  181. /package/dist/{src → cjs/src}/discovery/scanner.d.ts +0 -0
  182. /package/dist/{src → cjs/src}/formatters/discovery-results.d.ts +0 -0
  183. /package/dist/{src → cjs/src}/formatters/json.d.ts +0 -0
  184. /package/dist/{src → cjs/src}/formatters/performance.d.ts +0 -0
  185. /package/dist/{src → cjs/src}/formatters/table.d.ts +0 -0
  186. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  187. /package/dist/{src → cjs/src}/utils/commands.d.ts +0 -0
  188. /package/dist/{src → cjs/src}/utils/object-utils.d.ts +0 -0
  189. /package/dist/{src → cjs/src}/utils/validation.d.ts +0 -0
  190. /package/dist/{bin → esm/bin}/ya-modbus.js +0 -0
  191. /package/dist/{src → esm/src}/commands/discover.js +0 -0
  192. /package/dist/{src → esm/src}/commands/list-devices.js +0 -0
  193. /package/dist/{src → esm/src}/commands/read.js +0 -0
  194. /package/dist/{src → esm/src}/commands/show-defaults.js +0 -0
  195. /package/dist/{src → esm/src}/commands/write.js +0 -0
  196. /package/dist/{src → esm/src}/discovery/constants.js +0 -0
  197. /package/dist/{src → esm/src}/discovery/device-identifier.js +0 -0
  198. /package/dist/{src → esm/src}/discovery/parameter-generator-utils.js +0 -0
  199. /package/dist/{src → esm/src}/discovery/parameter-generator.js +0 -0
  200. /package/dist/{src → esm/src}/discovery/scanner.js +0 -0
  201. /package/dist/{src → esm/src}/formatters/discovery-results.js +0 -0
  202. /package/dist/{src → esm/src}/formatters/json.js +0 -0
  203. /package/dist/{src → esm/src}/formatters/performance.js +0 -0
  204. /package/dist/{src → esm/src}/formatters/table.js +0 -0
  205. /package/dist/{src → esm/src}/index.js +0 -0
  206. /package/dist/{src → esm/src}/utils/commands.js +0 -0
  207. /package/dist/{src → esm/src}/utils/object-utils.js +0 -0
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.identifyDevice = identifyDevice;
4
+ /**
5
+ * FC43 Read Device ID Code values (MEI type)
6
+ * See Modbus specification 6.21 - Read Device Identification (FC43/0x2B)
7
+ */
8
+ const FC43_READ_DEVICE_ID_CODE = {
9
+ /** Basic device identification (VendorName, ProductCode, Revision) */
10
+ BASIC: 1,
11
+ /** Regular device identification (adds additional standard objects) */
12
+ REGULAR: 2,
13
+ /** Extended device identification (includes vendor-specific objects) */
14
+ EXTENDED: 3,
15
+ /** Specific individual object request */
16
+ SPECIFIC: 4,
17
+ };
18
+ /**
19
+ * FC43 Object ID values for device identification
20
+ * See Modbus specification 6.21 - Read Device Identification object IDs
21
+ */
22
+ const FC43_OBJECT_ID = {
23
+ /** Vendor/manufacturer name */
24
+ VENDOR_NAME: 0,
25
+ /** Product code/identifier */
26
+ PRODUCT_CODE: 1,
27
+ /** Major/minor revision number */
28
+ MAJOR_MINOR_REVISION: 2,
29
+ /** Vendor URL */
30
+ VENDOR_URL: 3,
31
+ /** Product name/model */
32
+ PRODUCT_NAME: 4,
33
+ /** Model name */
34
+ MODEL_NAME: 5,
35
+ /** User application name */
36
+ USER_APPLICATION_NAME: 6,
37
+ };
38
+ /**
39
+ * Check if error is a Modbus exception (device present but unsupported function/address)
40
+ */
41
+ function isModbusException(error) {
42
+ if (error && typeof error === 'object' && 'modbusCode' in error) {
43
+ const code = error.modbusCode;
44
+ return typeof code === 'number' ? code : undefined;
45
+ }
46
+ return undefined;
47
+ }
48
+ /**
49
+ * Check if error is a timeout (device not responding)
50
+ *
51
+ * The modbus-serial library can return timeout errors in different formats:
52
+ * - Error with message containing "timeout" (most common)
53
+ * - Error with errno='ETIMEDOUT' (serial port timeout)
54
+ * - Error with code='ETIMEDOUT' (TCP socket timeout)
55
+ *
56
+ * We check all three formats to handle different error sources reliably.
57
+ */
58
+ function isTimeout(error) {
59
+ if (!error || typeof error !== 'object') {
60
+ return false;
61
+ }
62
+ const err = error;
63
+ return Boolean((err.message?.toLowerCase().includes('timeout') ?? false) ||
64
+ err.errno === 'ETIMEDOUT' ||
65
+ err.code === 'ETIMEDOUT');
66
+ }
67
+ /**
68
+ * Check if error is a CRC error (wrong serial parameters)
69
+ *
70
+ * The modbus-serial library can return CRC errors in different formats:
71
+ * - Error with message containing "crc" (most common, e.g., "CRC error")
72
+ * - Error with errno='CRC' (serial port CRC validation failure)
73
+ *
74
+ * CRC errors indicate wrong serial parameters (baud rate, parity, etc.)
75
+ * and are distinguished from timeouts to guide parameter tuning.
76
+ */
77
+ function isCRCError(error) {
78
+ if (!error || typeof error !== 'object') {
79
+ return false;
80
+ }
81
+ const err = error;
82
+ return Boolean((err.message?.toLowerCase().includes('crc') ?? false) || err.errno === 'CRC');
83
+ }
84
+ /**
85
+ * Try to identify device using FC43 (Read Device Identification)
86
+ *
87
+ * FC43/14 is the standard MEI (Modbus Encapsulated Interface) for device identification.
88
+ * Not all devices support this - device-level support is handled via exception codes.
89
+ *
90
+ * Any Modbus response (including exceptions) indicates a device is present.
91
+ * Throws for timeout/CRC errors which indicate no device with these parameters.
92
+ *
93
+ * @param client - Configured ModbusRTU client
94
+ * @param startTime - Start time for response time calculation
95
+ * @throws Error for timeout, CRC, or other communication failures
96
+ * @returns DeviceIdentificationResult with present: true guaranteed
97
+ */
98
+ async function tryFC43(client, startTime) {
99
+ try {
100
+ const response = await client.readDeviceIdentification(FC43_READ_DEVICE_ID_CODE.BASIC, FC43_OBJECT_ID.VENDOR_NAME);
101
+ // Build result object with response time
102
+ const result = {
103
+ present: true,
104
+ responseTimeMs: performance.now() - startTime,
105
+ supportsFC43: true,
106
+ };
107
+ // modbus-serial returns { data: { 0: "vendor", 1: "product", 2: "revision" }, conformityLevel }
108
+ if (response.data && typeof response.data === 'object') {
109
+ const data = response.data;
110
+ const vendorName = data[FC43_OBJECT_ID.VENDOR_NAME];
111
+ if (vendorName !== undefined) {
112
+ result.vendorName = vendorName;
113
+ }
114
+ const productCode = data[FC43_OBJECT_ID.PRODUCT_CODE];
115
+ if (productCode !== undefined) {
116
+ result.productCode = productCode;
117
+ }
118
+ const revision = data[FC43_OBJECT_ID.MAJOR_MINOR_REVISION];
119
+ if (revision !== undefined) {
120
+ result.revision = revision;
121
+ }
122
+ // Note: modelName requires requesting FC43_OBJECT_ID.MODEL_NAME specifically
123
+ }
124
+ return result;
125
+ }
126
+ catch (error) {
127
+ const responseTime = performance.now() - startTime;
128
+ const exceptionCode = isModbusException(error);
129
+ if (exceptionCode !== undefined) {
130
+ // Exception means device is present but doesn't support FC43 or the specific registers
131
+ // This is still a successful device detection - we found a device, just don't know what it is
132
+ return {
133
+ present: true,
134
+ responseTimeMs: responseTime,
135
+ supportsFC43: false,
136
+ exceptionCode,
137
+ };
138
+ }
139
+ // Timeout, CRC, or other communication error - let caller handle it
140
+ throw error;
141
+ }
142
+ }
143
+ /**
144
+ * Attempt to identify a Modbus device at the current client configuration
145
+ *
146
+ * Uses FC43 (Read Device Identification) to probe for device presence.
147
+ * Any Modbus response (including exceptions) indicates a device is present.
148
+ * Only timeouts and CRC errors mean no device with these parameters.
149
+ *
150
+ * @param client - Configured ModbusRTU client (address, serial params, and timeout already set)
151
+ * @returns Device identification result
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * const client = new ModbusRTU()
156
+ * await client.connectRTUBuffered('/dev/ttyUSB0', { baudRate: 9600 })
157
+ * client.setID(1)
158
+ * client.setTimeout(1000)
159
+ *
160
+ * const result = await identifyDevice(client)
161
+ * if (result.present) {
162
+ * console.log(`Found device: ${result.vendorName ?? 'Unknown'}`)
163
+ * }
164
+ * ```
165
+ */
166
+ async function identifyDevice(client) {
167
+ const startTime = performance.now();
168
+ try {
169
+ // Try FC43 (provides device identification)
170
+ return await tryFC43(client, startTime);
171
+ }
172
+ catch (error) {
173
+ // Communication error - classify and return appropriate result
174
+ const responseTime = performance.now() - startTime;
175
+ if (isTimeout(error)) {
176
+ return {
177
+ present: false,
178
+ timeout: true,
179
+ responseTimeMs: responseTime,
180
+ };
181
+ }
182
+ if (isCRCError(error)) {
183
+ return {
184
+ present: false,
185
+ crcError: true,
186
+ responseTimeMs: responseTime,
187
+ };
188
+ }
189
+ // Other error (network, etc.) - treat as not present
190
+ return {
191
+ present: false,
192
+ responseTimeMs: responseTime,
193
+ };
194
+ }
195
+ }
196
+ //# sourceMappingURL=device-identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-identifier.js","sourceRoot":"","sources":["../../../../src/discovery/device-identifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-generator-utils.d.ts","sourceRoot":"","sources":["../../../../src/discovery/parameter-generator-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAahC,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEnF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,eAAe,CAAC,EAAE,qBAAqB,GACtC;IACD,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC9B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC7B,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC,CA+BA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAc5E"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getParameterArrays = getParameterArrays;
4
+ exports.countParameterCombinations = countParameterCombinations;
5
+ const constants_js_1 = require("./constants.js");
6
+ /**
7
+ * Get parameter arrays based on strategy and configuration
8
+ */
9
+ function getParameterArrays(strategy, supportedConfig) {
10
+ if (strategy === 'quick' && supportedConfig) {
11
+ // Quick mode with driver config: use supported values or fall back to common
12
+ return {
13
+ baudRates: supportedConfig.validBaudRates ?? constants_js_1.COMMON_BAUD_RATES,
14
+ parities: supportedConfig.validParity ?? constants_js_1.STANDARD_PARITY,
15
+ dataBits: supportedConfig.validDataBits ?? constants_js_1.STANDARD_DATA_BITS,
16
+ stopBits: supportedConfig.validStopBits ?? constants_js_1.STANDARD_STOP_BITS,
17
+ addressRange: supportedConfig.validAddressRange ?? [constants_js_1.MIN_SLAVE_ID, constants_js_1.MAX_SLAVE_ID],
18
+ };
19
+ }
20
+ if (strategy === 'thorough') {
21
+ // Thorough mode: use supported config if provided, otherwise standard Modbus
22
+ return {
23
+ baudRates: supportedConfig?.validBaudRates ?? constants_js_1.STANDARD_BAUD_RATES,
24
+ parities: supportedConfig?.validParity ?? constants_js_1.STANDARD_PARITY,
25
+ dataBits: supportedConfig?.validDataBits ?? constants_js_1.STANDARD_DATA_BITS,
26
+ stopBits: supportedConfig?.validStopBits ?? constants_js_1.STANDARD_STOP_BITS,
27
+ addressRange: supportedConfig?.validAddressRange ?? [constants_js_1.MIN_SLAVE_ID, constants_js_1.MAX_SLAVE_ID],
28
+ };
29
+ }
30
+ // Quick mode without driver config: use common parameters
31
+ return {
32
+ baudRates: constants_js_1.COMMON_BAUD_RATES,
33
+ parities: constants_js_1.STANDARD_PARITY,
34
+ dataBits: constants_js_1.COMMON_DATA_BITS,
35
+ stopBits: constants_js_1.COMMON_STOP_BITS,
36
+ addressRange: [constants_js_1.MIN_SLAVE_ID, constants_js_1.MAX_SLAVE_ID],
37
+ };
38
+ }
39
+ /**
40
+ * Count the total number of parameter combinations without materializing them
41
+ *
42
+ * This is much more efficient than Array.from(generateParameterCombinations()).length
43
+ * as it calculates the count mathematically instead of generating all combinations.
44
+ *
45
+ * @param options - Generator options
46
+ * @returns Total number of combinations that will be generated
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const count = countParameterCombinations({ strategy: 'quick' })
51
+ * console.log(`Will test ${count} combinations`) // Will test 3952 combinations
52
+ * ```
53
+ */
54
+ function countParameterCombinations(options) {
55
+ const { strategy, supportedConfig } = options;
56
+ const { baudRates, parities, dataBits, stopBits, addressRange } = getParameterArrays(strategy, supportedConfig);
57
+ // Calculate address count
58
+ const [minId, maxId] = addressRange;
59
+ const addressCount = maxId - minId + 1;
60
+ // Total combinations = addresses × baud rates × parities × data bits × stop bits
61
+ return addressCount * baudRates.length * parities.length * dataBits.length * stopBits.length;
62
+ }
63
+ //# sourceMappingURL=parameter-generator-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-generator-utils.js","sourceRoot":"","sources":["../../../../src/discovery/parameter-generator-utils.ts"],"names":[],"mappings":";;AAwBA,gDAwCC;AAiBD,gEAcC;AAvFD,iDAUuB;AAGvB;;GAEG;AACH,SAAgB,kBAAkB,CAChC,QAA2B,EAC3B,eAAuC;IAQvC,IAAI,QAAQ,KAAK,OAAO,IAAI,eAAe,EAAE,CAAC;QAC5C,6EAA6E;QAC7E,OAAO;YACL,SAAS,EAAE,eAAe,CAAC,cAAc,IAAI,gCAAiB;YAC9D,QAAQ,EAAE,eAAe,CAAC,WAAW,IAAI,8BAAe;YACxD,QAAQ,EAAE,eAAe,CAAC,aAAa,IAAI,iCAAkB;YAC7D,QAAQ,EAAE,eAAe,CAAC,aAAa,IAAI,iCAAkB;YAC7D,YAAY,EAAE,eAAe,CAAC,iBAAiB,IAAI,CAAC,2BAAY,EAAE,2BAAY,CAAC;SAChF,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,6EAA6E;QAC7E,OAAO;YACL,SAAS,EAAE,eAAe,EAAE,cAAc,IAAI,kCAAmB;YACjE,QAAQ,EAAE,eAAe,EAAE,WAAW,IAAI,8BAAe;YACzD,QAAQ,EAAE,eAAe,EAAE,aAAa,IAAI,iCAAkB;YAC9D,QAAQ,EAAE,eAAe,EAAE,aAAa,IAAI,iCAAkB;YAC9D,YAAY,EAAE,eAAe,EAAE,iBAAiB,IAAI,CAAC,2BAAY,EAAE,2BAAY,CAAC;SACjF,CAAA;IACH,CAAC;IAED,0DAA0D;IAC1D,OAAO;QACL,SAAS,EAAE,gCAAiB;QAC5B,QAAQ,EAAE,8BAAe;QACzB,QAAQ,EAAE,+BAAgB;QAC1B,QAAQ,EAAE,+BAAgB;QAC1B,YAAY,EAAE,CAAC,2BAAY,EAAE,2BAAY,CAAC;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,0BAA0B,CAAC,OAAyB;IAClE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;IAE7C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAClF,QAAQ,EACR,eAAe,CAChB,CAAA;IAED,0BAA0B;IAC1B,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,YAAY,CAAA;IACnC,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAA;IAEtC,iFAAiF;IACjF,OAAO,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;AAC9F,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-generator.d.ts","sourceRoot":"","sources":["../../../../src/discovery/parameter-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACR,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAKhC;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,QAAQ,EAAE,iBAAiB,CAAA;IAE3B,gEAAgE;IAChE,aAAa,CAAC,EAAE,mBAAmB,CAAA;IAEnC,0DAA0D;IAC1D,eAAe,CAAC,EAAE,qBAAqB,CAAA;CACxC;AAqED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,YAAY,EAAE;QACZ,QAAQ,EAAE,QAAQ,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,QAAQ,CAAA;QAClB,QAAQ,EAAE,QAAQ,CAAA;KACnB,CAAA;IACD,qFAAqF;IACrF,YAAY,EAAE,oBAAoB,EAAE,CAAA;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAiB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC,cAAc,CAAC,CA8C7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAiB,6BAA6B,CAC5C,OAAO,EAAE,gBAAgB,GACxB,SAAS,CAAC,oBAAoB,CAAC,CAsCjC"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateParameterGroups = generateParameterGroups;
4
+ exports.generateParameterCombinations = generateParameterCombinations;
5
+ const constants_js_1 = require("./constants.js");
6
+ const parameter_generator_utils_js_1 = require("./parameter-generator-utils.js");
7
+ /**
8
+ * Clamp slave ID to valid Modbus range [1, 247]
9
+ */
10
+ function clampSlaveId(id) {
11
+ return Math.max(constants_js_1.MIN_SLAVE_ID, Math.min(constants_js_1.MAX_SLAVE_ID, id));
12
+ }
13
+ /**
14
+ * Generate ordered list of slave IDs to test
15
+ *
16
+ * Priority order:
17
+ * 1. Default address (if provided)
18
+ * 2. Address 1 (most common)
19
+ * 3. Address 2
20
+ * 4. Remaining addresses sequentially (3, 4, 5, ...)
21
+ */
22
+ function* generateSlaveIds(range, defaultAddress) {
23
+ const [minId, maxId] = range;
24
+ const start = clampSlaveId(minId);
25
+ const end = clampSlaveId(maxId);
26
+ const yielded = new Set();
27
+ // Helper to yield if not already yielded and in range
28
+ function* yieldIfValid(id) {
29
+ const clamped = clampSlaveId(id);
30
+ if (clamped >= start && clamped <= end && !yielded.has(clamped)) {
31
+ yielded.add(clamped);
32
+ yield clamped;
33
+ }
34
+ }
35
+ // 1. Default address first
36
+ if (defaultAddress !== undefined) {
37
+ yield* yieldIfValid(defaultAddress);
38
+ }
39
+ // 2. Common addresses (1, 2)
40
+ yield* yieldIfValid(1);
41
+ yield* yieldIfValid(2);
42
+ // 3. Remaining addresses sequentially
43
+ for (let id = start; id <= end; id++) {
44
+ if (!yielded.has(id)) {
45
+ yielded.add(id);
46
+ yield id;
47
+ }
48
+ }
49
+ }
50
+ /**
51
+ * Prioritize default configuration values in parameter arrays
52
+ *
53
+ * Moves default values to the front of arrays while preserving uniqueness
54
+ */
55
+ function prioritizeDefaults(array, defaultValue) {
56
+ if (defaultValue === undefined || !array.includes(defaultValue)) {
57
+ return array;
58
+ }
59
+ // Move default to front, remove duplicates
60
+ return [defaultValue, ...array.filter((v) => v !== defaultValue)];
61
+ }
62
+ /**
63
+ * Generate parameter combinations grouped by serial configuration
64
+ *
65
+ * This is a memory-efficient alternative to materializing all combinations.
66
+ * Instead of creating all ~1500+ combinations at once, this generator yields
67
+ * groups of ~247 combinations at a time (one per serial config).
68
+ *
69
+ * Each group shares the same serial parameters (baud, parity, data bits, stop bits)
70
+ * but has different slave IDs. This matches how the scanner works - it creates
71
+ * one connection per serial config and tests all slave IDs with that connection.
72
+ *
73
+ * @param options - Generation options
74
+ * @yields Parameter groups to test
75
+ *
76
+ * @example Iterate over groups without materializing all combinations
77
+ * ```typescript
78
+ * for (const group of generateParameterGroups(options)) {
79
+ * // Only this group's ~247 combinations are in memory
80
+ * const { serialParams, combinations } = group
81
+ * // ... use combinations ...
82
+ * }
83
+ * ```
84
+ */
85
+ function* generateParameterGroups(options) {
86
+ const { strategy, defaultConfig, supportedConfig } = options;
87
+ // Get parameter arrays
88
+ let { baudRates, parities, dataBits, stopBits } = (0, parameter_generator_utils_js_1.getParameterArrays)(strategy, supportedConfig);
89
+ const { addressRange } = (0, parameter_generator_utils_js_1.getParameterArrays)(strategy, supportedConfig);
90
+ // Prioritize default values to test them first
91
+ if (defaultConfig) {
92
+ baudRates = prioritizeDefaults(baudRates, defaultConfig.baudRate);
93
+ parities = prioritizeDefaults(parities, defaultConfig.parity);
94
+ dataBits = prioritizeDefaults(dataBits, defaultConfig.dataBits);
95
+ stopBits = prioritizeDefaults(stopBits, defaultConfig.stopBits);
96
+ }
97
+ // Generate slave IDs once (reused for each serial config)
98
+ const slaveIds = Array.from(generateSlaveIds(addressRange, defaultConfig?.defaultAddress));
99
+ // Generate groups: iterate serial params (baud × parity × data × stop)
100
+ // For each serial config, create a group with all slave IDs
101
+ for (const baudRate of baudRates) {
102
+ for (const parity of parities) {
103
+ for (const dataBits_ of dataBits) {
104
+ for (const stopBits_ of stopBits) {
105
+ // Build combinations for this serial config
106
+ const combinations = slaveIds.map((slaveId) => ({
107
+ slaveId,
108
+ baudRate,
109
+ parity,
110
+ dataBits: dataBits_,
111
+ stopBits: stopBits_,
112
+ }));
113
+ yield {
114
+ serialParams: {
115
+ baudRate,
116
+ parity,
117
+ dataBits: dataBits_,
118
+ stopBits: stopBits_,
119
+ },
120
+ combinations,
121
+ };
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Generate all parameter combinations for Modbus device discovery
129
+ *
130
+ * Produces combinations in priority order:
131
+ * 1. Default configuration (if provided) tested first
132
+ * 2. Common slave addresses (1, 2) before others
133
+ * 3. Common baud rates before exotic ones
134
+ *
135
+ * @param options - Generation options
136
+ * @yields Parameter combinations to test
137
+ *
138
+ * @example Quick discovery with driver config
139
+ * ```typescript
140
+ * const combinations = generateParameterCombinations({
141
+ * strategy: 'quick',
142
+ * defaultConfig: { baudRate: 9600, parity: 'even', ... },
143
+ * supportedConfig: { validBaudRates: [9600, 19200], ... }
144
+ * })
145
+ * ```
146
+ *
147
+ * @example Thorough discovery without driver
148
+ * ```typescript
149
+ * const combinations = generateParameterCombinations({
150
+ * strategy: 'thorough'
151
+ * })
152
+ * ```
153
+ */
154
+ function* generateParameterCombinations(options) {
155
+ const { strategy, defaultConfig, supportedConfig } = options;
156
+ // Get parameter arrays
157
+ let { baudRates, parities, dataBits, stopBits } = (0, parameter_generator_utils_js_1.getParameterArrays)(strategy, supportedConfig);
158
+ const { addressRange } = (0, parameter_generator_utils_js_1.getParameterArrays)(strategy, supportedConfig);
159
+ // Prioritize default values to test them first
160
+ if (defaultConfig) {
161
+ baudRates = prioritizeDefaults(baudRates, defaultConfig.baudRate);
162
+ parities = prioritizeDefaults(parities, defaultConfig.parity);
163
+ dataBits = prioritizeDefaults(dataBits, defaultConfig.dataBits);
164
+ stopBits = prioritizeDefaults(stopBits, defaultConfig.stopBits);
165
+ }
166
+ // Generate combinations in priority order:
167
+ // - Default config combination first
168
+ // - Then iterate: slave IDs (prioritized) × baud rates (prioritized) × parity × data × stop
169
+ const slaveIds = Array.from(generateSlaveIds(addressRange, defaultConfig?.defaultAddress));
170
+ for (const slaveId of slaveIds) {
171
+ for (const baudRate of baudRates) {
172
+ for (const parity of parities) {
173
+ for (const dataBits_ of dataBits) {
174
+ for (const stopBits_ of stopBits) {
175
+ yield {
176
+ slaveId,
177
+ baudRate,
178
+ parity,
179
+ dataBits: dataBits_,
180
+ stopBits: stopBits_,
181
+ };
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ //# sourceMappingURL=parameter-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-generator.js","sourceRoot":"","sources":["../../../../src/discovery/parameter-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../src/discovery/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,eAAe;IAKd,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJ9C,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAe;gBAEnB,iBAAiB,EAAE,MAAM;IAItD;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAyB5D;;OAEG;IACH,OAAO,CAAC,cAAc;CAgBvB"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgressTracker = void 0;
4
+ /**
5
+ * Simple progress tracker for discovery operations
6
+ */
7
+ class ProgressTracker {
8
+ constructor(totalCombinations) {
9
+ this.totalCombinations = totalCombinations;
10
+ this.lastUpdateTime = 0;
11
+ this.updateIntervalMs = 1000; // Update every second
12
+ this.startTime = Date.now();
13
+ }
14
+ /**
15
+ * Update progress and return formatted status string
16
+ * Only returns a new string if enough time has passed since last update
17
+ *
18
+ * @param current - Current combination index
19
+ * @param devicesFound - Number of devices found so far
20
+ * @returns Progress string or null if no update needed
21
+ */
22
+ update(current, devicesFound) {
23
+ const now = Date.now();
24
+ // Throttle updates to avoid excessive console output
25
+ if (now - this.lastUpdateTime < this.updateIntervalMs && current < this.totalCombinations) {
26
+ return null;
27
+ }
28
+ this.lastUpdateTime = now;
29
+ const percentage = Math.round((current / this.totalCombinations) * 100);
30
+ const elapsed = Math.floor((now - this.startTime) / 1000);
31
+ // Calculate ETA
32
+ let eta = '';
33
+ if (current > 0 && current < this.totalCombinations && elapsed > 0) {
34
+ const rate = current / elapsed;
35
+ const remaining = this.totalCombinations - current;
36
+ const etaSeconds = Math.round(remaining / rate);
37
+ eta = ` | ETA: ${this.formatDuration(etaSeconds)}`;
38
+ }
39
+ return `Progress: ${percentage}% (${current}/${this.totalCombinations}) | Devices found: ${devicesFound} | Elapsed: ${this.formatDuration(elapsed)}${eta}`;
40
+ }
41
+ /**
42
+ * Format duration in seconds to human-readable string
43
+ */
44
+ formatDuration(seconds) {
45
+ if (seconds < 60) {
46
+ return `${seconds}s`;
47
+ }
48
+ const minutes = Math.floor(seconds / 60);
49
+ const remainingSeconds = seconds % 60;
50
+ if (minutes < 60) {
51
+ return `${minutes}m ${remainingSeconds}s`;
52
+ }
53
+ const hours = Math.floor(minutes / 60);
54
+ const remainingMinutes = minutes % 60;
55
+ return `${hours}h ${remainingMinutes}m`;
56
+ }
57
+ }
58
+ exports.ProgressTracker = ProgressTracker;
59
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../src/discovery/progress.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,eAAe;IAK1B,YAA6B,iBAAyB;QAAzB,sBAAiB,GAAjB,iBAAiB,CAAQ;QAH9C,mBAAc,GAAW,CAAC,CAAA;QACjB,qBAAgB,GAAW,IAAI,CAAA,CAAC,sBAAsB;QAGrE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,OAAe,EAAE,YAAoB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,qDAAqD;QACrD,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1F,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,GAAG,CAAA;QAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,CAAA;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;QAEzD,gBAAgB;QAChB,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAA;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAA;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;YAC/C,GAAG,GAAG,WAAW,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAA;QACpD,CAAC;QAED,OAAO,aAAa,UAAU,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,sBAAsB,YAAY,eAAe,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,CAAA;IAC5J,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe;QACpC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,GAAG,CAAA;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;QACxC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAA;QAErC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAA;QAC3C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;QACtC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAA;QACrC,OAAO,GAAG,KAAK,KAAK,gBAAgB,GAAG,CAAA;IACzC,CAAC;CACF;AA7DD,0CA6DC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../../src/discovery/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAExF,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAA;AAEjC;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;IAC5D,mCAAmC;IACnC,cAAc,EAAE,0BAA0B,CAAA;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAA;IAEZ,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAA;IAEf,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAA;IAEf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAE3E,4BAA4B;IAC5B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAElD,+DAA+D;IAC/D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,KAAK,IAAI,CAAA;CAClG;AAsCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsH7B"}