njs-modbus 2.0.1 → 2.1.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/README.md CHANGED
@@ -8,6 +8,7 @@ A pure JavaScript implementation of MODBUS for NodeJS.
8
8
  [![npm download](http://img.shields.io/npm/dw/njs-modbus.svg?style=flat-square)](http://www.npm-stats.com/~packages/njs-modbus)
9
9
  [![npm latest package](http://img.shields.io/npm/v/njs-modbus/latest.svg?style=flat-square)](https://www.npmjs.com/package/njs-modbus)
10
10
  [![npm bundle size](https://img.shields.io/bundlephobia/minzip/njs-modbus?style=flat-square)](https://bundlephobia.com/package/njs-modbus)
11
+ [![CI](https://img.shields.io/github/actions/workflow/status/xiejay97/njs-modbus/ci.yml?branch=main&style=flat-square)](https://github.com/xiejay97/njs-modbus/actions)
11
12
  <!-- prettier-ignore-end -->
12
13
 
13
14
  </div>
@@ -188,7 +189,7 @@ If you broadcast over serial (RTU or ASCII), per Modbus over Serial Line V1.02
188
189
  const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
189
190
 
190
191
  await master.writeSingleRegister(0, 0x0000, 0x1234); // broadcast
191
- await sleep(100); // turnaround — tune per devices
192
+ await sleep(100); // turnaround — tune per devices
192
193
  await master.writeSingleRegister(1, 0x0000, 0x5678); // unicast to next slave
193
194
  ```
194
195
 
package/dist/index.cjs CHANGED
@@ -1305,7 +1305,7 @@ class RtuApplicationLayer extends AbstractApplicationLayer {
1305
1305
  for (const removeListener of this._removeAllListeners) {
1306
1306
  removeListener();
1307
1307
  }
1308
- this._removeAllListeners.length = 0;
1308
+ this._removeAllListeners = [];
1309
1309
  for (const state of this._states.values()) {
1310
1310
  this.clearStateTimers(state);
1311
1311
  }
@@ -1514,7 +1514,7 @@ class AsciiApplicationLayer extends AbstractApplicationLayer {
1514
1514
  for (const removeListener of this._removeAllListeners) {
1515
1515
  removeListener();
1516
1516
  }
1517
- this._removeAllListeners.length = 0;
1517
+ this._removeAllListeners = [];
1518
1518
  this._states.clear();
1519
1519
  }
1520
1520
  }
@@ -1644,7 +1644,7 @@ class TcpApplicationLayer extends AbstractApplicationLayer {
1644
1644
  for (const removeListener of this._removeAllListeners) {
1645
1645
  removeListener();
1646
1646
  }
1647
- this._removeAllListeners.length = 0;
1647
+ this._removeAllListeners = [];
1648
1648
  this._buffers.clear();
1649
1649
  }
1650
1650
  }
@@ -1796,12 +1796,6 @@ class ModbusMaster extends EventEmitter {
1796
1796
  writable: true,
1797
1797
  value: 1
1798
1798
  });
1799
- Object.defineProperty(this, "_closed", {
1800
- enumerable: true,
1801
- configurable: true,
1802
- writable: true,
1803
- value: false
1804
- });
1805
1799
  Object.defineProperty(this, "_cleanLevel", {
1806
1800
  enumerable: true,
1807
1801
  configurable: true,
@@ -1960,7 +1954,7 @@ class ModbusMaster extends EventEmitter {
1960
1954
  }
1961
1955
  _exchange(adu, preCheck, timeout, broadcast) {
1962
1956
  return new Promise((resolve, reject) => {
1963
- if (this._closed) {
1957
+ if (this._cleanLevel !== 'none') {
1964
1958
  reject(new ModbusError(ModbusErrorCode.MASTER_CLOSED, 'Master closed'));
1965
1959
  return;
1966
1960
  }
@@ -2113,7 +2107,7 @@ class ModbusMaster extends EventEmitter {
2113
2107
  if (frame) {
2114
2108
  const runStatusIndex = 1 + serverIdLength;
2115
2109
  return Object.assign(Object.assign({}, frame), { data: {
2116
- serverId: serverIdLength === 1 ? frame.data[1] : Array.from(frame.data.subarray(1, runStatusIndex)),
2110
+ serverId: Array.from(frame.data.subarray(1, runStatusIndex)),
2117
2111
  runIndicatorStatus: frame.data[runStatusIndex] === 0xff,
2118
2112
  additionalData: Array.from(frame.data.subarray(runStatusIndex + 1)),
2119
2113
  } });
@@ -2230,7 +2224,6 @@ class ModbusMaster extends EventEmitter {
2230
2224
  }
2231
2225
  const errorCode = level === 'destroy' ? ModbusErrorCode.MASTER_DESTROYED : ModbusErrorCode.MASTER_CLOSED;
2232
2226
  const message = level === 'destroy' ? 'Master destroyed' : 'Master closed';
2233
- this._closed = true;
2234
2227
  const queued = this._queue.splice(0);
2235
2228
  for (const item of queued) {
2236
2229
  item.cancel(new ModbusError(errorCode, message));
@@ -2243,7 +2236,6 @@ class ModbusMaster extends EventEmitter {
2243
2236
  return Promise.reject(new ModbusError(ModbusErrorCode.PORT_DESTROYED, 'Master is destroyed'));
2244
2237
  }
2245
2238
  this._cleanLevel = 'none';
2246
- this._closed = false;
2247
2239
  this._nextTid = 1;
2248
2240
  return this.physicalLayer.open(...args);
2249
2241
  }
@@ -2352,14 +2344,14 @@ class ModbusSlave extends EventEmitter {
2352
2344
  if (!q) {
2353
2345
  return;
2354
2346
  }
2355
- q.items.length = 0;
2347
+ q.items = [];
2356
2348
  if (!q.processing) {
2357
2349
  this._queues.delete(connection.id);
2358
2350
  }
2359
2351
  });
2360
2352
  physicalLayer.on('close', () => {
2361
2353
  for (const q of this._queues.values()) {
2362
- q.items.length = 0;
2354
+ q.items = [];
2363
2355
  }
2364
2356
  this._queues.clear();
2365
2357
  this.emit('close');
@@ -2648,8 +2640,8 @@ class ModbusSlave extends EventEmitter {
2648
2640
  return;
2649
2641
  }
2650
2642
  try {
2651
- const { serverId = (_a = model.unit) !== null && _a !== void 0 ? _a : 1, runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
2652
- const serverIdBytes = Array.isArray(serverId) ? serverId : [serverId];
2643
+ const { serverId = [(_a = model.unit) !== null && _a !== void 0 ? _a : 1], runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
2644
+ const serverIdBytes = serverId;
2653
2645
  const byteCount = serverIdBytes.length + 1 + additionalData.length;
2654
2646
  if (byteCount > 255) {
2655
2647
  yield this.responseError(frame, response, getErrorByCode(exports.ErrorCode.SERVER_DEVICE_FAILURE));
@@ -3063,7 +3055,7 @@ class ModbusSlave extends EventEmitter {
3063
3055
  return;
3064
3056
  }
3065
3057
  for (const q of this._queues.values()) {
3066
- q.items.length = 0;
3058
+ q.items = [];
3067
3059
  }
3068
3060
  this._queues.clear();
3069
3061
  this._locks.clear();
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ interface ApplicationDataUnit {
12
12
  }
13
13
  interface ServerId {
14
14
  /** Server ID; may be 1 byte (number) or multi-byte (number[]) per device spec. */
15
- serverId?: number | number[];
15
+ serverId?: number[];
16
16
  runIndicatorStatus?: boolean;
17
17
  additionalData?: number[];
18
18
  }
@@ -421,7 +421,6 @@ declare class ModbusMaster<A extends AbstractApplicationLayer, P extends Abstrac
421
421
  private _queue;
422
422
  private _draining;
423
423
  private _nextTid;
424
- private _closed;
425
424
  private _cleanLevel;
426
425
  timeout: number;
427
426
  readonly concurrent: boolean;
package/dist/index.mjs CHANGED
@@ -1303,7 +1303,7 @@ class RtuApplicationLayer extends AbstractApplicationLayer {
1303
1303
  for (const removeListener of this._removeAllListeners) {
1304
1304
  removeListener();
1305
1305
  }
1306
- this._removeAllListeners.length = 0;
1306
+ this._removeAllListeners = [];
1307
1307
  for (const state of this._states.values()) {
1308
1308
  this.clearStateTimers(state);
1309
1309
  }
@@ -1512,7 +1512,7 @@ class AsciiApplicationLayer extends AbstractApplicationLayer {
1512
1512
  for (const removeListener of this._removeAllListeners) {
1513
1513
  removeListener();
1514
1514
  }
1515
- this._removeAllListeners.length = 0;
1515
+ this._removeAllListeners = [];
1516
1516
  this._states.clear();
1517
1517
  }
1518
1518
  }
@@ -1642,7 +1642,7 @@ class TcpApplicationLayer extends AbstractApplicationLayer {
1642
1642
  for (const removeListener of this._removeAllListeners) {
1643
1643
  removeListener();
1644
1644
  }
1645
- this._removeAllListeners.length = 0;
1645
+ this._removeAllListeners = [];
1646
1646
  this._buffers.clear();
1647
1647
  }
1648
1648
  }
@@ -1794,12 +1794,6 @@ class ModbusMaster extends EventEmitter {
1794
1794
  writable: true,
1795
1795
  value: 1
1796
1796
  });
1797
- Object.defineProperty(this, "_closed", {
1798
- enumerable: true,
1799
- configurable: true,
1800
- writable: true,
1801
- value: false
1802
- });
1803
1797
  Object.defineProperty(this, "_cleanLevel", {
1804
1798
  enumerable: true,
1805
1799
  configurable: true,
@@ -1958,7 +1952,7 @@ class ModbusMaster extends EventEmitter {
1958
1952
  }
1959
1953
  _exchange(adu, preCheck, timeout, broadcast) {
1960
1954
  return new Promise((resolve, reject) => {
1961
- if (this._closed) {
1955
+ if (this._cleanLevel !== 'none') {
1962
1956
  reject(new ModbusError(ModbusErrorCode.MASTER_CLOSED, 'Master closed'));
1963
1957
  return;
1964
1958
  }
@@ -2111,7 +2105,7 @@ class ModbusMaster extends EventEmitter {
2111
2105
  if (frame) {
2112
2106
  const runStatusIndex = 1 + serverIdLength;
2113
2107
  return Object.assign(Object.assign({}, frame), { data: {
2114
- serverId: serverIdLength === 1 ? frame.data[1] : Array.from(frame.data.subarray(1, runStatusIndex)),
2108
+ serverId: Array.from(frame.data.subarray(1, runStatusIndex)),
2115
2109
  runIndicatorStatus: frame.data[runStatusIndex] === 0xff,
2116
2110
  additionalData: Array.from(frame.data.subarray(runStatusIndex + 1)),
2117
2111
  } });
@@ -2228,7 +2222,6 @@ class ModbusMaster extends EventEmitter {
2228
2222
  }
2229
2223
  const errorCode = level === 'destroy' ? ModbusErrorCode.MASTER_DESTROYED : ModbusErrorCode.MASTER_CLOSED;
2230
2224
  const message = level === 'destroy' ? 'Master destroyed' : 'Master closed';
2231
- this._closed = true;
2232
2225
  const queued = this._queue.splice(0);
2233
2226
  for (const item of queued) {
2234
2227
  item.cancel(new ModbusError(errorCode, message));
@@ -2241,7 +2234,6 @@ class ModbusMaster extends EventEmitter {
2241
2234
  return Promise.reject(new ModbusError(ModbusErrorCode.PORT_DESTROYED, 'Master is destroyed'));
2242
2235
  }
2243
2236
  this._cleanLevel = 'none';
2244
- this._closed = false;
2245
2237
  this._nextTid = 1;
2246
2238
  return this.physicalLayer.open(...args);
2247
2239
  }
@@ -2350,14 +2342,14 @@ class ModbusSlave extends EventEmitter {
2350
2342
  if (!q) {
2351
2343
  return;
2352
2344
  }
2353
- q.items.length = 0;
2345
+ q.items = [];
2354
2346
  if (!q.processing) {
2355
2347
  this._queues.delete(connection.id);
2356
2348
  }
2357
2349
  });
2358
2350
  physicalLayer.on('close', () => {
2359
2351
  for (const q of this._queues.values()) {
2360
- q.items.length = 0;
2352
+ q.items = [];
2361
2353
  }
2362
2354
  this._queues.clear();
2363
2355
  this.emit('close');
@@ -2646,8 +2638,8 @@ class ModbusSlave extends EventEmitter {
2646
2638
  return;
2647
2639
  }
2648
2640
  try {
2649
- const { serverId = (_a = model.unit) !== null && _a !== void 0 ? _a : 1, runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
2650
- const serverIdBytes = Array.isArray(serverId) ? serverId : [serverId];
2641
+ const { serverId = [(_a = model.unit) !== null && _a !== void 0 ? _a : 1], runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
2642
+ const serverIdBytes = serverId;
2651
2643
  const byteCount = serverIdBytes.length + 1 + additionalData.length;
2652
2644
  if (byteCount > 255) {
2653
2645
  yield this.responseError(frame, response, getErrorByCode(ErrorCode.SERVER_DEVICE_FAILURE));
@@ -3061,7 +3053,7 @@ class ModbusSlave extends EventEmitter {
3061
3053
  return;
3062
3054
  }
3063
3055
  for (const q of this._queues.values()) {
3064
- q.items.length = 0;
3056
+ q.items = [];
3065
3057
  }
3066
3058
  this._queues.clear();
3067
3059
  this._locks.clear();
@@ -30,7 +30,6 @@ export declare class ModbusMaster<A extends AbstractApplicationLayer, P extends
30
30
  private _queue;
31
31
  private _draining;
32
32
  private _nextTid;
33
- private _closed;
34
33
  private _cleanLevel;
35
34
  timeout: number;
36
35
  readonly concurrent: boolean;
@@ -8,7 +8,7 @@ export interface ApplicationDataUnit {
8
8
  }
9
9
  export interface ServerId {
10
10
  /** Server ID; may be 1 byte (number) or multi-byte (number[]) per device spec. */
11
- serverId?: number | number[];
11
+ serverId?: number[];
12
12
  runIndicatorStatus?: boolean;
13
13
  additionalData?: number[];
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "njs-modbus",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "A pure JavaScript implemetation of Modbus for NodeJS.",
5
5
  "keywords": [
6
6
  "modbus",
@@ -20,6 +20,7 @@
20
20
  },
21
21
  "license": "MIT",
22
22
  "author": "Xie Jay <xiejay97@gmail.com>",
23
+ "packageManager": "pnpm@10.10.0",
23
24
  "sideEffects": false,
24
25
  "type": "module",
25
26
  "main": "dist/index.cjs",
@@ -32,7 +33,7 @@
32
33
  ],
33
34
  "scripts": {
34
35
  "build": "rollup -c",
35
- "test": "tsx --test \"test/*.test.ts\"",
36
+ "test": "tsx --test test/*.test.ts",
36
37
  "util:sort-package-json": "sort-package-json"
37
38
  },
38
39
  "devDependencies": {
@@ -59,6 +60,7 @@
59
60
  "serialport": ">=12.0.0",
60
61
  "sort-package-json": "^3.2.1",
61
62
  "tslib": "^2.8.1",
63
+ "tsx": "^4.21.0",
62
64
  "typescript": "~5.8.3",
63
65
  "typescript-eslint": "^8.34.0"
64
66
  },