UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

127 lines 9.59 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { Buffer } from 'buffer'; import { Subject } from 'rxjs'; import { debug } from './debug'; import { bufferToHexString } from '@iotize/common/byte-converter'; const TAG = 'Relay'; export class RelayServer { constructor(_server, params) { this._server = _server; this._params = params || { port: 2000, }; this._clients = []; } get server() { return this._server; } addClient(socket) { this._clients.push(socket); return this; } removeClient(client) { let index = this._clients.indexOf(client); if (index >= 0) { client.close(); debug(TAG, `Removing client ${client.getClientName()}...`); delete this._clients[index]; } return this; } start() { this._subscription = new Subject(); this._server .connections() .subscribe((socket) => __awaiter(this, void 0, void 0, function* () { // Identify this client let clientName = socket.getClientName(); debug(TAG, `[NEW_CLIENT] ${clientName}`); yield socket.ready(); debug(TAG, `[NEW_CLIENT] ${clientName} IS READY`); // Put this new client in the list this.addClient(socket); socket.events().subscribe({ next: (event) => { switch (event.type) { case 'data': let messageString = this.messageToLog(event.payload); debug(TAG, `[MESSAGE] ${messageString} from ${clientName}`); this.broadcastMessage(event.payload, socket); break; case 'error': debug(TAG, `[ERROR] ${clientName} `, event.payload); // Do we have to remove client every time ? this.removeClient(socket); break; case 'end': debug(TAG, `[CLIENTEND] ${clientName}`); this.removeClient(socket); break; } }, }); })); return this._server.listen(this._params); } stop() { return __awaiter(this, void 0, void 0, function* () { this._clients.forEach((client) => { client.close(); }); if (this._server) { yield this._server.stop(); } if (this._subscription) { this._subscription.complete(); } }); } broadcastMessage(message, sender) { let messageString = this.messageToLog(message); debug(TAG, `[BROADCAST] ${messageString} from ${sender.getClientName()}`); if (this._clients.length == 0) { debug(TAG, 'There is no client yet'); return; } // Send a message to all clients this._clients.forEach(function (client) { // Don't want to send it to sender try { if (client === sender) { debug(TAG, `\t- Skip sender ${client.getClientName()}`); return; } if (client.isWritable()) { debug(TAG, `\t- Sent to ${client.getClientName()}`); client.write(message); } else { debug(TAG, `Client ${client.getClientName()} is not writable. Cannot send to it`); } } catch (err) { debug(`Cannot broadcast to ${client.getClientName()}`, err); } }); } messageToLog(message) { if (typeof message === 'string') { return `"${message}"`; } else if (message instanceof Buffer) { return bufferToHexString(message); } else { return message; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXktc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVsYXkvaW1wbC9zcmMvbGliL3JlbGF5LXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVFoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFFcEIsTUFBTSxPQUFPLFdBQVc7SUFNdEIsWUFDWSxPQUErQixFQUN6QyxNQUEyQjtRQURqQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQUd6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSTtZQUN2QixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBOEI7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQThCO1FBQ3pDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUssQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTzthQUNULFdBQVcsRUFBRTthQUNiLFNBQVMsQ0FBQyxDQUFPLE1BQThCLEVBQUUsRUFBRTtZQUNsRCx1QkFBdUI7WUFDdkIsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFFekMsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsVUFBVSxXQUFXLENBQUMsQ0FBQztZQUVsRCxrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV2QixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN4QixJQUFJLEVBQUUsQ0FBQyxLQUF5QixFQUFFLEVBQUU7b0JBQ2xDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTt3QkFDbEIsS0FBSyxNQUFNOzRCQUNULElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNyRCxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWEsYUFBYSxTQUFTLFVBQVUsRUFBRSxDQUFDLENBQUM7NEJBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUM3QyxNQUFNO3dCQUNSLEtBQUssT0FBTzs0QkFDVixLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsVUFBVSxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNwRCwyQ0FBMkM7NEJBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFCLE1BQU07d0JBQ1IsS0FBSyxLQUFLOzRCQUNSLEtBQUssQ0FBQyxHQUFHLEVBQUUsZUFBZSxVQUFVLEVBQUUsQ0FBQyxDQUFDOzRCQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixNQUFNO3FCQUNUO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVZLElBQUk7O1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUE4QixFQUFFLEVBQUU7Z0JBQ3ZELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzNCO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQy9CO1FBQ0gsQ0FBQztLQUFBO0lBRU0sZ0JBQWdCLENBQ3JCLE9BQXdCLEVBQ3hCLE1BQThCO1FBRTlCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxlQUFlLGFBQWEsU0FBUyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQzdCLEtBQUssQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUNyQyxPQUFPO1NBQ1I7UUFDRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUE4QjtZQUM1RCxrQ0FBa0M7WUFDbEMsSUFBSTtnQkFDRixJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7b0JBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3hELE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3ZCLEtBQUssQ0FBQyxHQUFHLEVBQUUsZUFBZSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNwRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN2QjtxQkFBTTtvQkFDTCxLQUFLLENBQ0gsR0FBRyxFQUNILFVBQVUsTUFBTSxDQUFDLGFBQWEsRUFBRSxxQ0FBcUMsQ0FDdEUsQ0FBQztpQkFDSDthQUNGO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osS0FBSyxDQUFDLHVCQUF1QixNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUM3RDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFlBQVksQ0FBQyxPQUE4QjtRQUNuRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUMvQixPQUFPLElBQUksT0FBTyxHQUFHLENBQUM7U0FDdkI7YUFBTSxJQUFJLE9BQU8sWUFBWSxNQUFNLEVBQUU7WUFDcEMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0wsT0FBTyxPQUFPLENBQUM7U0FDaEI7SUFDSCxDQUFDO0NBQ0YifQ==