@streamr/dht 0.0.1-tatum.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.eslintrc +3 -0
- package/README.md +38 -0
- package/dist/src/connection/Connection.d.ts +11 -0
- package/dist/src/connection/Connection.js +23 -0
- package/dist/src/connection/Connection.js.map +1 -0
- package/dist/src/connection/ConnectionLockHandler.d.ts +23 -0
- package/dist/src/connection/ConnectionLockHandler.js +94 -0
- package/dist/src/connection/ConnectionLockHandler.js.map +1 -0
- package/dist/src/connection/ConnectionManager.d.ts +94 -0
- package/dist/src/connection/ConnectionManager.js +554 -0
- package/dist/src/connection/ConnectionManager.js.map +1 -0
- package/dist/src/connection/ConnectivityChecker.d.ts +17 -0
- package/dist/src/connection/ConnectivityChecker.js +187 -0
- package/dist/src/connection/ConnectivityChecker.js.map +1 -0
- package/dist/src/connection/Handshaker.d.ts +19 -0
- package/dist/src/connection/Handshaker.js +77 -0
- package/dist/src/connection/Handshaker.js.map +1 -0
- package/dist/src/connection/IConnection.d.ts +38 -0
- package/dist/src/connection/IConnection.js +19 -0
- package/dist/src/connection/IConnection.js.map +1 -0
- package/dist/src/connection/IConnectionSource.d.ts +4 -0
- package/dist/src/connection/IConnectionSource.js +3 -0
- package/dist/src/connection/IConnectionSource.js.map +1 -0
- package/dist/src/connection/ManagedConnection.d.ts +60 -0
- package/dist/src/connection/ManagedConnection.js +352 -0
- package/dist/src/connection/ManagedConnection.js.map +1 -0
- package/dist/src/connection/ManagedWebRtcConnection.d.ts +7 -0
- package/dist/src/connection/ManagedWebRtcConnection.js +20 -0
- package/dist/src/connection/ManagedWebRtcConnection.js.map +1 -0
- package/dist/src/connection/RemoteConnectionLocker.d.ts +14 -0
- package/dist/src/connection/RemoteConnectionLocker.js +93 -0
- package/dist/src/connection/RemoteConnectionLocker.js.map +1 -0
- package/dist/src/connection/Simulator/Simulator.d.ts +42 -0
- package/dist/src/connection/Simulator/Simulator.js +325 -0
- package/dist/src/connection/Simulator/Simulator.js.map +1 -0
- package/dist/src/connection/Simulator/SimulatorConnection.d.ts +19 -0
- package/dist/src/connection/Simulator/SimulatorConnection.js +118 -0
- package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -0
- package/dist/src/connection/Simulator/SimulatorConnector.d.ts +17 -0
- package/dist/src/connection/Simulator/SimulatorConnector.js +72 -0
- package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -0
- package/dist/src/connection/Simulator/SimulatorTransport.d.ts +6 -0
- package/dist/src/connection/Simulator/SimulatorTransport.js +11 -0
- package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -0
- package/dist/src/connection/Simulator/pings.d.ts +21 -0
- package/dist/src/connection/Simulator/pings.js +61 -0
- package/dist/src/connection/Simulator/pings.js.map +1 -0
- package/dist/src/connection/WebRTC/IWebRtcConnection.d.ts +20 -0
- package/dist/src/connection/WebRTC/IWebRtcConnection.js +9 -0
- package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +1 -0
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +47 -0
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +233 -0
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -0
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.d.ts +12 -0
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js +74 -0
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js.map +1 -0
- package/dist/src/connection/WebRTC/WebRtcConnector.d.ts +47 -0
- package/dist/src/connection/WebRTC/WebRtcConnector.js +227 -0
- package/dist/src/connection/WebRTC/WebRtcConnector.js.map +1 -0
- package/dist/src/connection/WebRTC/iceServerAsString.d.ts +2 -0
- package/dist/src/connection/WebRTC/iceServerAsString.js +18 -0
- package/dist/src/connection/WebRTC/iceServerAsString.js.map +1 -0
- package/dist/src/connection/WebSocket/ClientWebSocket.d.ts +15 -0
- package/dist/src/connection/WebSocket/ClientWebSocket.js +113 -0
- package/dist/src/connection/WebSocket/ClientWebSocket.js.map +1 -0
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.d.ts +9 -0
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js +63 -0
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +1 -0
- package/dist/src/connection/WebSocket/ServerWebSocket.d.ts +18 -0
- package/dist/src/connection/WebSocket/ServerWebSocket.js +103 -0
- package/dist/src/connection/WebSocket/ServerWebSocket.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketConnector.d.ts +31 -0
- package/dist/src/connection/WebSocket/WebSocketConnector.js +202 -0
- package/dist/src/connection/WebSocket/WebSocketConnector.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketServer.d.ts +9 -0
- package/dist/src/connection/WebSocket/WebSocketServer.js +101 -0
- package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -0
- package/dist/src/dht/DhtNode.d.ts +153 -0
- package/dist/src/dht/DhtNode.js +599 -0
- package/dist/src/dht/DhtNode.js.map +1 -0
- package/dist/src/dht/DhtPeer.d.ts +18 -0
- package/dist/src/dht/DhtPeer.js +74 -0
- package/dist/src/dht/DhtPeer.js.map +1 -0
- package/dist/src/dht/ExternalApi.d.ts +8 -0
- package/dist/src/dht/ExternalApi.js +26 -0
- package/dist/src/dht/ExternalApi.js.map +1 -0
- package/dist/src/dht/RemoteExternalApi.d.ts +6 -0
- package/dist/src/dht/RemoteExternalApi.js +26 -0
- package/dist/src/dht/RemoteExternalApi.js.map +1 -0
- package/dist/src/dht/contact/Contact.d.ts +22 -0
- package/dist/src/dht/contact/Contact.js +25 -0
- package/dist/src/dht/contact/Contact.js.map +1 -0
- package/dist/src/dht/contact/RandomContactList.d.ts +20 -0
- package/dist/src/dht/contact/RandomContactList.js +78 -0
- package/dist/src/dht/contact/RandomContactList.js.map +1 -0
- package/dist/src/dht/contact/Remote.d.ts +15 -0
- package/dist/src/dht/contact/Remote.js +24 -0
- package/dist/src/dht/contact/Remote.js.map +1 -0
- package/dist/src/dht/contact/SortedContactList.d.ts +35 -0
- package/dist/src/dht/contact/SortedContactList.js +156 -0
- package/dist/src/dht/contact/SortedContactList.js.map +1 -0
- package/dist/src/dht/discovery/DiscoverySession.d.ts +36 -0
- package/dist/src/dht/discovery/DiscoverySession.js +116 -0
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -0
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +42 -0
- package/dist/src/dht/discovery/PeerDiscovery.js +157 -0
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -0
- package/dist/src/dht/find/RecursiveFindSession.d.ts +46 -0
- package/dist/src/dht/find/RecursiveFindSession.js +142 -0
- package/dist/src/dht/find/RecursiveFindSession.js.map +1 -0
- package/dist/src/dht/find/RecursiveFinder.d.ts +54 -0
- package/dist/src/dht/find/RecursiveFinder.js +180 -0
- package/dist/src/dht/find/RecursiveFinder.js.map +1 -0
- package/dist/src/dht/find/RemoteRecursiveFindSession.d.ts +6 -0
- package/dist/src/dht/find/RemoteRecursiveFindSession.js +25 -0
- package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +1 -0
- package/dist/src/dht/routing/DuplicateDetector.d.ts +13 -0
- package/dist/src/dht/routing/DuplicateDetector.js +41 -0
- package/dist/src/dht/routing/DuplicateDetector.js.map +1 -0
- package/dist/src/dht/routing/RemoteRouter.d.ts +8 -0
- package/dist/src/dht/routing/RemoteRouter.js +106 -0
- package/dist/src/dht/routing/RemoteRouter.js.map +1 -0
- package/dist/src/dht/routing/Router.d.ts +60 -0
- package/dist/src/dht/routing/Router.js +207 -0
- package/dist/src/dht/routing/Router.js.map +1 -0
- package/dist/src/dht/routing/RoutingSession.d.ts +42 -0
- package/dist/src/dht/routing/RoutingSession.js +178 -0
- package/dist/src/dht/routing/RoutingSession.js.map +1 -0
- package/dist/src/dht/store/DataStore.d.ts +45 -0
- package/dist/src/dht/store/DataStore.js +244 -0
- package/dist/src/dht/store/DataStore.js.map +1 -0
- package/dist/src/dht/store/LocalDataStore.d.ts +19 -0
- package/dist/src/dht/store/LocalDataStore.js +104 -0
- package/dist/src/dht/store/LocalDataStore.js.map +1 -0
- package/dist/src/dht/store/RemoteStore.d.ts +8 -0
- package/dist/src/dht/store/RemoteStore.js +44 -0
- package/dist/src/dht/store/RemoteStore.js.map +1 -0
- package/dist/src/exports.d.ts +19 -0
- package/dist/src/exports.js +41 -0
- package/dist/src/exports.js.map +1 -0
- package/dist/src/helpers/AddressTools.d.ts +2 -0
- package/dist/src/helpers/AddressTools.js +31 -0
- package/dist/src/helpers/AddressTools.js.map +1 -0
- package/dist/src/helpers/PeerID.d.ts +25 -0
- package/dist/src/helpers/PeerID.js +84 -0
- package/dist/src/helpers/PeerID.js.map +1 -0
- package/dist/src/helpers/UUID.d.ts +7 -0
- package/dist/src/helpers/UUID.js +32 -0
- package/dist/src/helpers/UUID.js.map +1 -0
- package/dist/src/helpers/debugHelpers.d.ts +3 -0
- package/dist/src/helpers/debugHelpers.js +11 -0
- package/dist/src/helpers/debugHelpers.js.map +1 -0
- package/dist/src/helpers/errors.d.ts +72 -0
- package/dist/src/helpers/errors.js +95 -0
- package/dist/src/helpers/errors.js.map +1 -0
- package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +5 -0
- package/dist/src/helpers/peerIdFromPeerDescriptor.js +17 -0
- package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -0
- package/dist/src/helpers/protoClasses.d.ts +2 -0
- package/dist/src/helpers/protoClasses.js +35 -0
- package/dist/src/helpers/protoClasses.js.map +1 -0
- package/dist/src/helpers/protoToString.d.ts +2 -0
- package/dist/src/helpers/protoToString.js +20 -0
- package/dist/src/helpers/protoToString.js.map +1 -0
- package/dist/src/proto/google/protobuf/any.d.ts +173 -0
- package/dist/src/proto/google/protobuf/any.js +155 -0
- package/dist/src/proto/google/protobuf/any.js.map +1 -0
- package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
- package/dist/src/proto/google/protobuf/empty.js +34 -0
- package/dist/src/proto/google/protobuf/empty.js.map +1 -0
- package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
- package/dist/src/proto/google/protobuf/timestamp.js +136 -0
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/src/proto/tests.d.ts +39 -0
- package/dist/src/proto/tests.js +34 -0
- package/dist/src/proto/tests.js.map +1 -0
- package/dist/src/rpc-protocol/DhtCallContext.d.ts +12 -0
- package/dist/src/rpc-protocol/DhtCallContext.js +8 -0
- package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -0
- package/dist/src/rpc-protocol/DhtRpcOptions.d.ts +8 -0
- package/dist/src/rpc-protocol/DhtRpcOptions.js +3 -0
- package/dist/src/rpc-protocol/DhtRpcOptions.js.map +1 -0
- package/dist/src/transport/ITransport.d.ts +22 -0
- package/dist/src/transport/ITransport.js +3 -0
- package/dist/src/transport/ITransport.js.map +1 -0
- package/dist/src/transport/ListeningRpcCommunicator.d.ts +6 -0
- package/dist/src/transport/ListeningRpcCommunicator.js +14 -0
- package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -0
- package/dist/src/transport/RoutingRpcCommunicator.d.ts +8 -0
- package/dist/src/transport/RoutingRpcCommunicator.js +52 -0
- package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -0
- package/jest.config.js +2 -0
- package/karma.config.js +20 -0
- package/package.json +64 -0
- package/proto.sh +3 -0
- package/protos/DhtRpc.proto +330 -0
- package/protos/tests.proto +16 -0
- package/src/connection/Connection.ts +23 -0
- package/src/connection/ConnectionLockHandler.ts +105 -0
- package/src/connection/ConnectionManager.ts +676 -0
- package/src/connection/ConnectivityChecker.ts +173 -0
- package/src/connection/Handshaker.ts +92 -0
- package/src/connection/IConnection.ts +47 -0
- package/src/connection/IConnectionSource.ts +6 -0
- package/src/connection/ManagedConnection.ts +398 -0
- package/src/connection/ManagedWebRtcConnection.ts +27 -0
- package/src/connection/RemoteConnectionLocker.ts +88 -0
- package/src/connection/Simulator/Simulator.ts +399 -0
- package/src/connection/Simulator/SimulatorConnection.ts +137 -0
- package/src/connection/Simulator/SimulatorConnector.ts +104 -0
- package/src/connection/Simulator/SimulatorTransport.ts +9 -0
- package/src/connection/Simulator/pings.ts +42 -0
- package/src/connection/WebRTC/BrowserWebRtcConnection.ts +227 -0
- package/src/connection/WebRTC/IWebRtcConnection.ts +24 -0
- package/src/connection/WebRTC/NodeWebRtcConnection.ts +256 -0
- package/src/connection/WebRTC/RemoteWebrtcConnector.ts +93 -0
- package/src/connection/WebRTC/WebRtcConnector.ts +306 -0
- package/src/connection/WebRTC/iceServerAsString.ts +15 -0
- package/src/connection/WebSocket/ClientWebSocket.ts +118 -0
- package/src/connection/WebSocket/RemoteWebSocketConnector.ts +49 -0
- package/src/connection/WebSocket/ServerWebSocket.ts +119 -0
- package/src/connection/WebSocket/WebSocketConnector.ts +264 -0
- package/src/connection/WebSocket/WebSocketServer.ts +97 -0
- package/src/dht/DhtNode.ts +776 -0
- package/src/dht/DhtPeer.ts +96 -0
- package/src/dht/ExternalApi.ts +29 -0
- package/src/dht/RemoteExternalApi.ts +25 -0
- package/src/dht/contact/Contact.ts +36 -0
- package/src/dht/contact/RandomContactList.ts +92 -0
- package/src/dht/contact/Remote.ts +40 -0
- package/src/dht/contact/SortedContactList.ts +196 -0
- package/src/dht/discovery/DiscoverySession.ts +150 -0
- package/src/dht/discovery/PeerDiscovery.ts +162 -0
- package/src/dht/find/RecursiveFindSession.ts +178 -0
- package/src/dht/find/RecursiveFinder.ts +272 -0
- package/src/dht/find/RemoteRecursiveFindSession.ts +33 -0
- package/src/dht/routing/DuplicateDetector.ts +53 -0
- package/src/dht/routing/RemoteRouter.ts +115 -0
- package/src/dht/routing/Router.ts +266 -0
- package/src/dht/routing/RoutingSession.ts +222 -0
- package/src/dht/store/DataStore.ts +321 -0
- package/src/dht/store/LocalDataStore.ts +114 -0
- package/src/dht/store/RemoteStore.ts +58 -0
- package/src/exports.ts +19 -0
- package/src/helpers/AddressTools.ts +26 -0
- package/src/helpers/PeerID.ts +95 -0
- package/src/helpers/UUID.ts +30 -0
- package/src/helpers/debugHelpers.ts +9 -0
- package/src/helpers/errors.ts +49 -0
- package/src/helpers/peerIdFromPeerDescriptor.ts +14 -0
- package/src/helpers/protoClasses.ts +63 -0
- package/src/helpers/protoToString.ts +21 -0
- package/src/proto/google/protobuf/any.ts +319 -0
- package/src/proto/google/protobuf/empty.ts +84 -0
- package/src/proto/google/protobuf/timestamp.ts +281 -0
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
- package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
- package/src/proto/tests.ts +52 -0
- package/src/rpc-protocol/DhtCallContext.ts +15 -0
- package/src/rpc-protocol/DhtRpcOptions.ts +9 -0
- package/src/transport/ITransport.ts +31 -0
- package/src/transport/ListeningRpcCommunicator.ts +14 -0
- package/src/transport/RoutingRpcCommunicator.ts +59 -0
- package/src/types/glogal.d.ts +1 -0
- package/src/types/textencoding.d.ts +7 -0
- package/test/RandomGraphSimulation.ts +52 -0
- package/test/benchmark/KademliaCorrectness.test.ts +115 -0
- package/test/benchmark/RecursiveFind.test.ts +87 -0
- package/test/benchmark/any.test.ts +28 -0
- package/test/benchmark/kademlia-simulation/Contact.ts +32 -0
- package/test/benchmark/kademlia-simulation/KademliaSimulation.ts +94 -0
- package/test/benchmark/kademlia-simulation/SimulationNode.ts +125 -0
- package/test/data/generateGroundTruthData.ts +70 -0
- package/test/end-to-end/Layer0-Layer1.test.ts +87 -0
- package/test/end-to-end/Layer0.test.ts +60 -0
- package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +94 -0
- package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +134 -0
- package/test/end-to-end/Layer0WebRTC.test.ts +98 -0
- package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +69 -0
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +73 -0
- package/test/end-to-end/WebSocketConnectionRequest.test.ts +62 -0
- package/test/integration/ConnectionLocking.test.ts +166 -0
- package/test/integration/ConnectionManager.test.ts +291 -0
- package/test/integration/DhtNodeExternalAPI.test.ts +43 -0
- package/test/integration/DhtPeer.test.ts +73 -0
- package/test/integration/DhtRpc.test.ts +131 -0
- package/test/integration/DhtWithMockConnectionLatencies.test.ts +46 -0
- package/test/integration/DhtWithMockConnections.test.ts +46 -0
- package/test/integration/DhtWithRealConnectionLatencies.test.ts +47 -0
- package/test/integration/Layer1-scale.test.ts +200 -0
- package/test/integration/MigrateData.test.ts +203 -0
- package/test/integration/Mock-Layer1-Layer0.test.ts +106 -0
- package/test/integration/MultipleEntryPointJoining.test.ts +105 -0
- package/test/integration/RecursiveFind.test.ts +50 -0
- package/test/integration/RemoteRouter.test.ts +83 -0
- package/test/integration/RemoteStore.test.ts +66 -0
- package/test/integration/RouteMessage.test.ts +254 -0
- package/test/integration/RpcErrors.test.ts +153 -0
- package/test/integration/ScaleDownDht.test.ts +66 -0
- package/test/integration/SimultaneousConnections.test.ts +308 -0
- package/test/integration/Store.test.ts +72 -0
- package/test/integration/StoreAndDelete.test.ts +93 -0
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +71 -0
- package/test/integration/WebRtcConnectionManagement.test.ts +205 -0
- package/test/integration/WebRtcConnectorRpc.test.ts +145 -0
- package/test/integration/WebSocket.test.ts +64 -0
- package/test/integration/WebSocketConnectionManagement.test.ts +131 -0
- package/test/integration/WebSocketConnectorRpc.test.ts +86 -0
- package/test/kademlia-simulation/data/nodeids.json +13002 -0
- package/test/kademlia-simulation/data/orderedneighbors.json +1001 -0
- package/test/unit/AddressTools.test.ts +40 -0
- package/test/unit/DuplicateDetector.test.ts +29 -0
- package/test/unit/LocalDataStore.test.ts +107 -0
- package/test/unit/PeerID.test.ts +22 -0
- package/test/unit/ProtobufMessage.test.ts +21 -0
- package/test/unit/RandomContactList.test.ts +87 -0
- package/test/unit/RecursiveFinder.test.ts +112 -0
- package/test/unit/Router.test.ts +124 -0
- package/test/unit/SortedContactList.test.ts +127 -0
- package/test/unit/UUID.test.ts +49 -0
- package/test/unit/WebSocketServer.test.ts +42 -0
- package/test/utils/mock/RecursiveFinder.ts +19 -0
- package/test/utils/mock/Router.ts +53 -0
- package/test/utils/mock/Transport.ts +26 -0
- package/test/utils/utils.ts +311 -0
- package/tsconfig.browser.json +15 -0
- package/tsconfig.jest.json +19 -0
- package/tsconfig.json +3 -0
- package/tsconfig.node.json +18 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { Simulator } from '../../src/connection/Simulator/Simulator'
|
|
2
|
+
import { PeerID } from '../../src/helpers/PeerID'
|
|
3
|
+
import { DhtNode } from '../../src/dht/DhtNode'
|
|
4
|
+
import { createMockConnectionDhtNode, createMockConnectionLayer1Node } from '../utils/utils'
|
|
5
|
+
import { UUID } from '../../src/helpers/UUID'
|
|
6
|
+
|
|
7
|
+
describe('Layer1', () => {
|
|
8
|
+
|
|
9
|
+
let simulator: Simulator
|
|
10
|
+
const layer0EntryPointId = new UUID().toString()
|
|
11
|
+
|
|
12
|
+
const entryPoint0Descriptor = {
|
|
13
|
+
kademliaId: PeerID.fromString(layer0EntryPointId).value,
|
|
14
|
+
type: 0,
|
|
15
|
+
nodeName: layer0EntryPointId
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let layer0EntryPoint: DhtNode
|
|
19
|
+
|
|
20
|
+
const NODE_COUNT = 48
|
|
21
|
+
let nodes: DhtNode[]
|
|
22
|
+
|
|
23
|
+
let layer1CleanUp: DhtNode[]
|
|
24
|
+
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
simulator = new Simulator()
|
|
27
|
+
layer0EntryPoint = await createMockConnectionDhtNode(layer0EntryPointId, simulator)
|
|
28
|
+
await layer0EntryPoint.joinDht([entryPoint0Descriptor])
|
|
29
|
+
|
|
30
|
+
nodes = []
|
|
31
|
+
layer1CleanUp = []
|
|
32
|
+
|
|
33
|
+
for (let i = 0; i < NODE_COUNT; i++) {
|
|
34
|
+
const node = await createMockConnectionDhtNode(
|
|
35
|
+
new UUID().toString(),
|
|
36
|
+
simulator,
|
|
37
|
+
undefined,
|
|
38
|
+
undefined,
|
|
39
|
+
undefined,
|
|
40
|
+
undefined,
|
|
41
|
+
60000
|
|
42
|
+
)
|
|
43
|
+
nodes.push(node)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await Promise.all(nodes.map((node) => node.joinDht([entryPoint0Descriptor])))
|
|
47
|
+
|
|
48
|
+
}, 30000)
|
|
49
|
+
|
|
50
|
+
afterEach(async () => {
|
|
51
|
+
await Promise.all(nodes.map((node) => node.stop()))
|
|
52
|
+
await Promise.all(layer1CleanUp.map((node) => node.stop()))
|
|
53
|
+
await layer0EntryPoint.stop()
|
|
54
|
+
simulator.stop()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('single layer1 dht', async () => {
|
|
58
|
+
const layer1EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint)
|
|
59
|
+
await layer1EntryPoint.joinDht([entryPoint0Descriptor])
|
|
60
|
+
layer1CleanUp.push(layer1EntryPoint)
|
|
61
|
+
|
|
62
|
+
const layer1Nodes: DhtNode[] = []
|
|
63
|
+
for (let i = 0; i < NODE_COUNT; i++) {
|
|
64
|
+
const layer0 = nodes[i]
|
|
65
|
+
const layer1 = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0)
|
|
66
|
+
layer1Nodes.push(layer1)
|
|
67
|
+
layer1CleanUp.push(layer1)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
await Promise.all(layer1Nodes.map((node) => node.joinDht([entryPoint0Descriptor])))
|
|
71
|
+
|
|
72
|
+
for (let i = 0; i < NODE_COUNT; i++) {
|
|
73
|
+
const layer0Node = nodes[i]
|
|
74
|
+
const layer1Node = layer1Nodes[i]
|
|
75
|
+
expect(layer1Node.getNodeId().equals(layer0Node.getNodeId())).toEqual(true)
|
|
76
|
+
expect(layer1Node.getNumberOfConnections()).toEqual(layer0Node.getNumberOfConnections())
|
|
77
|
+
expect(layer1Node.getBucketSize()).toBeGreaterThanOrEqual(layer1Node.getK() / 2)
|
|
78
|
+
expect(layer1Node.getAllConnectionPeerDescriptors()).toEqual(layer0Node.getAllConnectionPeerDescriptors())
|
|
79
|
+
}
|
|
80
|
+
}, 120000)
|
|
81
|
+
|
|
82
|
+
it('multiple layer1 dht', async () => {
|
|
83
|
+
const stream1EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint, 'one')
|
|
84
|
+
await stream1EntryPoint.joinDht([entryPoint0Descriptor])
|
|
85
|
+
|
|
86
|
+
const stream2EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint, 'two')
|
|
87
|
+
await stream2EntryPoint.joinDht([entryPoint0Descriptor])
|
|
88
|
+
|
|
89
|
+
const stream3EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint, 'three')
|
|
90
|
+
await stream3EntryPoint.joinDht([entryPoint0Descriptor])
|
|
91
|
+
|
|
92
|
+
const stream4EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint, 'four')
|
|
93
|
+
await stream4EntryPoint.joinDht([entryPoint0Descriptor])
|
|
94
|
+
|
|
95
|
+
layer1CleanUp.push(stream1EntryPoint)
|
|
96
|
+
layer1CleanUp.push(stream2EntryPoint)
|
|
97
|
+
layer1CleanUp.push(stream3EntryPoint)
|
|
98
|
+
layer1CleanUp.push(stream4EntryPoint)
|
|
99
|
+
|
|
100
|
+
const stream1: DhtNode[] = []
|
|
101
|
+
const stream2: DhtNode[] = []
|
|
102
|
+
const stream3: DhtNode[] = []
|
|
103
|
+
const stream4: DhtNode[] = []
|
|
104
|
+
|
|
105
|
+
for (let i = 0; i < NODE_COUNT; i++) {
|
|
106
|
+
const layer0 = nodes[i]
|
|
107
|
+
const one = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0, 'one')
|
|
108
|
+
const two = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0, 'two')
|
|
109
|
+
const three = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0, 'three')
|
|
110
|
+
const four = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0, 'four')
|
|
111
|
+
|
|
112
|
+
stream1.push(one)
|
|
113
|
+
stream2.push(two)
|
|
114
|
+
stream3.push(three)
|
|
115
|
+
stream4.push(four)
|
|
116
|
+
|
|
117
|
+
layer1CleanUp.push(one)
|
|
118
|
+
layer1CleanUp.push(two)
|
|
119
|
+
layer1CleanUp.push(three)
|
|
120
|
+
layer1CleanUp.push(four)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
await Promise.all(layer1CleanUp.map((node) => node.joinDht([entryPoint0Descriptor])))
|
|
124
|
+
|
|
125
|
+
for (let i = 0; i < NODE_COUNT; i++) {
|
|
126
|
+
const layer0Node = nodes[i]
|
|
127
|
+
const stream1Node = stream1[i]
|
|
128
|
+
const stream2Node = stream2[i]
|
|
129
|
+
const stream3Node = stream3[i]
|
|
130
|
+
const stream4Node = stream4[i]
|
|
131
|
+
|
|
132
|
+
expect(layer0Node.getNumberOfConnections()).toEqual(stream1Node.getNumberOfConnections())
|
|
133
|
+
expect(layer0Node.getNumberOfConnections()).toEqual(stream2Node.getNumberOfConnections())
|
|
134
|
+
expect(layer0Node.getNumberOfConnections()).toEqual(stream3Node.getNumberOfConnections())
|
|
135
|
+
expect(layer0Node.getNumberOfConnections()).toEqual(stream4Node.getNumberOfConnections())
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
}, 120000)
|
|
139
|
+
|
|
140
|
+
// TODO: Make this work
|
|
141
|
+
// it('layer1 routing', async () => {
|
|
142
|
+
// const layer1EntryPoint = await createMockConnectionLayer1Node(layer0EntryPoint.getNodeId().toString(), layer0EntryPoint)
|
|
143
|
+
// await layer1EntryPoint.joinDht(entryPoint0Descriptor)
|
|
144
|
+
// layer1CleanUp.push(layer1EntryPoint)
|
|
145
|
+
//
|
|
146
|
+
// const receivedMessages: Map<string, Set<string>> = new Map()
|
|
147
|
+
//
|
|
148
|
+
// const layer1Nodes: DhtNode[] = []
|
|
149
|
+
// for (let i = 0; i < NODE_COUNT; i++) {
|
|
150
|
+
// const layer0 = nodes[i]
|
|
151
|
+
// if (i > NODE_COUNT - 5) {
|
|
152
|
+
// const layer1 = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0)
|
|
153
|
+
// layer1Nodes.push(layer1)
|
|
154
|
+
// layer1CleanUp.push(layer1)
|
|
155
|
+
// receivedMessages.set(layer0.getNodeId().toKey(), new Set())
|
|
156
|
+
// layer1.on('message', (msg: Message) => {
|
|
157
|
+
// const peerId = PeerID.fromValue(msg.sourceDescriptor!.kademliaId)
|
|
158
|
+
// receivedMessages.get(layer0.getNodeId().toKey())!.add(peerId.toKey())
|
|
159
|
+
// })
|
|
160
|
+
// }
|
|
161
|
+
// }
|
|
162
|
+
//
|
|
163
|
+
// await Promise.all(layer1Nodes.map((node) => node.joinDht(entryPoint0Descriptor)))
|
|
164
|
+
//
|
|
165
|
+
// layer1Nodes.map((sender) => {
|
|
166
|
+
// layer1Nodes.map(async (receiver) => {
|
|
167
|
+
// if (!sender.getNodeId().equals(receiver.getNodeId())) {
|
|
168
|
+
// const rpcWrapper = createWrappedClosestPeersRequest(sender.getPeerDescriptor(), receiver.getPeerDescriptor())
|
|
169
|
+
// const message: Message = {
|
|
170
|
+
// serviceId: 'service',
|
|
171
|
+
// messageId: v4(),
|
|
172
|
+
// messageType: MessageType.RPC,
|
|
173
|
+
// body: {
|
|
174
|
+
// oneofKind: 'rpcMessage',
|
|
175
|
+
// rpcMessage: rpcWrapper
|
|
176
|
+
// },
|
|
177
|
+
// sourceDescriptor: sender.getPeerDescriptor(),
|
|
178
|
+
// targetDescriptor: receiver.getPeerDescriptor()
|
|
179
|
+
// }
|
|
180
|
+
// await sender.doRouteMessage({
|
|
181
|
+
// message,
|
|
182
|
+
// destinationPeer: receiver.getPeerDescriptor(),
|
|
183
|
+
// sourcePeer: sender.getPeerDescriptor(),
|
|
184
|
+
// requestId: v4(),
|
|
185
|
+
// reachableThrough: [],
|
|
186
|
+
// routingPath: []
|
|
187
|
+
// })
|
|
188
|
+
// }
|
|
189
|
+
// })
|
|
190
|
+
// })
|
|
191
|
+
//
|
|
192
|
+
// await waitForCondition(() => {
|
|
193
|
+
// return [...receivedMessages.values()].every((set) => {
|
|
194
|
+
// return set.size === receivedMessages.size - 1
|
|
195
|
+
// })
|
|
196
|
+
// }, 15000)
|
|
197
|
+
//
|
|
198
|
+
// }, 120000)
|
|
199
|
+
|
|
200
|
+
})
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { LatencyType, Simulator } from '../../src/connection/Simulator/Simulator'
|
|
3
|
+
import { DhtNode } from '../../src/dht/DhtNode'
|
|
4
|
+
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
5
|
+
import { createMockConnectionDhtNode, waitNodesReadyForTesting } from '../utils/utils'
|
|
6
|
+
import { execSync } from 'child_process'
|
|
7
|
+
import fs from 'fs'
|
|
8
|
+
import { Logger } from '@streamr/utils'
|
|
9
|
+
import { PeerID } from '../../src/exports'
|
|
10
|
+
import { Any } from '../../src/proto/google/protobuf/any'
|
|
11
|
+
import { SortedContactList } from '../../src/dht/contact/SortedContactList'
|
|
12
|
+
import { Contact } from '../../src/dht/contact/Contact'
|
|
13
|
+
|
|
14
|
+
const logger = new Logger(module)
|
|
15
|
+
|
|
16
|
+
jest.setTimeout(60000)
|
|
17
|
+
|
|
18
|
+
describe('Migrating data from node to node in DHT', () => {
|
|
19
|
+
let entryPoint: DhtNode
|
|
20
|
+
let nodes: DhtNode[]
|
|
21
|
+
let entrypointDescriptor: PeerDescriptor
|
|
22
|
+
const simulator = new Simulator(LatencyType.FIXED, 20)
|
|
23
|
+
const NUM_NODES = 100
|
|
24
|
+
const MAX_CONNECTIONS = 80
|
|
25
|
+
const K = 8
|
|
26
|
+
|
|
27
|
+
const nodesById: Map<string, DhtNode> = new Map()
|
|
28
|
+
|
|
29
|
+
if (!fs.existsSync('test/data/nodeids.json')) {
|
|
30
|
+
console.log('ground truth data does not exist yet, generating..')
|
|
31
|
+
execSync('npm run prepare-kademlia-simulation')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const dhtIds: Array<{ type: string, data: Array<number> }> = JSON.parse(fs.readFileSync('test/data/nodeids.json').toString())
|
|
35
|
+
/*
|
|
36
|
+
const getRandomNode = () => {
|
|
37
|
+
return nodes[Math.floor(Math.random() * nodes.length)]
|
|
38
|
+
}
|
|
39
|
+
*/
|
|
40
|
+
beforeEach(async () => {
|
|
41
|
+
nodes = []
|
|
42
|
+
const entryPointId = '0'
|
|
43
|
+
entryPoint = await createMockConnectionDhtNode(entryPointId, simulator,
|
|
44
|
+
Uint8Array.from(dhtIds[0].data), K, entryPointId, MAX_CONNECTIONS)
|
|
45
|
+
nodes.push(entryPoint)
|
|
46
|
+
nodesById.set(entryPoint.getNodeId().toKey(), entryPoint)
|
|
47
|
+
|
|
48
|
+
entrypointDescriptor = {
|
|
49
|
+
kademliaId: entryPoint.getNodeId().value,
|
|
50
|
+
type: NodeType.NODEJS,
|
|
51
|
+
nodeName: entryPointId
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
nodes.push(entryPoint)
|
|
55
|
+
|
|
56
|
+
for (let i = 1; i < NUM_NODES; i++) {
|
|
57
|
+
const nodeId = `${i}`
|
|
58
|
+
|
|
59
|
+
const node = await createMockConnectionDhtNode(nodeId, simulator,
|
|
60
|
+
Uint8Array.from(dhtIds[i].data), K, nodeId, MAX_CONNECTIONS)
|
|
61
|
+
nodesById.set(node.getNodeId().toKey(), node)
|
|
62
|
+
nodes.push(node)
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
afterEach(async () => {
|
|
67
|
+
await Promise.all([
|
|
68
|
+
...nodes.map(async (node) => await node.stop())
|
|
69
|
+
])
|
|
70
|
+
logger.info('nodes stopped')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
afterAll(async () => {
|
|
74
|
+
simulator.stop()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('Data migrates to the closest node no matter where it is stored', async () => {
|
|
78
|
+
const dataKey = PeerID.fromString('3232323e12r31r3')
|
|
79
|
+
const data = Any.pack(entrypointDescriptor, PeerDescriptor)
|
|
80
|
+
|
|
81
|
+
// calculate offline which node is closest to the data
|
|
82
|
+
|
|
83
|
+
const sortedList = new SortedContactList<Contact>(dataKey, 10000)
|
|
84
|
+
|
|
85
|
+
nodes.forEach((node) => {
|
|
86
|
+
sortedList.addContact(new Contact(node.getPeerDescriptor())
|
|
87
|
+
)
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const closest = sortedList.getAllContacts()
|
|
91
|
+
|
|
92
|
+
logger.info('Nodes sorted according to distance to data are: ')
|
|
93
|
+
closest.forEach((contact) => {
|
|
94
|
+
logger.info('' + contact.getPeerDescriptor().nodeName)
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
logger.info('node 0 joining to the DHT')
|
|
98
|
+
|
|
99
|
+
await nodes[0].joinDht([entrypointDescriptor])
|
|
100
|
+
|
|
101
|
+
logger.info('storing data to node 0')
|
|
102
|
+
const successfulStorers = await nodes[0].storeDataToDht(dataKey.value, data)
|
|
103
|
+
expect(successfulStorers.length).toBe(1)
|
|
104
|
+
logger.info('data successfully stored to node 0')
|
|
105
|
+
|
|
106
|
+
logger.info('Nodes sorted according to distance to data with storing nodes marked are: ')
|
|
107
|
+
|
|
108
|
+
closest.forEach((contact) => {
|
|
109
|
+
const node = nodesById.get(PeerID.fromValue(contact.getPeerDescriptor().kademliaId).toKey())!
|
|
110
|
+
let hasDataMarker = ''
|
|
111
|
+
|
|
112
|
+
// @ts-expect-error private field
|
|
113
|
+
if (node.localDataStore.getEntry(dataKey)) {
|
|
114
|
+
hasDataMarker = '<-'
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
logger.info(contact.getPeerDescriptor().nodeName + ' ' + node.getNodeName() + hasDataMarker)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
logger.info(NUM_NODES + ' nodes joining layer0 DHT')
|
|
121
|
+
await Promise.all(
|
|
122
|
+
nodes.map((node) => {
|
|
123
|
+
if (node.getNodeName() != '0') {
|
|
124
|
+
node.joinDht([entrypointDescriptor])
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
logger.info('completed ' + NUM_NODES + ' nodes joining layer0 DHT')
|
|
130
|
+
|
|
131
|
+
await waitNodesReadyForTesting(nodes)
|
|
132
|
+
|
|
133
|
+
logger.info('After join of 99 nodes: nodes sorted according to distance to data with storing nodes marked are: ')
|
|
134
|
+
|
|
135
|
+
closest.forEach((contact) => {
|
|
136
|
+
const node = nodesById.get(PeerID.fromValue(contact.getPeerDescriptor().kademliaId).toKey())!
|
|
137
|
+
let hasDataMarker = ''
|
|
138
|
+
|
|
139
|
+
// @ts-expect-error private field
|
|
140
|
+
|
|
141
|
+
if (node.localDataStore.getEntry(dataKey)) {
|
|
142
|
+
hasDataMarker = '<-'
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
logger.info('' + node.getNodeName() + hasDataMarker)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
const closestNode = nodesById.get(PeerID.fromValue(closest[0].getPeerDescriptor().kademliaId).toKey())!
|
|
149
|
+
|
|
150
|
+
// @ts-expect-error private field
|
|
151
|
+
expect(closestNode.localDataStore.getEntry(dataKey)).toBeTruthy()
|
|
152
|
+
}, 180000)
|
|
153
|
+
|
|
154
|
+
it('Data migrates to the last remaining node if all other nodes leave gracefully', async () => {
|
|
155
|
+
const dataKey = PeerID.fromString('3232323e12r31r3')
|
|
156
|
+
const data = Any.pack(entrypointDescriptor, PeerDescriptor)
|
|
157
|
+
|
|
158
|
+
logger.info(NUM_NODES + ' nodes joining layer0 DHT')
|
|
159
|
+
await Promise.all(
|
|
160
|
+
nodes.map((node) => {
|
|
161
|
+
node.joinDht([entrypointDescriptor])
|
|
162
|
+
})
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
logger.info('completed ' + NUM_NODES + ' nodes joining layer0 DHT')
|
|
166
|
+
|
|
167
|
+
await waitNodesReadyForTesting(nodes)
|
|
168
|
+
|
|
169
|
+
const randomIndex = Math.floor(Math.random() * nodes.length)
|
|
170
|
+
logger.info('storing data to a random node: ' + randomIndex)
|
|
171
|
+
|
|
172
|
+
const successfulStorers = await nodes[randomIndex].storeDataToDht(dataKey.value, data)
|
|
173
|
+
|
|
174
|
+
logger.info('data successfully stored to ' + successfulStorers + ' nodes')
|
|
175
|
+
|
|
176
|
+
const randomIndices = []
|
|
177
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
178
|
+
randomIndices.push(i)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
console.error(randomIndices)
|
|
182
|
+
while (randomIndices.length > 1) {
|
|
183
|
+
const index = Math.floor(Math.random() * randomIndices.length)
|
|
184
|
+
const nodeIndex = randomIndices[index]
|
|
185
|
+
randomIndices.splice(index, 1)
|
|
186
|
+
|
|
187
|
+
logger.info('Stopping node ' + nodeIndex + ' ' +
|
|
188
|
+
// @ts-expect-error private field
|
|
189
|
+
(nodes[nodeIndex].localDataStore.getEntry(dataKey) ? ', has data' : ' does not have data'))
|
|
190
|
+
|
|
191
|
+
await nodes[nodeIndex].stop()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
logger.info('after random graceful leaving, node ' + randomIndices[0] + ' is left')
|
|
195
|
+
|
|
196
|
+
// @ts-expect-error private field
|
|
197
|
+
logger.info('data of ' + randomIndices[0] + ' was ' + nodes[randomIndices[0]].localDataStore.getEntry(dataKey))
|
|
198
|
+
|
|
199
|
+
// @ts-expect-error private field
|
|
200
|
+
expect(nodes[randomIndices[0]].localDataStore.getEntry(dataKey)).toBeTruthy()
|
|
201
|
+
|
|
202
|
+
}, 180000)
|
|
203
|
+
})
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Logger } from '@streamr/utils'
|
|
2
|
+
import { Simulator } from '../../src/connection/Simulator/Simulator'
|
|
3
|
+
import { DhtNode } from '../../src/dht/DhtNode'
|
|
4
|
+
import { PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
5
|
+
import { createMockConnectionDhtNode, createMockConnectionLayer1Node } from '../utils/utils'
|
|
6
|
+
|
|
7
|
+
const logger = new Logger(module)
|
|
8
|
+
|
|
9
|
+
describe('Layer 1 on Layer 0 with mocked connections', () => {
|
|
10
|
+
const simulator = new Simulator()
|
|
11
|
+
const layer0EntryPointId = 'layer0entrypoint'
|
|
12
|
+
|
|
13
|
+
let layer0EntryPoint: DhtNode
|
|
14
|
+
let layer1Node1: DhtNode
|
|
15
|
+
|
|
16
|
+
let layer0Node1: DhtNode
|
|
17
|
+
let layer1EntryPoint: DhtNode
|
|
18
|
+
|
|
19
|
+
let layer0Node2: DhtNode
|
|
20
|
+
let layer1Node2: DhtNode
|
|
21
|
+
|
|
22
|
+
let layer0Node3: DhtNode
|
|
23
|
+
let layer1Node3: DhtNode
|
|
24
|
+
|
|
25
|
+
let layer0Node4: DhtNode
|
|
26
|
+
let layer1Node4: DhtNode
|
|
27
|
+
|
|
28
|
+
let entryPointDescriptor: PeerDescriptor
|
|
29
|
+
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
|
|
32
|
+
layer0EntryPoint = await createMockConnectionDhtNode(layer0EntryPointId, simulator)
|
|
33
|
+
|
|
34
|
+
const layer0Node1Id = 'node1'
|
|
35
|
+
layer0Node1 = await createMockConnectionDhtNode(layer0Node1Id, simulator)
|
|
36
|
+
|
|
37
|
+
const layer0Node2Id = 'node2'
|
|
38
|
+
layer0Node2 = await createMockConnectionDhtNode(layer0Node2Id, simulator)
|
|
39
|
+
|
|
40
|
+
const layer0Node3Id = 'node3'
|
|
41
|
+
layer0Node3 = await createMockConnectionDhtNode(layer0Node3Id, simulator)
|
|
42
|
+
|
|
43
|
+
const layer0Node4Id = 'node4'
|
|
44
|
+
layer0Node4 = await createMockConnectionDhtNode(layer0Node4Id, simulator)
|
|
45
|
+
|
|
46
|
+
layer1EntryPoint = await createMockConnectionLayer1Node(layer0EntryPointId, layer0EntryPoint)
|
|
47
|
+
|
|
48
|
+
layer1Node1 = await createMockConnectionLayer1Node(layer0Node1Id, layer0Node1)
|
|
49
|
+
layer1Node2 = await createMockConnectionLayer1Node(layer0Node2Id, layer0Node2)
|
|
50
|
+
layer1Node3 = await createMockConnectionLayer1Node(layer0Node3Id, layer0Node3)
|
|
51
|
+
layer1Node4 = await createMockConnectionLayer1Node(layer0Node4Id, layer0Node4)
|
|
52
|
+
|
|
53
|
+
entryPointDescriptor = {
|
|
54
|
+
kademliaId: layer0EntryPoint.getNodeId().value,
|
|
55
|
+
type: 0,
|
|
56
|
+
nodeName: layer0EntryPointId
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
await layer0EntryPoint.joinDht([entryPointDescriptor])
|
|
60
|
+
await layer1EntryPoint.joinDht([entryPointDescriptor])
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
afterEach(async () => {
|
|
64
|
+
await Promise.all([
|
|
65
|
+
layer0EntryPoint.stop(),
|
|
66
|
+
layer0Node1.stop(),
|
|
67
|
+
layer0Node2.stop(),
|
|
68
|
+
layer0Node3.stop(),
|
|
69
|
+
layer0Node4.stop(),
|
|
70
|
+
layer1EntryPoint.stop(),
|
|
71
|
+
layer1Node1.stop(),
|
|
72
|
+
layer1Node2.stop(),
|
|
73
|
+
layer1Node3.stop(),
|
|
74
|
+
layer1Node4.stop()
|
|
75
|
+
])
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('Happy Path', async () => {
|
|
79
|
+
await layer0Node1.joinDht([entryPointDescriptor])
|
|
80
|
+
await layer0Node2.joinDht([entryPointDescriptor])
|
|
81
|
+
await layer0Node3.joinDht([entryPointDescriptor])
|
|
82
|
+
await layer0Node4.joinDht([entryPointDescriptor])
|
|
83
|
+
|
|
84
|
+
await layer1Node1.joinDht([entryPointDescriptor])
|
|
85
|
+
await layer1Node2.joinDht([entryPointDescriptor])
|
|
86
|
+
await layer1Node3.joinDht([entryPointDescriptor])
|
|
87
|
+
await layer1Node4.joinDht([entryPointDescriptor])
|
|
88
|
+
|
|
89
|
+
logger.info('layer1EntryPoint.getBucketSize() ' + layer1EntryPoint.getBucketSize())
|
|
90
|
+
logger.info('layer1Node1.getBucketSize()' + layer1Node1.getBucketSize())
|
|
91
|
+
logger.info('layer1Node2.getBucketSize()' + layer1Node2.getBucketSize())
|
|
92
|
+
logger.info('layer1Node3.getBucketSize()' + layer1Node3.getBucketSize())
|
|
93
|
+
logger.info('layer1Node4.getBucketSize()' + layer1Node4.getBucketSize())
|
|
94
|
+
|
|
95
|
+
expect(layer1Node1.getBucketSize()).toEqual(layer0Node1.getBucketSize())
|
|
96
|
+
expect(layer1Node2.getBucketSize()).toEqual(layer0Node2.getBucketSize())
|
|
97
|
+
expect(layer1Node3.getBucketSize()).toEqual(layer0Node3.getBucketSize())
|
|
98
|
+
expect(layer1Node4.getBucketSize()).toEqual(layer0Node4.getBucketSize())
|
|
99
|
+
|
|
100
|
+
expect(layer1Node1.getKBucketPeers()).toContainValues(layer0Node1.getKBucketPeers())
|
|
101
|
+
expect(layer1Node2.getKBucketPeers()).toContainValues(layer0Node2.getKBucketPeers())
|
|
102
|
+
expect(layer1Node3.getKBucketPeers()).toContainValues(layer0Node3.getKBucketPeers())
|
|
103
|
+
expect(layer1Node4.getKBucketPeers()).toContainValues(layer0Node4.getKBucketPeers())
|
|
104
|
+
|
|
105
|
+
}, 60000)
|
|
106
|
+
})
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { LatencyType, Simulator } from '../../src/connection/Simulator/Simulator'
|
|
2
|
+
import { DhtNode } from '../../src/dht/DhtNode'
|
|
3
|
+
import { PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
4
|
+
import { createMockConnectionDhtNode } from '../utils/utils'
|
|
5
|
+
|
|
6
|
+
describe('multiple entry point joining', () => {
|
|
7
|
+
|
|
8
|
+
describe('all nodes are entry points', () => {
|
|
9
|
+
|
|
10
|
+
let simulator: Simulator
|
|
11
|
+
let node1: DhtNode
|
|
12
|
+
let node2: DhtNode
|
|
13
|
+
let node3: DhtNode
|
|
14
|
+
let entryPoints: PeerDescriptor[]
|
|
15
|
+
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
simulator = new Simulator(LatencyType.RANDOM)
|
|
18
|
+
|
|
19
|
+
node1 = await createMockConnectionDhtNode('node1', simulator)
|
|
20
|
+
node2 = await createMockConnectionDhtNode('node2', simulator)
|
|
21
|
+
node3 = await createMockConnectionDhtNode('node3', simulator)
|
|
22
|
+
|
|
23
|
+
entryPoints = [
|
|
24
|
+
node1.getPeerDescriptor(),
|
|
25
|
+
node2.getPeerDescriptor(),
|
|
26
|
+
node3.getPeerDescriptor()
|
|
27
|
+
]
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
afterEach(async () => {
|
|
31
|
+
await Promise.all([
|
|
32
|
+
node1.stop(),
|
|
33
|
+
node2.stop(),
|
|
34
|
+
node3.stop()
|
|
35
|
+
])
|
|
36
|
+
simulator.stop()
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('can join simultaneously', async () => {
|
|
40
|
+
await Promise.all([
|
|
41
|
+
node1.joinDht(entryPoints),
|
|
42
|
+
node2.joinDht(entryPoints),
|
|
43
|
+
node3.joinDht(entryPoints)
|
|
44
|
+
])
|
|
45
|
+
expect(node1.getBucketSize()).toEqual(2)
|
|
46
|
+
expect(node2.getBucketSize()).toEqual(2)
|
|
47
|
+
expect(node3.getBucketSize()).toEqual(2)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('can join even if a node is offline', async () => {
|
|
51
|
+
await node3.stop()
|
|
52
|
+
await Promise.all([
|
|
53
|
+
node1.joinDht(entryPoints),
|
|
54
|
+
node2.joinDht(entryPoints)
|
|
55
|
+
])
|
|
56
|
+
expect(node1.getBucketSize()).toEqual(1)
|
|
57
|
+
expect(node2.getBucketSize()).toEqual(1)
|
|
58
|
+
}, 10000)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
describe('non entry point nodes can join via multiple entry points', () => {
|
|
62
|
+
let simulator: Simulator
|
|
63
|
+
let entryPoint1: DhtNode
|
|
64
|
+
let entryPoint2: DhtNode
|
|
65
|
+
let node1: DhtNode
|
|
66
|
+
let node2: DhtNode
|
|
67
|
+
let entryPoints: PeerDescriptor[]
|
|
68
|
+
|
|
69
|
+
beforeEach(async () => {
|
|
70
|
+
simulator = new Simulator(LatencyType.RANDOM)
|
|
71
|
+
|
|
72
|
+
entryPoint1 = await createMockConnectionDhtNode('entryPoint1', simulator)
|
|
73
|
+
entryPoint2 = await createMockConnectionDhtNode('entryPoint2', simulator)
|
|
74
|
+
|
|
75
|
+
node1 = await createMockConnectionDhtNode('node1', simulator)
|
|
76
|
+
node2 = await createMockConnectionDhtNode('node2', simulator)
|
|
77
|
+
|
|
78
|
+
entryPoints = [
|
|
79
|
+
entryPoint1.getPeerDescriptor(),
|
|
80
|
+
entryPoint2.getPeerDescriptor(),
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
await entryPoint1.joinDht(entryPoints)
|
|
84
|
+
await entryPoint2.joinDht(entryPoints)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
afterEach(async () => {
|
|
88
|
+
await Promise.all([
|
|
89
|
+
entryPoint1.stop(),
|
|
90
|
+
entryPoint2.stop(),
|
|
91
|
+
node1.stop(),
|
|
92
|
+
node2.stop()
|
|
93
|
+
])
|
|
94
|
+
simulator.stop()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('non-entry point nodes can join', async () => {
|
|
98
|
+
await node1.joinDht(entryPoints)
|
|
99
|
+
expect(node1.getBucketSize()).toEqual(2)
|
|
100
|
+
await node2.joinDht(entryPoints)
|
|
101
|
+
expect(node2.getBucketSize()).toEqual(3)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
})
|
|
105
|
+
})
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { LatencyType, Simulator } from '../../src/connection/Simulator/Simulator'
|
|
2
|
+
import { DhtNode } from '../../src/dht/DhtNode'
|
|
3
|
+
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
4
|
+
import { createMockConnectionDhtNode, waitConnectionManagersReadyForTesting } from '../utils/utils'
|
|
5
|
+
import { PeerID, peerIdFromPeerDescriptor } from '../../src/exports'
|
|
6
|
+
|
|
7
|
+
describe('Recursive find correctness', () => {
|
|
8
|
+
|
|
9
|
+
let entryPoint: DhtNode
|
|
10
|
+
let nodes: DhtNode[]
|
|
11
|
+
let entrypointDescriptor: PeerDescriptor
|
|
12
|
+
const simulator = new Simulator(LatencyType.RANDOM)
|
|
13
|
+
const NUM_NODES = 100
|
|
14
|
+
const K = 2
|
|
15
|
+
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
nodes = []
|
|
18
|
+
const entryPointId = '0'
|
|
19
|
+
entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, undefined, K, entryPointId)
|
|
20
|
+
nodes.push(entryPoint)
|
|
21
|
+
entrypointDescriptor = {
|
|
22
|
+
kademliaId: entryPoint.getNodeId().value,
|
|
23
|
+
type: NodeType.NODEJS,
|
|
24
|
+
nodeName: entryPointId
|
|
25
|
+
}
|
|
26
|
+
for (let i = 1; i < NUM_NODES; i++) {
|
|
27
|
+
const nodeId = `${i}`
|
|
28
|
+
const node = await createMockConnectionDhtNode(nodeId, simulator, undefined, K, nodeId, 20, 60000)
|
|
29
|
+
nodes.push(node)
|
|
30
|
+
}
|
|
31
|
+
await entryPoint.joinDht([entrypointDescriptor])
|
|
32
|
+
await Promise.all(nodes.map((node) => node.joinDht([entrypointDescriptor])))
|
|
33
|
+
await waitConnectionManagersReadyForTesting(nodes.map((node) => node.connectionManager!), 20)
|
|
34
|
+
}, 90000)
|
|
35
|
+
|
|
36
|
+
afterEach(async () => {
|
|
37
|
+
await Promise.all([
|
|
38
|
+
entryPoint.stop(),
|
|
39
|
+
...nodes.map(async (node) => await node.stop())
|
|
40
|
+
])
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('Entrypoint can find a node from the network (exact match)', async () => {
|
|
44
|
+
const kademliaIdToFind = nodes[45].getNodeId().value
|
|
45
|
+
const results = await entryPoint.startRecursiveFind(kademliaIdToFind)
|
|
46
|
+
expect(results.closestNodes.length).toBeGreaterThanOrEqual(5)
|
|
47
|
+
expect(PeerID.fromValue(kademliaIdToFind).equals(peerIdFromPeerDescriptor(results.closestNodes[0])))
|
|
48
|
+
}, 30000)
|
|
49
|
+
|
|
50
|
+
})
|