From cdd61799922f31fc28b4adcb781b5cb28e4596d0 Mon Sep 17 00:00:00 2001 From: Josh Burman Date: Mon, 11 Mar 2019 14:35:33 -0400 Subject: [PATCH] update to types --- dist/server/channelManager.js | 42 ++++++++++- dist/server/channelManager.js.map | 2 +- dist/server/channels/channelBase.js | 42 +++++++++++ dist/server/channels/channelBase.js.map | 1 + dist/server/channels/sites/mhsChannel.js | 20 ++++++ dist/server/channels/sites/mhsChannel.js.map | 1 + dist/server/client/sites/mhsClient.js | 8 +++ dist/server/client/sites/mhsClient.js.map | 1 + dist/server/clientManager.js | 59 +++++++++++++--- dist/server/clientManager.js.map | 2 +- dist/server/clients/base.js | 22 ++++++ dist/server/clients/base.js.map | 1 + dist/server/clients/clientBase.js | 30 ++++++++ dist/server/clients/clientBase.js.map | 1 + dist/server/clients/sites/mhsClient.js | 13 ++++ dist/server/clients/sites/mhsClient.js.map | 1 + dist/server/config/app.js | 4 +- dist/server/config/app.js.map | 2 +- dist/server/server.js | 23 +++++- dist/server/server.js.map | 2 +- src/channelManager.ts | 53 +++++++++++++- src/channels/channelBase.ts | 46 ++++++++++++ src/channels/sites/mhsChannel.ts | 19 +++++ src/clientManager.ts | 74 ++++++++++++++++---- src/clients/clientBase.ts | 42 +++++++++++ src/clients/sites/mhsClient.ts | 13 ++++ src/config/app.ts | 4 +- src/server.ts | 29 +++++++- 28 files changed, 518 insertions(+), 39 deletions(-) create mode 100644 dist/server/channels/channelBase.js create mode 100644 dist/server/channels/channelBase.js.map create mode 100644 dist/server/channels/sites/mhsChannel.js create mode 100644 dist/server/channels/sites/mhsChannel.js.map create mode 100644 dist/server/client/sites/mhsClient.js create mode 100644 dist/server/client/sites/mhsClient.js.map create mode 100644 dist/server/clients/base.js create mode 100644 dist/server/clients/base.js.map create mode 100644 dist/server/clients/clientBase.js create mode 100644 dist/server/clients/clientBase.js.map create mode 100644 dist/server/clients/sites/mhsClient.js create mode 100644 dist/server/clients/sites/mhsClient.js.map create mode 100644 src/channels/channelBase.ts create mode 100644 src/channels/sites/mhsChannel.ts create mode 100644 src/clients/clientBase.ts create mode 100644 src/clients/sites/mhsClient.ts diff --git a/dist/server/channelManager.js b/dist/server/channelManager.js index 68794df..36fb6d3 100644 --- a/dist/server/channelManager.js +++ b/dist/server/channelManager.js @@ -1,6 +1,46 @@ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const channelBase_1 = require("./channels/channelBase"); class ChannelManager { + constructor() { + this.channels = []; + // create default channel... + var channel = new channelBase_1.default('default'); + this.channels.push(channel); + } + createChannel(data) { + var channel = this.channelExists(data.channel_id); + if (channel) { + console.log('channel already exists'); + } + else { + var Channel = require(`./channels/${data.client_type}s/${data.client}channel`); + var channel = new channelBase_1.default(data.channel_id); + this.channels.push(channel); + console.log('added channel to channel manager'); + } + console.log(data.channel_id); + } + channelExists(channel_id) { + for (let channel of this.channels) { + if (channel.id == channel_id) { + return channel; + } + } + return null; + } + addClientToChannel(client, channel_id) { + var channel = this.channelExists(channel_id); + if (channel) { + channel.addClient(client); + client.connectToChannel(channel); + } + else { + console.log(`channel with id ${channel_id} does not exist.`); + } + } } ; -module.exports = ChannelManager; +exports.default = ChannelManager; +// { :client => 'mhs', :client_type => 'site', :user_id => 125, :user_type => 'user', :channel => 'mhs_1239' } //# sourceMappingURL=channelManager.js.map \ No newline at end of file diff --git a/dist/server/channelManager.js.map b/dist/server/channelManager.js.map index 882d5f3..620d258 100644 --- a/dist/server/channelManager.js.map +++ b/dist/server/channelManager.js.map @@ -1 +1 @@ -{"version":3,"file":"channelManager.js","sourceRoot":"","sources":["../../src/channelManager.ts"],"names":[],"mappings":";AAAA,MAAM,cAAc;CAEnB;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC"} \ No newline at end of file +{"version":3,"file":"channelManager.js","sourceRoot":"","sources":["../../src/channelManager.ts"],"names":[],"mappings":";;AAAA,wDAAiD;AAKjD,MAAM,cAAc;IAGlB;QAFA,aAAQ,GAA+B,EAAE,CAAC;QAGxC,4BAA4B;QAC5B,IAAI,OAAO,GAAgB,IAAI,qBAAW,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,IAAS;QACrB,IAAI,OAAO,GAAgC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/E,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;SACvC;aAAM;YACL,IAAI,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;YAC/E,IAAI,OAAO,GAAgC,IAAI,qBAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;SACjD;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjC,IAAI,OAAO,CAAC,EAAE,IAAI,UAAU,EAAE;gBAC5B,OAAO,OAAO,CAAC;aAChB;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB,CAAC,MAA4B,EAAE,UAAkB;QACjE,IAAI,OAAO,GAAgC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAE1E,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;SAClC;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,kBAAkB,CAAC,CAAA;SAC7D;IACH,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,cAAc,CAAC;AAE9B,8GAA8G"} \ No newline at end of file diff --git a/dist/server/channels/channelBase.js b/dist/server/channels/channelBase.js new file mode 100644 index 0000000..7a21e1c --- /dev/null +++ b/dist/server/channels/channelBase.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ChannelBase { + constructor(id) { + this.clients = []; + this.id = id; + console.log('channel created'); + } + addClient(client) { + console.log(client.data); + if (this.clientExists(client.id)) { + console.log('client already exits in channel'); + } + else { + this.clients.push(client); + console.log('added client to channel'); + } + } + clientExists(id) { + for (let client of this.clients) { + if (client.id == id) { + return client; + } + } + return null; + } + broadcastMessage(from, message) { + for (let client of this.clients) { + if (client != from) { + client.ws.send(message); + console.log(`sent to ${client.id}: %s`, message); + console.log(message); + } + else { + console.log('client is same as sender'); + } + } + } +} +; +exports.default = ChannelBase; +//# sourceMappingURL=channelBase.js.map \ No newline at end of file diff --git a/dist/server/channels/channelBase.js.map b/dist/server/channels/channelBase.js.map new file mode 100644 index 0000000..6fb5b93 --- /dev/null +++ b/dist/server/channels/channelBase.js.map @@ -0,0 +1 @@ +{"version":3,"file":"channelBase.js","sourceRoot":"","sources":["../../../src/channels/channelBase.ts"],"names":[],"mappings":";;AAGA,MAAM,WAAW;IAIf,YAAY,EAAU;QAFtB,YAAO,GAA6B,EAAE,CAAC;QAGrC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,MAA4B;QACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;SAChD;aAAM;YACL,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;SACxC;IACH,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnB,OAAO,MAAM,CAAC;aACf;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,IAA+B,EAAE,OAAe;QAC/D,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,IAAI,IAAI,EAAE;gBAClB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACtB;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;aACzC;SACF;IACH,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,WAAW,CAAC"} \ No newline at end of file diff --git a/dist/server/channels/sites/mhsChannel.js b/dist/server/channels/sites/mhsChannel.js new file mode 100644 index 0000000..c8d9c59 --- /dev/null +++ b/dist/server/channels/sites/mhsChannel.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const channelBase_1 = require("../channelBase"); +class MHSChannel extends channelBase_1.default { + broadcastMessage(from, message) { + for (let client of this.clients) { + if (client != from) { + client.ws.send(message); + console.log(`sent to ${client.id}: %s`, message); + console.log(message); + } + else { + console.log('client is same as sender'); + } + } + } +} +; +exports.default = MHSChannel; +//# sourceMappingURL=mhsChannel.js.map \ No newline at end of file diff --git a/dist/server/channels/sites/mhsChannel.js.map b/dist/server/channels/sites/mhsChannel.js.map new file mode 100644 index 0000000..d124194 --- /dev/null +++ b/dist/server/channels/sites/mhsChannel.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mhsChannel.js","sourceRoot":"","sources":["../../../../src/channels/sites/mhsChannel.ts"],"names":[],"mappings":";;AAEA,gDAAyC;AAEzC,MAAM,UAAW,SAAQ,qBAAW;IAClC,gBAAgB,CAAC,IAA+B,EAAE,OAAe;QAC/D,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,IAAI,IAAI,EAAE;gBAClB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACtB;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;aACzC;SACF;IACH,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,UAAU,CAAC"} \ No newline at end of file diff --git a/dist/server/client/sites/mhsClient.js b/dist/server/client/sites/mhsClient.js new file mode 100644 index 0000000..803c961 --- /dev/null +++ b/dist/server/client/sites/mhsClient.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const base_1 = require("../base"); +class MHSClient extends base_1.default { +} +; +module.exports = MHSClient; +//# sourceMappingURL=mhsClient.js.map \ No newline at end of file diff --git a/dist/server/client/sites/mhsClient.js.map b/dist/server/client/sites/mhsClient.js.map new file mode 100644 index 0000000..014b117 --- /dev/null +++ b/dist/server/client/sites/mhsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mhsClient.js","sourceRoot":"","sources":["../../../../src/client/sites/mhsClient.ts"],"names":[],"mappings":";;AAAA,kCAA2B;AAE3B,MAAM,SAAU,SAAQ,cAAI;CAE3B;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC"} \ No newline at end of file diff --git a/dist/server/clientManager.js b/dist/server/clientManager.js index 5a0647f..15cc84f 100644 --- a/dist/server/clientManager.js +++ b/dist/server/clientManager.js @@ -1,20 +1,59 @@ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); class ClientManager { - constructor(data, ws) { - this.ws = ws; - this.client(data); + constructor() { + this.clients = []; + //...maybe one day } - client(data) { - if (data.site) { - console.log('legit: ' + data.site); + addClient(data, ws) { + if (data.client_type && !this.clientExists(data.user_id)) { + var Client = require(`./clients/${data.client_type}s/${data.client}client`); + var client = new Client(data, ws); + this.clients.push(client); + console.log('client added to client manager'); + return client; } else { - console.log('no client type designated, socket disconnect.'); - this.ws.close(); + console.log('no client type designated or client already exists, socket disconnected.'); + ws.close(); + return null; + } + } + clientsOfType(client_type) { + var result = []; + for (let client of this.clients) { + if (client.type() == client_type) { + result.push(client); + } + } + return result; + } + clientExists(id) { + for (let client of this.clients) { + if (client.id == id) { + return client; + } + } + return null; + } + getClient(id) { + return this.clientExists(id); + } + removeClient(id) { + var index = 0; + for (let client of this.clients) { + if (client.id == id) { + client.ws.close(); + this.clients.splice(index, 1); + console.log('client disconnected'); + return true; + } + index++; } } } ; -module.exports = ClientManager; -// user_type: 'user', user_id: 125, site: 'mhs' } +exports.default = ClientManager; +// { :client => 'mhs', :client_type => 'site', :user_id => 125, :user_type => 'user' } +// var exampleSocket = new WebSocket("wss://ysbraid.localhost:8443?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImNsaWVudCI6Im1ocyIsImNsaWVudF90eXBlIjoic2l0ZSIsInVzZXJfdHlwZSI6InVzZXIiLCJ1c2VyX2lkIjoxMjV9LCJleHAiOjE1NTI4MDExMDUsImF1ZCI6ImludGVybmFsIiwiaXNzIjoiWWFyZHN0aWNrIFNvZnR3YXJlIiwic3ViIjoiQnJhaWQgSldUIn0.fkfoqoWNjOeKfsXXJxh-9lBudhFsxhUt9fUIT1BXOLU"); //# sourceMappingURL=clientManager.js.map \ No newline at end of file diff --git a/dist/server/clientManager.js.map b/dist/server/clientManager.js.map index 5db1837..ae74406 100644 --- a/dist/server/clientManager.js.map +++ b/dist/server/clientManager.js.map @@ -1 +1 @@ -{"version":3,"file":"clientManager.js","sourceRoot":"","sources":["../../src/clientManager.ts"],"names":[],"mappings":";AAAA,MAAM,aAAa;IAGjB,YAAY,IAAY,EAAE,EAAU;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,IAAS;QACd,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;SACnC;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;YAC5D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;SACjB;IACH,CAAC;CACF;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;AAG9B,iDAAiD"} \ No newline at end of file +{"version":3,"file":"clientManager.js","sourceRoot":"","sources":["../../src/clientManager.ts"],"names":[],"mappings":";;AAIA,MAAM,aAAa;IAGjB;QAFA,YAAO,GAA6B,EAAE,CAAC;QAGrC,kBAAkB;IACpB,CAAC;IAED,SAAS,CAAC,IAAS,EAAE,EAAa;QAChC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACxD,IAAI,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC5E,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC;SACf;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;YACvF,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,IAAI,MAAM,GAA6B,EAAE,CAAC;QAE1C,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE;gBAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrB;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnB,OAAO,MAAM,CAAC;aACf;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,KAAK,GAAW,CAAC,CAAC;QAEtB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;aACb;YAED,KAAK,EAAE,CAAC;SACT;IACH,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,aAAa,CAAC;AAG7B,sFAAsF;AACtF,gXAAgX"} \ No newline at end of file diff --git a/dist/server/clients/base.js b/dist/server/clients/base.js new file mode 100644 index 0000000..45ffb4f --- /dev/null +++ b/dist/server/clients/base.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ClientBase { + constructor(data, ws) { + this.ws = ws; + this.data = data; + this.id = data.user_id; + this.channel = null; + } + getData() { + return this.data; + } + type() { + return this.data.client_type; + } + connectToChannel(channel) { + this.channel = channel; + } +} +; +exports.default = ClientBase; +//# sourceMappingURL=Base.js.map \ No newline at end of file diff --git a/dist/server/clients/base.js.map b/dist/server/clients/base.js.map new file mode 100644 index 0000000..8c92b10 --- /dev/null +++ b/dist/server/clients/base.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/clients/Base.ts"],"names":[],"mappings":";;AAIA,MAAM,UAAU;IAMd,YAAY,IAAS,EAAE,EAAa;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,OAAoB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,UAAU,CAAC"} \ No newline at end of file diff --git a/dist/server/clients/clientBase.js b/dist/server/clients/clientBase.js new file mode 100644 index 0000000..4c4bbfd --- /dev/null +++ b/dist/server/clients/clientBase.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ClientBase { + constructor(data, ws) { + this.ws = ws; + this.data = data; + this.id = data.user_id; + this.channel = null; + } + getData() { + return this.data; + } + type() { + return this.data.client_type; + } + connectToChannel(channel) { + this.channel = channel; + this.ws.on('message', (message) => { + channel.broadcastMessage(this, message); + console.log('broadcasted: %s', message); + }); + } + replaceWebSocket(ws) { + this.ws.close(); + this.ws = ws; + } +} +; +exports.default = ClientBase; +//# sourceMappingURL=clientBase.js.map \ No newline at end of file diff --git a/dist/server/clients/clientBase.js.map b/dist/server/clients/clientBase.js.map new file mode 100644 index 0000000..46ae205 --- /dev/null +++ b/dist/server/clients/clientBase.js.map @@ -0,0 +1 @@ +{"version":3,"file":"clientBase.js","sourceRoot":"","sources":["../../../src/clients/clientBase.ts"],"names":[],"mappings":";;AAKA,MAAM,UAAU;IAMd,YAAY,IAAS,EAAE,EAAa;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,OAA+B;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;YACxC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,EAAa;QAC5B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;CACF;AAAA,CAAC;AAEF,kBAAe,UAAU,CAAC"} \ No newline at end of file diff --git a/dist/server/clients/sites/mhsClient.js b/dist/server/clients/sites/mhsClient.js new file mode 100644 index 0000000..af0cafa --- /dev/null +++ b/dist/server/clients/sites/mhsClient.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const clientBase_1 = require("../clientBase"); +class MHSClient extends clientBase_1.default { + constructor(data, ws) { + super(data, ws); + console.log('mhs client created'); + } +} +; +module.exports = MHSClient; +exports.default = MHSClient; +//# sourceMappingURL=mhsClient.js.map \ No newline at end of file diff --git a/dist/server/clients/sites/mhsClient.js.map b/dist/server/clients/sites/mhsClient.js.map new file mode 100644 index 0000000..76f06f1 --- /dev/null +++ b/dist/server/clients/sites/mhsClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mhsClient.js","sourceRoot":"","sources":["../../../../src/clients/sites/mhsClient.ts"],"names":[],"mappings":";;AACA,8CAAuC;AAEvC,MAAM,SAAU,SAAQ,oBAAU;IAChC,YAAY,IAAS,EAAE,EAAa;QAClC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;CACF;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;AAC3B,kBAAe,SAAS,CAAC"} \ No newline at end of file diff --git a/dist/server/config/app.js b/dist/server/config/app.js index a8a7b4a..af5d88e 100644 --- a/dist/server/config/app.js +++ b/dist/server/config/app.js @@ -1,8 +1,8 @@ "use strict"; module.exports = { - version: '0.2.1', + version: '0.5.5', whitelist: (process.env.WHITELIST || "http://admin.localhost").split(','), - secret: process.env.API_TOKEN || "test", + secret: process.env.SECRET || "test", devToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCBkYXRhIiwiYXVkIjoiaW50ZXJuYWwiLCJpc3MiOiJZYXJkc3RpY2sgU29mdHdhcmUiLCJzdWIiOiJCcmFpZCBKV1QifQ.t6LFXWPEVz3aLXwtrucarggqTkGY_2NnZB8ZTMaJ2oI', port: process.env.PORT || 8443, hostname: process.env.HOSTNAME || 'ysbraid.localhost', diff --git a/dist/server/config/app.js.map b/dist/server/config/app.js.map index 8167fba..ba2f8ab 100644 --- a/dist/server/config/app.js.map +++ b/dist/server/config/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG;IACf,OAAO,EAAG,OAAO;IACjB,SAAS,EAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1E,MAAM,EAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACxC,QAAQ,EAAE,iMAAiM;IAC3M,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;IACrD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,aAAa;IACrD,WAAW,EAAG;QACZ,MAAM,EAAG,oBAAoB;QAC7B,OAAO,EAAG,WAAW;QACrB,QAAQ,EAAG,UAAU;QACrB,SAAS,EAAG,CAAC,OAAO,CAAC;KACtB;CACF,CAAA"} \ No newline at end of file +{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG;IACf,OAAO,EAAG,OAAO;IACjB,SAAS,EAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1E,MAAM,EAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM;IACrC,QAAQ,EAAE,iMAAiM;IAC3M,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;IACrD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,aAAa;IACrD,WAAW,EAAG;QACZ,MAAM,EAAG,oBAAoB;QAC7B,OAAO,EAAG,WAAW;QACrB,QAAQ,EAAG,UAAU;QACrB,SAAS,EAAG,CAAC,OAAO,CAAC;KACtB;CACF,CAAA"} \ No newline at end of file diff --git a/dist/server/server.js b/dist/server/server.js index 7abbd56..9b8c83a 100755 --- a/dist/server/server.js +++ b/dist/server/server.js @@ -18,6 +18,8 @@ const url = require("url"); //internal imports var routes = require('./routes'); var app = require('./config/app'); +const clientManager_1 = require("./clientManager"); +const channelManager_1 = require("./channelManager"); var privateKey = fs.readFileSync('certs/key.pem', 'utf8'); var certificate = fs.readFileSync('certs/cert.pem', 'utf8'); var options = { key: privateKey, cert: certificate, hostname: app.hostname }; @@ -26,11 +28,26 @@ const server = https.createServer(options, application); const wss = new WebSocket.Server({ noServer: true, maxPayload: 250000, host: app.hostname }); application.use(express.json()); application.use('', routes); +let clientManager = new clientManager_1.default(); +let channelManager = new channelManager_1.default(); wss.on('connection', (ws, request, args) => { console.log('client connected'); var data = JSON.parse(args).data; - var ClientManager = require('./clientManager'); - let clientManager = new ClientManager(data, ws); + if (!channelManager.channelExists(data.channel)) { + channelManager.createChannel(data); + } + if (clientManager.clientExists(data.user_id)) { + var client = clientManager.getClient(data.user_id); + if (client != null) { + client.replaceWebSocket(ws); + } + } + else { + var client = clientManager.addClient(data, ws); + } + if (client != null) { + channelManager.addClientToChannel(client, data.channel); + } // ws.on('message', (message: string) => { // console.log('received: %s', message); // const broadcastRegex = /^broadcast\:/; @@ -63,7 +80,7 @@ server.on('upgrade', function upgrade(request, socket, head) { function verifyConnection() { return new Promise((resolve, reject) => { var data = url.parse(request.url, true).query; - var token = data["token"] || (app.environment == 'development' ? app.devToken : ''); + var token = data.token || (app.environment == 'development' ? app.devToken : ''); var accepted = true; var result; jwt.verify(token, app.secret, app.signOptions, function (err, decoded) { diff --git a/dist/server/server.js.map b/dist/server/server.js.map index ec76a43..06bc655 100755 --- a/dist/server/server.js.map +++ b/dist/server/server.js.map @@ -1 +1 @@ -{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/channelManager.ts b/src/channelManager.ts index 47120fa..3fedaac 100644 --- a/src/channelManager.ts +++ b/src/channelManager.ts @@ -1,5 +1,54 @@ -class ChannelManager { +import ChannelBase from './channels/channelBase'; +import ClientBase from './clients/clientBase'; +import MHSClient from './clients/sites/mhsClient'; +import MHSChannel from './channels/sites/mhsChannel'; +class ChannelManager { + channels: ChannelBase[]|MHSChannel[] = []; + + constructor() { + // create default channel... + var channel: ChannelBase = new ChannelBase('default'); + this.channels.push(channel); + } + + createChannel(data: any) { + var channel: ChannelBase|MHSChannel|null = this.channelExists(data.channel_id); + + if (channel) { + console.log('channel already exists'); + } else { + var Channel = require(`./channels/${data.client_type}s/${data.client}channel`); + var channel: ChannelBase|MHSChannel|null = new ChannelBase(data.channel_id); + this.channels.push(channel); + console.log('added channel to channel manager'); + } + + console.log(data.channel_id); + } + + channelExists(channel_id: string) { + for (let channel of this.channels) { + if (channel.id == channel_id) { + return channel; + } + } + + return null; + } + + addClientToChannel(client: ClientBase|MHSClient, channel_id: string) { + var channel: ChannelBase|MHSChannel|null = this.channelExists(channel_id); + + if (channel) { + channel.addClient(client); + client.connectToChannel(channel); + } else { + console.log(`channel with id ${channel_id} does not exist.`) + } + } }; -module.exports = ChannelManager; +export default ChannelManager; + +// { :client => 'mhs', :client_type => 'site', :user_id => 125, :user_type => 'user', :channel => 'mhs_1239' } diff --git a/src/channels/channelBase.ts b/src/channels/channelBase.ts new file mode 100644 index 0000000..380a014 --- /dev/null +++ b/src/channels/channelBase.ts @@ -0,0 +1,46 @@ +import ClientBase from '../clients/clientBase'; +import MHSClient from '../clients/sites/mhsClient'; + +class ChannelBase { + id: string; + clients: MHSClient[]|ClientBase[] = []; + + constructor(id: string) { + this.id = id; + console.log('channel created'); + } + + addClient(client: MHSClient|ClientBase) { + console.log(client.data) + if (this.clientExists(client.id)) { + console.log('client already exits in channel'); + } else { + this.clients.push(client); + console.log('added client to channel'); + } + } + + clientExists(id: number) { + for (let client of this.clients) { + if (client.id == id) { + return client; + } + } + + return null; + } + + broadcastMessage(from: ClientBase|MHSClient|null, message: string) { + for (let client of this.clients) { + if (client != from) { + client.ws.send(message); + console.log(`sent to ${client.id}: %s`, message); + console.log(message); + } else { + console.log('client is same as sender'); + } + } + } +}; + +export default ChannelBase; diff --git a/src/channels/sites/mhsChannel.ts b/src/channels/sites/mhsChannel.ts new file mode 100644 index 0000000..02c841a --- /dev/null +++ b/src/channels/sites/mhsChannel.ts @@ -0,0 +1,19 @@ +import ClientBase from '../../clients/clientBase'; +import MHSClient from '../../clients/sites/mhsClient'; +import ChannelBase from '../channelBase'; + +class MHSChannel extends ChannelBase { + broadcastMessage(from: ClientBase|MHSClient|null, message: string) { + for (let client of this.clients) { + if (client != from) { + client.ws.send(message); + console.log(`sent to ${client.id}: %s`, message); + console.log(message); + } else { + console.log('client is same as sender'); + } + } + } +}; + +export default MHSChannel; diff --git a/src/clientManager.ts b/src/clientManager.ts index 358361e..d0a0096 100644 --- a/src/clientManager.ts +++ b/src/clientManager.ts @@ -1,22 +1,72 @@ -class ClientManager { - ws: any; +import * as WebSocket from 'ws'; +import ClientBase from './clients/clientBase'; +import MHSClient from './clients/sites/mhsClient'; - constructor(data: object, ws: object) { - this.ws = ws; - this.client(data); +class ClientManager { + clients: ClientBase[]|MHSClient[] = []; + + constructor() { + //...maybe one day } - client(data: any) { - if (data.site) { - console.log('legit: ' + data.site) + addClient(data: any, ws: WebSocket) { + if (data.client_type && !this.clientExists(data.user_id)) { + var Client = require(`./clients/${data.client_type}s/${data.client}client`); + var client = new Client(data, ws); + this.clients.push(client); + console.log('client added to client manager'); + return client; } else { - console.log('no client type designated, socket disconnect.') - this.ws.close(); + console.log('no client type designated or client already exists, socket disconnected.') + ws.close(); + return null; + } + } + + clientsOfType(client_type: string) { + var result: ClientBase[]|MHSClient[] = []; + + for (let client of this.clients) { + if (client.type() == client_type) { + result.push(client); + } + } + + return result; + } + + clientExists(id: number) { + for (let client of this.clients) { + if (client.id == id) { + return client; + } + } + + return null; + } + + getClient(id: number) { + return this.clientExists(id); + } + + removeClient(id: number) { + var index: number = 0; + + for (let client of this.clients) { + if (client.id == id) { + client.ws.close(); + this.clients.splice(index, 1); + console.log('client disconnected'); + return true; + } + + index++; } } }; -module.exports = ClientManager; +export default ClientManager; - // user_type: 'user', user_id: 125, site: 'mhs' } +// { :client => 'mhs', :client_type => 'site', :user_id => 125, :user_type => 'user' } +// var exampleSocket = new WebSocket("wss://ysbraid.localhost:8443?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImNsaWVudCI6Im1ocyIsImNsaWVudF90eXBlIjoic2l0ZSIsInVzZXJfdHlwZSI6InVzZXIiLCJ1c2VyX2lkIjoxMjV9LCJleHAiOjE1NTI4MDExMDUsImF1ZCI6ImludGVybmFsIiwiaXNzIjoiWWFyZHN0aWNrIFNvZnR3YXJlIiwic3ViIjoiQnJhaWQgSldUIn0.fkfoqoWNjOeKfsXXJxh-9lBudhFsxhUt9fUIT1BXOLU"); diff --git a/src/clients/clientBase.ts b/src/clients/clientBase.ts new file mode 100644 index 0000000..ccda8b8 --- /dev/null +++ b/src/clients/clientBase.ts @@ -0,0 +1,42 @@ +import * as WebSocket from 'ws'; +import * as ChannelManager from '../channelManager'; +import ChannelBase from '../channels/channelBase'; +import MHSChannel from '../channels/sites/mhsChannel'; + +class ClientBase { + ws: WebSocket; + data: any; + id: number; + channel: ChannelBase|MHSChannel|null; + + constructor(data: any, ws: WebSocket) { + this.ws = ws; + this.data = data; + this.id = data.user_id; + this.channel = null; + } + + getData() { + return this.data; + } + + type() { + return this.data.client_type; + } + + connectToChannel(channel: ChannelBase|MHSChannel) { + this.channel = channel; + + this.ws.on('message', (message: string) => { + channel.broadcastMessage(this, message); + console.log('broadcasted: %s', message); + }); + } + + replaceWebSocket(ws: WebSocket) { + this.ws.close(); + this.ws = ws; + } +}; + +export default ClientBase; diff --git a/src/clients/sites/mhsClient.ts b/src/clients/sites/mhsClient.ts new file mode 100644 index 0000000..6b5303b --- /dev/null +++ b/src/clients/sites/mhsClient.ts @@ -0,0 +1,13 @@ +import * as WebSocket from 'ws'; +import ClientBase from '../clientBase'; + +class MHSClient extends ClientBase { + constructor(data: any, ws: WebSocket) { + super(data, ws); + console.log('mhs client created'); + } +}; + +module.exports = MHSClient; +export default MHSClient; + diff --git a/src/config/app.ts b/src/config/app.ts index 175cf1f..b7bf4b2 100644 --- a/src/config/app.ts +++ b/src/config/app.ts @@ -1,7 +1,7 @@ module.exports = { - version : '0.5.1', + version : '0.5.5', whitelist : (process.env.WHITELIST || "http://admin.localhost").split(','), - secret : (process.env.API_TOKENS || "test").split(','), + secret : process.env.SECRET || "test", devToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCBkYXRhIiwiYXVkIjoiaW50ZXJuYWwiLCJpc3MiOiJZYXJkc3RpY2sgU29mdHdhcmUiLCJzdWIiOiJCcmFpZCBKV1QifQ.t6LFXWPEVz3aLXwtrucarggqTkGY_2NnZB8ZTMaJ2oI', port: process.env.PORT || 8443, hostname: process.env.HOSTNAME || 'ysbraid.localhost', diff --git a/src/server.ts b/src/server.ts index ee473a7..bad7275 100755 --- a/src/server.ts +++ b/src/server.ts @@ -9,6 +9,10 @@ import * as url from 'url'; //internal imports var routes = require('./routes'); var app = require('./config/app'); +import ClientManager from './clientManager'; +import ChannelManager from './channelManager'; +import ClientBase from './clients/clientBase'; +import MHSClient from './clients/sites/mhsClient'; var privateKey = fs.readFileSync('certs/key.pem', 'utf8'); var certificate = fs.readFileSync('certs/cert.pem', 'utf8'); @@ -21,11 +25,30 @@ const wss = new WebSocket.Server({ noServer: true, maxPayload:250000, host: app. application.use(express.json()); application.use('', routes); +let clientManager = new ClientManager(); +let channelManager = new ChannelManager(); + wss.on('connection', (ws: WebSocket, request: object, args: string) => { console.log('client connected'); var data = JSON.parse(args).data - var ClientManager = require('./clientManager'); - let clientManager = new ClientManager(data, ws); + + if (!channelManager.channelExists(data.channel)) { + channelManager.createChannel(data); + } + + if (clientManager.clientExists(data.user_id)) { + var client: ClientBase|MHSClient|null = clientManager.getClient(data.user_id); + + if (client != null) { + client.replaceWebSocket(ws); + } + } else { + var client: ClientBase|MHSClient|null = clientManager.addClient(data, ws); + } + + if (client != null) { + channelManager.addClientToChannel(client, data.channel); + } // ws.on('message', (message: string) => { @@ -66,7 +89,7 @@ server.on('upgrade', async function upgrade(request, socket, head) { function verifyConnection() { return new Promise((resolve, reject) => { var data = url.parse(request.url, true).query; - var token = data["token"] || (app.environment == 'development' ? app.devToken : ''); + var token = data.token || (app.environment == 'development' ? app.devToken : ''); var accepted = true; var result: string;