@ya-modbus/transport 0.9.0 → 0.10.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 +12 -0
- package/README.md +68 -0
- package/dist/cjs/src/connection.d.ts +90 -0
- package/dist/cjs/src/connection.d.ts.map +1 -0
- package/dist/cjs/src/connection.js +217 -0
- package/dist/cjs/src/connection.js.map +1 -0
- package/dist/cjs/src/create-modbus-transport.d.ts +4 -2
- package/dist/cjs/src/create-modbus-transport.d.ts.map +1 -1
- package/dist/cjs/src/create-modbus-transport.js +29 -28
- package/dist/cjs/src/create-modbus-transport.js.map +1 -1
- package/dist/cjs/src/factory.d.ts +2 -2
- package/dist/cjs/src/factory.js +12 -12
- package/dist/cjs/src/factory.js.map +1 -1
- package/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +4 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/manager.d.ts +10 -0
- package/dist/cjs/src/manager.d.ts.map +1 -1
- package/dist/cjs/src/manager.js +18 -6
- package/dist/cjs/src/manager.js.map +1 -1
- package/dist/cjs/src/rtu-transport.d.ts +4 -0
- package/dist/cjs/src/rtu-transport.d.ts.map +1 -1
- package/dist/cjs/src/rtu-transport.js +19 -10
- package/dist/cjs/src/rtu-transport.js.map +1 -1
- package/dist/cjs/src/slave-transport.d.ts +10 -5
- package/dist/cjs/src/slave-transport.d.ts.map +1 -1
- package/dist/cjs/src/slave-transport.js +42 -39
- package/dist/cjs/src/slave-transport.js.map +1 -1
- package/dist/cjs/src/tcp-transport.d.ts +3 -0
- package/dist/cjs/src/tcp-transport.d.ts.map +1 -1
- package/dist/cjs/src/tcp-transport.js +14 -5
- package/dist/cjs/src/tcp-transport.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/connection.d.ts +90 -0
- package/dist/esm/src/connection.d.ts.map +1 -0
- package/dist/esm/src/connection.js +211 -0
- package/dist/esm/src/connection.js.map +1 -0
- package/dist/esm/src/create-modbus-transport.d.ts +4 -2
- package/dist/esm/src/create-modbus-transport.d.ts.map +1 -1
- package/dist/esm/src/create-modbus-transport.js +29 -28
- package/dist/esm/src/create-modbus-transport.js.map +1 -1
- package/dist/esm/src/factory.d.ts +2 -2
- package/dist/esm/src/factory.js +12 -12
- package/dist/esm/src/factory.js.map +1 -1
- package/dist/esm/src/index.d.ts +1 -0
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +1 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/manager.d.ts +10 -0
- package/dist/esm/src/manager.d.ts.map +1 -1
- package/dist/esm/src/manager.js +18 -6
- package/dist/esm/src/manager.js.map +1 -1
- package/dist/esm/src/rtu-transport.d.ts +4 -0
- package/dist/esm/src/rtu-transport.d.ts.map +1 -1
- package/dist/esm/src/rtu-transport.js +19 -10
- package/dist/esm/src/rtu-transport.js.map +1 -1
- package/dist/esm/src/slave-transport.d.ts +10 -5
- package/dist/esm/src/slave-transport.d.ts.map +1 -1
- package/dist/esm/src/slave-transport.js +42 -39
- package/dist/esm/src/slave-transport.js.map +1 -1
- package/dist/esm/src/tcp-transport.d.ts +3 -0
- package/dist/esm/src/tcp-transport.d.ts.map +1 -1
- package/dist/esm/src/tcp-transport.js +14 -5
- package/dist/esm/src/tcp-transport.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1 +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,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
|
|
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,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC1F,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/cjs/src/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* and transport pooling with mutex-based RTU bus serialization
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.SlaveTransport = exports.MutexTransport = exports.TransportManager = exports.normalizeModbusError = exports.RETRY_DELAY_MS = exports.MAX_RETRIES = exports.withRetry = exports.createModbusTransport = exports.createTCPTransport = exports.createRTUTransport = exports.createTransport = void 0;
|
|
9
|
+
exports.SlaveTransport = exports.MutexTransport = exports.TransportManager = exports.ModbusConnection = exports.isConnectionLostError = exports.normalizeModbusError = exports.RETRY_DELAY_MS = exports.MAX_RETRIES = exports.withRetry = exports.createModbusTransport = exports.createTCPTransport = exports.createRTUTransport = exports.createTransport = void 0;
|
|
10
10
|
var factory_js_1 = require("./factory.js");
|
|
11
11
|
Object.defineProperty(exports, "createTransport", { enumerable: true, get: function () { return factory_js_1.createTransport; } });
|
|
12
12
|
var rtu_transport_js_1 = require("./rtu-transport.js");
|
|
@@ -21,6 +21,9 @@ Object.defineProperty(exports, "MAX_RETRIES", { enumerable: true, get: function
|
|
|
21
21
|
Object.defineProperty(exports, "RETRY_DELAY_MS", { enumerable: true, get: function () { return retry_js_1.RETRY_DELAY_MS; } });
|
|
22
22
|
var normalize_error_js_1 = require("./normalize-error.js");
|
|
23
23
|
Object.defineProperty(exports, "normalizeModbusError", { enumerable: true, get: function () { return normalize_error_js_1.normalizeModbusError; } });
|
|
24
|
+
var connection_js_1 = require("./connection.js");
|
|
25
|
+
Object.defineProperty(exports, "isConnectionLostError", { enumerable: true, get: function () { return connection_js_1.isConnectionLostError; } });
|
|
26
|
+
Object.defineProperty(exports, "ModbusConnection", { enumerable: true, get: function () { return connection_js_1.ModbusConnection; } });
|
|
24
27
|
var manager_js_1 = require("./manager.js");
|
|
25
28
|
Object.defineProperty(exports, "TransportManager", { enumerable: true, get: function () { return manager_js_1.TransportManager; } });
|
|
26
29
|
var mutex_transport_js_1 = require("./mutex-transport.js");
|
|
@@ -1 +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,2DAA6E;AAApE,0HAAA,oBAAoB,OAAA;AAC7B,2CAAoE;AAA3D,8GAAA,gBAAgB,OAAA;AACzB,2DAAqD;AAA5C,oHAAA,cAAc,OAAA;AACvB,2DAAqD;AAA5C,oHAAA,cAAc,OAAA"}
|
|
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,2DAA6E;AAApE,0HAAA,oBAAoB,OAAA;AAC7B,iDAA0F;AAAjF,sHAAA,qBAAqB,OAAA;AAAE,iHAAA,gBAAgB,OAAA;AAChD,2CAAoE;AAA3D,8GAAA,gBAAgB,OAAA;AACzB,2DAAqD;AAA5C,oHAAA,cAAc,OAAA;AACvB,2DAAqD;AAA5C,oHAAA,cAAc,OAAA"}
|
|
@@ -18,6 +18,9 @@ export interface TransportStats {
|
|
|
18
18
|
* - Returns SlaveTransport instances that set the slave ID before each operation
|
|
19
19
|
* - Multiple devices on the same connection share a single client and mutex
|
|
20
20
|
* - All operations are serialized using async-mutex to prevent race conditions
|
|
21
|
+
* - A lost connection (USB adapter unplugged, TCP connection closed) drops the client.
|
|
22
|
+
* The first request after a backoff opens a new client for all devices on the
|
|
23
|
+
* connection (see ModbusConnection)
|
|
21
24
|
*
|
|
22
25
|
* This architecture solves the multi-device problem:
|
|
23
26
|
* - Each device gets its own SlaveTransport with its own slave ID
|
|
@@ -64,6 +67,13 @@ export declare class TransportManager {
|
|
|
64
67
|
* @returns Physical connection key string
|
|
65
68
|
*/
|
|
66
69
|
private getPhysicalConnectionKey;
|
|
70
|
+
/**
|
|
71
|
+
* Describe a physical connection for error messages
|
|
72
|
+
*
|
|
73
|
+
* @param config - Transport configuration
|
|
74
|
+
* @returns Serial port path for RTU, host:port for TCP
|
|
75
|
+
*/
|
|
76
|
+
private getTarget;
|
|
67
77
|
/**
|
|
68
78
|
* Create and configure an RTU modbus-serial client.
|
|
69
79
|
* Does NOT set slave ID - that's handled by SlaveTransport.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAMxD,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,cAAc,CAAA;AAazE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IAEjE;;;;;;;OAOG;IACG,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IA8B/D;;;;OAIG;IACH,QAAQ,IAAI,cAAc;IAS1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAc/B;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;;OAMG;YACW,eAAe;IAe7B;;;;;;OAMG;YACW,eAAe;IAU7B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;CAGpB"}
|
package/dist/cjs/src/manager.js
CHANGED
|
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const async_mutex_1 = require("async-mutex");
|
|
6
6
|
const modbus_serial_1 = tslib_1.__importDefault(require("modbus-serial"));
|
|
7
7
|
const client_config_js_1 = require("./client-config.js");
|
|
8
|
+
const connection_js_1 = require("./connection.js");
|
|
8
9
|
const slave_transport_js_1 = require("./slave-transport.js");
|
|
9
10
|
/**
|
|
10
11
|
* TransportManager pools modbus-serial clients and provides slave-specific transports.
|
|
@@ -16,6 +17,9 @@ const slave_transport_js_1 = require("./slave-transport.js");
|
|
|
16
17
|
* - Returns SlaveTransport instances that set the slave ID before each operation
|
|
17
18
|
* - Multiple devices on the same connection share a single client and mutex
|
|
18
19
|
* - All operations are serialized using async-mutex to prevent race conditions
|
|
20
|
+
* - A lost connection (USB adapter unplugged, TCP connection closed) drops the client.
|
|
21
|
+
* The first request after a backoff opens a new client for all devices on the
|
|
22
|
+
* connection (see ModbusConnection)
|
|
19
23
|
*
|
|
20
24
|
* This architecture solves the multi-device problem:
|
|
21
25
|
* - Each device gets its own SlaveTransport with its own slave ID
|
|
@@ -49,9 +53,10 @@ class TransportManager {
|
|
|
49
53
|
let entry = this.connections.get(key);
|
|
50
54
|
if (!entry) {
|
|
51
55
|
// Create new client for this physical connection
|
|
52
|
-
const
|
|
56
|
+
const open = isRTU ? () => this.createRTUClient(config) : () => this.createTCPClient(config);
|
|
57
|
+
const client = await open();
|
|
53
58
|
entry = {
|
|
54
|
-
client,
|
|
59
|
+
connection: new connection_js_1.ModbusConnection(client, this.getTarget(config), open),
|
|
55
60
|
mutex: new async_mutex_1.Mutex(),
|
|
56
61
|
config,
|
|
57
62
|
isRTU,
|
|
@@ -59,7 +64,7 @@ class TransportManager {
|
|
|
59
64
|
this.connections.set(key, entry);
|
|
60
65
|
}
|
|
61
66
|
// Return a new SlaveTransport for this specific slave
|
|
62
|
-
return new slave_transport_js_1.SlaveTransport(config.slaveId, entry.
|
|
67
|
+
return new slave_transport_js_1.SlaveTransport(config.slaveId, entry.connection, entry.mutex, config.maxRetries ?? 3, config.logger);
|
|
63
68
|
}
|
|
64
69
|
/**
|
|
65
70
|
* Get statistics about managed connections
|
|
@@ -81,9 +86,7 @@ class TransportManager {
|
|
|
81
86
|
async closeAll() {
|
|
82
87
|
const closePromises = Array.from(this.connections.values()).map(async (entry) => {
|
|
83
88
|
try {
|
|
84
|
-
await
|
|
85
|
-
entry.client.close(resolve);
|
|
86
|
-
});
|
|
89
|
+
await entry.connection.close();
|
|
87
90
|
}
|
|
88
91
|
catch (error) {
|
|
89
92
|
// Log but don't throw - we want to close all connections
|
|
@@ -109,6 +112,15 @@ class TransportManager {
|
|
|
109
112
|
// TCP config - safe to access host/port because isRTUConfig returned false
|
|
110
113
|
return `tcp:${config.host}:${config.port ?? 502}`;
|
|
111
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Describe a physical connection for error messages
|
|
117
|
+
*
|
|
118
|
+
* @param config - Transport configuration
|
|
119
|
+
* @returns Serial port path for RTU, host:port for TCP
|
|
120
|
+
*/
|
|
121
|
+
getTarget(config) {
|
|
122
|
+
return this.isRTUConfig(config) ? config.port : `${config.host}:${config.port ?? 502}`;
|
|
123
|
+
}
|
|
112
124
|
/**
|
|
113
125
|
* Create and configure an RTU modbus-serial client.
|
|
114
126
|
* Does NOT set slave ID - that's handled by SlaveTransport.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":";;;;AACA,6CAAmC;AACnC,0EAAqC;AAErC,yDAAuD;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,10 @@ export interface RTUConfig {
|
|
|
26
26
|
/**
|
|
27
27
|
* Create an RTU transport
|
|
28
28
|
*
|
|
29
|
+
* When the serial port is lost (for example the USB adapter is unplugged), requests
|
|
30
|
+
* reject with a ConnectionLostError and the port is reopened on a later request
|
|
31
|
+
* (see ModbusConnection).
|
|
32
|
+
*
|
|
29
33
|
* @param config - RTU configuration
|
|
30
34
|
* @returns Transport implementation for RTU
|
|
31
35
|
*/
|
|
@@ -1 +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;
|
|
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;AAM9F,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;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAkB9E"}
|
|
@@ -4,23 +4,32 @@ exports.createRTUTransport = createRTUTransport;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const modbus_serial_1 = tslib_1.__importDefault(require("modbus-serial"));
|
|
6
6
|
const client_config_js_1 = require("./client-config.js");
|
|
7
|
+
const connection_js_1 = require("./connection.js");
|
|
7
8
|
const create_modbus_transport_js_1 = require("./create-modbus-transport.js");
|
|
8
9
|
/**
|
|
9
10
|
* Create an RTU transport
|
|
10
11
|
*
|
|
12
|
+
* When the serial port is lost (for example the USB adapter is unplugged), requests
|
|
13
|
+
* reject with a ConnectionLostError and the port is reopened on a later request
|
|
14
|
+
* (see ModbusConnection).
|
|
15
|
+
*
|
|
11
16
|
* @param config - RTU configuration
|
|
12
17
|
* @returns Transport implementation for RTU
|
|
13
18
|
*/
|
|
14
19
|
async function createRTUTransport(config) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
const open = async () => {
|
|
21
|
+
const client = new modbus_serial_1.default();
|
|
22
|
+
// Connect to serial port
|
|
23
|
+
await client.connectRTUBuffered(config.port, {
|
|
24
|
+
baudRate: config.baudRate,
|
|
25
|
+
dataBits: config.dataBits,
|
|
26
|
+
parity: config.parity,
|
|
27
|
+
stopBits: config.stopBits,
|
|
28
|
+
});
|
|
29
|
+
(0, client_config_js_1.configureClient)(client, config.slaveId, config.timeout);
|
|
30
|
+
return client;
|
|
31
|
+
};
|
|
32
|
+
const connection = new connection_js_1.ModbusConnection(await open(), config.port, open);
|
|
33
|
+
return (0, create_modbus_transport_js_1.createModbusTransport)(connection, config.maxRetries, config.logger);
|
|
25
34
|
}
|
|
26
35
|
//# sourceMappingURL=rtu-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtu-transport.js","sourceRoot":"","sources":["../../../src/rtu-transport.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rtu-transport.js","sourceRoot":"","sources":["../../../src/rtu-transport.ts"],"names":[],"mappings":";;AA0CA,gDAkBC;;AA3DD,0EAAqC;AAErC,yDAAoD;AACpD,mDAAkD;AAClD,6EAAoE;AA2BpE;;;;;;;;;GASG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,IAAI,GAAG,KAAK,IAAwB,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,uBAAS,EAAE,CAAA;QAE9B,yBAAyB;QACzB,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAA;QAEF,IAAA,kCAAe,EAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,IAAI,gCAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACxE,OAAO,IAAA,kDAAqB,EAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Transport } from '@ya-modbus/driver-types';
|
|
2
2
|
import type { Mutex } from 'async-mutex';
|
|
3
3
|
import type ModbusRTU from 'modbus-serial';
|
|
4
|
+
import { type ModbusConnection } from './connection.js';
|
|
4
5
|
import { type RetryLogger } from './retry.js';
|
|
5
6
|
/**
|
|
6
7
|
* SlaveTransport wraps a shared ModbusRTU client with slave-specific addressing.
|
|
@@ -9,15 +10,19 @@ import { type RetryLogger } from './retry.js';
|
|
|
9
10
|
* each communicating with a different slave device. The slave ID is set before each operation
|
|
10
11
|
* to ensure requests are directed to the correct device.
|
|
11
12
|
*
|
|
13
|
+
* Requests on a lost connection reject with a ConnectionLostError. When the shared
|
|
14
|
+
* ModbusConnection can reopen its client, all devices on the connection use the new client.
|
|
15
|
+
*
|
|
12
16
|
* @example
|
|
13
17
|
* ```typescript
|
|
14
18
|
* const client = new ModbusRTU()
|
|
15
19
|
* await client.connectRTUBuffered('/dev/ttyUSB0', { baudRate: 9600 })
|
|
20
|
+
* const connection = new ModbusConnection(client, '/dev/ttyUSB0')
|
|
16
21
|
* const mutex = new Mutex()
|
|
17
22
|
*
|
|
18
23
|
* // Two devices on the same serial port
|
|
19
|
-
* const device1 = new SlaveTransport(1,
|
|
20
|
-
* const device2 = new SlaveTransport(2,
|
|
24
|
+
* const device1 = new SlaveTransport(1, connection, mutex, 3)
|
|
25
|
+
* const device2 = new SlaveTransport(2, connection, mutex, 3)
|
|
21
26
|
*
|
|
22
27
|
* // Each device talks to its own slave ID
|
|
23
28
|
* await device1.readHoldingRegisters(0, 10) // Reads from slave 1
|
|
@@ -26,18 +31,18 @@ import { type RetryLogger } from './retry.js';
|
|
|
26
31
|
*/
|
|
27
32
|
export declare class SlaveTransport implements Transport {
|
|
28
33
|
private readonly slaveId;
|
|
29
|
-
private readonly client;
|
|
30
34
|
private readonly mutex;
|
|
31
35
|
private readonly maxRetries;
|
|
32
36
|
private readonly logger?;
|
|
37
|
+
private readonly connection;
|
|
33
38
|
/**
|
|
34
39
|
* @param slaveId - Modbus slave/unit ID for this device
|
|
35
|
-
* @param client - Shared ModbusRTU client
|
|
40
|
+
* @param client - Shared connection, or a ModbusRTU client that is not shared with other transports
|
|
36
41
|
* @param mutex - Shared mutex for serializing operations on the bus
|
|
37
42
|
* @param maxRetries - Maximum retry attempts for failed operations (default: 3)
|
|
38
43
|
* @param logger - Optional callback to log retry attempts
|
|
39
44
|
*/
|
|
40
|
-
constructor(slaveId: number, client: ModbusRTU, mutex: Mutex, maxRetries?: number, logger?: RetryLogger | undefined);
|
|
45
|
+
constructor(slaveId: number, client: ModbusConnection | ModbusRTU, mutex: Mutex, maxRetries?: number, logger?: RetryLogger | undefined);
|
|
41
46
|
readHoldingRegisters(address: number, count: number): Promise<Buffer>;
|
|
42
47
|
readInputRegisters(address: number, count: number): Promise<Buffer>;
|
|
43
48
|
readCoils(address: number, count: number): Promise<Buffer>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slave-transport.d.ts","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD
|
|
1
|
+
{"version":3,"file":"slave-transport.d.ts","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,cAAe,YAAW,SAAS;IAW5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAd1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAE7C;;;;;;OAMG;gBAEgB,OAAO,EAAE,MAAM,EAChC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACnB,KAAK,EAAE,KAAK,EACZ,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,YAAA;IAKjC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAerE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe1D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclE,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IActE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxE;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SlaveTransport = void 0;
|
|
4
|
+
const connection_js_1 = require("./connection.js");
|
|
4
5
|
const retry_js_1 = require("./retry.js");
|
|
5
6
|
/**
|
|
6
7
|
* SlaveTransport wraps a shared ModbusRTU client with slave-specific addressing.
|
|
@@ -9,15 +10,19 @@ const retry_js_1 = require("./retry.js");
|
|
|
9
10
|
* each communicating with a different slave device. The slave ID is set before each operation
|
|
10
11
|
* to ensure requests are directed to the correct device.
|
|
11
12
|
*
|
|
13
|
+
* Requests on a lost connection reject with a ConnectionLostError. When the shared
|
|
14
|
+
* ModbusConnection can reopen its client, all devices on the connection use the new client.
|
|
15
|
+
*
|
|
12
16
|
* @example
|
|
13
17
|
* ```typescript
|
|
14
18
|
* const client = new ModbusRTU()
|
|
15
19
|
* await client.connectRTUBuffered('/dev/ttyUSB0', { baudRate: 9600 })
|
|
20
|
+
* const connection = new ModbusConnection(client, '/dev/ttyUSB0')
|
|
16
21
|
* const mutex = new Mutex()
|
|
17
22
|
*
|
|
18
23
|
* // Two devices on the same serial port
|
|
19
|
-
* const device1 = new SlaveTransport(1,
|
|
20
|
-
* const device2 = new SlaveTransport(2,
|
|
24
|
+
* const device1 = new SlaveTransport(1, connection, mutex, 3)
|
|
25
|
+
* const device2 = new SlaveTransport(2, connection, mutex, 3)
|
|
21
26
|
*
|
|
22
27
|
* // Each device talks to its own slave ID
|
|
23
28
|
* await device1.readHoldingRegisters(0, 10) // Reads from slave 1
|
|
@@ -27,82 +32,82 @@ const retry_js_1 = require("./retry.js");
|
|
|
27
32
|
class SlaveTransport {
|
|
28
33
|
/**
|
|
29
34
|
* @param slaveId - Modbus slave/unit ID for this device
|
|
30
|
-
* @param client - Shared ModbusRTU client
|
|
35
|
+
* @param client - Shared connection, or a ModbusRTU client that is not shared with other transports
|
|
31
36
|
* @param mutex - Shared mutex for serializing operations on the bus
|
|
32
37
|
* @param maxRetries - Maximum retry attempts for failed operations (default: 3)
|
|
33
38
|
* @param logger - Optional callback to log retry attempts
|
|
34
39
|
*/
|
|
35
40
|
constructor(slaveId, client, mutex, maxRetries = 3, logger) {
|
|
36
41
|
this.slaveId = slaveId;
|
|
37
|
-
this.client = client;
|
|
38
42
|
this.mutex = mutex;
|
|
39
43
|
this.maxRetries = maxRetries;
|
|
40
44
|
this.logger = logger;
|
|
45
|
+
this.connection = (0, connection_js_1.toConnection)(client);
|
|
41
46
|
}
|
|
42
47
|
async readHoldingRegisters(address, count) {
|
|
43
48
|
return this.mutex.runExclusive(async () => {
|
|
44
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
45
|
-
|
|
46
|
-
const result = await
|
|
49
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
50
|
+
client.setID(this.slaveId);
|
|
51
|
+
const result = await client.readHoldingRegisters(address, count);
|
|
47
52
|
return result.buffer;
|
|
48
|
-
}, this.maxRetries, this.logger);
|
|
53
|
+
}), this.maxRetries, this.logger);
|
|
49
54
|
});
|
|
50
55
|
}
|
|
51
56
|
async readInputRegisters(address, count) {
|
|
52
57
|
return this.mutex.runExclusive(async () => {
|
|
53
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
54
|
-
|
|
55
|
-
const result = await
|
|
58
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
59
|
+
client.setID(this.slaveId);
|
|
60
|
+
const result = await client.readInputRegisters(address, count);
|
|
56
61
|
return result.buffer;
|
|
57
|
-
}, this.maxRetries, this.logger);
|
|
62
|
+
}), this.maxRetries, this.logger);
|
|
58
63
|
});
|
|
59
64
|
}
|
|
60
65
|
async readCoils(address, count) {
|
|
61
66
|
return this.mutex.runExclusive(async () => {
|
|
62
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
63
|
-
|
|
64
|
-
const result = await
|
|
67
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
68
|
+
client.setID(this.slaveId);
|
|
69
|
+
const result = await client.readCoils(address, count);
|
|
65
70
|
return result.buffer;
|
|
66
|
-
}, this.maxRetries, this.logger);
|
|
71
|
+
}), this.maxRetries, this.logger);
|
|
67
72
|
});
|
|
68
73
|
}
|
|
69
74
|
async readDiscreteInputs(address, count) {
|
|
70
75
|
return this.mutex.runExclusive(async () => {
|
|
71
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
72
|
-
|
|
73
|
-
const result = await
|
|
76
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
77
|
+
client.setID(this.slaveId);
|
|
78
|
+
const result = await client.readDiscreteInputs(address, count);
|
|
74
79
|
return result.buffer;
|
|
75
|
-
}, this.maxRetries, this.logger);
|
|
80
|
+
}), this.maxRetries, this.logger);
|
|
76
81
|
});
|
|
77
82
|
}
|
|
78
83
|
async writeSingleRegister(address, value) {
|
|
79
84
|
return this.mutex.runExclusive(async () => {
|
|
80
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
81
|
-
|
|
82
|
-
await
|
|
83
|
-
}, this.maxRetries, this.logger);
|
|
85
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
86
|
+
client.setID(this.slaveId);
|
|
87
|
+
await client.writeRegister(address, value);
|
|
88
|
+
}), this.maxRetries, this.logger);
|
|
84
89
|
});
|
|
85
90
|
}
|
|
86
91
|
async writeMultipleRegisters(address, values) {
|
|
87
92
|
return this.mutex.runExclusive(async () => {
|
|
88
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
89
|
-
|
|
90
|
-
await
|
|
91
|
-
}, this.maxRetries, this.logger);
|
|
93
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
94
|
+
client.setID(this.slaveId);
|
|
95
|
+
await client.writeRegisters(address, values);
|
|
96
|
+
}), this.maxRetries, this.logger);
|
|
92
97
|
});
|
|
93
98
|
}
|
|
94
99
|
async writeSingleCoil(address, value) {
|
|
95
100
|
return this.mutex.runExclusive(async () => {
|
|
96
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
97
|
-
|
|
98
|
-
await
|
|
99
|
-
}, this.maxRetries, this.logger);
|
|
101
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
102
|
+
client.setID(this.slaveId);
|
|
103
|
+
await client.writeCoil(address, value);
|
|
104
|
+
}), this.maxRetries, this.logger);
|
|
100
105
|
});
|
|
101
106
|
}
|
|
102
107
|
async writeMultipleCoils(address, values) {
|
|
103
108
|
return this.mutex.runExclusive(async () => {
|
|
104
|
-
return (0, retry_js_1.withRetry)(async () => {
|
|
105
|
-
|
|
109
|
+
return (0, retry_js_1.withRetry)(() => this.connection.run(async (client) => {
|
|
110
|
+
client.setID(this.slaveId);
|
|
106
111
|
// Convert Buffer to boolean array
|
|
107
112
|
const bools = [];
|
|
108
113
|
for (let i = 0; i < values.length * 8; i++) {
|
|
@@ -111,8 +116,8 @@ class SlaveTransport {
|
|
|
111
116
|
const byte = values[byteIndex];
|
|
112
117
|
bools.push((byte & (1 << bitIndex)) !== 0);
|
|
113
118
|
}
|
|
114
|
-
await
|
|
115
|
-
}, this.maxRetries, this.logger);
|
|
119
|
+
await client.writeCoils(address, bools);
|
|
120
|
+
}), this.maxRetries, this.logger);
|
|
116
121
|
});
|
|
117
122
|
}
|
|
118
123
|
/**
|
|
@@ -127,9 +132,7 @@ class SlaveTransport {
|
|
|
127
132
|
*/
|
|
128
133
|
async close() {
|
|
129
134
|
// Don't use mutex for close operation
|
|
130
|
-
return
|
|
131
|
-
this.client.close(resolve);
|
|
132
|
-
});
|
|
135
|
+
return this.connection.close();
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
exports.SlaveTransport = SlaveTransport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slave-transport.js","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":";;;AAIA,yCAAwD;AAExD
|
|
1
|
+
{"version":3,"file":"slave-transport.js","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,9 @@ export interface TCPConfig {
|
|
|
20
20
|
/**
|
|
21
21
|
* Create a TCP transport
|
|
22
22
|
*
|
|
23
|
+
* When the connection is lost, requests reject with a ConnectionLostError and the
|
|
24
|
+
* connection is reopened on a later request (see ModbusConnection).
|
|
25
|
+
*
|
|
23
26
|
* @param config - TCP configuration
|
|
24
27
|
* @returns Transport implementation for TCP
|
|
25
28
|
*/
|
|
@@ -1 +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;
|
|
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;AAMxD,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;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAc9E"}
|
|
@@ -4,18 +4,27 @@ exports.createTCPTransport = createTCPTransport;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const modbus_serial_1 = tslib_1.__importDefault(require("modbus-serial"));
|
|
6
6
|
const client_config_js_1 = require("./client-config.js");
|
|
7
|
+
const connection_js_1 = require("./connection.js");
|
|
7
8
|
const create_modbus_transport_js_1 = require("./create-modbus-transport.js");
|
|
8
9
|
/**
|
|
9
10
|
* Create a TCP transport
|
|
10
11
|
*
|
|
12
|
+
* When the connection is lost, requests reject with a ConnectionLostError and the
|
|
13
|
+
* connection is reopened on a later request (see ModbusConnection).
|
|
14
|
+
*
|
|
11
15
|
* @param config - TCP configuration
|
|
12
16
|
* @returns Transport implementation for TCP
|
|
13
17
|
*/
|
|
14
18
|
async function createTCPTransport(config) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
const port = config.port ?? 502;
|
|
20
|
+
const open = async () => {
|
|
21
|
+
const client = new modbus_serial_1.default();
|
|
22
|
+
// Connect to TCP server
|
|
23
|
+
await client.connectTCP(config.host, { port });
|
|
24
|
+
(0, client_config_js_1.configureClient)(client, config.slaveId, config.timeout);
|
|
25
|
+
return client;
|
|
26
|
+
};
|
|
27
|
+
const connection = new connection_js_1.ModbusConnection(await open(), `${config.host}:${port}`, open);
|
|
28
|
+
return (0, create_modbus_transport_js_1.createModbusTransport)(connection, config.maxRetries, config.logger);
|
|
20
29
|
}
|
|
21
30
|
//# sourceMappingURL=tcp-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":";;AAmCA,gDAcC;;AAhDD,0EAAqC;AAErC,yDAAoD;AACpD,mDAAkD;AAClD,6EAAoE;AAqBpE;;;;;;;;GAQG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAA;IAC/B,MAAM,IAAI,GAAG,KAAK,IAAwB,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,uBAAS,EAAE,CAAA;QAE9B,wBAAwB;QACxB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9C,IAAA,kCAAe,EAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,IAAI,gCAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;IACrF,OAAO,IAAA,kDAAqB,EAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AAC5E,CAAC"}
|