@ya-modbus/mqtt-bridge 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 (145) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/bin/ya-modbus-bridge.d.ts.map +1 -0
  3. package/dist/cjs/bin/ya-modbus-bridge.js +12 -0
  4. package/dist/cjs/bin/ya-modbus-bridge.js.map +1 -0
  5. package/dist/cjs/package.json +1 -0
  6. package/dist/cjs/src/cli.d.ts.map +1 -0
  7. package/dist/cjs/src/cli.js +113 -0
  8. package/dist/cjs/src/cli.js.map +1 -0
  9. package/dist/cjs/src/device-manager.d.ts.map +1 -0
  10. package/dist/cjs/src/device-manager.js +82 -0
  11. package/dist/cjs/src/device-manager.js.map +1 -0
  12. package/dist/cjs/src/driver-loader.d.ts.map +1 -0
  13. package/dist/cjs/src/driver-loader.js +122 -0
  14. package/dist/cjs/src/driver-loader.js.map +1 -0
  15. package/dist/cjs/src/index.d.ts.map +1 -0
  16. package/dist/cjs/src/index.js +291 -0
  17. package/dist/cjs/src/index.js.map +1 -0
  18. package/dist/cjs/src/polling-scheduler.d.ts.map +1 -0
  19. package/dist/cjs/src/polling-scheduler.js +130 -0
  20. package/dist/cjs/src/polling-scheduler.js.map +1 -0
  21. package/dist/cjs/src/types.d.ts.map +1 -0
  22. package/dist/cjs/src/types.js +3 -0
  23. package/dist/{src → cjs/src}/types.js.map +1 -1
  24. package/dist/cjs/src/utils/config-validator.d.ts.map +1 -0
  25. package/dist/cjs/src/utils/config-validator.js +35 -0
  26. package/dist/cjs/src/utils/config-validator.js.map +1 -0
  27. package/dist/cjs/src/utils/config.d.ts.map +1 -0
  28. package/dist/cjs/src/utils/config.js +55 -0
  29. package/dist/cjs/src/utils/config.js.map +1 -0
  30. package/dist/cjs/src/utils/device-validation.d.ts.map +1 -0
  31. package/dist/cjs/src/utils/device-validation.js +74 -0
  32. package/dist/cjs/src/utils/device-validation.js.map +1 -0
  33. package/dist/cjs/src/utils/package-info.d.ts.map +1 -0
  34. package/dist/cjs/src/utils/package-info.js +30 -0
  35. package/dist/cjs/src/utils/package-info.js.map +1 -0
  36. package/dist/cjs/src/utils/process.d.ts.map +1 -0
  37. package/dist/cjs/src/utils/process.js +16 -0
  38. package/dist/cjs/src/utils/process.js.map +1 -0
  39. package/dist/cjs/src/utils/test-utils.d.ts.map +1 -0
  40. package/dist/cjs/src/utils/test-utils.js +556 -0
  41. package/dist/cjs/src/utils/test-utils.js.map +1 -0
  42. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  43. package/dist/esm/bin/ya-modbus-bridge.d.ts +9 -0
  44. package/dist/esm/bin/ya-modbus-bridge.d.ts.map +1 -0
  45. package/dist/esm/bin/ya-modbus-bridge.js.map +1 -0
  46. package/dist/esm/package.json +1 -0
  47. package/dist/esm/src/cli.d.ts +4 -0
  48. package/dist/esm/src/cli.d.ts.map +1 -0
  49. package/dist/esm/src/cli.js.map +1 -0
  50. package/dist/esm/src/device-manager.d.ts +17 -0
  51. package/dist/esm/src/device-manager.d.ts.map +1 -0
  52. package/dist/{src → esm/src}/device-manager.js +2 -3
  53. package/dist/esm/src/device-manager.js.map +1 -0
  54. package/dist/esm/src/driver-loader.d.ts +53 -0
  55. package/dist/esm/src/driver-loader.d.ts.map +1 -0
  56. package/dist/{src → esm/src}/driver-loader.js +2 -4
  57. package/dist/esm/src/driver-loader.js.map +1 -0
  58. package/dist/esm/src/index.d.ts +13 -0
  59. package/dist/esm/src/index.d.ts.map +1 -0
  60. package/dist/esm/src/index.js.map +1 -0
  61. package/dist/esm/src/polling-scheduler.d.ts +48 -0
  62. package/dist/esm/src/polling-scheduler.d.ts.map +1 -0
  63. package/dist/{src → esm/src}/polling-scheduler.js +2 -4
  64. package/dist/esm/src/polling-scheduler.js.map +1 -0
  65. package/dist/esm/src/types.d.ts +86 -0
  66. package/dist/esm/src/types.d.ts.map +1 -0
  67. package/dist/esm/src/types.js.map +1 -0
  68. package/dist/esm/src/utils/config-validator.d.ts +3 -0
  69. package/dist/esm/src/utils/config-validator.d.ts.map +1 -0
  70. package/dist/esm/src/utils/config-validator.js.map +1 -0
  71. package/dist/esm/src/utils/config.d.ts +3 -0
  72. package/dist/esm/src/utils/config.d.ts.map +1 -0
  73. package/dist/esm/src/utils/config.js.map +1 -0
  74. package/dist/esm/src/utils/device-validation.d.ts +31 -0
  75. package/dist/esm/src/utils/device-validation.d.ts.map +1 -0
  76. package/dist/esm/src/utils/device-validation.js.map +1 -0
  77. package/dist/esm/src/utils/package-info.d.ts +5 -0
  78. package/dist/esm/src/utils/package-info.d.ts.map +1 -0
  79. package/dist/esm/src/utils/package-info.js +27 -0
  80. package/dist/esm/src/utils/package-info.js.map +1 -0
  81. package/dist/esm/src/utils/process.d.ts +10 -0
  82. package/dist/esm/src/utils/process.d.ts.map +1 -0
  83. package/dist/esm/src/utils/process.js.map +1 -0
  84. package/dist/esm/src/utils/test-utils.d.ts +313 -0
  85. package/dist/esm/src/utils/test-utils.d.ts.map +1 -0
  86. package/dist/esm/src/utils/test-utils.js.map +1 -0
  87. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  88. package/package.json +27 -10
  89. package/dist/bin/ya-modbus-bridge.d.ts.map +0 -1
  90. package/dist/bin/ya-modbus-bridge.js.map +0 -1
  91. package/dist/src/cli.d.ts.map +0 -1
  92. package/dist/src/cli.js.map +0 -1
  93. package/dist/src/device-manager.d.ts.map +0 -1
  94. package/dist/src/device-manager.js.map +0 -1
  95. package/dist/src/driver-loader.d.ts.map +0 -1
  96. package/dist/src/driver-loader.js.map +0 -1
  97. package/dist/src/index.d.ts.map +0 -1
  98. package/dist/src/index.js.map +0 -1
  99. package/dist/src/polling-scheduler.d.ts.map +0 -1
  100. package/dist/src/polling-scheduler.js.map +0 -1
  101. package/dist/src/types.d.ts.map +0 -1
  102. package/dist/src/utils/__mocks__/package-info.d.ts +0 -9
  103. package/dist/src/utils/__mocks__/package-info.d.ts.map +0 -1
  104. package/dist/src/utils/__mocks__/package-info.js +0 -11
  105. package/dist/src/utils/__mocks__/package-info.js.map +0 -1
  106. package/dist/src/utils/__mocks__/process.d.ts +0 -20
  107. package/dist/src/utils/__mocks__/process.d.ts.map +0 -1
  108. package/dist/src/utils/__mocks__/process.js +0 -37
  109. package/dist/src/utils/__mocks__/process.js.map +0 -1
  110. package/dist/src/utils/config-validator.d.ts.map +0 -1
  111. package/dist/src/utils/config-validator.js.map +0 -1
  112. package/dist/src/utils/config.d.ts.map +0 -1
  113. package/dist/src/utils/config.js.map +0 -1
  114. package/dist/src/utils/device-validation.d.ts.map +0 -1
  115. package/dist/src/utils/device-validation.js.map +0 -1
  116. package/dist/src/utils/package-info.d.ts.map +0 -1
  117. package/dist/src/utils/package-info.js +0 -11
  118. package/dist/src/utils/package-info.js.map +0 -1
  119. package/dist/src/utils/process.d.ts.map +0 -1
  120. package/dist/src/utils/process.js.map +0 -1
  121. package/dist/src/utils/test-utils.d.ts.map +0 -1
  122. package/dist/src/utils/test-utils.js.map +0 -1
  123. package/dist/tsconfig.tsbuildinfo +0 -1
  124. /package/dist/{bin → cjs/bin}/ya-modbus-bridge.d.ts +0 -0
  125. /package/dist/{src → cjs/src}/cli.d.ts +0 -0
  126. /package/dist/{src → cjs/src}/device-manager.d.ts +0 -0
  127. /package/dist/{src → cjs/src}/driver-loader.d.ts +0 -0
  128. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  129. /package/dist/{src → cjs/src}/polling-scheduler.d.ts +0 -0
  130. /package/dist/{src → cjs/src}/types.d.ts +0 -0
  131. /package/dist/{src → cjs/src}/utils/config-validator.d.ts +0 -0
  132. /package/dist/{src → cjs/src}/utils/config.d.ts +0 -0
  133. /package/dist/{src → cjs/src}/utils/device-validation.d.ts +0 -0
  134. /package/dist/{src → cjs/src}/utils/package-info.d.ts +0 -0
  135. /package/dist/{src → cjs/src}/utils/process.d.ts +0 -0
  136. /package/dist/{src → cjs/src}/utils/test-utils.d.ts +0 -0
  137. /package/dist/{bin → esm/bin}/ya-modbus-bridge.js +0 -0
  138. /package/dist/{src → esm/src}/cli.js +0 -0
  139. /package/dist/{src → esm/src}/index.js +0 -0
  140. /package/dist/{src → esm/src}/types.js +0 -0
  141. /package/dist/{src → esm/src}/utils/config-validator.js +0 -0
  142. /package/dist/{src → esm/src}/utils/config.js +0 -0
  143. /package/dist/{src → esm/src}/utils/device-validation.js +0 -0
  144. /package/dist/{src → esm/src}/utils/process.js +0 -0
  145. /package/dist/{src → esm/src}/utils/test-utils.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-validation.js","sourceRoot":"","sources":["../../../../src/utils/device-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../../../../src/utils/package-info.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA2BzE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPackageInfo = getPackageInfo;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const node_url_1 = require("node:url");
