From 80f0eabcc9ccbdc0dfb7feb955d6390aa8e07884 Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Wed, 18 Jul 2018 20:29:47 +0200 Subject: [PATCH] Handle system.interval at block height 0 --- packages/backend/src/Node.ts | 52 ++++++++++++++++------- packages/frontend/src/components/Node.css | 2 + 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/packages/backend/src/Node.ts b/packages/backend/src/Node.ts index 2cfb4cd..13858d8 100644 --- a/packages/backend/src/Node.ts +++ b/packages/backend/src/Node.ts @@ -49,6 +49,7 @@ export default class Node { config: string, implentation: Types.NodeImplementation, version: Types.NodeVersion, + messages: Array, ) { this.ip = ip; this.id = nextId(); @@ -67,18 +68,7 @@ export default class Node { return; } - this.lastMessage = timestamp(); - this.updateLatency(message.ts); - - const update = getBestBlock(message); - - if (update) { - this.updateBestBlock(update); - } - - if (message.msg === 'system.interval') { - this.onSystemInterval(message); - } + this.onMessage(message); }); socket.on('close', () => { @@ -93,6 +83,11 @@ export default class Node { this.disconnect(); }); + // Handle cached messages + for (const message of messages) { + this.onMessage(message); + } + locate(ip).then((location) => { if (!location) { return; @@ -111,15 +106,27 @@ export default class Node { socket.removeAllListeners('message'); } + const messages: Array = []; + function handler(data: WebSocket.Data) { const message = parseMessage(data); - if (message && message.msg === "system.connected") { + if (!message || !message.msg) { + return; + } + + if (message.msg === "system.connected") { cleanup(); const { name, chain, config, implementation, version } = message; - resolve(new Node(ip, socket, name, chain, config, implementation, version)); + resolve(new Node(ip, socket, name, chain, config, implementation, version, messages)); + } else { + if (messages.length === 10) { + messages.shift(); + } + + messages.push(message); } } @@ -192,6 +199,21 @@ export default class Node { this.events.emit('disconnect'); } + private onMessage(message: Message) { + this.lastMessage = timestamp(); + this.updateLatency(message.ts); + + const update = getBestBlock(message); + + if (update) { + this.updateBestBlock(update); + } + + if (message.msg === 'system.interval') { + this.onSystemInterval(message); + } + } + private onSystemInterval(message: SystemInterval) { const { peers, txcount } = message; @@ -210,7 +232,7 @@ export default class Node { private updateBestBlock(update: BestBlock) { const { height, ts: time, best } = update; - if (this.height < height) { + if (this.best !== best && this.height <= height) { const blockTime = this.getBlockTime(time); this.best = best; diff --git a/packages/frontend/src/components/Node.css b/packages/frontend/src/components/Node.css index cd6b1d4..927063e 100644 --- a/packages/frontend/src/components/Node.css +++ b/packages/frontend/src/components/Node.css @@ -36,6 +36,8 @@ } .Node-details td:nth-child(odd) { + width: 16px; + text-align: center; padding-right: 0.2em; }