From 030fb62b38f41a00d97cd29d2b63e38f8aeba144 Mon Sep 17 00:00:00 2001 From: Josh Burman Date: Thu, 13 Feb 2020 13:19:52 -0500 Subject: [PATCH] ping pong check, fix to channel status, explicit channel removal option added for custom channels --- src/channelManager.ts | 4 +++- src/channels/channelBase.ts | 1 + src/channels/types/customChannel.ts | 1 + src/clients/clientBase.ts | 10 ++++++++++ src/server.ts | 6 +++--- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/channelManager.ts b/src/channelManager.ts index 42a58b9..691355f 100644 --- a/src/channelManager.ts +++ b/src/channelManager.ts @@ -115,7 +115,9 @@ class ChannelManager { purgeEmptyChannels() { for (const channel of this.channels) { - if (channel.clients.length === 0 && channel.id !== 'default') { + logger.accessLog.info(`Purging empty channels...`); + + if (channel.clients.length === 0 && channel.explicitRemoval === false) { const index = this.channels.indexOf(channel); this.channels.splice(index, 1); logger.accessLog.info(`channel removed: ${channel.id}`); diff --git a/src/channels/channelBase.ts b/src/channels/channelBase.ts index b86716b..19ac2b2 100644 --- a/src/channels/channelBase.ts +++ b/src/channels/channelBase.ts @@ -9,6 +9,7 @@ class ChannelBase { clients: any[] = []; broadcastConditions: string = "true"; channelContent: JSON = JSON.parse('{}'); + explicitRemoval: boolean = false; constructor(id: string) { this.id = id; diff --git a/src/channels/types/customChannel.ts b/src/channels/types/customChannel.ts index fbb24f4..a87274f 100644 --- a/src/channels/types/customChannel.ts +++ b/src/channels/types/customChannel.ts @@ -10,6 +10,7 @@ class CustomChannel extends ChannelBase { if (custom) { this.broadcastConditions = custom.broadcastConditions; this.channelContent = custom.channelContent; + this.explicitRemoval = custom.explicitRemoval; } } } diff --git a/src/clients/clientBase.ts b/src/clients/clientBase.ts index 5d26f2e..4139ac7 100644 --- a/src/clients/clientBase.ts +++ b/src/clients/clientBase.ts @@ -18,6 +18,8 @@ class ClientBase { roles: string[]; messageListener: (data: any) => void; closeListener: () => void; + pongListener: () => void; + heartbeat: any; constructor(data: any, ws: WebSocket, channelManager: ChannelManager, clientManager: ClientManager) { this.ws = ws; @@ -42,8 +44,14 @@ class ClientBase { } this.clientManager.removeClient(this.id); + clearInterval(this.heartbeat); logger.accessLog.info(`closed connection for client ${this.id}`); }; + this.pongListener = () => { + logger.accessLog.info(`client (${this.id}) ponged.`); + this.ws.pong(); + } + this.heartbeat = setInterval(() => { this.ws.ping('ping') }, 30000); logger.accessLog.info('Client Created', {data}); } @@ -64,6 +72,8 @@ class ClientBase { this.channel = channel; this.ws.on('message', this.messageListener); this.ws.on('close', this.closeListener); + this.ws.on('pong', this.pongListener); + this.heartbeat; } messageTransaction(message: any) { diff --git a/src/server.ts b/src/server.ts index f0c4dfc..43923b1 100755 --- a/src/server.ts +++ b/src/server.ts @@ -46,21 +46,21 @@ function connectionManager() { if (data.channel_type == 'custom') { const channel = channelManager.channelExists(data.channel); - const connectionResponse = { + let connectionResponse = { message_type: 'channelStatus', content: channel.channelContent } if (data.user_roles.includes('super')) { channelManager.updateChannelContent(channel, data.custom.channelContent); - channel.broadcastMessage(connectionResponse); + connectionResponse['content'] = channel.channelContent; + channel.broadcastMessage(client, connectionResponse); } else { client.directMessage(connectionResponse); } } } - 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}`);