diff --git a/forum-network/src/classes/forum-node.js b/forum-network/src/classes/forum-node.js index 67008d3..992ce33 100644 --- a/forum-network/src/classes/forum-node.js +++ b/forum-network/src/classes/forum-node.js @@ -1,62 +1,21 @@ -import { Actor } from './actor.js'; import { Action } from './action.js'; import { Message, PostMessage, PeerMessage, messageFromJSON, } from './message.js'; import { CryptoUtil } from './crypto.js'; import { ForumView } from './forum-view.js'; -import { PrioritizedQueue } from './prioritized-queue.js'; +import { NetworkNode } from './network-node.js'; -export class ForumNode extends Actor { +export class ForumNode extends NetworkNode { constructor(name, scene) { super(name, scene); this.forumView = new ForumView(); - this.queue = new PrioritizedQueue(); this.actions = { + ...this.actions, storePost: new Action('store post', scene), - peerMessage: new Action('peer message', scene), }; } - // Generate a signing key pair and connect to the network - async initialize(forumNetwork) { - this.keyPair = await CryptoUtil.generateAsymmetricKey(); - this.forumNetwork = forumNetwork.addNode(this); - this.status.set('Initialized'); - return this; - } - - // Send a message to all other nodes in the network - async broadcast(message) { - await message.sign(this.keyPair); - const otherForumNodes = this.forumNetwork - .listNodes() - .filter((forumNode) => forumNode.keyPair.publicKey !== this.keyPair.publicKey); - for (const forumNode of otherForumNodes) { - // For now just call receiveMessage on the target node - // await this.actions.peerMessage.log(this, forumNode, null, message.content); - await this.actions.peerMessage.log(this, forumNode); - await forumNode.receiveMessage(JSON.stringify(message.toJSON())); - } - } - - // Perform minimal processing to ingest a message. - // Enqueue it for further processing. - async receiveMessage(messageStr) { - const messageJson = JSON.parse(messageStr); - const senderReputation = this.forumView.getReputation(messageJson.publicKey) || 0; - this.queue.add(messageJson, senderReputation); - } - - // Process next highest priority message in the queue - async processNextMessage() { - const messageJson = this.queue.pop(); - if (!messageJson) { - return null; - } - return this.processMessage(messageJson); - } - // Process a message from the queue async processMessage(messageJson) { try { diff --git a/forum-network/src/classes/network-node.js b/forum-network/src/classes/network-node.js new file mode 100644 index 0000000..d365c9d --- /dev/null +++ b/forum-network/src/classes/network-node.js @@ -0,0 +1,57 @@ +import { Actor } from './actor.js'; +import { Action } from './action.js'; +import { CryptoUtil } from './crypto.js'; +import { PrioritizedQueue } from './prioritized-queue.js'; + +export class NetworkNode extends Actor { + constructor(name, scene) { + super(name, scene); + this.queue = new PrioritizedQueue(); + this.actions = { + peerMessage: new Action('peer message', scene), + }; + } + + // Generate a signing key pair and connect to the network + async initialize(forumNetwork) { + this.keyPair = await CryptoUtil.generateAsymmetricKey(); + this.forumNetwork = forumNetwork.addNode(this); + this.status.set('Initialized'); + return this; + } + + // Send a message to all other nodes in the network + async broadcast(message) { + await message.sign(this.keyPair); + const otherForumNodes = this.forumNetwork + .listNodes() + .filter((forumNode) => forumNode.keyPair.publicKey !== this.keyPair.publicKey); + for (const forumNode of otherForumNodes) { + // For now just call receiveMessage on the target node + // await this.actions.peerMessage.log(this, forumNode, null, message.content); + await this.actions.peerMessage.log(this, forumNode); + await forumNode.receiveMessage(JSON.stringify(message.toJSON())); + } + } + + // Perform minimal processing to ingest a message. + // Enqueue it for further processing. + async receiveMessage(messageStr) { + const messageJson = JSON.parse(messageStr); + const senderReputation = this.forumView.getReputation(messageJson.publicKey) || 0; + this.queue.add(messageJson, senderReputation); + } + + // Process next highest priority message in the queue + async processNextMessage() { + const messageJson = this.queue.pop(); + if (!messageJson) { + return null; + } + return this.processMessage(messageJson); + } + + // Process a message from the queue + // async processMessage(messageJson) { + // } +} diff --git a/forum-network/src/classes/forum-network.js b/forum-network/src/classes/network.js similarity index 88% rename from forum-network/src/classes/forum-network.js rename to forum-network/src/classes/network.js index 46ce92f..6e7e4cd 100644 --- a/forum-network/src/classes/forum-network.js +++ b/forum-network/src/classes/network.js @@ -1,4 +1,4 @@ -export class ForumNetwork { +export class Network { constructor() { this.nodes = new Map(); } diff --git a/forum-network/src/tests/scripts/forum-network.test.js b/forum-network/src/tests/scripts/forum-network.test.js index cc564d7..1bcfe10 100644 --- a/forum-network/src/tests/scripts/forum-network.test.js +++ b/forum-network/src/tests/scripts/forum-network.test.js @@ -3,7 +3,7 @@ import { Scene } from '../../classes/scene.js'; import { PostContent } from '../../classes/post-content.js'; import { Expert } from '../../classes/expert.js'; import { ForumNode } from '../../classes/forum-node.js'; -import { ForumNetwork } from '../../classes/forum-network.js'; +import { Network } from '../../classes/network.js'; import { CryptoUtil } from '../../classes/crypto.js'; import { delay } from '../../util.js'; @@ -15,7 +15,7 @@ window.scene = new Scene('Forum Network test', rootBox).withSequenceDiagram(); window.author1 = await new Expert('author1', window.scene).initialize(); window.author2 = await new Expert('author2', window.scene).initialize(); -window.forumNetwork = new ForumNetwork(); +window.forumNetwork = new Network(); window.forumNode1 = await new ForumNode('node1', window.scene).initialize( window.forumNetwork,