@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.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/create-modbus-transport.d.ts.map +1 -0
- package/dist/cjs/create-modbus-transport.js +77 -0
- package/dist/cjs/create-modbus-transport.js.map +1 -0
- package/dist/cjs/factory.d.ts.map +1 -0
- package/dist/cjs/factory.js +36 -0
- package/dist/cjs/factory.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +26 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/manager.d.ts.map +1 -0
- package/dist/cjs/manager.js +136 -0
- package/dist/cjs/manager.js.map +1 -0
- package/dist/cjs/mutex-transport.d.ts.map +1 -0
- package/dist/cjs/mutex-transport.js +64 -0
- package/dist/cjs/mutex-transport.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/retry.d.ts.map +1 -0
- package/dist/cjs/retry.js +50 -0
- package/dist/cjs/retry.js.map +1 -0
- package/dist/cjs/rtu-transport.d.ts.map +1 -0
- package/dist/cjs/rtu-transport.js +28 -0
- package/dist/cjs/rtu-transport.js.map +1 -0
- package/dist/cjs/tcp-transport.d.ts.map +1 -0
- package/dist/cjs/tcp-transport.js +23 -0
- package/dist/cjs/tcp-transport.js.map +1 -0
- package/dist/esm/create-modbus-transport.d.ts +16 -0
- package/dist/esm/create-modbus-transport.d.ts.map +1 -0
- package/dist/esm/create-modbus-transport.js.map +1 -0
- package/dist/esm/factory.d.ts +22 -0
- package/dist/esm/factory.d.ts.map +1 -0
- package/dist/esm/factory.js.map +1 -0
- package/dist/esm/index.d.ts +14 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/manager.d.ts +66 -0
- package/dist/esm/manager.d.ts.map +1 -0
- package/dist/{manager.js → esm/manager.js} +3 -1
- package/dist/esm/manager.js.map +1 -0
- package/dist/esm/mutex-transport.d.ts +26 -0
- package/dist/esm/mutex-transport.d.ts.map +1 -0
- package/dist/{mutex-transport.js → esm/mutex-transport.js} +0 -2
- package/dist/esm/mutex-transport.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/retry.d.ts +25 -0
- package/dist/esm/retry.d.ts.map +1 -0
- package/dist/esm/retry.js.map +1 -0
- package/dist/esm/rtu-transport.d.ts +33 -0
- package/dist/esm/rtu-transport.d.ts.map +1 -0
- package/dist/esm/rtu-transport.js.map +1 -0
- package/dist/esm/tcp-transport.d.ts +27 -0
- package/dist/esm/tcp-transport.d.ts.map +1 -0
- package/dist/esm/tcp-transport.js.map +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +24 -7
- package/dist/create-modbus-transport.d.ts.map +0 -1
- package/dist/create-modbus-transport.js.map +0 -1
- package/dist/factory.d.ts.map +0 -1
- package/dist/factory.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js.map +0 -1
- package/dist/mutex-transport.d.ts.map +0 -1
- package/dist/mutex-transport.js.map +0 -1
- package/dist/retry.d.ts.map +0 -1
- package/dist/retry.js.map +0 -1
- package/dist/rtu-transport.d.ts.map +0 -1
- package/dist/rtu-transport.js.map +0 -1
- package/dist/tcp-transport.d.ts.map +0 -1
- package/dist/tcp-transport.js.map +0 -1
- /package/dist/{create-modbus-transport.d.ts → cjs/create-modbus-transport.d.ts} +0 -0
- /package/dist/{factory.d.ts → cjs/factory.d.ts} +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{manager.d.ts → cjs/manager.d.ts} +0 -0
- /package/dist/{mutex-transport.d.ts → cjs/mutex-transport.d.ts} +0 -0
- /package/dist/{retry.d.ts → cjs/retry.d.ts} +0 -0
- /package/dist/{rtu-transport.d.ts → cjs/rtu-transport.d.ts} +0 -0
- /package/dist/{tcp-transport.d.ts → cjs/tcp-transport.d.ts} +0 -0
- /package/dist/{create-modbus-transport.js → esm/create-modbus-transport.js} +0 -0
- /package/dist/{factory.js → esm/factory.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{retry.js → esm/retry.js} +0 -0
- /package/dist/{rtu-transport.js → esm/rtu-transport.js} +0 -0
- /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":";;AAgBA,sDAwGC;AArHD,yCAAwD;AAExD;;;;;;;;;;GAUG;AACH,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,aAAqB,CAAC,EACtB,MAAoB;IAEpB,OAAO;QACL,KAAK,CAAC,oBAAoB,CAAC,OAAe,EAAE,KAAa;YACvD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAChE,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;YACrD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAC9D,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAAa;YAC5C,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACrD,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;YACrD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAC9D,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,KAAa;YACtD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5C,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,sBAAsB,CAAC,OAAe,EAAE,MAAc;YAC1D,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC9C,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAc;YACnD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YACxC,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,MAAc;YACtD,OAAO,IAAA,oBAAS,EACd,KAAK,IAAI,EAAE;gBACT,kCAAkC;gBAClC,MAAM,KAAK,GAAc,EAAE,CAAA;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;oBACnC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;oBACtB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAW,CAAA,CAAC,kDAAkD;oBAC3F,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC5C,CAAC;gBACD,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YACzC,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAA;QACH,CAAC;QAED,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -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"}
|