diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index 2be0b2ac6..6581230a1 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -32,7 +32,7 @@ exports.newDesktopApp = function newDesktopApp() { */ thisObject.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient() await thisObject.webSocketsClient.initialize('Network Client', selectedNetworkNode) - console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT) + /* These are the Network Interfaces by which the Web App interacts with this Desktop Client. */ diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index 26763ca92..91fb26487 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -5,6 +5,7 @@ exports.newNetworkNode = function newNetworkNode() { socialGraphService: undefined, storage: undefined, p2pNetwork: undefined, + p2pNetworkPeers: undefined, run: run } @@ -24,16 +25,21 @@ exports.newNetworkNode = function newNetworkNode() { thisObject.storage = NT.projects.socialTrading.modules.storage.newSocialTradingModulesStorage() thisObject.storage.initialize() /* - We can join now the P2P Network as a new peer there. + Let's discover who is at the p2p network. */ thisObject.p2pNetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork() await thisObject.p2pNetwork.initialize('Network Peer') /* + We can join now the P2P Network as a new peer there. + */ + thisObject.p2pNetworkPeers = SA.projects.network.modules.p2pNetworkPeers.newNetworkModulesP2PNetworkPeers() + await thisObject.p2pNetworkPeers.initialize() + /* Other Network Nodes and Client Apps will communicate with this Network Node via it's Websocket Interface. */ - thisObject.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() - thisObject.webSocketsInterface.initialize() - console.log('Network Node Web Sockets Interface ....................................... Listening at port ' + JSON.parse(NT.networkNode.p2pNetwork.thisNetworkNode.node.config).webSocketsPort) + thisObject.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() + thisObject.webSocketsInterface.initialize() + console.log('Network Node Web Sockets Interface ....................................... Listening at port ' + JSON.parse(NT.networkNode.p2pNetwork.thisNetworkNode.node.config).webSocketsPort) } } diff --git a/Projects/Network/SA/Modules/P2PNetworkPeers.js b/Projects/Network/SA/Modules/P2PNetworkPeers.js index 2e40bd9ca..ddcc56637 100644 --- a/Projects/Network/SA/Modules/P2PNetworkPeers.js +++ b/Projects/Network/SA/Modules/P2PNetworkPeers.js @@ -2,7 +2,8 @@ exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkP /* This module represents the P2P Nodes we are connected to. */ - let thisObject = { + let thisObject = { + peers: undefined, /* Framework Functions */ initialize: initialize, @@ -12,7 +13,7 @@ exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkP return thisObject function finalize() { - + thisObject.peers = undefined } async function initialize() { @@ -20,7 +21,30 @@ exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkP On a first iteration, we will try to connect to 2 Network Peers, one upstream and one downstream, meaning one with higher ranking that us, and the other with lower ranking than us. */ + thisObject.peers = [] + let totalConnected = 0 - + for (let i = 0; i < NT.networkNode.p2pNetwork.p2pNodesToConnect.length; i++) { + if (totalConnected === 2) { break } + let peer = {} + peer.p2pNetworkNode = NT.networkNode.p2pNetwork.p2pNodesToConnect[i] + peer.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient() + await peer.webSocketsClient.initialize('Network Peer', peer.p2pNetworkNode) + .then(addPeer) + .catch(onError) + + function addPeer() { + thisObject.peers.push(peer) + totalConnected++ + } + + function onError(err) { + if (err !== undefined) { + console.log('[ERROR] P2P Network Peers -> onError -> While connecting to node -> ' + peer.p2pNetworkNode.userProfile.userProfileHandle + ' -> ' + peer.p2pNetworkNode.node.name + ' -> ' + err.message) + } else { + console.log('[WARN] P2P Network Peers -> onError -> Peer Not Available at the Moment -> ' + peer.p2pNetworkNode.userProfile.userProfileHandle + ' -> ' + peer.p2pNetworkNode.node.name) + } + } + } } } \ No newline at end of file diff --git a/Projects/Network/SA/Modules/WebSocketsNetworkClient.js b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js index 16ffbafd7..c2db2516a 100644 --- a/Projects/Network/SA/Modules/WebSocketsNetworkClient.js +++ b/Projects/Network/SA/Modules/WebSocketsNetworkClient.js @@ -1,6 +1,8 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWebSocketsNetworkClient() { let thisObject = { + host: undefined, + port: undefined, sendMessage: sendMessage, initialize: initialize, finalize: finalize @@ -29,11 +31,13 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb web3 = new SA.nodeModules.web3() - let host = JSON.parse(p2pNetworkNode.node.config).host - let port = JSON.parse(p2pNetworkNode.node.config).webSocketsPort + thisObject.host = JSON.parse(p2pNetworkNode.node.config).host + thisObject.port = JSON.parse(p2pNetworkNode.node.config).webSocketsPort - socketClient = new SA.nodeModules.ws('ws://' + host + ':' + port) + socketClient = new SA.nodeModules.ws('ws://' + thisObject.host + ':' + thisObject.port) await setUpWebsocketClient(callerRole, p2pNetworkNode) + + console.log('Websockets Client Connected to Network Node via Web Sockets .............. Connected to ' + p2pNetworkNode.userProfile.userProfileHandle + ' -> ' + p2pNetworkNode.node.name + ' -> ' + thisObject.host + ':' + thisObject.port) } async function setUpWebsocketClient(callerRole, p2pNetworkNode) { @@ -197,8 +201,15 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb } function onError(err) { + if (err.message.indexOf('ECONNREFUSED') >= 0) { + console.log('[WARN] Web Sockets Client -> onError -> Nobody home at ' + thisObject.host + ':' + thisObject.port) + reject() + return + } console.log('[ERROR] Web Sockets Client -> onError -> err.message = ' + err.message) console.log('[ERROR] Web Sockets Client -> onError -> err.stack = ' + err.stack) + reject() + return } } catch (err) { diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 2182d5c83..feebfdbbf 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1413,6 +1413,12 @@ "propertyName": "p2pNetworkNode", "functionName": "newNetworkModulesP2PNetworkNode", "fileName": "P2PNetworkNode.js" + }, + { + "name": "P2P Network Peers", + "propertyName": "p2pNetworkPeers", + "functionName": "newNetworkModulesP2PNetworkPeers", + "fileName": "P2PNetworkPeers.js" } ], "utilities": [