98 lines
3.6 KiB
JavaScript
98 lines
3.6 KiB
JavaScript
exports.newNetworkModulesP2PNetworkPeers = function newNetworkModulesP2PNetworkPeers() {
|
|
/*
|
|
This module holds the P2P Nodes we are coonected to.
|
|
*/
|
|
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,
|
|
webSocketsClient: undefined
|
|
}
|
|
|
|
peer.p2pNetworkNode = p2pNetwork.p2pNodesToConnect[i]
|
|
if (isConnectedPeer(peer) === true) { continue }
|
|
peer.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient()
|
|
await peer.webSocketsClient.initialize(callerRole, p2pNetworkIdentity, peer.p2pNetworkNode, onConnectionClosed)
|
|
.then(addPeer)
|
|
.catch(onError)
|
|
|
|
function addPeer() {
|
|
thisObject.peers.push(peer)
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|
|
|
|
function onConnectionClosed(webSocketsClientId) {
|
|
for (let i = 0; i < thisObject.peers.length; i++) {
|
|
let connectedPeer = thisObject.peers[i]
|
|
if (connectedPeer.webSocketsClient.id === webSocketsClientId) {
|
|
thisObject.peers.splice(i, 1)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function isConnectedPeer(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 sendMessage(message) {
|
|
/*
|
|
This function will send the message from a random picked network node
|
|
selected from the array of already connected peers.
|
|
*/
|
|
let peerIndex = Math.max(Math.round(Math.random() * thisObject.peers.length) - 1, 0)
|
|
let peer = thisObject.peers[peerIndex]
|
|
return await peer.webSocketsClient.sendMessage(message)
|
|
}
|
|
} |