knx-listener
Version:
A thin client that creates a tunnel to knx gateway to listen to telegrams within knx net
96 lines • 11 kB
JavaScript
;
const dgram_1 = require("dgram");
const events_1 = require("events");
/**
* Simple promisable udp socket
*/
class AsyncSocket {
constructor() {
this.events = new events_1.EventEmitter();
}
isConnected() {
return this.socket ? true : false;
}
connect(port = 0 /* OS assigned port */) {
return new Promise((resolve, reject) => {
if (this.isConnected()) {
resolve(this.socket.address());
}
else {
this.socket = dgram_1.createSocket('udp4')
.on('message', (raw, remote) => {
this.events.emit('raw', raw, remote);
})
.once('close', () => {
this.socket = undefined;
// emit disconnect event
this.events.emit('disconnect');
// and remove all listeners to prevent any memory leak
this.events.removeAllListeners();
})
.once('error', (err) => {
reject(err);
})
.once('listening', () => {
resolve(this.socket.address());
});
this.socket.bind(port);
}
});
}
complete(cb) {
return new Promise((resolve) => {
if (this.isConnected()) {
this.socket.once('close', () => {
resolve(typeof cb === 'function' ? cb() : undefined);
});
}
else {
resolve(typeof cb === 'function' ? cb() : undefined);
}
});
}
disconnect(cb) {
return new Promise((resolve) => {
if (this.isConnected()) {
this.socket.once('close', () => {
resolve(typeof cb === 'function' ? cb() : undefined);
});
this.socket.close();
}
else {
resolve(typeof cb === 'function' ? cb() : undefined);
}
});
}
send(host, port, data) {
return new Promise((resolve, reject) => {
if (this.isConnected()) {
this.socket.send(data, port, host, (err, bytes) => {
if (err) {
reject(err);
}
if (bytes !== data.length) {
reject(new Error(`Expected to send ${data.length} bytes, but sent ${bytes}`));
}
resolve();
});
}
else {
throw new Error(`No connection`);
}
});
}
on(event, cb) {
if (this.events.on(event, cb)) {
return {
unsubscribe: () => this.events.removeListener(event, cb),
};
}
else {
throw new Error(`Failed to subscribe`);
}
}
}
exports.AsyncSocket = AsyncSocket;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtc29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FzeW5jLXNvY2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUNBSWU7QUFDZixtQ0FFZ0I7QUFLaEI7O0dBRUc7QUFDSDtJQUFBO1FBRVksV0FBTSxHQUFpQixJQUFJLHFCQUFZLEVBQUUsQ0FBQztJQWtGdEQsQ0FBQztJQWpGQyxXQUFXO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLE9BQWUsQ0FBQyxDQUFDLHNCQUFzQjtRQUM3QyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTTtZQUM3QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxHQUFHLG9CQUFZLENBQUMsTUFBTSxDQUFDO3FCQUMvQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBVyxFQUFFLE1BQU07b0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO29CQUN4Qix3QkFBd0I7b0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMvQixzREFBc0Q7b0JBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFD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QzVDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDO2dCQUNMLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7YUFDekQsQ0FBQztRQUNKLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcEZELGtDQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZVNvY2tldCxcbiAgU29ja2V0LFxuICBSZW1vdGVJbmZvLFxufSBmcm9tICdkZ3JhbSc7XG5pbXBvcnQge1xuICBFdmVudEVtaXR0ZXIsXG59IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQge1xuICBTdWJzY3JpYmVyLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBTaW1wbGUgcHJvbWlzYWJsZSB1ZHAgc29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY1NvY2tldCB7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQ7XG4gIHByb3RlY3RlZCBldmVudHM6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIGNvbm5lY3QocG9ydDogbnVtYmVyID0gMCAvKiBPUyBhc3NpZ25lZCBwb3J0ICovKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJlbW90ZUluZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnNvY2tldC5hZGRyZXNzKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBjcmVhdGVTb2NrZXQoJ3VkcDQnKVxuICAgICAgICAgIC5vbignbWVzc2FnZScsIChyYXc6IEJ1ZmZlciwgcmVtb3RlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdyYXcnLCByYXcsIHJlbW90ZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIGVtaXQgZGlzY29ubmVjdCBldmVudFxuICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdCgnZGlzY29ubmVjdCcpO1xuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZSBhbGwgbGlzdGVuZXJzIHRvIHByZXZlbnQgYW55IG1lbW9yeSBsZWFrXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbmNlKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5zb2NrZXQuYWRkcmVzcygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb2NrZXQuYmluZChwb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb21wbGV0ZTxUPihjYj86ICgpID0+IFQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYigpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKCkgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGRpc2Nvbm5lY3Q8VD4oY2I/OiAoKSA9PiBUKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IoKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYigpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBzZW5kKGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhLCBwb3J0LCBob3N0LCAoZXJyLCBieXRlcykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYnl0ZXMgIT09IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBFeHBlY3RlZCB0byBzZW5kICR7ZGF0YS5sZW5ndGh9IGJ5dGVzLCBidXQgc2VudCAke2J5dGVzfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29ubmVjdGlvbmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uKGV2ZW50OiAnZGlzY29ubmVjdCcsIGNiOiAoKSA9PiB2b2lkKTogU3Vic2NyaWJlcjtcbiAgb24oZXZlbnQ6ICdyYXcnLCBjYjogKHJhdzogQnVmZmVyLCBzZW5kZXI6IFJlbW90ZUluZm8pID0+IHZvaWQpOiBTdWJzY3JpYmVyO1xuICBvbjxUPihldmVudDogc3RyaW5nLCBjYjogKHF1ZXJ5OiBULCBzZW5kZXI6IFJlbW90ZUluZm8pID0+IHZvaWQpOiBTdWJzY3JpYmVyO1xuICBvbihldmVudDogc3RyaW5nLCBjYjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogU3Vic2NyaWJlciB7XG4gICAgaWYgKHRoaXMuZXZlbnRzLm9uKGV2ZW50LCBjYikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB0aGlzLmV2ZW50cy5yZW1vdmVMaXN0ZW5lcihldmVudCwgY2IpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3Vic2NyaWJlYCk7XG4gICAgfVxuICB9XG59XG4iXX0=