From 2f0f250d81bb4730c1c05569a724c1ae0039e0a4 Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Thu, 26 Jul 2018 15:26:14 +0200 Subject: [PATCH] Log backend connections --- packages/backend/src/Aggregator.ts | 4 ++++ packages/backend/src/Feed.ts | 15 +++++++++++++-- packages/backend/src/Node.ts | 4 +--- packages/backend/src/index.ts | 8 ++++++++ packages/common/src/helpers.ts | 2 ++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/Aggregator.ts b/packages/backend/src/Aggregator.ts index d769b69..175a33d 100644 --- a/packages/backend/src/Aggregator.ts +++ b/packages/backend/src/Aggregator.ts @@ -88,5 +88,9 @@ export default class Aggregator { for (const chain of this.chains.values()) { chain.timeoutCheck(now); } + + for (const feed of this.feeds.values()) { + feed.ping(); + } } } diff --git a/packages/backend/src/Feed.ts b/packages/backend/src/Feed.ts index 378188f..48ee35b 100644 --- a/packages/backend/src/Feed.ts +++ b/packages/backend/src/Feed.ts @@ -2,7 +2,7 @@ import * as WebSocket from 'ws'; import * as EventEmitter from 'events'; import Node from './Node'; import Chain from './Chain'; -import { VERSION, timestamp, Maybe, FeedMessage, Types, idGenerator } from '@dotstats/common'; +import { VERSION, noop, timestamp, Maybe, FeedMessage, Types, idGenerator } from '@dotstats/common'; import { Location } from './location'; const nextId = idGenerator(); @@ -16,6 +16,7 @@ export default class Feed { private socket: WebSocket; private messages: Array = []; + private waitingForPong = false; constructor(socket: WebSocket) { this.id = nextId(); @@ -24,6 +25,7 @@ export default class Feed { socket.on('message', (data) => this.handleCommand(data.toString())); socket.on('error', () => this.disconnect()); socket.on('close', () => this.disconnect()); + socket.on('pong', () => this.waitingForPong = false); } public static feedVersion(): FeedMessage.Message { @@ -131,6 +133,15 @@ export default class Feed { } } + public ping() { + if (this.waitingForPong) { + this.disconnect(); + return; + } + this.waitingForPong = true; + this.socket.ping(noop); + } + private sendMessages = () => { const data = FeedMessage.serialize(this.messages); this.messages = []; @@ -165,7 +176,7 @@ export default class Feed { private disconnect() { this.socket.removeAllListeners(); - this.socket.close(); + this.socket.terminate(); this.events.emit('disconnect'); } diff --git a/packages/backend/src/Node.ts b/packages/backend/src/Node.ts index b940c60..5c4b495 100644 --- a/packages/backend/src/Node.ts +++ b/packages/backend/src/Node.ts @@ -1,6 +1,6 @@ import * as WebSocket from 'ws'; import * as EventEmitter from 'events'; -import { timestamp, Maybe, Types, idGenerator } from '@dotstats/common'; +import { noop, timestamp, Maybe, Types, idGenerator } from '@dotstats/common'; import { parseMessage, getBestBlock, Message, BestBlock, SystemInterval } from './message'; import { locate, Location } from './location'; @@ -14,8 +14,6 @@ export interface NodeEvents { emit(event: 'location', location: Location): void; } -function noop() {} - export default class Node { public readonly id: Types.NodeId; public readonly name: Types.NodeName; diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 2ea5804..86d230a 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -33,6 +33,14 @@ incomingTelemetry.on('connection', async (socket, req) => { } }); +function logClients() { + const feed = telemetryFeed.clients.size; + const node = incomingTelemetry.clients.size; + + console.log(`[System] ${feed} open telemetry connections; ${node} open feed connections`); +} + + telemetryFeed.on('connection', (socket: WebSocket) => { aggregator.addFeed(new Feed(socket)); }); diff --git a/packages/common/src/helpers.ts b/packages/common/src/helpers.ts index 4a90ca3..00c76d3 100644 --- a/packages/common/src/helpers.ts +++ b/packages/common/src/helpers.ts @@ -33,3 +33,5 @@ export function sleep(time: Milliseconds): Promise { } export const timestamp = Date.now as () => Timestamp; + +export function noop() {}