From 60f617be6650dda638557c480cd5d334559e3caa Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Wed, 20 Jun 2018 17:58:10 +0200 Subject: [PATCH] Introducing opaque types --- src/aggregator.ts | 11 ++++++++--- src/node.ts | 7 +++---- src/nodeId.ts | 9 +++++++++ src/opaque.ts | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/nodeId.ts create mode 100644 src/opaque.ts diff --git a/src/aggregator.ts b/src/aggregator.ts index 418d4f8..6edaa8e 100644 --- a/src/aggregator.ts +++ b/src/aggregator.ts @@ -1,21 +1,26 @@ import * as EventEmitter from 'events'; import Node from './node'; +import { NodeId } from './nodeId'; export default class Aggregator extends EventEmitter { - private nodes: WeakSet = new WeakSet; + private nodes: Map = new Map; private height: number = 0; add(node: Node) { - this.nodes.add(node); + this.nodes.set(node.id, node); node.once('disconnect', () => { node.removeAllListeners('block'); - this.nodes.delete(node); + this.nodes.delete(node.id); }); node.on('block', () => this.updateBlock(node)); } + get nodeList(): Iterable { + return this.nodes.values(); + } + private updateBlock(node: Node) { if (node.height > this.height) { this.height = node.height; diff --git a/src/node.ts b/src/node.ts index 157e06e..686a5a7 100644 --- a/src/node.ts +++ b/src/node.ts @@ -1,14 +1,13 @@ import * as WebSocket from 'ws'; import * as EventEmitter from 'events'; import { Maybe } from './maybe'; +import { NodeId, getId } from './nodeId'; import { parseMessage, getBestBlock, Message, BestBlock } from './message'; const BLOCK_TIME_HISTORY = 10; -let idDispenser = 0; - export default class Node extends EventEmitter { - public id: number; + public id: NodeId; public name: string; public implementation: string; public version: string; @@ -24,7 +23,7 @@ export default class Node extends EventEmitter { constructor(socket: WebSocket, name: string, config: string, implentation: string, version: string) { super(); - this.id = idDispenser++; + this.id = getId(); this.socket = socket; this.name = name; this.config = config; diff --git a/src/nodeId.ts b/src/nodeId.ts new file mode 100644 index 0000000..b8c3b20 --- /dev/null +++ b/src/nodeId.ts @@ -0,0 +1,9 @@ +import { Opaque } from './opaque'; + +let currentId = 0; + +export type NodeId = Opaque; + +export function getId(): NodeId { + return currentId++ as NodeId; +} diff --git a/src/opaque.ts b/src/opaque.ts new file mode 100644 index 0000000..71a4e20 --- /dev/null +++ b/src/opaque.ts @@ -0,0 +1,2 @@ +// Hack for Opaque Types +export type Opaque = T & {__TYPE__: Label};