88 lines
2.5 KiB
TypeScript
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;
|