schema validation, yeeee

This commit is contained in:
Josh Burman
2019-03-18 16:54:16 -04:00
parent 30e45f8e47
commit 02b62ed018
12 changed files with 103 additions and 19 deletions

View File

@ -6,7 +6,7 @@ import MHSChannel from './channels/sites/mhsChannel';
var logger = require('./logger');
class ChannelManager {
channels: ChannelBase[]|MHSChannel[] = [];
channels: any = [];
constructor() {
// create default channel...
@ -85,6 +85,19 @@ class ChannelManager {
return false;
}
purgeEmptyChannels() {
var index = 0
for (let channel of this.channels) {
if (channel.clients.length == 0) {
this.channels.splice(index, 1);
logger.accessLog.info(`channel removed: ${channel.id}`);
}
index++;
}
}
};
export default ChannelManager;

View File

@ -1,17 +1,32 @@
import ClientBase from '../../clients/clientBase';
import MHSClient from '../../clients/sites/mhsClient';
import ChannelBase from '../channelBase';
import * as Joi from 'joi';
var logger = require('../../logger');
class MHSChannel extends ChannelBase {
private schema = {
currentIndex: Joi.number().integer().required(),
totalQuestions: Joi.number().integer().required(),
timeElapsed: Joi.number().required(),
status: Joi.string().required(),
};
broadcastMessage(from: ClientBase|MHSClient|null, message: string) {
for (let client of this.clients) {
if (client != from && client.data.user_type == 'teacher') {
client.ws.send(message);
logger.accessLog.info(`sent to ${client.id}: `, {message: message});
} else {
logger.accessLog.info(`client either not a teacher or is the sender: ${client.id} - `, {message: message});
const result = Joi.validate(JSON.parse(message), this.schema);
if (result.error && from != null) {
from.ws.send(`Failed to send the message, the data provided does not conform to the schema outlined by the channel type (mhs) - ${result.error}`);
logger.errorLog.info(`Failed to send the message, the data provided does not conform to the schema outlined by the channel type (mhs)"`, {data: {clientId: from.id, message: message, error: result.error}});
} else {
for (let client of this.clients) {
if (client != from && client.data.user_type == 'teacher') {
client.ws.send(message);
logger.accessLog.info(`sent to ${client.id}: `, {message: message});
} else {
logger.accessLog.info(`client either not a teacher or is the sender: ${client.id} - `, {message: message});
}
}
}

View File

@ -69,11 +69,11 @@ class ClientManager {
try {
var Client = require(`./clients/${data.client_type}s/${data.client}client`);
logger.accessLog.info(`attempting to create client of type ${data.client}, client id: ${data.user_id}...`);
return new Client(data, ws);
return new Client(data, ws, this);
} catch (e) {
logger.errorLog.info(e);
logger.accessLog.info(`creating base client: ${data.user_id}`);
return new ClientBase(data, ws);
return new ClientBase(data, ws, this);
}
}
};

View File

@ -1,5 +1,6 @@
import * as WebSocket from 'ws';
import * as ChannelManager from '../channelManager';
import ClientManager from '../clientManager';
import ChannelBase from '../channels/channelBase';
import MHSChannel from '../channels/sites/mhsChannel';
@ -10,12 +11,14 @@ class ClientBase {
data: any;
id: number;
channel: ChannelBase|MHSChannel|null;
clientManager: ClientManager;
constructor(data: any, ws: WebSocket) {
constructor(data: any, ws: WebSocket, clientManager: ClientManager) {
this.ws = ws;
this.data = data;
this.id = data.user_id;
this.channel = null;
this.clientManager = clientManager;
}
getData() {
@ -46,7 +49,7 @@ class ClientBase {
this.channel.removeClient(this.id);
}
// server.clientManager.removeClient(this.id);
this.clientManager.removeClient(this.id);
logger.accessLog.info(`closed connection for client ${this.id}`);
});
}

View File

@ -1,11 +1,12 @@
import * as WebSocket from 'ws';
import ClientBase from '../clientBase';
import ClientManager from '../../clientManager';
var logger = require('../../logger');
class MHSClient extends ClientBase {
constructor(data: any, ws: WebSocket) {
super(data, ws);
constructor(data: any, ws: WebSocket, clientManager: ClientManager) {
super(data, ws, clientManager);
logger.accessLog.info('MHS Client Created', {data: data});
}
};

View File

@ -52,6 +52,10 @@ function connectionManager() {
channelManager.addClientToChannel(client, data.channel);
}
//remove any channels that have no users in them
logger.accessLog.info(`Purging empty channels...`);
channelManager.purgeEmptyChannels();
ws.send(`Hi there, welcome to braid, Measures Web Socket server. Connecting all our services!\nYou are currently in channel: ${data.channel}`);
});
}

View File

@ -1,5 +1,6 @@
import ChannelBase from '../channels/channelBase';
import ClientBase from '../clients/clientBase';
import ClientManager from '../clientManager';
var exec = require('child_process').exec;
var expect = require('chai').expect;
@ -10,8 +11,9 @@ var app = require('../config/app');
var name: string = 'test channel';
var wsClient = new WebSocketClient();
var channel: ChannelBase;
var clientManager = new ClientManager();
var data: any = { 'client': 'test', 'client_type':'site', 'user_id': 125, 'user_type': 'user', 'channel': name }
var client: ClientBase = new ClientBase(data, wsClient);
var client: ClientBase = new ClientBase(data, wsClient, clientManager);
describe('ChannelBase', function () {
it('should create a class of ChannelBase', function () {

View File

@ -3,6 +3,7 @@ import ClientBase from '../clients/clientBase';
import MHSClient from '../clients/sites/mhsClient';
import MHSChannel from '../channels/sites/mhsChannel';
import ChannelManager from '../channelManager';
import ClientManager from '../clientManager';
var expect = require('chai').expect;
var sinon = require('sinon');
@ -11,7 +12,8 @@ var name: string = 'test channel';
var data: any = { 'client': 'test', 'client_type':'site', 'user_id': 125, 'user_type': 'user', 'channel': name }
var WebSocketClient = require('websocket').client;
var wsClient = new WebSocketClient();
var client: ClientBase = new ClientBase(data, wsClient);
var clientManager = new ClientManager();
var client: ClientBase = new ClientBase(data, wsClient, clientManager);
let channelManager = new ChannelManager();

View File

@ -1,5 +1,6 @@
import * as WebSocket from 'ws';
import ClientBase from '../clients/clientBase';
import ClientManager from '../clientManager';
var expect = require('chai').expect;
var assert = require('chai').assert;
@ -9,7 +10,8 @@ var name: string = 'test channel';
var data: any = { 'client': 'test', 'client_type':'site', 'user_id': 125, 'user_type': 'user', 'channel': name }
var WebSocketClient = require('websocket').client;
var wsClient = new WebSocketClient();
var client: ClientBase = new ClientBase(data, wsClient);
var clientManager = new ClientManager();
var client: ClientBase = new ClientBase(data, wsClient, clientManager);
describe('ClientBase', function () {
it('should get client data', function () {

View File

@ -11,9 +11,8 @@ var name: string = 'test channel';
var data: any = { 'client': 'test', 'client_type':'site', 'user_id': 125, 'user_type': 'user', 'channel': name }
var WebSocketClient = require('websocket').client;
var wsClient = new WebSocketClient();
var client: ClientBase = new ClientBase(data, wsClient);
let clientManager = new ClientManager();
var clientManager = new ClientManager();
var client: ClientBase = new ClientBase(data, wsClient, clientManager);
describe('ClientManager', function () {
it('should add a client', function () {