@ya-modbus/mqtt-bridge 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/bin/ya-modbus-bridge.d.ts.map +1 -0
- package/dist/cjs/bin/ya-modbus-bridge.js +12 -0
- package/dist/cjs/bin/ya-modbus-bridge.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/cli.d.ts.map +1 -0
- package/dist/cjs/src/cli.js +113 -0
- package/dist/cjs/src/cli.js.map +1 -0
- package/dist/cjs/src/device-manager.d.ts.map +1 -0
- package/dist/cjs/src/device-manager.js +82 -0
- package/dist/cjs/src/device-manager.js.map +1 -0
- package/dist/cjs/src/driver-loader.d.ts.map +1 -0
- package/dist/cjs/src/driver-loader.js +122 -0
- package/dist/cjs/src/driver-loader.js.map +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +291 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/polling-scheduler.d.ts.map +1 -0
- package/dist/cjs/src/polling-scheduler.js +130 -0
- package/dist/cjs/src/polling-scheduler.js.map +1 -0
- package/dist/cjs/src/types.d.ts.map +1 -0
- package/dist/cjs/src/types.js +3 -0
- package/dist/{src → cjs/src}/types.js.map +1 -1
- package/dist/cjs/src/utils/config-validator.d.ts.map +1 -0
- package/dist/cjs/src/utils/config-validator.js +35 -0
- package/dist/cjs/src/utils/config-validator.js.map +1 -0
- package/dist/cjs/src/utils/config.d.ts.map +1 -0
- package/dist/cjs/src/utils/config.js +55 -0
- package/dist/cjs/src/utils/config.js.map +1 -0
- package/dist/cjs/src/utils/device-validation.d.ts.map +1 -0
- package/dist/cjs/src/utils/device-validation.js +74 -0
- package/dist/cjs/src/utils/device-validation.js.map +1 -0
- package/dist/cjs/src/utils/package-info.d.ts.map +1 -0
- package/dist/cjs/src/utils/package-info.js +30 -0
- package/dist/cjs/src/utils/package-info.js.map +1 -0
- package/dist/cjs/src/utils/process.d.ts.map +1 -0
- package/dist/cjs/src/utils/process.js +16 -0
- package/dist/cjs/src/utils/process.js.map +1 -0
- package/dist/cjs/src/utils/test-utils.d.ts.map +1 -0
- package/dist/cjs/src/utils/test-utils.js +556 -0
- package/dist/cjs/src/utils/test-utils.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/esm/bin/ya-modbus-bridge.d.ts +9 -0
- package/dist/esm/bin/ya-modbus-bridge.d.ts.map +1 -0
- package/dist/esm/bin/ya-modbus-bridge.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/cli.d.ts +4 -0
- package/dist/esm/src/cli.d.ts.map +1 -0
- package/dist/esm/src/cli.js.map +1 -0
- package/dist/esm/src/device-manager.d.ts +17 -0
- package/dist/esm/src/device-manager.d.ts.map +1 -0
- package/dist/{src → esm/src}/device-manager.js +2 -3
- package/dist/esm/src/device-manager.js.map +1 -0
- package/dist/esm/src/driver-loader.d.ts +53 -0
- package/dist/esm/src/driver-loader.d.ts.map +1 -0
- package/dist/{src → esm/src}/driver-loader.js +2 -4
- package/dist/esm/src/driver-loader.js.map +1 -0
- package/dist/esm/src/index.d.ts +13 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/polling-scheduler.d.ts +48 -0
- package/dist/esm/src/polling-scheduler.d.ts.map +1 -0
- package/dist/{src → esm/src}/polling-scheduler.js +2 -4
- package/dist/esm/src/polling-scheduler.js.map +1 -0
- package/dist/esm/src/types.d.ts +86 -0
- package/dist/esm/src/types.d.ts.map +1 -0
- package/dist/esm/src/types.js.map +1 -0
- package/dist/esm/src/utils/config-validator.d.ts +3 -0
- package/dist/esm/src/utils/config-validator.d.ts.map +1 -0
- package/dist/esm/src/utils/config-validator.js.map +1 -0
- package/dist/esm/src/utils/config.d.ts +3 -0
- package/dist/esm/src/utils/config.d.ts.map +1 -0
- package/dist/esm/src/utils/config.js.map +1 -0
- package/dist/esm/src/utils/device-validation.d.ts +31 -0
- package/dist/esm/src/utils/device-validation.d.ts.map +1 -0
- package/dist/esm/src/utils/device-validation.js.map +1 -0
- package/dist/esm/src/utils/package-info.d.ts +5 -0
- package/dist/esm/src/utils/package-info.d.ts.map +1 -0
- package/dist/esm/src/utils/package-info.js +27 -0
- package/dist/esm/src/utils/package-info.js.map +1 -0
- package/dist/esm/src/utils/process.d.ts +10 -0
- package/dist/esm/src/utils/process.d.ts.map +1 -0
- package/dist/esm/src/utils/process.js.map +1 -0
- package/dist/esm/src/utils/test-utils.d.ts +313 -0
- package/dist/esm/src/utils/test-utils.d.ts.map +1 -0
- package/dist/esm/src/utils/test-utils.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +27 -10
- package/dist/bin/ya-modbus-bridge.d.ts.map +0 -1
- package/dist/bin/ya-modbus-bridge.js.map +0 -1
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js.map +0 -1
- package/dist/src/device-manager.d.ts.map +0 -1
- package/dist/src/device-manager.js.map +0 -1
- package/dist/src/driver-loader.d.ts.map +0 -1
- package/dist/src/driver-loader.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/polling-scheduler.d.ts.map +0 -1
- package/dist/src/polling-scheduler.js.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/utils/__mocks__/package-info.d.ts +0 -9
- package/dist/src/utils/__mocks__/package-info.d.ts.map +0 -1
- package/dist/src/utils/__mocks__/package-info.js +0 -11
- package/dist/src/utils/__mocks__/package-info.js.map +0 -1
- package/dist/src/utils/__mocks__/process.d.ts +0 -20
- package/dist/src/utils/__mocks__/process.d.ts.map +0 -1
- package/dist/src/utils/__mocks__/process.js +0 -37
- package/dist/src/utils/__mocks__/process.js.map +0 -1
- package/dist/src/utils/config-validator.d.ts.map +0 -1
- package/dist/src/utils/config-validator.js.map +0 -1
- package/dist/src/utils/config.d.ts.map +0 -1
- package/dist/src/utils/config.js.map +0 -1
- package/dist/src/utils/device-validation.d.ts.map +0 -1
- package/dist/src/utils/device-validation.js.map +0 -1
- package/dist/src/utils/package-info.d.ts.map +0 -1
- package/dist/src/utils/package-info.js +0 -11
- package/dist/src/utils/package-info.js.map +0 -1
- package/dist/src/utils/process.d.ts.map +0 -1
- package/dist/src/utils/process.js.map +0 -1
- package/dist/src/utils/test-utils.d.ts.map +0 -1
- package/dist/src/utils/test-utils.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{bin → cjs/bin}/ya-modbus-bridge.d.ts +0 -0
- /package/dist/{src → cjs/src}/cli.d.ts +0 -0
- /package/dist/{src → cjs/src}/device-manager.d.ts +0 -0
- /package/dist/{src → cjs/src}/driver-loader.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/polling-scheduler.d.ts +0 -0
- /package/dist/{src → cjs/src}/types.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/config-validator.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/config.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/device-validation.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/package-info.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/process.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/test-utils.d.ts +0 -0
- /package/dist/{bin → esm/bin}/ya-modbus-bridge.js +0 -0
- /package/dist/{src → esm/src}/cli.js +0 -0
- /package/dist/{src → esm/src}/index.js +0 -0
- /package/dist/{src → esm/src}/types.js +0 -0
- /package/dist/{src → esm/src}/utils/config-validator.js +0 -0
- /package/dist/{src → esm/src}/utils/config.js +0 -0
- /package/dist/{src → esm/src}/utils/device-validation.js +0 -0
- /package/dist/{src → esm/src}/utils/process.js +0 -0
- /package/dist/{src → esm/src}/utils/test-utils.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/mqtt-bridge@0.6.0...@ya-modbus/mqtt-bridge@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":"ya-modbus-bridge.d.ts","sourceRoot":"","sources":["../../../bin/ya-modbus-bridge.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CLI entry point
|
|
5
|
+
*
|
|
6
|
+
* This file is the executable entry point that parses command-line arguments.
|
|
7
|
+
* The actual CLI implementation is in src/cli.ts
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const cli_js_1 = require("../src/cli.js");
|
|
11
|
+
cli_js_1.program.parse();
|
|
12
|
+
//# sourceMappingURL=ya-modbus-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ya-modbus-bridge.js","sourceRoot":"","sources":["../../../bin/ya-modbus-bridge.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;AAEH,0CAAuC;AAEvC,gBAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,eAAO,MAAM,OAAO,SAAgB,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.program = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const config_validator_js_1 = require("./utils/config-validator.js");
|
|
9
|
+
const config_js_1 = require("./utils/config.js");
|
|
10
|
+
const package_info_js_1 = require("./utils/package-info.js");
|
|
11
|
+
const process_js_1 = require("./utils/process.js");
|
|
12
|
+
const index_js_1 = require("./index.js");
|
|
13
|
+
exports.program = new commander_1.Command();
|
|
14
|
+
const packageInfo = (0, package_info_js_1.getPackageInfo)();
|
|
15
|
+
exports.program.name('ya-modbus-bridge').description(packageInfo.description).version(packageInfo.version);
|
|
16
|
+
// Error handler for command execution
|
|
17
|
+
exports.program.exitOverride(); // Prevent automatic exit, let us handle errors
|
|
18
|
+
exports.program.configureOutput({
|
|
19
|
+
/* istanbul ignore next - commander internal error output */
|
|
20
|
+
writeErr: (str) => process.stderr.write(str),
|
|
21
|
+
});
|
|
22
|
+
exports.program
|
|
23
|
+
.command('run')
|
|
24
|
+
.description('Run the MQTT bridge')
|
|
25
|
+
.option('-c, --config <path>', 'Path to configuration file')
|
|
26
|
+
.option('--mqtt-url <url>', 'MQTT broker URL (mqtt://, mqtts://, ws://, wss://)')
|
|
27
|
+
.option('--mqtt-client-id <id>', 'MQTT client identifier')
|
|
28
|
+
.option('--mqtt-username <username>', 'MQTT authentication username')
|
|
29
|
+
.option('--mqtt-password <password>', 'MQTT authentication password')
|
|
30
|
+
.option('--mqtt-reconnect-period <ms>', 'Reconnection interval in milliseconds', parseInt)
|
|
31
|
+
.option('--topic-prefix <prefix>', 'Topic prefix for all MQTT topics (default: modbus)')
|
|
32
|
+
.option('--state-dir <path>', 'Directory path for state persistence')
|
|
33
|
+
.action(async (options) => {
|
|
34
|
+
try {
|
|
35
|
+
await runCommand(options);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
39
|
+
process_js_1.processUtils.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
async function runCommand(options) {
|
|
43
|
+
console.log(chalk_1.default.blue('Loading configuration...'));
|
|
44
|
+
let config;
|
|
45
|
+
if (options.config) {
|
|
46
|
+
// Load from file
|
|
47
|
+
config = await (0, config_js_1.loadConfig)(options.config);
|
|
48
|
+
// Override with CLI options if provided
|
|
49
|
+
if (options.mqttUrl)
|
|
50
|
+
config.mqtt.url = options.mqttUrl;
|
|
51
|
+
if (options.mqttClientId)
|
|
52
|
+
config.mqtt.clientId = options.mqttClientId;
|
|
53
|
+
if (options.mqttUsername)
|
|
54
|
+
config.mqtt.username = options.mqttUsername;
|
|
55
|
+
if (options.mqttPassword)
|
|
56
|
+
config.mqtt.password = options.mqttPassword;
|
|
57
|
+
if (options.mqttReconnectPeriod)
|
|
58
|
+
config.mqtt.reconnectPeriod = options.mqttReconnectPeriod;
|
|
59
|
+
if (options.topicPrefix)
|
|
60
|
+
config.topicPrefix = options.topicPrefix;
|
|
61
|
+
if (options.stateDir)
|
|
62
|
+
config.stateDir = options.stateDir;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Build from CLI options only
|
|
66
|
+
if (!options.mqttUrl) {
|
|
67
|
+
throw new Error('Either --config or --mqtt-url must be provided');
|
|
68
|
+
}
|
|
69
|
+
config = {
|
|
70
|
+
mqtt: {
|
|
71
|
+
url: options.mqttUrl,
|
|
72
|
+
...(options.mqttClientId && { clientId: options.mqttClientId }),
|
|
73
|
+
...(options.mqttUsername && { username: options.mqttUsername }),
|
|
74
|
+
...(options.mqttPassword && { password: options.mqttPassword }),
|
|
75
|
+
...(options.mqttReconnectPeriod && { reconnectPeriod: options.mqttReconnectPeriod }),
|
|
76
|
+
},
|
|
77
|
+
...(options.topicPrefix && { topicPrefix: options.topicPrefix }),
|
|
78
|
+
...(options.stateDir && { stateDir: options.stateDir }),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Validate configuration after merging CLI options
|
|
82
|
+
(0, config_validator_js_1.validateConfig)(config);
|
|
83
|
+
// Sanitize URL to hide credentials
|
|
84
|
+
const sanitizedUrl = config.mqtt.url.replace(/:\/\/([^:]+):([^@]+)@/, '://$1:****@');
|
|
85
|
+
console.log(chalk_1.default.blue(`Starting MQTT bridge - connecting to ${sanitizedUrl}...`));
|
|
86
|
+
const bridge = (0, index_js_1.createBridge)(config);
|
|
87
|
+
await bridge.start();
|
|
88
|
+
console.log(chalk_1.default.green('Bridge started successfully'));
|
|
89
|
+
let isShuttingDown = false;
|
|
90
|
+
const handleShutdown = async (signal) => {
|
|
91
|
+
if (isShuttingDown) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
isShuttingDown = true;
|
|
95
|
+
console.log(chalk_1.default.yellow(`\nReceived ${signal}, shutting down...`));
|
|
96
|
+
await bridge.stop();
|
|
97
|
+
console.log(chalk_1.default.green('Bridge stopped'));
|
|
98
|
+
process_js_1.processUtils.exit(0);
|
|
99
|
+
};
|
|
100
|
+
process_js_1.processUtils.onSignal('SIGINT', () => {
|
|
101
|
+
handleShutdown('SIGINT').catch((err) => {
|
|
102
|
+
console.error(chalk_1.default.red('Shutdown error:'), err);
|
|
103
|
+
process_js_1.processUtils.exit(1);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
process_js_1.processUtils.onSignal('SIGTERM', () => {
|
|
107
|
+
handleShutdown('SIGTERM').catch((err) => {
|
|
108
|
+
console.error(chalk_1.default.red('Shutdown error:'), err);
|
|
109
|
+
process_js_1.processUtils.exit(1);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-manager.d.ts","sourceRoot":"","sources":["../../../src/device-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG5D,qBAAa,aAAa;IAIZ,OAAO,CAAC,YAAY;IAHhC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAkC;gBAE7B,YAAY,EAAE,YAAY;IAExC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC9C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD,WAAW,IAAI,YAAY,EAAE;IAI7B,cAAc,IAAI,MAAM;IAIxB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,GAAG,IAAI;IAYrF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;CAG5D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceManager = void 0;
|
|
4
|
+
const device_validation_js_1 = require("./utils/device-validation.js");
|
|
5
|
+
class DeviceManager {
|
|
6
|
+
constructor(driverLoader) {
|
|
7
|
+
this.driverLoader = driverLoader;
|
|
8
|
+
this.devices = new Map();
|
|
9
|
+
this.configs = new Map();
|
|
10
|
+
}
|
|
11
|
+
async addDevice(config) {
|
|
12
|
+
(0, device_validation_js_1.validateDeviceConfig)(config);
|
|
13
|
+
if (this.devices.has(config.deviceId)) {
|
|
14
|
+
throw new Error(`Device ${config.deviceId} already exists`);
|
|
15
|
+
}
|
|
16
|
+
const enabled = config.enabled ?? true;
|
|
17
|
+
const status = {
|
|
18
|
+
deviceId: config.deviceId,
|
|
19
|
+
state: 'disconnected',
|
|
20
|
+
enabled,
|
|
21
|
+
connected: false,
|
|
22
|
+
};
|
|
23
|
+
this.devices.set(config.deviceId, status);
|
|
24
|
+
this.configs.set(config.deviceId, config);
|
|
25
|
+
// Load driver if enabled
|
|
26
|
+
if (enabled) {
|
|
27
|
+
try {
|
|
28
|
+
this.updateDeviceState(config.deviceId, { state: 'connecting' });
|
|
29
|
+
await this.driverLoader.loadDriver(config.driver, config.connection, config.deviceId);
|
|
30
|
+
this.updateDeviceState(config.deviceId, {
|
|
31
|
+
state: 'connected',
|
|
32
|
+
connected: true,
|
|
33
|
+
lastUpdate: Date.now(),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// Clean up device state to allow retry (make operation atomic)
|
|
38
|
+
this.devices.delete(config.deviceId);
|
|
39
|
+
this.configs.delete(config.deviceId);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async removeDevice(deviceId) {
|
|
45
|
+
if (!this.devices.has(deviceId)) {
|
|
46
|
+
throw new Error(`Device ${deviceId} not found`);
|
|
47
|
+
}
|
|
48
|
+
await this.driverLoader.unloadDriver(deviceId);
|
|
49
|
+
this.devices.delete(deviceId);
|
|
50
|
+
this.configs.delete(deviceId);
|
|
51
|
+
}
|
|
52
|
+
getDevice(deviceId) {
|
|
53
|
+
return this.devices.get(deviceId);
|
|
54
|
+
}
|
|
55
|
+
listDevices() {
|
|
56
|
+
return Array.from(this.devices.values());
|
|
57
|
+
}
|
|
58
|
+
getDeviceCount() {
|
|
59
|
+
return this.devices.size;
|
|
60
|
+
}
|
|
61
|
+
updateDeviceState(deviceId, updates) {
|
|
62
|
+
const device = this.devices.get(deviceId);
|
|
63
|
+
if (!device) {
|
|
64
|
+
throw new Error(`Device ${deviceId} not found`);
|
|
65
|
+
}
|
|
66
|
+
this.devices.set(deviceId, {
|
|
67
|
+
...device,
|
|
68
|
+
...updates,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async clear() {
|
|
72
|
+
const deviceIds = Array.from(this.devices.keys());
|
|
73
|
+
await Promise.all(deviceIds.map((id) => this.driverLoader.unloadDriver(id)));
|
|
74
|
+
this.devices.clear();
|
|
75
|
+
this.configs.clear();
|
|
76
|
+
}
|
|
77
|
+
getDeviceConfig(deviceId) {
|
|
78
|
+
return this.configs.get(deviceId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.DeviceManager = DeviceManager;
|
|
82
|
+
//# sourceMappingURL=device-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../../src/device-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-loader.d.ts","sourceRoot":"","sources":["../../../src/driver-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAwB,MAAM,sBAAsB,CAAA;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,KAAK,kBAAkB,GAAG,OAAO,iBAAiB,CAAA;AAElD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;gBAEvC,YAAY,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,EAAE,gBAAgB;IAKlF;;;;;;;OAOG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IA2CxB;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;CAkBpC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DriverLoader = void 0;
|
|
4
|
+
const driver_loader_1 = require("@ya-modbus/driver-loader");
|
|
5
|
+
const transport_1 = require("@ya-modbus/transport");
|
|
6
|
+
/**
|
|
7
|
+
* Manages dynamic loading and lifecycle of device drivers
|
|
8
|
+
* Uses TransportManager to pool RTU transports and prevent bus collisions
|
|
9
|
+
*/
|
|
10
|
+
class DriverLoader {
|
|
11
|
+
constructor(loadDriverFn, transportManager) {
|
|
12
|
+
this.driverInstances = new Map();
|
|
13
|
+
this.devicePackages = new Map();
|
|
14
|
+
this.loadDriverFn = loadDriverFn ?? driver_loader_1.loadDriver;
|
|
15
|
+
this.transportManager = transportManager ?? new transport_1.TransportManager();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load a driver package and create an instance for a device
|
|
19
|
+
*
|
|
20
|
+
* @param packageName - NPM package name (e.g., '@ya-modbus/driver-xymd1' or 'ya-modbus-driver-test')
|
|
21
|
+
* @param connection - Device connection configuration
|
|
22
|
+
* @param deviceId - Unique device identifier for tracking the instance
|
|
23
|
+
* @returns Driver instance
|
|
24
|
+
*/
|
|
25
|
+
async loadDriver(packageName, connection, deviceId) {
|
|
26
|
+
// Security validation: prevent path traversal and code injection
|
|
27
|
+
// Accept both scoped (@ya-modbus/driver-*) and unscoped (ya-modbus-driver-*) packages
|
|
28
|
+
const isValidScopedDriver = packageName.startsWith('@ya-modbus/driver-');
|
|
29
|
+
const isValidUnscopedDriver = packageName.startsWith('ya-modbus-driver-');
|
|
30
|
+
if (!isValidScopedDriver && !isValidUnscopedDriver) {
|
|
31
|
+
throw new Error(`Invalid driver package name: must be @ya-modbus/driver-<name> or ya-modbus-driver-<name>`);
|
|
32
|
+
}
|
|
33
|
+
if (packageName.includes('..') || packageName.includes('\\')) {
|
|
34
|
+
throw new Error('Invalid driver package name: path traversal not allowed');
|
|
35
|
+
}
|
|
36
|
+
// Load driver package using driver-loader
|
|
37
|
+
const loadedDriver = await this.loadDriverFn({ driverPackage: packageName });
|
|
38
|
+
// Get transport from manager (shared for RTU, unique for TCP)
|
|
39
|
+
const config = this.connectionToTransportConfig(connection);
|
|
40
|
+
const transport = await this.transportManager.getTransport(config);
|
|
41
|
+
// Create driver instance
|
|
42
|
+
const driver = await loadedDriver.createDriver({
|
|
43
|
+
transport,
|
|
44
|
+
slaveId: connection.slaveId,
|
|
45
|
+
});
|
|
46
|
+
// Call initialize if available
|
|
47
|
+
if (driver.initialize) {
|
|
48
|
+
await driver.initialize();
|
|
49
|
+
}
|
|
50
|
+
// Cache instance if deviceId provided
|
|
51
|
+
if (deviceId) {
|
|
52
|
+
this.driverInstances.set(deviceId, driver);
|
|
53
|
+
this.devicePackages.set(deviceId, packageName);
|
|
54
|
+
}
|
|
55
|
+
// Note: Don't close transport on failure - it may be shared by other devices
|
|
56
|
+
// The transport manager will handle cleanup when closeAll() is called
|
|
57
|
+
return driver;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Unload a driver instance and clean up resources
|
|
61
|
+
* Note: Transport is managed by TransportManager and not closed here
|
|
62
|
+
*
|
|
63
|
+
* @param deviceId - Device identifier
|
|
64
|
+
*/
|
|
65
|
+
async unloadDriver(deviceId) {
|
|
66
|
+
const driver = this.driverInstances.get(deviceId);
|
|
67
|
+
try {
|
|
68
|
+
if (driver?.destroy) {
|
|
69
|
+
await driver.destroy();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
// Always remove from cache, even if destroy fails
|
|
74
|
+
this.driverInstances.delete(deviceId);
|
|
75
|
+
this.devicePackages.delete(deviceId);
|
|
76
|
+
}
|
|
77
|
+
// Note: Transport is managed by TransportManager and shared across devices
|
|
78
|
+
// It will be closed when the entire bridge shuts down via closeAll()
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get a loaded driver instance
|
|
82
|
+
*
|
|
83
|
+
* @param deviceId - Device identifier
|
|
84
|
+
* @returns Driver instance or undefined if not loaded
|
|
85
|
+
*/
|
|
86
|
+
getDriver(deviceId) {
|
|
87
|
+
return this.driverInstances.get(deviceId);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Close all managed transports
|
|
91
|
+
* Should be called when shutting down the bridge
|
|
92
|
+
*/
|
|
93
|
+
async closeAllTransports() {
|
|
94
|
+
await this.transportManager.closeAll();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Convert DeviceConnection to TransportConfig
|
|
98
|
+
*
|
|
99
|
+
* @param connection - Device connection configuration
|
|
100
|
+
* @returns Transport configuration
|
|
101
|
+
*/
|
|
102
|
+
connectionToTransportConfig(connection) {
|
|
103
|
+
return connection.type === 'rtu'
|
|
104
|
+
? {
|
|
105
|
+
port: connection.port,
|
|
106
|
+
baudRate: connection.baudRate,
|
|
107
|
+
dataBits: connection.dataBits,
|
|
108
|
+
parity: connection.parity,
|
|
109
|
+
stopBits: connection.stopBits,
|
|
110
|
+
slaveId: connection.slaveId,
|
|
111
|
+
timeout: connection.timeout,
|
|
112
|
+
}
|
|
113
|
+
: {
|
|
114
|
+
host: connection.host,
|
|
115
|
+
port: connection.port,
|
|
116
|
+
slaveId: connection.slaveId,
|
|
117
|
+
timeout: connection.timeout,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.DriverLoader = DriverLoader;
|
|
122
|
+
//# sourceMappingURL=driver-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-loader.js","sourceRoot":"","sources":["../../../src/driver-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAMX,MAAM,YAAY,CAAA;AAQnB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,kBAAkB,GAChC,UAAU,CA0UZ"}
|