UNPKG

@andrei-tatar/node-red-contrib-nibetcp

Version:

Node-red integration for Nibe S series heatpumps using modbus over TCP

66 lines (65 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(Buffer.from(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;