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