P2P Network Head

This commit is contained in:
Luis Fernando Molina committed 2021-12-04 18:20:25 +01:00
1 parent f2bdfb14c9
commit a5ab8472a9
5 files changed
+110 -4

No files matched your search

+1
View File
@@ -33,6 +33,7 @@ exports.newEnvironment = function () {
DESKTOP_APP_SIGNING_ACCOUNT: 'Social-Trading-Desktop-App-1',
DESKTOP_APP_MAX_OUTGOING_PEERS: 1,
TASK_SERVER_APP_MAX_OUTGOING_PEERS: 1,
TASK_SERVER_APP_MAX_OUTGOING_HEADS: 1,
MOBILE_APP_SIGNING_ACCOUNT: 'Social-Trading-Mobile-App-1',
SERVER_APP_SIGNING_ACCOUNT: 'Social-Trading-Server-App-1',
PLATFORM_APP_SIGNING_ACCOUNT: 'Algo-Traders-Platform-1',
@@ -0,0 +1,89 @@
exports.newNetworkModulesP2PNetworkHead = function newNetworkModulesP2PNetworkHead() {
/*
This has identified which are the nodes at the head of the network worm,
and it is ready to send messages to it.
*/
let thisObject = {
peers: undefined,
sendMessage: sendMessage,
/* Framework Functions */
initialize: initialize,
finalize: finalize
}
const RECONNECT_DELAY = 10 * 1000
let intervalIdConnectToPeers
return thisObject
function finalize() {
thisObject.peers = undefined
clearInterval(intervalIdConnectToPeers)
}
async function initialize(
callerRole,
p2pNetworkIdentity,
p2pNetwork,
maxOutgoingPeers
) {
thisObject.peers = []
connectToPeers()
intervalIdConnectToPeers = setInterval(connectToPeers, RECONNECT_DELAY);
async function connectToPeers() {
if (thisObject.peers.length >= maxOutgoingPeers) { return }
for (let i = 0; i < p2pNetwork.p2pNodesToConnect.length; i++) {
if (thisObject.peers.length >= maxOutgoingPeers) { break }
let peer = {
p2pNetworkNode: undefined,
httpClient: undefined
}
peer.p2pNetworkNode = p2pNetwork.p2pNodesToConnect[i]
if (isPeerConnected(peer) === true) { continue }
if (isPeerOnline(peer) === false) { continue }
thisObject.peers.push(peer)
}
function isPeerConnected(peer) {
for (let i = 0; i < thisObject.peers.length; i++) {
let connectedPeer = thisObject.peers[i]
if (connectedPeer.p2pNetworkNode.node.id === peer.p2pNetworkNode.node.id) {
return true
}
}
}
async function isPeerOnline(peer) {
/*
Test if the peer is actually online.
*/
if (peer.httpClient === undefined) {
peer.httpClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesHttpNetworkClient()
peer.httpClient.initialize(callerRole, p2pNetworkIdentity, peer.p2pNetworkNode)
}
return await peer.httpClient.testConnection()
}
}
}
async function sendMessage(message) {
/*
This function will send the message from a random picked network node
selected from the array of already verified online peers.
*/
let peerIndex = Math.max(Math.round(Math.random() * thisObject.peers.length) - 1, 0)
let peer = thisObject.peers[peerIndex]
return await peer.httpClient.sendMessage(message)
}
}
@@ -46,7 +46,7 @@ exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkP
}
peer.p2pNetworkNode = p2pNetwork.p2pNodesToConnect[i]
if (isConnectedPeer(peer) === true) { continue }
if (isPeerConnected(peer) === true) { continue }
peer.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient()
await peer.webSocketsClient.initialize(callerRole, p2pNetworkIdentity, peer.p2pNetworkNode, onConnectionClosed)
.then(addPeer)
@@ -75,7 +75,7 @@ exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkP
}
}
function isConnectedPeer(peer) {
function isPeerConnected(peer) {
for (let i = 0; i < thisObject.peers.length; i++) {
let connectedPeer = thisObject.peers[i]
if (connectedPeer.p2pNetworkNode.node.id === peer.p2pNetworkNode.node.id) {
+6
View File
@@ -1637,6 +1637,12 @@
"functionName": "newNetworkModulesP2PNetworkPeers",
"fileName": "P2PNetworkPeers.js"
},
{
"name": "P2P Network Head",
"propertyName": "p2pNetworkHead",
"functionName": "newNetworkModulesP2PNetworkHead",
"fileName": "P2PNetworkHead.js"
},
{
"name": "P2P Network Client",
"propertyName": "p2pNetworkClient",
+12 -2
View File
@@ -142,7 +142,7 @@ exports.newTaskServer = function newTaskServer() {
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork()
await TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetwork.initialize('Network Client')
/*
Set up the connections to network nodes.
Set up the connections to network peers nodes. These connections will be used to consume signals.
*/
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetworkPeers = SA.projects.network.modules.p2pNetworkPeers.newNetworkModulesP2PNetworkPeers()
await TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetworkPeers.initialize(
@@ -151,7 +151,17 @@ exports.newTaskServer = function newTaskServer() {
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetwork,
global.env.TASK_SERVER_APP_MAX_OUTGOING_PEERS
)
}
/*
Set up the connections to network head nodes. These connections will be used to send signals.
*/
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetworkPeers = SA.projects.network.modules.p2pNetworkPeers.newNetworkModulesP2PNetworkHead()
await TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetworkPeers.initialize(
'Network Client',
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetworkClient,
TS.projects.foundations.globals.taskConstants.P2P_NETWORK.p2pNetwork,
global.env.TASK_SERVER_APP_MAX_OUTGOING_HEADS
)
}
function setupTaskHeartbeats() {
/*