@andrei-tatar/node-red-contrib-nibetcp
Version:
Node-red integration for Nibe S series heatpumps using modbus over TCP
67 lines (66 loc) • 2.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Tcp = void 0;
const net_1 = require("net");
const rxjs_1 = require("rxjs");
class Tcp {
constructor(client, logger) {
this.client = client;
this.logger = logger;
this._data = new rxjs_1.Subject();
this.data$ = this._data.asObservable();
client.on('data', msg => this._data.next(msg));
}
static create(address, logger) {
return new rxjs_1.Observable(observer => {
const client = new net_1.Socket();
const url = new URL(address);
if (url.protocol !== 'tcp:') {
throw new Error('Only TCP supported for now');
}
;
const port = parseInt(url.port) || 502;
client.connect({
host: url.hostname,
port,
});
logger === null || logger === void 0 ? void 0 : logger.trace('connecting', { host: url.hostname, port });
const wrapper = new Tcp(client, logger);
client.on('connect', () => {
logger === null || logger === void 0 ? void 0 : logger.trace('connected');
observer.next(wrapper);
});
client.on('error', (err) => {
logger === null || logger === void 0 ? void 0 : logger.trace('error', { err });
observer.error(err);
});
client.on('close', () => {
logger === null || logger === void 0 ? void 0 : logger.trace('connection closed');
observer.error(new Error('Socket was closed'));
});
return () => {
logger === null || logger === void 0 ? void 0 : logger.trace('observable closed');
wrapper.end();
client.end();
};
});
}
send(data) {
return new rxjs_1.Observable(observer => {
this.client.write(data, err => {
if (err) {
observer.error(err);
}
else {
observer.complete();
}
});
});
}
end() {
var _a;
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.trace('end');
this._data.complete();
}
}
exports.Tcp = Tcp;