@iotize/tap
Version:
IoTize Device client for Javascript
127 lines • 9.59 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXktc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVsYXkvaW1wbC9zcmMvbGliL3JlbGF5LXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVFoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFFcEIsTUFBTSxPQUFPLFdBQVc7SUFNdEIsWUFDWSxPQUErQixFQUN6QyxNQUEyQjtRQURqQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQUd6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSTtZQUN2QixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBOEI7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQThCO1FBQ3pDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUssQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLE1BQU0sQ0FBQyxhQUFhLEVB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