@ya-modbus/transport 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 (86) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/create-modbus-transport.d.ts.map +1 -0
  3. package/dist/cjs/create-modbus-transport.js +77 -0
  4. package/dist/cjs/create-modbus-transport.js.map +1 -0
  5. package/dist/cjs/factory.d.ts.map +1 -0
  6. package/dist/cjs/factory.js +36 -0
  7. package/dist/cjs/factory.js.map +1 -0
  8. package/dist/cjs/index.d.ts.map +1 -0
  9. package/dist/cjs/index.js +26 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/manager.d.ts.map +1 -0
  12. package/dist/cjs/manager.js +136 -0
  13. package/dist/cjs/manager.js.map +1 -0
  14. package/dist/cjs/mutex-transport.d.ts.map +1 -0
  15. package/dist/cjs/mutex-transport.js +64 -0
  16. package/dist/cjs/mutex-transport.js.map +1 -0
  17. package/dist/cjs/package.json +1 -0
  18. package/dist/cjs/retry.d.ts.map +1 -0
  19. package/dist/cjs/retry.js +50 -0
  20. package/dist/cjs/retry.js.map +1 -0
  21. package/dist/cjs/rtu-transport.d.ts.map +1 -0
  22. package/dist/cjs/rtu-transport.js +28 -0
  23. package/dist/cjs/rtu-transport.js.map +1 -0
  24. package/dist/cjs/tcp-transport.d.ts.map +1 -0
  25. package/dist/cjs/tcp-transport.js +23 -0
  26. package/dist/cjs/tcp-transport.js.map +1 -0
  27. package/dist/esm/create-modbus-transport.d.ts +16 -0
  28. package/dist/esm/create-modbus-transport.d.ts.map +1 -0
  29. package/dist/esm/create-modbus-transport.js.map +1 -0
  30. package/dist/esm/factory.d.ts +22 -0
  31. package/dist/esm/factory.d.ts.map +1 -0
  32. package/dist/esm/factory.js.map +1 -0
  33. package/dist/esm/index.d.ts +14 -0
  34. package/dist/esm/index.d.ts.map +1 -0
  35. package/dist/esm/index.js.map +1 -0
  36. package/dist/esm/manager.d.ts +66 -0
  37. package/dist/esm/manager.d.ts.map +1 -0
  38. package/dist/{manager.js → esm/manager.js} +3 -1
  39. package/dist/esm/manager.js.map +1 -0
  40. package/dist/esm/mutex-transport.d.ts +26 -0
  41. package/dist/esm/mutex-transport.d.ts.map +1 -0
  42. package/dist/{mutex-transport.js → esm/mutex-transport.js} +0 -2
  43. package/dist/esm/mutex-transport.js.map +1 -0
  44. package/dist/esm/package.json +1 -0
  45. package/dist/esm/retry.d.ts +25 -0
  46. package/dist/esm/retry.d.ts.map +1 -0
  47. package/dist/esm/retry.js.map +1 -0
  48. package/dist/esm/rtu-transport.d.ts +33 -0
  49. package/dist/esm/rtu-transport.d.ts.map +1 -0
  50. package/dist/esm/rtu-transport.js.map +1 -0
  51. package/dist/esm/tcp-transport.d.ts +27 -0
  52. package/dist/esm/tcp-transport.d.ts.map +1 -0
  53. package/dist/esm/tcp-transport.js.map +1 -0
  54. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  55. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  56. package/package.json +24 -7
  57. package/dist/create-modbus-transport.d.ts.map +0 -1
  58. package/dist/create-modbus-transport.js.map +0 -1
  59. package/dist/factory.d.ts.map +0 -1
  60. package/dist/factory.js.map +0 -1
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/index.js.map +0 -1
  63. package/dist/manager.d.ts.map +0 -1
  64. package/dist/manager.js.map +0 -1
  65. package/dist/mutex-transport.d.ts.map +0 -1
  66. package/dist/mutex-transport.js.map +0 -1
  67. package/dist/retry.d.ts.map +0 -1
  68. package/dist/retry.js.map +0 -1
  69. package/dist/rtu-transport.d.ts.map +0 -1
  70. package/dist/rtu-transport.js.map +0 -1
  71. package/dist/tcp-transport.d.ts.map +0 -1
  72. package/dist/tcp-transport.js.map +0 -1
  73. /package/dist/{create-modbus-transport.d.ts → cjs/create-modbus-transport.d.ts} +0 -0
  74. /package/dist/{factory.d.ts → cjs/factory.d.ts} +0 -0
  75. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  76. /package/dist/{manager.d.ts → cjs/manager.d.ts} +0 -0
  77. /package/dist/{mutex-transport.d.ts → cjs/mutex-transport.d.ts} +0 -0
  78. /package/dist/{retry.d.ts → cjs/retry.d.ts} +0 -0
  79. /package/dist/{rtu-transport.d.ts → cjs/rtu-transport.d.ts} +0 -0
  80. /package/dist/{tcp-transport.d.ts → cjs/tcp-transport.d.ts} +0 -0
  81. /package/dist/{create-modbus-transport.js → esm/create-modbus-transport.js} +0 -0
  82. /package/dist/{factory.js → esm/factory.js} +0 -0
  83. /package/dist/{index.js → esm/index.js} +0 -0
  84. /package/dist/{retry.js → esm/retry.js} +0 -0
  85. /package/dist/{rtu-transport.js → esm/rtu-transport.js} +0 -0
  86. /package/dist/{tcp-transport.js → esm/tcp-transport.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.7.0](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/transport@0.6.0...@ya-modbus/transport@0.7.0) (2026-01-11)
