@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
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(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;