7
+ function getPackageInfo() {
8
+ // Determine the package root differently for ESM vs CJS builds
9
+ // In CJS: __dirname is available
10
+ // In ESM: use import.meta.url
11
+ let pkgPath;
12
+ // Check if we're in a CommonJS context by testing for __dirname
13
+ // This works because typeof __dirname is 'undefined' in ESM but 'string' in CJS
14
+ if (typeof __dirname !== 'undefined') {
15
+ // CommonJS: file is at dist/cjs/src/utils/package-info.js
16
+ pkgPath = (0, node_path_1.join)(__dirname, '../../../../package.json');
17
+ }
18
+ else {
19
+ // ESM: file is at dist/esm/src/utils/package-info.js
20
+ // Use import.meta.url (only executed in ESM builds where it's valid)
21
+ // TypeScript will complain about import.meta in CJS, but this branch is never reached in CJS runtime
22
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
23
+ // @ts-ignore - import.meta is valid in ESM but TypeScript CJS build sees all code
24
+ const currentFileUrl = new URL(import.meta.url);
25
+ pkgPath = (0, node_url_1.fileURLToPath)(new URL('../../../../package.json', currentFileUrl));
26
+ }
27
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, 'utf-8'));
28
+ return pkg;
29
+ }
30
+ //# sourceMappingURL=package-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.js","sourceRoot":"","sources":["../../../../src/utils/package-info.ts"],"names":[],"mappings":";;AAIA,wCA2BC;AA/BD,qCAAsC;AACtC,yCAAgC;AAChC,uCAAwC;AAExC,SAAgB,cAAc;IAC5B,+DAA+D;IAC/D,iCAAiC;IACjC,8BAA8B;IAE9B,IAAI,OAAe,CAAA;IAEnB,gEAAgE;IAChE,gFAAgF;IAChF,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,0DAA0D;QAC1D,OAAO,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,0BAA0B,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,qEAAqE;QACrE,qGAAqG;QACrG,6DAA6D;QAC7D,kFAAkF;QAClF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/C,OAAO,GAAG,IAAA,wBAAa,EAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,cAAc,CAAC,CAAC,CAAA;IAC9E,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAGpD,CAAA;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CAC5D;AAED,eAAO,MAAM,YAAY,EAAE,YAQ1B,CAAA"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Process utilities for signal handling and exit
4
+ * Extracted to separate module for testability
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.processUtils = void 0;
8
+ exports.processUtils = {
9
+ exit(code) {
10
+ process.exit(code);
11
+ },
12
+ onSignal(signal, handler) {
13
+ process.on(signal, handler);
14
+ },
15
+ };
16
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../src/utils/process.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOU,QAAA,YAAY,GAAiB;IACxC,IAAI,CAAC,IAAY;QACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,QAAQ,CAAC,MAAsB,EAAE,OAAmB;QAClD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,CAAC;CACF,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/test-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,556 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withTimeout = withTimeout;
4
+ exports.waitForAllClientsToDisconnect = waitForAllClientsToDisconnect;
5
+ exports.waitForClientReady = waitForClientReady;
6
+ exports.waitForClientDisconnect = waitForClientDisconnect;
7
+ exports.waitForPublish = waitForPublish;
8
+ exports.waitForSubscribe = waitForSubscribe;
9
+ exports.waitForUnsubscribe = waitForUnsubscribe;
10
+ exports.createTestBridgeConfig = createTestBridgeConfig;
11
+ exports.subscribeAndWait = subscribeAndWait;
12
+ exports.publishAndWait = publishAndWait;
13
+ exports.createMessageCollector = createMessageCollector;
14
+ exports.withBridge = withBridge;
15
+ exports.withBridgeAndMockDriver = withBridgeAndMockDriver;
16
+ exports.startTestBroker = startTestBroker;
17
+ exports.createMockTransport = createMockTransport;
18
+ exports.createMockTransportManager = createMockTransportManager;
19
+ exports.createMockDriver = createMockDriver;
20
+ exports.createTestBridgeWithMockDriver = createTestBridgeWithMockDriver;
21
+ const tslib_1 = require("tslib");
22
+ // Non-null assertions are used for event handler cleanup where the handlers are guaranteed to be defined
23
+ // by control flow. Using optional chaining would create untestable branches for impossible null cases.
24
+ const node_net_1 = require("node:net");
25
+ const globals_1 = require("@jest/globals");
26
+ const aedes_1 = tslib_1.__importDefault(require("aedes"));
27
+ const driver_loader_js_1 = require("../driver-loader.js");
28
+ const index_js_1 = require("../index.js");
29
+ /**
30
+ * Race a promise against a timeout, properly cleaning up the timer
31
+ *
32
+ * This ensures Jest can exit cleanly by clearing the timeout when the promise settles.
33
+ * Always use this instead of bare Promise.race with setTimeout.
34
+ *
35
+ * @param promise - The promise to race
36
+ * @param timeoutMs - Timeout in milliseconds
37
+ * @param errorMessage - Error message if timeout occurs, or a function that returns the message
38
+ * @returns Promise that resolves/rejects with the first settled result
39
+ *
40
+ * @example
41
+ * // With static message
42
+ * await withTimeout(
43
+ * clientReadyPromise,
44
+ * 5000,
45
+ * 'Client ready timeout'
46
+ * )
47
+ *
48
+ * @example
49
+ * // With dynamic message (evaluated when timeout occurs)
50
+ * await withTimeout(
51
+ * disconnectPromise,
52
+ * 5000,
53
+ * () => `Still connected: ${broker.connectedClients}`
54
+ * )
55
+ */
56
+ function withTimeout(promise, timeoutMs, errorMessage) {
57
+ let timeoutId;
58
+ const timeoutPromise = new Promise((_, reject) => {
59
+ timeoutId = setTimeout(() => {
60
+ const message = typeof errorMessage === 'function' ? errorMessage() : errorMessage;
61
+ reject(new Error(message));
62
+ }, timeoutMs);
63
+ });
64
+ return Promise.race([promise, timeoutPromise]).finally(() => {
65
+ clearTimeout(timeoutId);
66
+ });
67
+ }
68
+ /**
69
+ * Wait for all MQTT clients to disconnect from a test broker
70
+ *
71
+ * @param broker - The test broker to monitor
72
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 5000)
73
+ * @returns Promise that resolves when all clients disconnect or rejects on timeout
74
+ *
75
+ * @example
76
+ * await waitForAllClientsToDisconnect(broker, 5000)
77
+ */
78
+ function waitForAllClientsToDisconnect(broker, timeoutMs = 5000) {
79
+ if (broker.broker.connectedClients === 0) {
80
+ return Promise.resolve();
81
+ }
82
+ let onDisconnect;
83
+ const disconnectPromise = new Promise((resolve) => {
84
+ onDisconnect = () => {
85
+ if (broker.broker.connectedClients === 0) {
86
+ broker.broker.off('clientDisconnect', onDisconnect);
87
+ resolve();
88
+ }
89
+ };
90
+ broker.broker.on('clientDisconnect', onDisconnect);
91
+ });
92
+ return withTimeout(disconnectPromise, timeoutMs, () => `Timeout waiting for clients to disconnect. Still connected: ${broker.broker.connectedClients}`).finally(() => {
93
+ broker.broker.off('clientDisconnect', onDisconnect);
94
+ });
95
+ }
96
+ /**
97
+ * Wait for a client to be ready
98
+ *
99
+ * @param broker - The test broker to monitor
100
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 2000)
101
+ * @returns Promise that resolves when a client is ready or rejects on timeout
102
+ *
103
+ * @example
104
+ * await waitForClientReady(broker)
105
+ */
106
+ function waitForClientReady(broker, timeoutMs = 2000) {
107
+ let onClientReady;
108
+ const clientReadyPromise = new Promise((resolve) => {
109
+ onClientReady = () => {
110
+ broker.broker.off('clientReady', onClientReady);
111
+ resolve();
112
+ };
113
+ broker.broker.on('clientReady', onClientReady);
114
+ });
115
+ return withTimeout(clientReadyPromise, timeoutMs, () => `Timeout waiting for client to be ready (connected: ${broker.broker.connectedClients})`).finally(() => {
116
+ broker.broker.off('clientReady', onClientReady);
117
+ });
118
+ }
119
+ /**
120
+ * Wait for a client to disconnect
121
+ *
122
+ * @param broker - The test broker to monitor
123
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 2000)
124
+ * @returns Promise that resolves when a client disconnects or rejects on timeout
125
+ *
126
+ * @example
127
+ * await waitForClientDisconnect(broker)
128
+ */
129
+ function waitForClientDisconnect(broker, timeoutMs = 2000) {
130
+ let onClientDisconnect;
131
+ const clientDisconnectPromise = new Promise((resolve) => {
132
+ onClientDisconnect = () => {
133
+ broker.broker.off('clientDisconnect', onClientDisconnect);
134
+ resolve();
135
+ };
136
+ broker.broker.on('clientDisconnect', onClientDisconnect);
137
+ });
138
+ return withTimeout(clientDisconnectPromise, timeoutMs, () => `Timeout waiting for client to disconnect (connected: ${broker.broker.connectedClients})`).finally(() => {
139
+ broker.broker.off('clientDisconnect', onClientDisconnect);
140
+ });
141
+ }
142
+ /**
143
+ * Wait for a publish event on the broker
144
+ *
145
+ * @param broker - The test broker to monitor
146
+ * @param topicPattern - Optional topic to match (supports wildcards)
147
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 1000)
148
+ * @returns Promise that resolves with the published packet or rejects on timeout
149
+ *
150
+ * @example
151
+ * const packet = await waitForPublish(broker, 'test/topic')
152
+ */
153
+ function waitForPublish(broker, topicPattern, timeoutMs = 1000) {
154
+ let onPublish;
155
+ const publishPromise = new Promise((resolve) => {
156
+ onPublish = (packet, _client) => {
157
+ if (!topicPattern || matchTopic(packet.topic, topicPattern)) {
158
+ broker.broker.off('publish', onPublish);
159
+ const payload = typeof packet.payload === 'string' ? Buffer.from(packet.payload) : packet.payload;
160
+ resolve({ topic: packet.topic, payload });
161
+ }
162
+ };
163
+ broker.broker.on('publish', onPublish);
164
+ });
165
+ return withTimeout(publishPromise, timeoutMs, `Timeout waiting for publish${topicPattern ? ` on topic ${topicPattern}` : ''}`).finally(() => {
166
+ broker.broker.off('publish', onPublish);
167
+ });
168
+ }
169
+ /**
170
+ * Wait for a subscribe event on the broker
171
+ *
172
+ * @param broker - The test broker to monitor
173
+ * @param topicPattern - Optional topic to match
174
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 1000)
175
+ * @returns Promise that resolves with subscriptions or rejects on timeout
176
+ *
177
+ * @example
178
+ * await waitForSubscribe(broker, 'test/topic')
179
+ */
180
+ function waitForSubscribe(broker, topicPattern, timeoutMs = 1000) {
181
+ let onSubscribe;
182
+ const subscribePromise = new Promise((resolve) => {
183
+ onSubscribe = (subscriptions) => {
184
+ if (!topicPattern || subscriptions.some((s) => matchTopic(s.topic, topicPattern))) {
185
+ broker.broker.off('subscribe', onSubscribe);
186
+ resolve(subscriptions);
187
+ }
188
+ };
189
+ broker.broker.on('subscribe', onSubscribe);
190
+ });
191
+ return withTimeout(subscribePromise, timeoutMs, `Timeout waiting for subscribe${topicPattern ? ` on topic ${topicPattern}` : ''}`).finally(() => {
192
+ broker.broker.off('subscribe', onSubscribe);
193
+ });
194
+ }
195
+ /**
196
+ * Wait for an unsubscribe event on the broker
197
+ *
198
+ * @param broker - The test broker to monitor
199
+ * @param topicPattern - Optional topic to match
200
+ * @param timeoutMs - Maximum time to wait in milliseconds (default: 1000)
201
+ * @returns Promise that resolves with unsubscriptions or rejects on timeout
202
+ *
203
+ * @example
204
+ * await waitForUnsubscribe(broker, 'test/topic')
205
+ */
206
+ function waitForUnsubscribe(broker, topicPattern, timeoutMs = 1000) {
207
+ let onUnsubscribe;
208
+ const unsubscribePromise = new Promise((resolve) => {
209
+ onUnsubscribe = (unsubscriptions) => {
210
+ if (!topicPattern || unsubscriptions.some((topic) => matchTopic(topic, topicPattern))) {
211
+ broker.broker.off('unsubscribe', onUnsubscribe);
212
+ resolve(unsubscriptions);
213
+ }
214
+ };
215
+ broker.broker.on('unsubscribe', onUnsubscribe);
216
+ });
217
+ return withTimeout(unsubscribePromise, timeoutMs, `Timeout waiting for unsubscribe${topicPattern ? ` on topic ${topicPattern}` : ''}`).finally(() => {
218
+ broker.broker.off('unsubscribe', onUnsubscribe);
219
+ });
220
+ }
221
+ /**
222
+ * Simple topic matcher that supports MQTT wildcards
223
+ *
224
+ * @param topic - The actual topic
225
+ * @param pattern - The pattern to match (supports + and # wildcards)
226
+ * @returns True if topic matches pattern
227
+ */
228
+ function matchTopic(topic, pattern) {
229
+ if (topic === pattern)
230
+ return true;
231
+ const topicParts = topic.split('/');
232
+ const patternParts = pattern.split('/');
233
+ for (let i = 0; i < patternParts.length; i++) {
234
+ if (patternParts[i] === '#') {
235
+ return true;
236
+ }
237
+ if (patternParts[i] !== '+' && patternParts[i] !== topicParts[i]) {
238
+ return false;
239
+ }
240
+ }
241
+ return topicParts.length === patternParts.length;
242
+ }
243
+ /**
244
+ * Create a test bridge configuration with optional overrides
245
+ *
246
+ * @param broker - The test broker to connect to
247
+ * @param overrides - Optional configuration overrides
248
+ * @returns Bridge configuration for testing
249
+ *
250
+ * @example
251
+ * const config = createTestBridgeConfig(broker, { topicPrefix: 'custom' })
252
+ */
253
+ function createTestBridgeConfig(broker, overrides) {
254
+ const { mqtt, ...otherOverrides } = overrides ?? {};
255
+ return {
256
+ mqtt: {
257
+ url: broker.url,
258
+ ...mqtt,
259
+ },
260
+ ...otherOverrides,
261
+ };
262
+ }
263
+ /**
264
+ * Subscribe to a topic and wait for the subscription to be registered with the broker
265
+ *
266
+ * @param bridge - The MQTT bridge instance
267
+ * @param broker - The test broker to monitor
268
+ * @param topic - Topic to subscribe to (without prefix)
269
+ * @param handler - Message handler function
270
+ * @param options - Subscribe options and topic prefix
271
+ * @returns Promise that resolves when subscription is registered
272
+ *
273
+ * @example
274
+ * await subscribeAndWait(bridge, broker, 'test/topic', (msg) => { ... })
275
+ */
276
+ async function subscribeAndWait(bridge, broker, topic, handler, options) {
277
+ const prefix = options?.prefix ?? 'modbus';
278
+ const subscribePromise = waitForSubscribe(broker, `${prefix}/${topic}`);
279
+ await bridge.subscribe(topic, handler, options);
280
+ await subscribePromise;
281
+ }
282
+ /**
283
+ * Publish a message and wait for it to be published to the broker
284
+ *
285
+ * @param bridge - The MQTT bridge instance
286
+ * @param broker - The test broker to monitor
287
+ * @param topic - Topic to publish to (without prefix)
288
+ * @param message - Message payload
289
+ * @param options - Publish options and topic prefix
290
+ * @returns Promise that resolves when message is published
291
+ *
292
+ * @example
293
+ * await publishAndWait(bridge, broker, 'test/topic', 'Hello', { qos: 1 })
294
+ */
295
+ async function publishAndWait(bridge, broker, topic, message, options) {
296
+ const prefix = options?.prefix ?? 'modbus';
297
+ const publishPromise = waitForPublish(broker, `${prefix}/${topic}`);
298
+ await bridge.publish(topic, message, options);
299
+ await publishPromise;
300
+ }
301
+ /**
302
+ * Create a message collector for capturing messages in tests
303
+ *
304
+ * @returns Message collector with handler and utilities
305
+ *
306
+ * @example
307
+ * const collector = createMessageCollector()
308
+ * await bridge.subscribe('test/topic', collector.handler)
309
+ * expect(collector.messages).toContain('Expected message')
310
+ */
311
+ function createMessageCollector() {
312
+ const messages = [];
313
+ return {
314
+ messages,
315
+ handler: (message) => messages.push(message.payload.toString()),
316
+ clear: () => {
317
+ messages.length = 0;
318
+ },
319
+ };
320
+ }
321
+ /**
322
+ * Execute a test function with a running bridge, ensuring proper cleanup
323
+ *
324
+ * Automatically starts the bridge before the test and stops it after,
325
+ * even if the test throws an error. This eliminates boilerplate and
326
+ * ensures resources are properly cleaned up.
327
+ *
328
+ * @param config - Bridge configuration
329
+ * @param testFn - Test function to execute with the running bridge (can be sync or async)
330
+ * @returns Promise that resolves when test completes and bridge is stopped
331
+ *
332
+ * @example
333
+ * await withBridge(createTestBridgeConfig(broker), async (bridge) => {
334
+ * const status = bridge.getStatus()
335
+ * expect(status.state).toBe('running')
336
+ * })
337
+ */
338
+ async function withBridge(config, testFn) {
339
+ const bridge = (0, index_js_1.createBridge)(config);
340
+ await bridge.start();
341
+ try {
342
+ await testFn(bridge);
343
+ }
344
+ finally {
345
+ await bridge.stop();
346
+ }
347
+ }
348
+ /**
349
+ * Execute a test function with a running bridge using mock driver DI
350
+ *
351
+ * Automatically sets up the bridge with injected mocks, starts it before the test,
352
+ * and stops it after. This eliminates boilerplate for tests that need to verify
353
+ * driver lifecycle with dependency injection.
354
+ *
355
+ * @param broker - The test broker to connect to
356
+ * @param testFn - Test function with bridge and mocks
357
+ * @param overrides - Optional configuration overrides
358
+ * @returns Promise that resolves when test completes and bridge is stopped
359
+ *
360
+ * @example
361
+ * await withBridgeAndMockDriver(broker, async (bridge, mocks) => {
362
+ * await bridge.addDevice({ deviceId: 'test', driver: 'mock', connection: {...} })
363
+ * expect(mocks.mockDriver.initialize).toHaveBeenCalled()
364
+ * })
365
+ */
366
+ async function withBridgeAndMockDriver(broker, testFn, overrides) {
367
+ const { config, driverLoader, mockDriver, mockTransport, mockLoadDriverFn, mockTransportManager, } = createTestBridgeWithMockDriver(broker, overrides);
368
+ const bridge = (0, index_js_1.createBridge)(config, { driverLoader });
369
+ await bridge.start();
370
+ try {
371
+ await testFn(bridge, { mockDriver, mockTransport, mockLoadDriverFn, mockTransportManager });
372
+ }
373
+ finally {
374
+ await bridge.stop();
375
+ }
376
+ }
377
+ /**
378
+ * Start an Aedes MQTT broker on a dynamic port for testing
379
+ */
380
+ async function startTestBroker(options) {
381
+ const broker = new aedes_1.default();
382
+ const server = (0, node_net_1.createServer)(broker.handle);
383
+ return new Promise((resolve, reject) => {
384
+ server.listen(options?.port, () => {
385
+ const address = server.address();
386
+ resolve({
387
+ address,
388
+ url: `mqtt://localhost:${address.port}`,
389
+ port: address.port,
390
+ broker,
391
+ server,
392
+ close: () => new Promise((resolveClose, rejectClose) => {
393
+ broker.close(() => {
394
+ server.close((err) => {
395
+ if (err) {
396
+ rejectClose(err);
397
+ }
398
+ else {
399
+ resolveClose();
400
+ }
401
+ });
402
+ });
403
+ }),
404
+ });
405
+ });
406
+ server.on('error', reject);
407
+ });
408
+ }
409
+ /**
410
+ * Create a mock transport for testing
411
+ *
412
+ * Returns a transport mock that implements the Transport interface
413
+ * with jest.fn() for all methods, allowing verification of calls.
414
+ *
415
+ * @returns Mock transport with trackable method calls
416
+ *
417
+ * @example
418
+ * const mockTransport = createMockTransport()
419
+ * mockTransport.readHoldingRegisters.mockResolvedValue([1, 2, 3])
420
+ */
421
+ function createMockTransport() {
422
+ return {
423
+ readHoldingRegisters: globals_1.jest.fn().mockResolvedValue([0, 0]),
424
+ readInputRegisters: globals_1.jest.fn().mockResolvedValue([0, 0]),
425
+ readCoils: globals_1.jest.fn().mockResolvedValue([false]),
426
+ readDiscreteInputs: globals_1.jest.fn().mockResolvedValue([false]),
427
+ writeSingleCoil: globals_1.jest.fn().mockResolvedValue(undefined),
428
+ writeSingleRegister: globals_1.jest.fn().mockResolvedValue(undefined),
429
+ writeMultipleRegisters: globals_1.jest.fn().mockResolvedValue(undefined),
430
+ writeMultipleCoils: globals_1.jest.fn().mockResolvedValue(undefined),
431
+ close: globals_1.jest.fn().mockResolvedValue(undefined),
432
+ };
433
+ }
434
+ /**
435
+ * Create a mock TransportManager for testing
436
+ *
437
+ * Returns a TransportManager mock that implements the TransportManager interface
438
+ * with jest.fn() for all methods, allowing verification of calls.
439
+ *
440
+ * @returns Mock TransportManager with trackable method calls
441
+ *
442
+ * @example
443
+ * const mockTransportManager = createMockTransportManager()
444
+ * const loader = new DriverLoader(mockLoadDriver, mockTransportManager)
445
+ */
446
+ function createMockTransportManager() {
447
+ const mockTransport = createMockTransport();
448
+ return {
449
+ getTransport: globals_1.jest.fn().mockResolvedValue(mockTransport),
450
+ getStats: globals_1.jest
451
+ .fn()
452
+ .mockReturnValue({ totalTransports: 0, rtuTransports: 0, tcpTransports: 0 }),
453
+ closeAll: globals_1.jest.fn().mockResolvedValue(undefined),
454
+ };
455
+ }
456
+ /**
457
+ * Create a mock driver for testing
458
+ *
459
+ * Returns a mock driver that implements the DeviceDriver interface
460
+ * with jest.fn() for all methods, allowing verification of calls.
461
+ *
462
+ * @param overrides - Optional property overrides
463
+ * @returns Mock driver with trackable method calls
464
+ *
465
+ * @example
466
+ * const mockDriver = createMockDriver({
467
+ * dataPoints: [{ id: 'voltage', name: 'Voltage', type: 'number', unit: 'V' }]
468
+ * })
469
+ * mockDriver.readDataPoints.mockResolvedValue({ voltage: 230 })
470
+ */
471
+ function createMockDriver(overrides) {
472
+ return {
473
+ name: overrides?.name ?? 'test-device',
474
+ manufacturer: overrides?.manufacturer ?? 'Test Manufacturer',
475
+ model: overrides?.model ?? 'TEST-001',
476
+ dataPoints: (overrides?.dataPoints ?? [
477
+ {
478
+ id: 'test-value',
479
+ name: 'Test Value',
480
+ type: 'number',
481
+ unit: 'unit',
482
+ },
483
+ ]),
484
+ readDataPoint: globals_1.jest.fn().mockResolvedValue(123),
485
+ writeDataPoint: globals_1.jest.fn().mockResolvedValue(undefined),
486
+ readDataPoints: globals_1.jest.fn().mockResolvedValue({ 'test-value': 123 }),
487
+ initialize: globals_1.jest.fn().mockResolvedValue(undefined),
488
+ destroy: globals_1.jest.fn().mockResolvedValue(undefined),
489
+ };
490
+ }
491
+ /**
492
+ * Create a test bridge configuration with mock driver injection
493
+ *
494
+ * This configures the bridge with dependency injection for testing,
495
+ * allowing integration tests to verify driver lifecycle without
496
+ * loading real driver packages.
497
+ *
498
+ * **Note**: Returns fresh mock instances on each call. Mock state does
499
+ * not persist between invocations. Each test gets independent mocks.
500
+ *
501
+ * @param broker - The test broker to connect to
502
+ * @param overrides - Optional configuration overrides
503
+ * @returns Object with bridge config and driver loader
504
+ *
505
+ * @example
506
+ * const { config, driverLoader, mockDriver } = createTestBridgeWithMockDriver(broker)
507
+ * const bridge = createBridge(config, { driverLoader })
508
+ * await bridge.addDevice({
509
+ * deviceId: 'test-device',
510
+ * driver: 'ya-modbus-driver-test',
511
+ * connection: { type: 'tcp', host: 'localhost', port: 502, slaveId: 1 },
512
+ * })
513
+ * // Verify driver lifecycle with injected mocks
514
+ * expect(mockDriver.initialize).toHaveBeenCalled()
515
+ */
516
+ function createTestBridgeWithMockDriver(broker, overrides) {
517
+ // Create first instances for single-device test convenience
518
+ const mockDriver = createMockDriver();
519
+ const mockTransport = createMockTransport();
520
+ // Mock loadDriverFn that creates NEW instances on each call for driver isolation
521
+ // First call returns the pre-created mockDriver for backward compatibility
522
+ let isFirstDriverCall = true;
523
+ const mockLoadDriverFn = globals_1.jest.fn().mockImplementation(() => {
524
+ return Promise.resolve({
525
+ createDriver: globals_1.jest.fn().mockImplementation(() => {
526
+ if (isFirstDriverCall) {
527
+ isFirstDriverCall = false;
528
+ return Promise.resolve(mockDriver);
529
+ }
530
+ return Promise.resolve(createMockDriver());
531
+ }),
532
+ });
533
+ });
534
+ // Create mock TransportManager that returns NEW transport instances for isolation
535
+ // First call returns the pre-created mockTransport for backward compatibility
536
+ let isFirstTransportCall = true;
537
+ const mockTransportManager = createMockTransportManager();
538
+ mockTransportManager.getTransport.mockImplementation(() => {
539
+ if (isFirstTransportCall) {
540
+ isFirstTransportCall = false;
541
+ return Promise.resolve(mockTransport);
542
+ }
543
+ return Promise.resolve(createMockTransport());
544
+ });
545
+ // Create DriverLoader with mocked dependencies
546
+ const driverLoader = new driver_loader_js_1.DriverLoader(mockLoadDriverFn, mockTransportManager);
547
+ return {
548
+ config: createTestBridgeConfig(broker, overrides),
549
+ driverLoader,
550
+ mockDriver,
551
+ mockTransport,
552
+ mockLoadDriverFn,
553
+ mockTransportManager,
554
+ };
555
+ }
556
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../../src/utils/test-utils.ts"],"names":[],"mappings":"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"}