UNPKG

@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
"use strict"; 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;