@streamr/dht 0.0.1-tatum.6 → 0.0.1-tatum.8
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/dist/src/connection/ConnectionLockHandler.d.ts +1 -1
- package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
- package/dist/src/connection/ConnectionLockRpcRemote.d.ts +10 -0
- package/dist/src/connection/{RemoteConnectionLocker.js → ConnectionLockRpcRemote.js} +21 -35
- package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -0
- package/dist/src/connection/ConnectionManager.d.ts +17 -41
- package/dist/src/connection/ConnectionManager.js +148 -212
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectivityChecker.js +16 -13
- package/dist/src/connection/ConnectivityChecker.js.map +1 -1
- package/dist/src/connection/ConnectorFacade.d.ts +49 -0
- package/dist/src/connection/ConnectorFacade.js +83 -0
- package/dist/src/connection/ConnectorFacade.js.map +1 -0
- package/dist/src/connection/Handshaker.d.ts +1 -2
- package/dist/src/connection/Handshaker.js +1 -4
- package/dist/src/connection/Handshaker.js.map +1 -1
- package/dist/src/connection/ManagedConnection.d.ts +2 -6
- package/dist/src/connection/ManagedConnection.js +27 -36
- package/dist/src/connection/ManagedConnection.js.map +1 -1
- package/dist/src/connection/ManagedWebRtcConnection.d.ts +1 -1
- package/dist/src/connection/ManagedWebRtcConnection.js +2 -2
- package/dist/src/connection/ManagedWebRtcConnection.js.map +1 -1
- package/dist/src/connection/Simulator/Simulator.d.ts +0 -2
- package/dist/src/connection/Simulator/Simulator.js +0 -5
- package/dist/src/connection/Simulator/Simulator.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorConnection.js +16 -13
- package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorConnector.d.ts +2 -3
- package/dist/src/connection/Simulator/SimulatorConnector.js +12 -14
- package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorTransport.js +6 -1
- package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -1
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +3 -1
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +12 -12
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -1
- package/dist/src/connection/WebRTC/{WebRtcConnector.d.ts → WebRtcConnectorRpcLocal.d.ts} +13 -13
- package/dist/src/connection/WebRTC/{WebRtcConnector.js → WebRtcConnectorRpcLocal.js} +46 -38
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.d.ts +11 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js +55 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/WebRTC/iceServerAsString.d.ts +1 -1
- package/dist/src/connection/WebSocket/{WebSocketConnector.d.ts → WebSocketConnectorRpcLocal.d.ts} +21 -11
- package/dist/src/connection/WebSocket/{WebSocketConnector.js → WebSocketConnectorRpcLocal.js} +80 -59
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.d.ts +8 -0
- package/dist/src/connection/WebSocket/{RemoteWebSocketConnector.js → WebSocketConnectorRpcRemote.js} +12 -16
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketServer.d.ts +11 -1
- package/dist/src/connection/WebSocket/WebSocketServer.js +15 -10
- package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -1
- package/dist/src/dht/DhtNode.d.ts +18 -55
- package/dist/src/dht/DhtNode.js +122 -145
- package/dist/src/dht/DhtNode.js.map +1 -1
- package/dist/src/dht/{RemoteExternalApi.d.ts → ExternalApiRpcRemote.d.ts} +2 -2
- package/dist/src/dht/{RemoteExternalApi.js → ExternalApiRpcRemote.js} +5 -6
- package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -0
- package/dist/src/dht/{DhtPeer.d.ts → RemoteDhtNode.d.ts} +2 -3
- package/dist/src/dht/{DhtPeer.js → RemoteDhtNode.js} +21 -19
- package/dist/src/dht/RemoteDhtNode.js.map +1 -0
- package/dist/src/dht/contact/ContactList.d.ts +0 -1
- package/dist/src/dht/contact/ContactList.js +0 -3
- package/dist/src/dht/contact/ContactList.js.map +1 -1
- package/dist/src/dht/contact/RandomContactList.d.ts +0 -1
- package/dist/src/dht/contact/RandomContactList.js +0 -3
- package/dist/src/dht/contact/RandomContactList.js.map +1 -1
- package/dist/src/dht/contact/SortedContactList.d.ts +0 -3
- package/dist/src/dht/contact/SortedContactList.js +0 -9
- package/dist/src/dht/contact/SortedContactList.js.map +1 -1
- package/dist/src/dht/discovery/DiscoverySession.d.ts +5 -7
- package/dist/src/dht/discovery/DiscoverySession.js +9 -10
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +12 -11
- package/dist/src/dht/discovery/PeerDiscovery.js +33 -37
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/find/RecursiveFindSession.d.ts +9 -10
- package/dist/src/dht/find/RecursiveFindSession.js +13 -13
- package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
- package/dist/src/dht/find/RecursiveFinder.d.ts +9 -11
- package/dist/src/dht/find/RecursiveFinder.js +35 -36
- package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
- package/dist/src/dht/find/RemoteRecursiveFindSession.d.ts +1 -1
- package/dist/src/dht/find/RemoteRecursiveFindSession.js +4 -4
- package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +1 -1
- package/dist/src/dht/registerExternalApiRpcMethods.d.ts +1 -1
- package/dist/src/dht/registerExternalApiRpcMethods.js +4 -3
- package/dist/src/dht/registerExternalApiRpcMethods.js.map +1 -1
- package/dist/src/dht/routing/DuplicateDetector.d.ts +1 -2
- package/dist/src/dht/routing/DuplicateDetector.js +2 -7
- package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
- package/dist/src/dht/routing/Router.d.ts +12 -15
- package/dist/src/dht/routing/Router.js +30 -33
- package/dist/src/dht/routing/Router.js.map +1 -1
- package/dist/src/dht/routing/{RemoteRouter.d.ts → RouterRpcRemote.d.ts} +2 -2
- package/dist/src/dht/routing/{RemoteRouter.js → RouterRpcRemote.js} +5 -5
- package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -0
- package/dist/src/dht/routing/RoutingSession.d.ts +3 -4
- package/dist/src/dht/routing/RoutingSession.js +6 -5
- package/dist/src/dht/routing/RoutingSession.js.map +1 -1
- package/dist/src/dht/store/{DataStore.d.ts → StoreRpcLocal.d.ts} +6 -6
- package/dist/src/dht/store/{DataStore.js → StoreRpcLocal.js} +34 -34
- package/dist/src/dht/store/StoreRpcLocal.js.map +1 -0
- package/dist/src/dht/store/{RemoteStore.d.ts → StoreRpcRemote.d.ts} +2 -2
- package/dist/src/dht/store/{RemoteStore.js → StoreRpcRemote.js} +4 -4
- package/dist/src/dht/store/StoreRpcRemote.js.map +1 -0
- package/dist/src/exports.d.ts +2 -8
- package/dist/src/exports.js +2 -14
- package/dist/src/exports.js.map +1 -1
- package/dist/src/helpers/PeerID.d.ts +0 -1
- package/dist/src/helpers/PeerID.js +0 -6
- package/dist/src/helpers/PeerID.js.map +1 -1
- package/dist/src/helpers/browser/isBrowserEnvironment.d.ts +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment.js +6 -0
- package/dist/src/helpers/browser/isBrowserEnvironment.js.map +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.d.ts +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.js +7 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.js.map +1 -0
- package/dist/src/helpers/kademliaId.d.ts +1 -0
- package/dist/src/helpers/kademliaId.js +14 -0
- package/dist/src/helpers/kademliaId.js.map +1 -0
- package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -1
- package/dist/src/helpers/peerIdFromPeerDescriptor.js +3 -3
- package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
- package/dist/src/helpers/protoClasses.js +2 -2
- package/dist/src/helpers/protoClasses.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +29 -29
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +39 -39
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +49 -162
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +47 -88
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +15 -15
- package/dist/src/transport/RoutingRpcCommunicator.js +1 -0
- package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
- package/package.json +10 -9
- package/protos/DhtRpc.proto +30 -60
- package/src/connection/ConnectionLockHandler.ts +1 -1
- package/src/connection/ConnectionLockRpcRemote.ts +62 -0
- package/src/connection/ConnectionManager.ts +178 -274
- package/src/connection/ConnectivityChecker.ts +15 -12
- package/src/connection/ConnectorFacade.ts +140 -0
- package/src/connection/Handshaker.ts +0 -5
- package/src/connection/ManagedConnection.ts +26 -40
- package/src/connection/ManagedWebRtcConnection.ts +0 -2
- package/src/connection/Simulator/Simulator.ts +0 -7
- package/src/connection/Simulator/SimulatorConnection.ts +16 -13
- package/src/connection/Simulator/SimulatorConnector.ts +13 -19
- package/src/connection/Simulator/SimulatorTransport.ts +6 -1
- package/src/connection/WebRTC/NodeWebRtcConnection.ts +15 -14
- package/src/connection/WebRTC/{WebRtcConnector.ts → WebRtcConnectorRpcLocal.ts} +68 -56
- package/src/connection/WebRTC/WebRtcConnectorRpcRemote.ts +71 -0
- package/src/connection/WebRTC/iceServerAsString.ts +1 -1
- package/src/connection/WebSocket/{WebSocketConnector.ts → WebSocketConnectorRpcLocal.ts} +102 -79
- package/src/connection/WebSocket/WebSocketConnectorRpcRemote.ts +45 -0
- package/src/connection/WebSocket/WebSocketServer.ts +26 -8
- package/src/dht/DhtNode.ts +176 -203
- package/src/dht/{RemoteExternalApi.ts → ExternalApiRpcRemote.ts} +3 -4
- package/src/dht/{DhtPeer.ts → RemoteDhtNode.ts} +11 -9
- package/src/dht/contact/ContactList.ts +0 -4
- package/src/dht/contact/RandomContactList.ts +0 -4
- package/src/dht/contact/SortedContactList.ts +0 -12
- package/src/dht/discovery/DiscoverySession.ts +20 -23
- package/src/dht/discovery/PeerDiscovery.ts +47 -45
- package/src/dht/find/RecursiveFindSession.ts +21 -22
- package/src/dht/find/RecursiveFinder.ts +45 -49
- package/src/dht/find/RemoteRecursiveFindSession.ts +6 -6
- package/src/dht/registerExternalApiRpcMethods.ts +8 -5
- package/src/dht/routing/DuplicateDetector.ts +3 -10
- package/src/dht/routing/Router.ts +39 -45
- package/src/dht/routing/{RemoteRouter.ts → RouterRpcRemote.ts} +4 -4
- package/src/dht/routing/RoutingSession.ts +15 -15
- package/src/dht/store/{DataStore.ts → StoreRpcLocal.ts} +42 -42
- package/src/dht/store/{RemoteStore.ts → StoreRpcRemote.ts} +2 -2
- package/src/exports.ts +2 -8
- package/src/helpers/PeerID.ts +0 -7
- package/src/helpers/browser/isBrowserEnvironment.ts +1 -0
- package/src/helpers/browser/isBrowserEnvironment_override.ts +3 -0
- package/src/helpers/kademliaId.ts +8 -0
- package/src/helpers/peerIdFromPeerDescriptor.ts +1 -1
- package/src/helpers/protoClasses.ts +4 -4
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +54 -54
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +15 -15
- package/src/proto/packages/dht/protos/DhtRpc.ts +77 -216
- package/src/transport/RoutingRpcCommunicator.ts +1 -0
- package/test/benchmark/KademliaCorrectness.test.ts +4 -2
- package/test/benchmark/RecursiveFind.test.ts +6 -6
- package/test/end-to-end/Layer0-Layer1.test.ts +9 -9
- package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +5 -5
- package/test/end-to-end/Layer0WebRTC.test.ts +5 -6
- package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +13 -8
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +15 -10
- package/test/end-to-end/WebSocketConnectionRequest.test.ts +5 -5
- package/test/integration/ConnectionLocking.test.ts +32 -26
- package/test/integration/ConnectionManager.test.ts +90 -93
- package/test/integration/DhtJoinPeerDiscovery.test.ts +53 -0
- package/test/integration/DhtRpc.test.ts +4 -6
- package/test/integration/Layer1-scale.test.ts +8 -8
- package/test/integration/MigrateData.test.ts +9 -9
- package/test/integration/Mock-Layer1-Layer0.test.ts +1 -2
- package/test/integration/RecursiveFind.test.ts +5 -5
- package/test/integration/{DhtPeer.test.ts → RemoteDhtNode.test.ts} +11 -12
- package/test/integration/RouteMessage.test.ts +7 -9
- package/test/integration/{RemoteRouter.test.ts → RouterRpcRemote.test.ts} +13 -14
- package/test/integration/RpcErrors.test.ts +25 -10
- package/test/integration/ScaleDownDht.test.ts +8 -8
- package/test/integration/SimultaneousConnections.test.ts +35 -36
- package/test/integration/Store.test.ts +8 -9
- package/test/integration/StoreAndDelete.test.ts +11 -11
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +7 -7
- package/test/integration/{RemoteStore.test.ts → StoreRpcRemote.test.ts} +17 -18
- package/test/integration/WebRtcConnectionManagement.test.ts +26 -19
- package/test/integration/WebRtcConnectorRpc.test.ts +17 -32
- package/test/integration/WebSocket.test.ts +4 -2
- package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
- package/test/integration/WebSocketConnectorRpc.test.ts +10 -15
- package/test/unit/DuplicateDetector.test.ts +3 -4
- package/test/unit/LocalDataStore.test.ts +6 -8
- package/test/unit/RandomContactList.test.ts +1 -1
- package/test/unit/RecursiveFinder.test.ts +13 -18
- package/test/unit/Router.test.ts +18 -21
- package/test/unit/WebSocketConnectorRpcLocal.test.ts +64 -0
- package/test/unit/WebSocketServer.test.ts +24 -12
- package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +1 -1
- package/test/utils/mock/RecursiveFinder.ts +2 -2
- package/test/utils/mock/Router.ts +9 -11
- package/test/utils/mock/Transport.ts +2 -2
- package/test/utils/utils.ts +55 -74
- package/dist/src/connection/RemoteConnectionLocker.d.ts +0 -13
- package/dist/src/connection/RemoteConnectionLocker.js.map +0 -1
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.d.ts +0 -12
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js +0 -74
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js.map +0 -1
- package/dist/src/connection/WebRTC/WebRtcConnector.js.map +0 -1
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.d.ts +0 -9
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +0 -1
- package/dist/src/connection/WebSocket/WebSocketConnector.js.map +0 -1
- package/dist/src/dht/DhtPeer.js.map +0 -1
- package/dist/src/dht/RemoteExternalApi.js.map +0 -1
- package/dist/src/dht/routing/RemoteRouter.js.map +0 -1
- package/dist/src/dht/store/DataStore.js.map +0 -1
- package/dist/src/dht/store/RemoteStore.js.map +0 -1
- package/dist/src/helpers/browser/isBrowser.d.ts +0 -1
- package/dist/src/helpers/browser/isBrowser.js +0 -6
- package/dist/src/helpers/browser/isBrowser.js.map +0 -1
- package/dist/src/helpers/browser/isNodeJS.d.ts +0 -1
- package/dist/src/helpers/browser/isNodeJS.js +0 -6
- package/dist/src/helpers/browser/isNodeJS.js.map +0 -1
- package/src/connection/RemoteConnectionLocker.ts +0 -84
- package/src/connection/WebRTC/RemoteWebrtcConnector.ts +0 -93
- package/src/connection/WebSocket/RemoteWebSocketConnector.ts +0 -49
- package/src/helpers/browser/isBrowser.ts +0 -1
- package/src/helpers/browser/isNodeJS.ts +0 -1
- package/test/integration/DhtWithMockConnectionLatencies.test.ts +0 -46
- package/test/integration/DhtWithMockConnections.test.ts +0 -46
- package/test/integration/DhtWithRealConnectionLatencies.test.ts +0 -47
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataEntry,
|
|
3
|
-
FindMode,
|
|
4
3
|
Message,
|
|
5
4
|
MessageType,
|
|
6
5
|
NodeType,
|
|
7
6
|
PeerDescriptor,
|
|
8
|
-
|
|
7
|
+
FindRequest,
|
|
9
8
|
RouteMessageAck,
|
|
10
9
|
RouteMessageWrapper
|
|
11
10
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
12
11
|
import { PeerID, PeerIDKey } from '../../helpers/PeerID'
|
|
13
12
|
import { createRouteMessageAck, RoutingErrors, IRouter } from '../routing/Router'
|
|
14
13
|
import { RoutingMode } from '../routing/RoutingSession'
|
|
15
|
-
import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
14
|
+
import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
16
15
|
import { Logger, runAndWaitForEvents3 } from '@streamr/utils'
|
|
17
16
|
import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
|
|
18
17
|
import { RemoteRecursiveFindSession } from './RemoteRecursiveFindSession'
|
|
19
18
|
import { v4 } from 'uuid'
|
|
20
19
|
import { RecursiveFindSession, RecursiveFindSessionEvents } from './RecursiveFindSession'
|
|
21
|
-
import {
|
|
20
|
+
import { RemoteDhtNode } from '../RemoteDhtNode'
|
|
22
21
|
import { ITransport } from '../../transport/ITransport'
|
|
23
22
|
import { LocalDataStore } from '../store/LocalDataStore'
|
|
24
|
-
import {
|
|
23
|
+
import { IRouterRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
25
24
|
import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
|
|
26
25
|
import { RecursiveFindSessionServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
27
26
|
import { toProtoRpcClient } from '@streamr/proto-rpc'
|
|
@@ -30,10 +29,9 @@ import { SortedContactList } from '../contact/SortedContactList'
|
|
|
30
29
|
interface RecursiveFinderConfig {
|
|
31
30
|
rpcCommunicator: RoutingRpcCommunicator
|
|
32
31
|
sessionTransport: ITransport
|
|
33
|
-
connections: Map<PeerIDKey,
|
|
32
|
+
connections: Map<PeerIDKey, RemoteDhtNode>
|
|
34
33
|
router: IRouter
|
|
35
34
|
ownPeerDescriptor: PeerDescriptor
|
|
36
|
-
ownPeerId: PeerID
|
|
37
35
|
serviceId: string
|
|
38
36
|
localDataStore: LocalDataStore
|
|
39
37
|
addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
@@ -41,10 +39,10 @@ interface RecursiveFinderConfig {
|
|
|
41
39
|
}
|
|
42
40
|
|
|
43
41
|
interface RecursiveFinderFunc {
|
|
44
|
-
startRecursiveFind(idToFind: Uint8Array,
|
|
42
|
+
startRecursiveFind(idToFind: Uint8Array, fetchData?: boolean): Promise<RecursiveFindResult>
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
export interface IRecursiveFinder extends Pick<
|
|
45
|
+
export interface IRecursiveFinder extends Pick<IRouterRpc, 'findRecursively'>, RecursiveFinderFunc {}
|
|
48
46
|
|
|
49
47
|
export interface RecursiveFindResult { closestNodes: Array<PeerDescriptor>, dataEntries?: Array<DataEntry> }
|
|
50
48
|
|
|
@@ -54,10 +52,9 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
54
52
|
|
|
55
53
|
private readonly rpcCommunicator: RoutingRpcCommunicator
|
|
56
54
|
private readonly sessionTransport: ITransport
|
|
57
|
-
private readonly connections: Map<PeerIDKey,
|
|
55
|
+
private readonly connections: Map<PeerIDKey, RemoteDhtNode>
|
|
58
56
|
private readonly router: IRouter
|
|
59
57
|
private readonly ownPeerDescriptor: PeerDescriptor
|
|
60
|
-
private readonly ownPeerId: PeerID
|
|
61
58
|
private readonly serviceId: string
|
|
62
59
|
private readonly localDataStore: LocalDataStore
|
|
63
60
|
private readonly addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
@@ -71,7 +68,6 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
71
68
|
this.connections = config.connections
|
|
72
69
|
this.router = config.router
|
|
73
70
|
this.ownPeerDescriptor = config.ownPeerDescriptor
|
|
74
|
-
this.ownPeerId = config.ownPeerId
|
|
75
71
|
this.serviceId = config.serviceId
|
|
76
72
|
this.localDataStore = config.localDataStore
|
|
77
73
|
this.addContact = config.addContact
|
|
@@ -82,7 +78,7 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
82
78
|
|
|
83
79
|
public async startRecursiveFind(
|
|
84
80
|
idToFind: Uint8Array,
|
|
85
|
-
|
|
81
|
+
fetchData: boolean = false,
|
|
86
82
|
excludedPeer?: PeerDescriptor
|
|
87
83
|
): Promise<RecursiveFindResult> {
|
|
88
84
|
if (this.stopped) {
|
|
@@ -91,15 +87,15 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
91
87
|
const sessionId = v4()
|
|
92
88
|
const recursiveFindSession = new RecursiveFindSession({
|
|
93
89
|
serviceId: sessionId,
|
|
94
|
-
|
|
90
|
+
transport: this.sessionTransport,
|
|
95
91
|
kademliaIdToFind: idToFind,
|
|
96
|
-
|
|
92
|
+
ownPeerId: peerIdFromPeerDescriptor(this.ownPeerDescriptor),
|
|
97
93
|
waitedRoutingPathCompletions: this.connections.size > 1 ? 2 : 1,
|
|
98
|
-
|
|
94
|
+
fetchData
|
|
99
95
|
})
|
|
100
96
|
if (this.connections.size === 0) {
|
|
101
97
|
const data = this.localDataStore.getEntry(PeerID.fromValue(idToFind))
|
|
102
|
-
recursiveFindSession.
|
|
98
|
+
recursiveFindSession.doSendFindResponse(
|
|
103
99
|
[this.ownPeerDescriptor],
|
|
104
100
|
[this.ownPeerDescriptor],
|
|
105
101
|
data ? Array.from(data.values()) : [],
|
|
@@ -107,7 +103,7 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
107
103
|
)
|
|
108
104
|
return recursiveFindSession.getResults()
|
|
109
105
|
}
|
|
110
|
-
const routeMessage = this.
|
|
106
|
+
const routeMessage = this.wrapFindRequest(idToFind, sessionId, fetchData)
|
|
111
107
|
this.ongoingSessions.set(sessionId, recursiveFindSession)
|
|
112
108
|
try {
|
|
113
109
|
await runAndWaitForEvents3<RecursiveFindSessionEvents>(
|
|
@@ -116,30 +112,30 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
116
112
|
15000
|
|
117
113
|
)
|
|
118
114
|
} catch (err) {
|
|
119
|
-
logger.debug(`doFindRecursively failed with error ${
|
|
115
|
+
logger.debug(`doFindRecursively failed with error ${err}`)
|
|
120
116
|
}
|
|
121
|
-
this.findAndReportLocalData(idToFind,
|
|
117
|
+
this.findAndReportLocalData(idToFind, fetchData, [], this.ownPeerDescriptor, sessionId)
|
|
122
118
|
this.ongoingSessions.delete(sessionId)
|
|
123
119
|
recursiveFindSession.stop()
|
|
124
120
|
return recursiveFindSession.getResults()
|
|
125
121
|
}
|
|
126
122
|
|
|
127
|
-
private
|
|
123
|
+
private wrapFindRequest(idToFind: Uint8Array, sessionId: string, fetchData: boolean): RouteMessageWrapper {
|
|
128
124
|
const targetDescriptor: PeerDescriptor = {
|
|
129
125
|
kademliaId: idToFind,
|
|
130
126
|
type: NodeType.VIRTUAL
|
|
131
127
|
}
|
|
132
|
-
const request:
|
|
133
|
-
|
|
134
|
-
|
|
128
|
+
const request: FindRequest = {
|
|
129
|
+
sessionId,
|
|
130
|
+
fetchData
|
|
135
131
|
}
|
|
136
132
|
const msg: Message = {
|
|
137
133
|
messageType: MessageType.RECURSIVE_FIND_REQUEST,
|
|
138
134
|
messageId: v4(),
|
|
139
135
|
serviceId: this.serviceId,
|
|
140
136
|
body: {
|
|
141
|
-
oneofKind: '
|
|
142
|
-
|
|
137
|
+
oneofKind: 'findRequest',
|
|
138
|
+
findRequest: request
|
|
143
139
|
}
|
|
144
140
|
}
|
|
145
141
|
const routeMessage: RouteMessageWrapper = {
|
|
@@ -155,29 +151,29 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
155
151
|
|
|
156
152
|
private findAndReportLocalData(
|
|
157
153
|
idToFind: Uint8Array,
|
|
158
|
-
|
|
154
|
+
fetchData: boolean,
|
|
159
155
|
routingPath: PeerDescriptor[],
|
|
160
156
|
sourcePeer: PeerDescriptor,
|
|
161
157
|
sessionId: string
|
|
162
158
|
): boolean {
|
|
163
|
-
if (
|
|
159
|
+
if (fetchData) {
|
|
164
160
|
const data = this.localDataStore.getEntry(PeerID.fromValue(idToFind))
|
|
165
161
|
if (data.size > 0) {
|
|
166
|
-
this.
|
|
162
|
+
this.sendFindResponse(routingPath, sourcePeer, sessionId, [], data, true)
|
|
167
163
|
return true
|
|
168
164
|
}
|
|
169
165
|
}
|
|
170
166
|
return false
|
|
171
167
|
}
|
|
172
168
|
|
|
173
|
-
private findLocalData(idToFind: Uint8Array,
|
|
174
|
-
if (
|
|
169
|
+
private findLocalData(idToFind: Uint8Array, fetchData: boolean): Map<PeerIDKey, DataEntry> | undefined {
|
|
170
|
+
if (fetchData) {
|
|
175
171
|
return this.localDataStore.getEntry(PeerID.fromValue(idToFind))
|
|
176
172
|
}
|
|
177
173
|
return undefined
|
|
178
174
|
}
|
|
179
175
|
|
|
180
|
-
private
|
|
176
|
+
private sendFindResponse(
|
|
181
177
|
routingPath: PeerDescriptor[],
|
|
182
178
|
targetPeerDescriptor: PeerDescriptor,
|
|
183
179
|
serviceId: string,
|
|
@@ -186,10 +182,10 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
186
182
|
noCloserNodesFound: boolean = false
|
|
187
183
|
): void {
|
|
188
184
|
const dataEntries = data ? Array.from(data.values(), DataEntry.create.bind(DataEntry)) : []
|
|
189
|
-
const
|
|
190
|
-
if (
|
|
185
|
+
const isOwnNode = areEqualPeerDescriptors(this.ownPeerDescriptor, targetPeerDescriptor)
|
|
186
|
+
if (isOwnNode && this.ongoingSessions.has(serviceId)) {
|
|
191
187
|
this.ongoingSessions.get(serviceId)!
|
|
192
|
-
.
|
|
188
|
+
.doSendFindResponse(routingPath, closestNodes, dataEntries, noCloserNodesFound)
|
|
193
189
|
} else {
|
|
194
190
|
const remoteCommunicator = new ListeningRpcCommunicator(serviceId, this.sessionTransport, { rpcRequestTimeout: 15000 })
|
|
195
191
|
const remoteSession = new RemoteRecursiveFindSession(
|
|
@@ -198,7 +194,7 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
198
194
|
serviceId,
|
|
199
195
|
toProtoRpcClient(new RecursiveFindSessionServiceClient(remoteCommunicator.getRpcClientTransport()))
|
|
200
196
|
)
|
|
201
|
-
remoteSession.
|
|
197
|
+
remoteSession.sendFindResponse(routingPath, closestNodes, dataEntries, noCloserNodesFound)
|
|
202
198
|
}
|
|
203
199
|
}
|
|
204
200
|
|
|
@@ -206,20 +202,20 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
206
202
|
if (this.stopped) {
|
|
207
203
|
return createRouteMessageAck(routedMessage, 'DhtNode Stopped')
|
|
208
204
|
}
|
|
209
|
-
const idToFind =
|
|
205
|
+
const idToFind = peerIdFromPeerDescriptor(routedMessage.destinationPeer!)
|
|
210
206
|
const msg = routedMessage.message
|
|
211
|
-
const
|
|
207
|
+
const findRequest = msg?.body.oneofKind === 'findRequest' ? msg.body.findRequest : undefined
|
|
212
208
|
const closestPeersToDestination = this.getClosestConnections(routedMessage.destinationPeer!.kademliaId, 5)
|
|
213
|
-
const data = this.findLocalData(idToFind.value,
|
|
214
|
-
if (this.
|
|
215
|
-
this.
|
|
209
|
+
const data = this.findLocalData(idToFind.value, findRequest!.fetchData)
|
|
210
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, routedMessage.destinationPeer!)) {
|
|
211
|
+
this.sendFindResponse(routedMessage.routingPath, routedMessage.sourcePeer!, findRequest!.sessionId,
|
|
216
212
|
closestPeersToDestination, data, true)
|
|
217
213
|
return createRouteMessageAck(routedMessage)
|
|
218
214
|
}
|
|
219
215
|
const ack = this.router.doRouteMessage(routedMessage, RoutingMode.RECURSIVE_FIND, excludedPeer)
|
|
220
216
|
if (ack.error === RoutingErrors.NO_CANDIDATES_FOUND) {
|
|
221
|
-
logger.trace(`findRecursively Node
|
|
222
|
-
this.
|
|
217
|
+
logger.trace(`findRecursively Node found no candidates`)
|
|
218
|
+
this.sendFindResponse(routedMessage.routingPath, routedMessage.sourcePeer!, findRequest!.sessionId,
|
|
223
219
|
closestPeersToDestination, data, true)
|
|
224
220
|
} else if (ack.error) {
|
|
225
221
|
return ack
|
|
@@ -229,7 +225,7 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
229
225
|
&& routedMessage.previousPeer
|
|
230
226
|
&& !this.isPeerCloserToIdThanSelf(closestPeersToDestination[0], idToFind)
|
|
231
227
|
)
|
|
232
|
-
this.
|
|
228
|
+
this.sendFindResponse(routedMessage.routingPath, routedMessage.sourcePeer!, findRequest!.sessionId,
|
|
233
229
|
closestPeersToDestination, data, noCloserContactsFound)
|
|
234
230
|
}
|
|
235
231
|
return ack
|
|
@@ -237,7 +233,7 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
237
233
|
|
|
238
234
|
private getClosestConnections(kademliaId: Uint8Array, limit: number): PeerDescriptor[] {
|
|
239
235
|
const connectedPeers = Array.from(this.connections.values())
|
|
240
|
-
const closestPeers = new SortedContactList<
|
|
236
|
+
const closestPeers = new SortedContactList<RemoteDhtNode>(
|
|
241
237
|
PeerID.fromValue(kademliaId),
|
|
242
238
|
limit,
|
|
243
239
|
undefined,
|
|
@@ -248,17 +244,17 @@ export class RecursiveFinder implements IRecursiveFinder {
|
|
|
248
244
|
return closestPeers.getClosestContacts(limit).map((peer) => peer.getPeerDescriptor())
|
|
249
245
|
}
|
|
250
246
|
|
|
251
|
-
//
|
|
247
|
+
// IRouterRpc method
|
|
252
248
|
async findRecursively(routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
|
|
253
249
|
if (this.stopped) {
|
|
254
250
|
return createRouteMessageAck(routedMessage, 'findRecursively() service is not running')
|
|
255
|
-
} else if (this.router.
|
|
251
|
+
} else if (this.router.isMostLikelyDuplicate(routedMessage.requestId)) {
|
|
256
252
|
return createRouteMessageAck(routedMessage, 'message given to findRecursively() service is likely a duplicate')
|
|
257
253
|
}
|
|
258
254
|
const senderKey = keyFromPeerDescriptor(routedMessage.previousPeer || routedMessage.sourcePeer!)
|
|
259
|
-
logger.trace(`
|
|
255
|
+
logger.trace(`Received findRecursively call from ${senderKey}`)
|
|
260
256
|
this.addContact(routedMessage.sourcePeer!, true)
|
|
261
|
-
this.router.addToDuplicateDetector(routedMessage.requestId
|
|
257
|
+
this.router.addToDuplicateDetector(routedMessage.requestId)
|
|
262
258
|
return this.doFindRecursevily(routedMessage)
|
|
263
259
|
}
|
|
264
260
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataEntry,
|
|
3
3
|
PeerDescriptor,
|
|
4
|
-
|
|
4
|
+
FindResponse
|
|
5
5
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
6
6
|
import { IRecursiveFindSessionServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
7
7
|
import { Logger } from '@streamr/utils'
|
|
@@ -11,16 +11,16 @@ const logger = new Logger(module)
|
|
|
11
11
|
|
|
12
12
|
export class RemoteRecursiveFindSession extends Remote<IRecursiveFindSessionServiceClient> {
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
sendFindResponse(routingPath: PeerDescriptor[], closestNodes: PeerDescriptor[],
|
|
15
15
|
dataEntries: DataEntry[], noCloserNodesFound: boolean): void {
|
|
16
|
-
const report:
|
|
16
|
+
const report: FindResponse = {
|
|
17
17
|
routingPath,
|
|
18
|
-
|
|
18
|
+
closestConnectedPeers: closestNodes,
|
|
19
19
|
dataEntries,
|
|
20
20
|
noCloserNodesFound
|
|
21
21
|
}
|
|
22
|
-
this.getClient().
|
|
23
|
-
logger.trace('Failed to send
|
|
22
|
+
this.getClient().sendFindResponse(report, this.formDhtRpcOptions()).catch((_e) => {
|
|
23
|
+
logger.trace('Failed to send FindResult')
|
|
24
24
|
})
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { DhtNode } from '../
|
|
2
|
-
import { ExternalStoreDataRequest, ExternalStoreDataResponse, FindDataRequest, FindDataResponse
|
|
1
|
+
import { DhtNode } from '../dht/DhtNode'
|
|
2
|
+
import { ExternalStoreDataRequest, ExternalStoreDataResponse, FindDataRequest, FindDataResponse } from '../proto/packages/dht/protos/DhtRpc'
|
|
3
|
+
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
4
|
+
import { DhtCallContext } from '../rpc-protocol/DhtCallContext'
|
|
3
5
|
|
|
4
6
|
export const registerExternalApiRpcMethods = (thisNode: DhtNode): void => {
|
|
5
7
|
const rpcCommunicator = thisNode.getRpcCommunicator()
|
|
@@ -7,7 +9,7 @@ export const registerExternalApiRpcMethods = (thisNode: DhtNode): void => {
|
|
|
7
9
|
FindDataRequest,
|
|
8
10
|
FindDataResponse,
|
|
9
11
|
'findData',
|
|
10
|
-
(req: FindDataRequest) => findData(thisNode, req),
|
|
12
|
+
(req: FindDataRequest, context: ServerCallContext) => findData(thisNode, req, context),
|
|
11
13
|
{ timeout: 10000 }
|
|
12
14
|
)
|
|
13
15
|
rpcCommunicator.registerRpcMethod(
|
|
@@ -20,8 +22,9 @@ export const registerExternalApiRpcMethods = (thisNode: DhtNode): void => {
|
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
// IDHTRpcService method for external findRecursive calls
|
|
23
|
-
const findData = async (thisNode: DhtNode, findDataRequest: FindDataRequest): Promise<FindDataResponse> => {
|
|
24
|
-
const
|
|
25
|
+
const findData = async (thisNode: DhtNode, findDataRequest: FindDataRequest, context: ServerCallContext): Promise<FindDataResponse> => {
|
|
26
|
+
const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
|
|
27
|
+
const result = await thisNode.startRecursiveFind(findDataRequest.kademliaId, true, senderPeerDescriptor)
|
|
25
28
|
if (result.dataEntries) {
|
|
26
29
|
return FindDataResponse.create({ dataEntries: result.dataEntries })
|
|
27
30
|
} else {
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
type QueueEntry = [timeStamp: number, value: string, senderId: string, message?: Message]
|
|
1
|
+
type QueueEntry = [timestamp: number, value: string]
|
|
4
2
|
|
|
5
3
|
export class DuplicateDetector {
|
|
6
4
|
|
|
@@ -17,13 +15,9 @@ export class DuplicateDetector {
|
|
|
17
15
|
this.maxAge = maxAgeInSeconds * 1000
|
|
18
16
|
}
|
|
19
17
|
|
|
20
|
-
public add(value: string
|
|
18
|
+
public add(value: string): void {
|
|
21
19
|
this.values.add(value)
|
|
22
|
-
|
|
23
|
-
this.queue.push([Date.now(), value, senderId, message])
|
|
24
|
-
} else {
|
|
25
|
-
this.queue.push([Date.now(), value, senderId])
|
|
26
|
-
}
|
|
20
|
+
this.queue.push([Date.now(), value])
|
|
27
21
|
this.cleanUp()
|
|
28
22
|
}
|
|
29
23
|
|
|
@@ -49,5 +43,4 @@ export class DuplicateDetector {
|
|
|
49
43
|
this.values.clear()
|
|
50
44
|
this.queue = []
|
|
51
45
|
}
|
|
52
|
-
|
|
53
46
|
}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import { Message, PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
|
|
2
|
-
import {
|
|
3
|
-
import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
2
|
+
import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
4
3
|
import { RoutingMode, RoutingSession, RoutingSessionEvents } from './RoutingSession'
|
|
5
4
|
import { Logger, executeSafePromise, raceEvents3, withTimeout } from '@streamr/utils'
|
|
6
5
|
import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
|
|
7
|
-
import {
|
|
6
|
+
import { PeerIDKey } from '../../helpers/PeerID'
|
|
8
7
|
import { DuplicateDetector } from './DuplicateDetector'
|
|
9
8
|
import { ConnectionManager } from '../../connection/ConnectionManager'
|
|
10
|
-
import {
|
|
9
|
+
import { RemoteDhtNode } from '../RemoteDhtNode'
|
|
11
10
|
import { v4 } from 'uuid'
|
|
12
|
-
import {
|
|
11
|
+
import { IRouterRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
13
12
|
|
|
14
13
|
export const createRouteMessageAck = (routedMessage: RouteMessageWrapper, error?: string): RouteMessageAck => {
|
|
15
14
|
const ack: RouteMessageAck = {
|
|
16
15
|
requestId: routedMessage.requestId,
|
|
17
|
-
destinationPeer: routedMessage.sourcePeer,
|
|
18
|
-
sourcePeer: routedMessage.destinationPeer,
|
|
19
16
|
error: error ? error : ''
|
|
20
17
|
}
|
|
21
18
|
return ack
|
|
@@ -29,8 +26,7 @@ export enum RoutingErrors {
|
|
|
29
26
|
export interface RouterConfig {
|
|
30
27
|
rpcCommunicator: RoutingRpcCommunicator
|
|
31
28
|
ownPeerDescriptor: PeerDescriptor
|
|
32
|
-
|
|
33
|
-
connections: Map<PeerIDKey, DhtPeer>
|
|
29
|
+
connections: Map<PeerIDKey, RemoteDhtNode>
|
|
34
30
|
addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
35
31
|
serviceId: string
|
|
36
32
|
connectionManager?: ConnectionManager
|
|
@@ -44,42 +40,40 @@ interface ForwardingTableEntry {
|
|
|
44
40
|
interface IRouterFunc {
|
|
45
41
|
doRouteMessage(routedMessage: RouteMessageWrapper, mode: RoutingMode, excludedPeer?: PeerDescriptor): RouteMessageAck
|
|
46
42
|
send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void>
|
|
47
|
-
|
|
48
|
-
addToDuplicateDetector(
|
|
43
|
+
isMostLikelyDuplicate(requestId: string): boolean
|
|
44
|
+
addToDuplicateDetector(requestId: string): void
|
|
49
45
|
addRoutingSession(session: RoutingSession): void
|
|
50
46
|
removeRoutingSession(sessionId: string): void
|
|
51
47
|
stop(): void
|
|
52
48
|
}
|
|
53
49
|
|
|
54
|
-
export interface IRouter extends Omit<
|
|
50
|
+
export interface IRouter extends Omit<IRouterRpc, 'findRecursively'>, IRouterFunc {}
|
|
55
51
|
|
|
56
52
|
const logger = new Logger(module)
|
|
57
53
|
|
|
58
54
|
export class Router implements IRouter {
|
|
59
55
|
private readonly rpcCommunicator: RoutingRpcCommunicator
|
|
60
56
|
private readonly ownPeerDescriptor: PeerDescriptor
|
|
61
|
-
private readonly
|
|
62
|
-
private readonly connections: Map<PeerIDKey, DhtPeer>
|
|
57
|
+
private readonly connections: Map<PeerIDKey, RemoteDhtNode>
|
|
63
58
|
private readonly addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
64
59
|
private readonly serviceId: string
|
|
65
60
|
private readonly connectionManager?: ConnectionManager
|
|
66
61
|
private readonly forwardingTable: Map<string, ForwardingTableEntry> = new Map()
|
|
67
62
|
private ongoingRoutingSessions: Map<string, RoutingSession> = new Map()
|
|
68
|
-
private readonly
|
|
63
|
+
private readonly duplicateRequestDetector: DuplicateDetector = new DuplicateDetector(100000, 100)
|
|
69
64
|
private stopped = false
|
|
70
65
|
|
|
71
66
|
constructor(config: RouterConfig) {
|
|
72
67
|
this.rpcCommunicator = config.rpcCommunicator
|
|
73
68
|
this.ownPeerDescriptor = config.ownPeerDescriptor
|
|
74
|
-
this.ownPeerId = config.ownPeerId
|
|
75
69
|
this.connections = config.connections
|
|
76
70
|
this.addContact = config.addContact
|
|
77
71
|
this.serviceId = config.serviceId
|
|
78
72
|
this.connectionManager = config.connectionManager
|
|
79
73
|
this.rpcCommunicator.registerRpcMethod(RouteMessageWrapper, RouteMessageAck, 'forwardMessage',
|
|
80
|
-
(forwardMessage: RouteMessageWrapper
|
|
74
|
+
(forwardMessage: RouteMessageWrapper) => this.forwardMessage(forwardMessage))
|
|
81
75
|
this.rpcCommunicator.registerRpcMethod(RouteMessageWrapper, RouteMessageAck, 'routeMessage',
|
|
82
|
-
(routedMessage: RouteMessageWrapper
|
|
76
|
+
(routedMessage: RouteMessageWrapper) => this.routeMessage(routedMessage))
|
|
83
77
|
}
|
|
84
78
|
|
|
85
79
|
public async send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void> {
|
|
@@ -114,8 +108,8 @@ export class Router implements IRouter {
|
|
|
114
108
|
if (this.stopped) {
|
|
115
109
|
return createRouteMessageAck(routedMessage, RoutingErrors.STOPPED)
|
|
116
110
|
}
|
|
117
|
-
logger.trace(`
|
|
118
|
-
|
|
111
|
+
logger.trace(`Routing message ${routedMessage.requestId} from ${keyFromPeerDescriptor(routedMessage.sourcePeer!)} `
|
|
112
|
+
+ `to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)}`)
|
|
119
113
|
routedMessage.routingPath.push(this.ownPeerDescriptor)
|
|
120
114
|
const session = this.createRoutingSession(routedMessage, mode, excludedPeer)
|
|
121
115
|
this.addRoutingSession(session)
|
|
@@ -141,7 +135,7 @@ export class Router implements IRouter {
|
|
|
141
135
|
})
|
|
142
136
|
session.start()
|
|
143
137
|
} catch (e) {
|
|
144
|
-
if (
|
|
138
|
+
if (areEqualPeerDescriptors(routedMessage.sourcePeer!, this.ownPeerDescriptor)) {
|
|
145
139
|
logger.warn(
|
|
146
140
|
`Failed to send (routeMessage: ${this.serviceId}) to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)}: ${e}`
|
|
147
141
|
)
|
|
@@ -162,19 +156,19 @@ export class Router implements IRouter {
|
|
|
162
156
|
this.ownPeerDescriptor,
|
|
163
157
|
routedMessage,
|
|
164
158
|
this.connections,
|
|
165
|
-
this.
|
|
159
|
+
areEqualPeerDescriptors(this.ownPeerDescriptor, routedMessage.sourcePeer!) ? 2 : 1,
|
|
166
160
|
mode,
|
|
167
161
|
undefined,
|
|
168
162
|
excludedPeers
|
|
169
163
|
)
|
|
170
164
|
}
|
|
171
165
|
|
|
172
|
-
public
|
|
173
|
-
return this.
|
|
166
|
+
public isMostLikelyDuplicate(requestId: string): boolean {
|
|
167
|
+
return this.duplicateRequestDetector.isMostLikelyDuplicate(requestId)
|
|
174
168
|
}
|
|
175
169
|
|
|
176
|
-
public addToDuplicateDetector(
|
|
177
|
-
this.
|
|
170
|
+
public addToDuplicateDetector(requestId: string): void {
|
|
171
|
+
this.duplicateRequestDetector.add(requestId)
|
|
178
172
|
}
|
|
179
173
|
|
|
180
174
|
public addRoutingSession(session: RoutingSession): void {
|
|
@@ -195,23 +189,23 @@ export class Router implements IRouter {
|
|
|
195
189
|
clearTimeout(entry.timeout)
|
|
196
190
|
})
|
|
197
191
|
this.forwardingTable.clear()
|
|
198
|
-
this.
|
|
192
|
+
this.duplicateRequestDetector.clear()
|
|
199
193
|
}
|
|
200
194
|
|
|
201
|
-
//
|
|
202
|
-
async routeMessage(routedMessage: RouteMessageWrapper
|
|
195
|
+
// IRouterRpc method
|
|
196
|
+
async routeMessage(routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
|
|
203
197
|
if (this.stopped) {
|
|
204
198
|
return createRouteMessageAck(routedMessage, 'routeMessage() service is not running')
|
|
205
|
-
} else if (this.
|
|
206
|
-
logger.trace(`
|
|
207
|
-
|
|
199
|
+
} else if (this.duplicateRequestDetector.isMostLikelyDuplicate(routedMessage.requestId)) {
|
|
200
|
+
logger.trace(`Routing message ${routedMessage.requestId} from ${keyFromPeerDescriptor(routedMessage.sourcePeer!)} `
|
|
201
|
+
+ `to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)} is likely a duplicate`)
|
|
208
202
|
return createRouteMessageAck(routedMessage, 'message given to routeMessage() service is likely a duplicate')
|
|
209
203
|
}
|
|
210
204
|
logger.trace(`Processing received routeMessage ${routedMessage.requestId}`)
|
|
211
205
|
this.addContact(routedMessage.sourcePeer!, true)
|
|
212
|
-
this.addToDuplicateDetector(routedMessage.requestId
|
|
213
|
-
if (this.
|
|
214
|
-
logger.trace(
|
|
206
|
+
this.addToDuplicateDetector(routedMessage.requestId)
|
|
207
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, routedMessage.destinationPeer!)) {
|
|
208
|
+
logger.trace(`routing message targeted to self ${routedMessage.requestId}`)
|
|
215
209
|
this.setForwardingEntries(routedMessage)
|
|
216
210
|
this.connectionManager?.handleMessage(routedMessage.message!)
|
|
217
211
|
return createRouteMessageAck(routedMessage)
|
|
@@ -222,7 +216,7 @@ export class Router implements IRouter {
|
|
|
222
216
|
|
|
223
217
|
private setForwardingEntries(routedMessage: RouteMessageWrapper): void {
|
|
224
218
|
const reachableThroughWithoutSelf = routedMessage.reachableThrough.filter((peer) => {
|
|
225
|
-
return !
|
|
219
|
+
return !areEqualPeerDescriptors(peer, this.ownPeerDescriptor)
|
|
226
220
|
})
|
|
227
221
|
|
|
228
222
|
if (reachableThroughWithoutSelf.length > 0) {
|
|
@@ -242,19 +236,19 @@ export class Router implements IRouter {
|
|
|
242
236
|
}
|
|
243
237
|
}
|
|
244
238
|
|
|
245
|
-
//
|
|
246
|
-
async forwardMessage(forwardMessage: RouteMessageWrapper
|
|
239
|
+
// IRouterRpc method
|
|
240
|
+
async forwardMessage(forwardMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
|
|
247
241
|
if (this.stopped) {
|
|
248
242
|
return createRouteMessageAck(forwardMessage, 'forwardMessage() service is not running')
|
|
249
|
-
} else if (this.
|
|
250
|
-
logger.trace(`
|
|
251
|
-
|
|
243
|
+
} else if (this.duplicateRequestDetector.isMostLikelyDuplicate(forwardMessage.requestId)) {
|
|
244
|
+
logger.trace(`Forwarding message ${forwardMessage.requestId} from ${keyFromPeerDescriptor(forwardMessage.sourcePeer!)} `
|
|
245
|
+
+ `to ${keyFromPeerDescriptor(forwardMessage.destinationPeer!)} is likely a duplicate`)
|
|
252
246
|
return createRouteMessageAck(forwardMessage, 'message given to forwardMessage() service is likely a duplicate')
|
|
253
247
|
}
|
|
254
248
|
logger.trace(`Processing received forward routeMessage ${forwardMessage.requestId}`)
|
|
255
249
|
this.addContact(forwardMessage.sourcePeer!, true)
|
|
256
|
-
this.addToDuplicateDetector(forwardMessage.requestId
|
|
257
|
-
if (this.
|
|
250
|
+
this.addToDuplicateDetector(forwardMessage.requestId)
|
|
251
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, forwardMessage.destinationPeer!)) {
|
|
258
252
|
return this.forwardToDestination(forwardMessage)
|
|
259
253
|
} else {
|
|
260
254
|
return this.doRouteMessage(forwardMessage, RoutingMode.FORWARD)
|
|
@@ -262,9 +256,9 @@ export class Router implements IRouter {
|
|
|
262
256
|
}
|
|
263
257
|
|
|
264
258
|
private forwardToDestination(routedMessage: RouteMessageWrapper): RouteMessageAck {
|
|
265
|
-
logger.trace(`
|
|
259
|
+
logger.trace(`Forwarding found message targeted to self ${routedMessage.requestId}`)
|
|
266
260
|
const forwardedMessage = routedMessage.message!
|
|
267
|
-
if (this.
|
|
261
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, forwardedMessage.targetDescriptor!)) {
|
|
268
262
|
this.connectionManager?.handleMessage(forwardedMessage)
|
|
269
263
|
return createRouteMessageAck(routedMessage)
|
|
270
264
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
|
|
2
2
|
import { v4 } from 'uuid'
|
|
3
3
|
import {
|
|
4
|
-
|
|
4
|
+
areEqualPeerDescriptors,
|
|
5
5
|
keyFromPeerDescriptor,
|
|
6
6
|
peerIdFromPeerDescriptor
|
|
7
7
|
} from '../../helpers/peerIdFromPeerDescriptor'
|
|
8
|
-
import {
|
|
8
|
+
import { IRouterRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
9
9
|
import { Remote } from '../contact/Remote'
|
|
10
10
|
import { Logger } from '@streamr/utils'
|
|
11
11
|
|
|
12
12
|
const logger = new Logger(module)
|
|
13
13
|
|
|
14
|
-
export class
|
|
14
|
+
export class RouterRpcRemote extends Remote<IRouterRpcClient> {
|
|
15
15
|
|
|
16
16
|
async routeMessage(params: RouteMessageWrapper): Promise<boolean> {
|
|
17
17
|
const message: RouteMessageWrapper = {
|
|
@@ -30,7 +30,7 @@ export class RemoteRouter extends Remote<IRoutingServiceClient> {
|
|
|
30
30
|
const ack = await this.getClient().routeMessage(message, options)
|
|
31
31
|
// Success signal if sent to destination and error includes duplicate
|
|
32
32
|
if (
|
|
33
|
-
|
|
33
|
+
areEqualPeerDescriptors(params.destinationPeer!, this.getPeerDescriptor())
|
|
34
34
|
&& ack.error.includes('duplicate')
|
|
35
35
|
) {
|
|
36
36
|
return true
|