braid/src/clients/clientBase.ts
2019-12-22 01:24:37 -05:00

88 lines
2.5 KiB
TypeScript

import * as WebSocket from 'ws';
import ClientManager from '../clientManager';
import ChannelManager from '../channelManager';
import PublicChannel from '../channels/types/publicChannel';
import PrivateChannel from '../channels/types/privateChannel';
import CustomChannel from '../channels/types/customChannel';
var messageManager = require('../messageManager');
var logger = require('../logger');
class ClientBase {
ws: WebSocket;
data: any;
id: number;
channel: PublicChannel|PrivateChannel|CustomChannel|null;
clientManager: ClientManager;
channelManager: ChannelManager;
roles: Array<string>;
constructor(data: any, ws: WebSocket, channelManager: ChannelManager, clientManager: ClientManager) {
this.ws = ws;
this.data = data;
this.id = data.user_id;
this.channel = null;
this.clientManager = clientManager;
this.channelManager = channelManager;
this.roles = ['receiver']
}
validations() {
return {}
}
getData() {
return this.data;
}
type() {
return this.data.client_type;
}
clientType() {
return this.data.client;
}
connectToChannel(channel: PublicChannel|PrivateChannel|CustomChannel) {
this.channel = channel;
var messageListener = (message: any) => {
logger.accessLog.info(`starting message transaction on channel ${channel.id}: `, {message: message});
message = messageManager.prepareMessage(message, channel, this);
if (!message.error) {
if (message['message_type'] == 'broadcast') {
channel.broadcastMessage(this, message);
} else if (message['message_type'] == 'changeChannel') {
this.ws.removeListener('message', messageListener);
this.channelManager.changeChannel(this, message);
}
logger.accessLog.info(`message transaction complete on channel ${channel.id}: `, {message: message});
} else {
logger.errorLog.info(`Validation failed, please review schema: ${channel.id}`, {data: {message: message, error: message.error}});
}
}
this.ws.on('message', messageListener);
this.ws.on('close', (reasonCode: string, description: string) => {
logger.accessLog.info(`closing connection for client ${this.id}`);
if (this.channel) {
this.channel.removeClient(this.id);
}
this.clientManager.removeClient(this.id);
logger.accessLog.info(`closed connection for client ${this.id}`);
});
}
replaceWebSocket(ws: WebSocket) {
this.ws.close();
this.ws = ws;
}
};
export default ClientBase;