7
+
8
+ ### Features
9
+
10
+ - **build:** add dual CommonJS/ESM package support ([#187](https://github.com/groupsky/ya-modbus/issues/187)) ([3d78130](https://github.com/groupsky/ya-modbus/commit/3d781304d42edba335cdc320ba25275f3b4ea6c9))
11
+
6
12
  # 0.6.0 (2026-01-04)
7
13
 
8
14
  ### Bug Fixes
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-modbus-transport.d.ts","sourceRoot":"","sources":["../../src/create-modbus-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,SAAS,CAoGX"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModbusTransport = createModbusTransport;
4
+ const retry_js_1 = require("./retry.js");
5
+ /**
6
+ * Create a Transport implementation from a ModbusRTU client
7
+ *
8
+ * This factory wraps all modbus-serial client methods with retry logic
9
+ * and converts them to the Transport interface expected by device drivers.
10
+ *
11
+ * @param client - Configured ModbusRTU client instance
12
+ * @param maxRetries - Maximum retry attempts (default: 3, use 1 for discovery to disable retries)
13
+ * @param logger - Optional callback to log retry attempts for debugging
14
+ * @returns Transport implementation
15
+ */
16
+ function createModbusTransport(client, maxRetries = 3, logger) {
17
+ return {
18
+ async readHoldingRegisters(address, count) {
19
+ return (0, retry_js_1.withRetry)(async () => {
20
+ const result = await client.readHoldingRegisters(address, count);
21
+ return result.buffer;
22
+ }, maxRetries, logger);
23
+ },
24
+ async readInputRegisters(address, count) {
25
+ return (0, retry_js_1.withRetry)(async () => {
26
+ const result = await client.readInputRegisters(address, count);
27
+ return result.buffer;
28
+ }, maxRetries, logger);
29
+ },
30
+ async readCoils(address, count) {
31
+ return (0, retry_js_1.withRetry)(async () => {
32
+ const result = await client.readCoils(address, count);
33
+ return result.buffer;
34
+ }, maxRetries, logger);
35
+ },
36
+ async readDiscreteInputs(address, count) {
37
+ return (0, retry_js_1.withRetry)(async () => {
38
+ const result = await client.readDiscreteInputs(address, count);
39
+ return result.buffer;
40
+ }, maxRetries, logger);
41
+ },
42
+ async writeSingleRegister(address, value) {
43
+ return (0, retry_js_1.withRetry)(async () => {
44
+ await client.writeRegister(address, value);
45
+ }, maxRetries, logger);
46
+ },
47
+ async writeMultipleRegisters(address, values) {
48
+ return (0, retry_js_1.withRetry)(async () => {
49
+ await client.writeRegisters(address, values);
50
+ }, maxRetries, logger);
51
+ },
52
+ async writeSingleCoil(address, value) {
53
+ return (0, retry_js_1.withRetry)(async () => {
54
+ await client.writeCoil(address, value);
55
+ }, maxRetries, logger);
56
+ },
57
+ async writeMultipleCoils(address, values) {
58
+ return (0, retry_js_1.withRetry)(async () => {
59
+ // Convert Buffer to boolean array
60
+ const bools = [];
61
+ for (let i = 0; i < values.length * 8; i++) {
62
+ const byteIndex = Math.floor(i / 8);
63
+ const bitIndex = i % 8;
64
+ const byte = values[byteIndex]; // byteIndex < values.length due to loop condition
65
+ bools.push((byte & (1 << bitIndex)) !== 0);
66
+ }
67
+ await client.writeCoils(address, bools);
68
+ }, maxRetries, logger);
69
+ },
70
+ async close() {
71
+ return new Promise((resolve) => {
72
+ client.close(resolve);
73
+ });
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=create-modbus-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-modbus-transport.js","sourceRoot":"","sources":["../../src/create-modbus-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGvE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;AAEpC;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAA;AASnD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAejF"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTransport = createTransport;
4
+ const rtu_transport_js_1 = require("./rtu-transport.js");
5
+ const tcp_transport_js_1 = require("./tcp-transport.js");
6
+ /**
7
+ * Type guard to check if config is RTU
8
+ */
9
+ function isRTUConfig(config) {
10
+ return 'port' in config && !('host' in config);
11
+ }
12
+ /**
13
+ * Create a transport instance based on configuration
14
+ *
15
+ * Detects whether to create RTU or TCP transport based on the config:
16
+ * - If `port` is provided → RTU transport
17
+ * - If `host` is provided → TCP transport
18
+ *
19
+ * @param config - Transport configuration (RTU or TCP)
20
+ * @returns Transport implementation
21
+ * @throws Error if config is invalid
22
+ */
23
+ async function createTransport(config) {
24
+ // Validate that exactly one of port/host is provided
25
+ if ('port' in config && 'host' in config) {
26
+ throw new Error('Cannot specify both port (RTU) and host (TCP)');
27
+ }
28
+ if (isRTUConfig(config)) {
29
+ return (0, rtu_transport_js_1.createRTUTransport)(config);
30
+ }
31
+ if ('host' in config) {
32
+ return (0, tcp_transport_js_1.createTCPTransport)(config);
33
+ }
34
+ throw new Error('Either port (for RTU) or host (for TCP) must be specified');
35
+ }
36
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":";;AAgCA,0CAeC;AA7CD,yDAAuE;AACvE,yDAAuE;AAWvE;;GAEG;AACH,SAAS,WAAW,CAAC,MAAuB;IAC1C,OAAO,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,eAAe,CAAC,MAAuB;IAC3D,qDAAqD;IACrD,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,IAAA,qCAAkB,EAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,OAAO,IAAA,qCAAkB,EAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * @ya-modbus/transport - Modbus transport implementations
4
+ *
5
+ * Provides RTU and TCP transport implementations with automatic retry logic
6
+ * and transport pooling with mutex-based RTU bus serialization
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MutexTransport = exports.TransportManager = exports.RETRY_DELAY_MS = exports.MAX_RETRIES = exports.withRetry = exports.createModbusTransport = exports.createTCPTransport = exports.createRTUTransport = exports.createTransport = void 0;
10
+ var factory_js_1 = require("./factory.js");
11
+ Object.defineProperty(exports, "createTransport", { enumerable: true, get: function () { return factory_js_1.createTransport; } });
12
+ var rtu_transport_js_1 = require("./rtu-transport.js");
13
+ Object.defineProperty(exports, "createRTUTransport", { enumerable: true, get: function () { return rtu_transport_js_1.createRTUTransport; } });
14
+ var tcp_transport_js_1 = require("./tcp-transport.js");
15
+ Object.defineProperty(exports, "createTCPTransport", { enumerable: true, get: function () { return tcp_transport_js_1.createTCPTransport; } });
16
+ var create_modbus_transport_js_1 = require("./create-modbus-transport.js");
17
+ Object.defineProperty(exports, "createModbusTransport", { enumerable: true, get: function () { return create_modbus_transport_js_1.createModbusTransport; } });
18
+ var retry_js_1 = require("./retry.js");
19
+ Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_js_1.withRetry; } });
20
+ Object.defineProperty(exports, "MAX_RETRIES", { enumerable: true, get: function () { return retry_js_1.MAX_RETRIES; } });
21
+ Object.defineProperty(exports, "RETRY_DELAY_MS", { enumerable: true, get: function () { return retry_js_1.RETRY_DELAY_MS; } });
22
+ var manager_js_1 = require("./manager.js");
23
+ Object.defineProperty(exports, "TransportManager", { enumerable: true, get: function () { return manager_js_1.TransportManager; } });
24
+ var mutex_transport_js_1 = require("./mutex-transport.js");
25
+ Object.defineProperty(exports, "MutexTransport", { enumerable: true, get: function () { return mutex_transport_js_1.MutexTransport; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,2CAAoE;AAA3D,6GAAA,eAAe,OAAA;AACxB,uDAAuE;AAA9D,sHAAA,kBAAkB,OAAA;AAC3B,uDAAuE;AAA9D,sHAAA,kBAAkB,OAAA;AAC3B,2EAAoE;AAA3D,mIAAA,qBAAqB,OAAA;AAC9B,uCAAqF;AAA5E,qGAAA,SAAS,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AAC/C,2CAAoE;AAA3D,8GAAA,gBAAgB,OAAA;AACzB,2DAAqD;AAA5C,oHAAA,cAAc,OAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAepE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAE/D;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAqD/D;;;;OAIG;IACH,QAAQ,IAAI,cAAc;IAS1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAc/B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransportManager = void 0;
4
+ const async_mutex_1 = require("async-mutex");
5
+ const factory_js_1 = require("./factory.js");
6
+ const mutex_transport_js_1 = require("./mutex-transport.js");
7
+ /**
8
+ * TransportManager pools transport instances and provides mutex-based
9
+ * serialization for all transport operations to prevent concurrent access issues.
10
+ *
11
+ * Key behaviors:
12
+ * - All transports (RTU and TCP) are pooled by connection configuration
13
+ * - RTU transports are pooled by bus configuration (port, baud rate, parity, etc.)
14
+ * - TCP transports are pooled by host and port
15
+ * - Multiple devices on the same connection share a single transport instance
16
+ * - All operations are serialized using async-mutex to prevent race conditions
17
+ *
18
+ * Why TCP needs mutex protection:
19
+ * - Many Modbus devices allow only one or a limited number of TCP connections
20
+ * - Even with multiple connections, devices often process requests sequentially
21
+ * - Concurrent requests can cause timeouts, dropped packets, or incorrect responses
22
+ * - Serialization ensures reliable communication regardless of device limitations
23
+ */
24
+ class TransportManager {
25
+ constructor() {
26
+ this.transports = new Map();
27
+ }
28
+ /**
29
+ * Get or create a transport for the given configuration.
30
+ * Returns mutex-wrapped shared transport if one exists for the same connection.
31
+ *
32
+ * @param config - RTU or TCP transport configuration
33
+ * @returns Transport instance wrapped with mutex for thread-safe operations
34
+ */
35
+ async getTransport(config) {
36
+ const key = this.getConnectionKey(config);
37
+ const isRTU = this.isRTUConfig(config);
38
+ // For RTU, reuse existing transport if available
39
+ if (isRTU) {
40
+ const entry = this.transports.get(key);
41
+ if (entry) {
42
+ return entry.wrappedTransport;
43
+ }
44
+ // Create new RTU transport with mutex wrapper
45
+ const rawTransport = await (0, factory_js_1.createTransport)(config);
46
+ const mutex = new async_mutex_1.Mutex();
47
+ const wrappedTransport = new mutex_transport_js_1.MutexTransport(rawTransport, mutex);
48
+ const newEntry = {
49
+ rawTransport,
50
+ wrappedTransport,
51
+ mutex,
52
+ config,
53
+ isRTU: true,
54
+ };
55
+ this.transports.set(key, newEntry);
56
+ return wrappedTransport;
57
+ }
58
+ // For TCP, reuse existing transport if available
59
+ // TCP is pooled like RTU because many devices support only one connection
60
+ // or process requests sequentially even with multiple connections
61
+ const entry = this.transports.get(key);
62
+ if (entry) {
63
+ return entry.wrappedTransport;
64
+ }
65
+ // Create new TCP transport with mutex wrapper
66
+ // Mutex prevents concurrent requests that could cause timeouts or errors
67
+ const rawTransport = await (0, factory_js_1.createTransport)(config);
68
+ const mutex = new async_mutex_1.Mutex();
69
+ const wrappedTransport = new mutex_transport_js_1.MutexTransport(rawTransport, mutex);
70
+ const newEntry = {
71
+ rawTransport,
72
+ wrappedTransport,
73
+ mutex,
74
+ config,
75
+ isRTU: false,
76
+ };
77
+ this.transports.set(key, newEntry);
78
+ return wrappedTransport;
79
+ }
80
+ /**
81
+ * Get statistics about managed transports
82
+ *
83
+ * @returns Transport statistics
84
+ */
85
+ getStats() {
86
+ const entries = Array.from(this.transports.values());
87
+ return {
88
+ totalTransports: entries.length,
89
+ rtuTransports: entries.filter((e) => e.isRTU).length,
90
+ tcpTransports: entries.filter((e) => !e.isRTU).length,
91
+ };
92
+ }
93
+ /**
94
+ * Close all managed transports and clear the pool.
95
+ * Errors during close are logged but do not stop the process.
96
+ */
97
+ async closeAll() {
98
+ const closePromises = Array.from(this.transports.values()).map(async (entry) => {
99
+ try {
100
+ await entry.rawTransport.close();
101
+ }
102
+ catch (error) {
103
+ // Log but don't throw - we want to close all transports
104
+ console.error('Error closing transport:', error);
105
+ }
106
+ });
107
+ await Promise.all(closePromises);
108
+ this.transports.clear();
109
+ }
110
+ /**
111
+ * Generate a unique key for a transport configuration.
112
+ * For RTU: Key includes all bus parameters (port, baud, parity, etc.)
113
+ * For TCP: Key includes host and port
114
+ *
115
+ * @param config - Transport configuration
116
+ * @returns Connection key string
117
+ */
118
+ getConnectionKey(config) {
119
+ if (this.isRTUConfig(config)) {
120
+ return `rtu:${config.port}:${config.baudRate}:${config.dataBits}:${config.parity}:${config.stopBits}`;
121
+ }
122
+ // TCP config - safe to access host/port because isRTUConfig returned false
123
+ return `tcp:${config.host}:${config.port ?? 502}`;
124
+ }
125
+ /**
126
+ * Type guard to check if config is RTU
127
+ *
128
+ * @param config - Transport configuration
129
+ * @returns True if RTU config
130
+ */
131
+ isRTUConfig(config) {
132
+ return 'port' in config && typeof config.port === 'string' && !('host' in config);
133
+ }
134
+ }
135
+ exports.TransportManager = TransportManager;
136
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex-transport.d.ts","sourceRoot":"","sources":["../../src/mutex-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,SAAS;IAE5C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK;IAGzB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMrE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/D,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MutexTransport = void 0;
4
+ /**
5
+ * Wraps a transport with mutex-based serialization.
6
+ * All operations are executed sequentially to prevent concurrent access issues.
7
+ *
8
+ * Used for:
9
+ * - RTU transports: Prevents bus collisions when multiple devices share a serial bus
10
+ * - TCP transports: Many Modbus devices support only one connection or process
11
+ * requests sequentially. Serialization prevents timeouts and communication errors.
12
+ */
13
+ class MutexTransport {
14
+ constructor(transport, mutex) {
15
+ this.transport = transport;
16
+ this.mutex = mutex;
17
+ }
18
+ async readHoldingRegisters(address, count) {
19
+ return this.mutex.runExclusive(() => {
20
+ return this.transport.readHoldingRegisters(address, count);
21
+ });
22
+ }
23
+ async readInputRegisters(address, count) {
24
+ return this.mutex.runExclusive(() => {
25
+ return this.transport.readInputRegisters(address, count);
26
+ });
27
+ }
28
+ async readCoils(address, count) {
29
+ return this.mutex.runExclusive(() => {
30
+ return this.transport.readCoils(address, count);
31
+ });
32
+ }
33
+ async readDiscreteInputs(address, count) {
34
+ return this.mutex.runExclusive(() => {
35
+ return this.transport.readDiscreteInputs(address, count);
36
+ });
37
+ }
38
+ async writeSingleRegister(address, value) {
39
+ await this.mutex.runExclusive(async () => {
40
+ await this.transport.writeSingleRegister(address, value);
41
+ });
42
+ }
43
+ async writeSingleCoil(address, value) {
44
+ await this.mutex.runExclusive(async () => {
45
+ await this.transport.writeSingleCoil(address, value);
46
+ });
47
+ }
48
+ async writeMultipleRegisters(address, values) {
49
+ return this.mutex.runExclusive(() => {
50
+ return this.transport.writeMultipleRegisters(address, values);
51
+ });
52
+ }
53
+ async writeMultipleCoils(address, values) {
54
+ return this.mutex.runExclusive(() => {
55
+ return this.transport.writeMultipleCoils(address, values);
56
+ });
57
+ }
58
+ async close() {
59
+ // No mutex needed for close - just delegate
60
+ return this.transport.close();
61
+ }
62
+ }
63
+ exports.MutexTransport = MutexTransport;
64
+ //# sourceMappingURL=mutex-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex-transport.js","sourceRoot":"","sources":["../../src/mutex-transport.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;GAQG;AACH,MAAa,cAAc;IACzB,YACmB,SAAoB,EACpB,KAAY;QADZ,cAAS,GAAT,SAAS,CAAW;QACpB,UAAK,GAAL,KAAK,CAAO;IAC5B,CAAC;IAEJ,KAAK,CAAC,oBAAoB,CAAC,OAAe,EAAE,KAAa;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAAa;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,KAAa;QACtD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACvC,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAc;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACvC,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAe,EAAE,MAAc;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,MAAc;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,4CAA4C;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IAC/B,CAAC;CACF;AA1DD,wCA0DC"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B,mDAAmD;AACnD,eAAO,MAAM,cAAc,MAAM,CAAA;AAYjC;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;AAEjE;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,GAAE,MAAoB,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * Retry configuration and utilities for Modbus transport operations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RETRY_DELAY_MS = exports.MAX_RETRIES = void 0;
7
+ exports.withRetry = withRetry;
8
+ /** Maximum number of retry attempts for failed operations */
9
+ exports.MAX_RETRIES = 3;
10
+ /** Delay between retry attempts in milliseconds */
11
+ exports.RETRY_DELAY_MS = 100;
12
+ /**
13
+ * Sleep for a specified duration
14
+ *
15
+ * @param ms - Duration in milliseconds
16
+ * @returns Promise that resolves after the specified duration
17
+ */
18
+ function sleep(ms) {
19
+ return new Promise((resolve) => setTimeout(resolve, ms));
20
+ }
21
+ /**
22
+ * Retry a function with fixed delay between attempts
23
+ *
24
+ * @param fn - The async function to retry
25
+ * @param maxRetries - Maximum number of attempts (default: MAX_RETRIES)
26
+ * @param logger - Optional callback to log retry attempts
27
+ * @returns Promise resolving to the function's return value
28
+ * @throws The last error encountered if all retries are exhausted
29
+ */
30
+ async function withRetry(fn, maxRetries = exports.MAX_RETRIES, logger) {
31
+ let lastError = new Error('No retry attempts were made');
32
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
33
+ try {
34
+ return await fn();
35
+ }
36
+ catch (error) {
37
+ lastError = error instanceof Error ? error : new Error(String(error));
38
+ // Don't retry on the last attempt
39
+ if (attempt < maxRetries) {
40
+ // Log the retry attempt if logger is provided
41
+ if (logger) {
42
+ logger(attempt, lastError);
43
+ }
44
+ await sleep(exports.RETRY_DELAY_MS);
45
+ }
46
+ }
47
+ }
48
+ throw lastError;
49
+ }
50
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAmCH,8BAyBC;AA1DD,6DAA6D;AAChD,QAAA,WAAW,GAAG,CAAC,CAAA;AAE5B,mDAAmD;AACtC,QAAA,cAAc,GAAG,GAAG,CAAA;AAEjC;;;;;GAKG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAUD;;;;;;;;GAQG;AACI,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,aAAqB,mBAAW,EAChC,MAAoB;IAEpB,IAAI,SAAS,GAAU,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAE/D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAErE,kCAAkC;YAClC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,8CAA8C;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;gBAC5B,CAAC;gBACD,MAAM,KAAK,CAAC,sBAAc,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAA;AACjB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtu-transport.d.ts","sourceRoot":"","sources":["../../src/rtu-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAI9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa;IACb,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAkB9E"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRTUTransport = createRTUTransport;
4
+ const tslib_1 = require("tslib");
5
+ const modbus_serial_1 = tslib_1.__importDefault(require("modbus-serial"));
6
+ const create_modbus_transport_js_1 = require("./create-modbus-transport.js");
7
+ /**
8
+ * Create an RTU transport
9
+ *
10
+ * @param config - RTU configuration
11
+ * @returns Transport implementation for RTU
12
+ */
13
+ async function createRTUTransport(config) {
14
+ const client = new modbus_serial_1.default();
15
+ // Connect to serial port
16
+ await client.connectRTUBuffered(config.port, {
17
+ baudRate: config.baudRate,
18
+ dataBits: config.dataBits,
19
+ parity: config.parity,
20
+ stopBits: config.stopBits,
21
+ });
22
+ // Set slave ID
23
+ client.setID(config.slaveId);
24
+ // Set timeout
25
+ client.setTimeout(config.timeout ?? 1000);
26
+ return (0, create_modbus_transport_js_1.createModbusTransport)(client, config.maxRetries, config.logger);
27
+ }
28
+ //# sourceMappingURL=rtu-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtu-transport.js","sourceRoot":"","sources":["../../src/rtu-transport.ts"],"names":[],"mappings":";;AAoCA,gDAkBC;;AArDD,0EAAqC;AAErC,6EAAoE;AA2BpE;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,MAAM,GAAG,IAAI,uBAAS,EAAE,CAAA;IAE9B,yBAAyB;IACzB,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAA;IAEF,eAAe;IACf,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE5B,cAAc;IACd,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;IAEzC,OAAO,IAAA,kDAAqB,EAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACxE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../src/tcp-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAa9E"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTCPTransport = createTCPTransport;
4
+ const tslib_1 = require("tslib");
5
+ const modbus_serial_1 = tslib_1.__importDefault(require("modbus-serial"));
6
+ const create_modbus_transport_js_1 = require("./create-modbus-transport.js");
7
+ /**
8
+ * Create a TCP transport
9
+ *
10
+ * @param config - TCP configuration
11
+ * @returns Transport implementation for TCP
12
+ */
13
+ async function createTCPTransport(config) {
14
+ const client = new modbus_serial_1.default();
15
+ // Connect to TCP server
16
+ await client.connectTCP(config.host, { port: config.port ?? 502 });
17
+ // Set slave ID
18
+ client.setID(config.slaveId);
19
+ // Set timeout
20
+ client.setTimeout(config.timeout ?? 1000);
21
+ return (0, create_modbus_transport_js_1.createModbusTransport)(client, config.maxRetries, config.logger);
22
+ }
23
+ //# sourceMappingURL=tcp-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../src/tcp-transport.ts"],"names":[],"mappings":";;AA8BA,gDAaC;;AA1CD,0EAAqC;AAErC,6EAAoE;AAqBpE;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,MAAM,GAAG,IAAI,uBAAS,EAAE,CAAA;IAE9B,wBAAwB;IACxB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAA;IAElE,eAAe;IACf,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE5B,cAAc;IACd,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;IAEzC,OAAO,IAAA,kDAAqB,EAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Transport } from '@ya-modbus/driver-types';
2
+ import type ModbusRTU from 'modbus-serial';
3
+ import { type RetryLogger } from './retry.js';
4
+ /**
5
+ * Create a Transport implementation from a ModbusRTU client
6
+ *
7
+ * This factory wraps all modbus-serial client methods with retry logic
8
+ * and converts them to the Transport interface expected by device drivers.
9
+ *
10
+ * @param client - Configured ModbusRTU client instance
11
+ * @param maxRetries - Maximum retry attempts (default: 3, use 1 for discovery to disable retries)
12
+ * @param logger - Optional callback to log retry attempts for debugging
13
+ * @returns Transport implementation
14
+ */
15
+ export declare function createModbusTransport(client: ModbusRTU, maxRetries?: number, logger?: RetryLogger): Transport;
16
+ //# sourceMappingURL=create-modbus-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-modbus-transport.d.ts","sourceRoot":"","sources":["../../src/create-modbus-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,SAAS,CAoGX"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-modbus-transport.js","sourceRoot":"","sources":["../../src/create-modbus-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Transport } from '@ya-modbus/driver-types';
2
+ import { type RTUConfig } from './rtu-transport.js';
3
+ import { type TCPConfig } from './tcp-transport.js';
4
+ export type { RTUConfig, TCPConfig };
5
+ /**
6
+ * Combined transport configuration
7
+ * Can be either RTU or TCP, but not both
8
+ */
9
+ export type TransportConfig = RTUConfig | TCPConfig;
10
+ /**
11
+ * Create a transport instance based on configuration
12
+ *
13
+ * Detects whether to create RTU or TCP transport based on the config:
14
+ * - If `port` is provided → RTU transport
15
+ * - If `host` is provided → TCP transport
16
+ *
17
+ * @param config - Transport configuration (RTU or TCP)
18
+ * @returns Transport implementation
19
+ * @throws Error if config is invalid
20
+ */
21
+ export declare function createTransport(config: TransportConfig): Promise<Transport>;
22
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGvE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;AAEpC;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAA;AASnD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAejF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AAWvE;;GAEG;AACH,SAAS,WAAW,CAAC,MAAuB;IAC1C,OAAO,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAuB;IAC3D,qDAAqD;IACrD,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @ya-modbus/transport - Modbus transport implementations
3
+ *
4
+ * Provides RTU and TCP transport implementations with automatic retry logic
5
+ * and transport pooling with mutex-based RTU bus serialization
6
+ */
7
+ export { createTransport, type TransportConfig } from './factory.js';
8
+ export { createRTUTransport, type RTUConfig } from './rtu-transport.js';
9
+ export { createTCPTransport, type TCPConfig } from './tcp-transport.js';
10
+ export { createModbusTransport } from './create-modbus-transport.js';
11
+ export { withRetry, MAX_RETRIES, RETRY_DELAY_MS, type RetryLogger } from './retry.js';
12
+ export { TransportManager, type TransportStats } from './manager.js';
13
+ export { MutexTransport } from './mutex-transport.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAwB,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}