diff --git a/app/modules/ws2p/lib/WS2PCluster.ts b/app/modules/ws2p/lib/WS2PCluster.ts index 101e0c89dc13fea9e2f225f92b5388c3504bc445..3b912104fab9b77a56d5d4ad89e258afc77c4863 100644 --- a/app/modules/ws2p/lib/WS2PCluster.ts +++ b/app/modules/ws2p/lib/WS2PCluster.ts @@ -427,32 +427,49 @@ export class WS2PCluster { let i = 0 let countPublicNodesWithSameKey:number = 1 // Necessary if maxPrivate = 0 let endpointsNodesWithSameKey:WS2PEndpoint[] = [] - while (i < peers.length && (this.clientsCount() < this.maxLevel1Size || this.numberOfConnectedPublicNodesWithSameKey() < countPublicNodesWithSameKey) ) { - const p = peers[i] - if (p.pubkey === this.server.conf.pair.pub) { - endpointsNodesWithSameKey = p.getAllWS2PEndpoints(canReachTorEndpoint, canReachClearEndpoint, myUUID) - countPublicNodesWithSameKey = endpointsNodesWithSameKey.length - for (const api of endpointsNodesWithSameKey) { - try { - // We do not connect to local host - if (api.uuid !== myUUID) { - await this.connectToRemoteWS(api.version, api.host, api.port, api.path, this.messageHandler, p.pubkey, api.uuid) + // Group the peers by bunches + const bunchsOfPeers = peers.reduce((bundles:PeerDTO[][], p:PeerDTO) => { + let bundleIndex = (bundles.length || 1) - 1 + // Maximum size of a bundle of peers + if (bundles[bundleIndex] && bundles[bundleIndex].length >= WS2PConstants.INITIAL_CONNECTION_PEERS_BUNDLE_SIZE) { + bundleIndex++ + } + // We create the bundle of it doesn't exist yet + if (!bundles[bundleIndex]) { + bundles[bundleIndex] = [] + } + // We feed it with this peer + bundles[bundleIndex].push(p) + return bundles + }, []) + while (i < bunchsOfPeers.length && (this.clientsCount() < this.maxLevel1Size || this.numberOfConnectedPublicNodesWithSameKey() < countPublicNodesWithSameKey) ) { + this.server.logger.info("WS2P: init: bundle of peers %s/%s", i+1, bunchsOfPeers.length) + await Promise.all(bunchsOfPeers[i].map(async p => { + if (p.pubkey === this.server.conf.pair.pub) { + endpointsNodesWithSameKey = p.getAllWS2PEndpoints(canReachTorEndpoint, canReachClearEndpoint, myUUID) + countPublicNodesWithSameKey = endpointsNodesWithSameKey.length + for (const api of endpointsNodesWithSameKey) { + try { + // We do not connect to local host + if (api.uuid !== myUUID) { + await this.connectToRemoteWS(api.version, api.host, api.port, api.path, this.messageHandler, p.pubkey, api.uuid) + } + } catch (e) { + this.server.logger.debug('WS2P: init: failed connection') } - } catch (e) { - this.server.logger.debug('WS2P: init: failed connection') } - } - } else { - const api = p.getOnceWS2PEndpoint(canReachTorEndpoint, canReachClearEndpoint) - if (api) { - try { - // We do not connect to local host - await this.connectToRemoteWS(api.version, api.host, api.port, api.path, this.messageHandler, p.pubkey, api.uuid) - } catch (e) { - this.server.logger.debug('WS2P: init: failed connection') + } else { + const api = p.getOnceWS2PEndpoint(canReachTorEndpoint, canReachClearEndpoint) + if (api) { + try { + // We do not connect to local host + await this.connectToRemoteWS(api.version, api.host, api.port, api.path, this.messageHandler, p.pubkey, api.uuid) + } catch (e) { + this.server.logger.debug('WS2P: init: failed connection') + } } } - } + })) i++ // Trim the eventual extra connections setTimeout(() => this.removeLowPriorityConnections(prefered), WS2PConstants.CONNEXION_TIMEOUT) diff --git a/app/modules/ws2p/lib/constants.ts b/app/modules/ws2p/lib/constants.ts index 84bda573fd1f43d4a19ba45bb1ff8735ef9997e5..664026793d56ccf07033f930143ab2085b022ab0 100644 --- a/app/modules/ws2p/lib/constants.ts +++ b/app/modules/ws2p/lib/constants.ts @@ -78,5 +78,7 @@ export const WS2PConstants = { HOST_ONION_REGEX: CommonConstants.HOST_ONION_REGEX, FULL_ADDRESS_ONION_REGEX: CommonConstants.WS_FULL_ADDRESS_ONION_REGEX, + INITIAL_CONNECTION_PEERS_BUNDLE_SIZE: 5, + HEADS_SPREAD_TIMEOUT: 100 // Wait 100ms before sending a bunch of signed heads } \ No newline at end of file