@streamr/dht 0.0.1-tatum.6 → 0.0.1-tatum.7
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/ConnectionManager.d.ts +17 -40
- package/dist/src/connection/ConnectionManager.js +138 -204
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectivityChecker.js +14 -11
- package/dist/src/connection/ConnectivityChecker.js.map +1 -1
- package/dist/src/connection/ConnectorFacade.d.ts +49 -0
- package/dist/src/connection/ConnectorFacade.js +86 -0
- package/dist/src/connection/ConnectorFacade.js.map +1 -0
- package/dist/src/connection/ManagedConnection.d.ts +1 -4
- package/dist/src/connection/ManagedConnection.js +23 -31
- package/dist/src/connection/ManagedConnection.js.map +1 -1
- package/dist/src/connection/RemoteConnectionLocker.js +4 -3
- package/dist/src/connection/RemoteConnectionLocker.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 -2
- package/dist/src/connection/Simulator/SimulatorConnector.js +10 -11
- 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 +2 -0
- 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 +9 -9
- package/dist/src/connection/WebRTC/WebRtcConnector.js +22 -22
- package/dist/src/connection/WebRTC/WebRtcConnector.js.map +1 -1
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js +2 -1
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +1 -1
- package/dist/src/connection/WebSocket/WebSocketConnector.d.ts +19 -8
- package/dist/src/connection/WebSocket/WebSocketConnector.js +67 -46
- package/dist/src/connection/WebSocket/WebSocketConnector.js.map +1 -1
- 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 +15 -51
- package/dist/src/dht/DhtNode.js +107 -129
- package/dist/src/dht/DhtNode.js.map +1 -1
- 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 +11 -10
- package/dist/src/dht/discovery/PeerDiscovery.js +32 -37
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/find/RecursiveFindSession.d.ts +5 -6
- package/dist/src/dht/find/RecursiveFindSession.js +8 -8
- package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
- package/dist/src/dht/find/RecursiveFinder.d.ts +2 -4
- package/dist/src/dht/find/RecursiveFinder.js +11 -12
- package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
- package/dist/src/dht/registerExternalApiRpcMethods.d.ts +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/RemoteRouter.js +1 -1
- package/dist/src/dht/routing/RemoteRouter.js.map +1 -1
- package/dist/src/dht/routing/Router.d.ts +10 -13
- package/dist/src/dht/routing/Router.js +28 -29
- package/dist/src/dht/routing/Router.js.map +1 -1
- package/dist/src/dht/routing/RoutingSession.d.ts +3 -4
- package/dist/src/dht/routing/RoutingSession.js +4 -3
- package/dist/src/dht/routing/RoutingSession.js.map +1 -1
- package/dist/src/dht/store/DataStore.d.ts +2 -2
- package/dist/src/dht/store/DataStore.js +7 -7
- package/dist/src/dht/store/DataStore.js.map +1 -1
- package/dist/src/exports.d.ts +1 -7
- 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/proto/packages/dht/protos/DhtRpc.d.ts +0 -4
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +1 -2
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/package.json +10 -9
- package/protos/DhtRpc.proto +0 -1
- package/src/connection/ConnectionLockHandler.ts +1 -1
- package/src/connection/ConnectionManager.ts +157 -254
- package/src/connection/ConnectivityChecker.ts +14 -11
- package/src/connection/ConnectorFacade.ts +143 -0
- package/src/connection/ManagedConnection.ts +23 -34
- package/src/connection/RemoteConnectionLocker.ts +4 -3
- package/src/connection/Simulator/Simulator.ts +0 -7
- package/src/connection/Simulator/SimulatorConnection.ts +16 -13
- package/src/connection/Simulator/SimulatorConnector.ts +11 -12
- package/src/connection/Simulator/SimulatorTransport.ts +6 -1
- package/src/connection/WebRTC/NodeWebRtcConnection.ts +14 -13
- package/src/connection/WebRTC/WebRtcConnector.ts +31 -31
- package/src/connection/WebSocket/RemoteWebSocketConnector.ts +2 -1
- package/src/connection/WebSocket/WebSocketConnector.ts +85 -62
- package/src/connection/WebSocket/WebSocketServer.ts +26 -8
- package/src/dht/DhtNode.ts +155 -181
- 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 +45 -44
- package/src/dht/find/RecursiveFindSession.ts +12 -13
- package/src/dht/find/RecursiveFinder.ts +16 -19
- package/src/dht/registerExternalApiRpcMethods.ts +1 -1
- package/src/dht/routing/DuplicateDetector.ts +3 -10
- package/src/dht/routing/RemoteRouter.ts +2 -2
- package/src/dht/routing/Router.ts +35 -39
- package/src/dht/routing/RoutingSession.ts +9 -9
- package/src/dht/store/DataStore.ts +11 -11
- package/src/exports.ts +1 -7
- 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/proto/packages/dht/protos/DhtRpc.ts +1 -6
- 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/RemoteRouter.test.ts +5 -6
- package/test/integration/RemoteStore.test.ts +4 -5
- package/test/integration/RouteMessage.test.ts +7 -9
- 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/WebRtcConnectionManagement.test.ts +26 -19
- package/test/integration/WebRtcConnectorRpc.test.ts +6 -8
- package/test/integration/WebSocket.test.ts +4 -2
- package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
- package/test/integration/WebSocketConnectorRpc.test.ts +2 -3
- 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 +8 -12
- package/test/unit/Router.test.ts +18 -21
- package/test/unit/WebSocketConnector.test.ts +64 -0
- package/test/unit/WebSocketServer.test.ts +24 -12
- 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 +40 -49
- package/dist/src/dht/DhtPeer.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/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
- /package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +0 -0
|
@@ -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,7 +1,7 @@
|
|
|
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'
|
|
@@ -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
|
|
@@ -1,13 +1,12 @@
|
|
|
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
11
|
import { IRoutingService } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
13
12
|
|
|
@@ -29,8 +28,7 @@ export enum RoutingErrors {
|
|
|
29
28
|
export interface RouterConfig {
|
|
30
29
|
rpcCommunicator: RoutingRpcCommunicator
|
|
31
30
|
ownPeerDescriptor: PeerDescriptor
|
|
32
|
-
|
|
33
|
-
connections: Map<PeerIDKey, DhtPeer>
|
|
31
|
+
connections: Map<PeerIDKey, RemoteDhtNode>
|
|
34
32
|
addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
35
33
|
serviceId: string
|
|
36
34
|
connectionManager?: ConnectionManager
|
|
@@ -44,8 +42,8 @@ interface ForwardingTableEntry {
|
|
|
44
42
|
interface IRouterFunc {
|
|
45
43
|
doRouteMessage(routedMessage: RouteMessageWrapper, mode: RoutingMode, excludedPeer?: PeerDescriptor): RouteMessageAck
|
|
46
44
|
send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void>
|
|
47
|
-
|
|
48
|
-
addToDuplicateDetector(
|
|
45
|
+
isMostLikelyDuplicate(requestId: string): boolean
|
|
46
|
+
addToDuplicateDetector(requestId: string): void
|
|
49
47
|
addRoutingSession(session: RoutingSession): void
|
|
50
48
|
removeRoutingSession(sessionId: string): void
|
|
51
49
|
stop(): void
|
|
@@ -58,28 +56,26 @@ const logger = new Logger(module)
|
|
|
58
56
|
export class Router implements IRouter {
|
|
59
57
|
private readonly rpcCommunicator: RoutingRpcCommunicator
|
|
60
58
|
private readonly ownPeerDescriptor: PeerDescriptor
|
|
61
|
-
private readonly
|
|
62
|
-
private readonly connections: Map<PeerIDKey, DhtPeer>
|
|
59
|
+
private readonly connections: Map<PeerIDKey, RemoteDhtNode>
|
|
63
60
|
private readonly addContact: (contact: PeerDescriptor, setActive?: boolean) => void
|
|
64
61
|
private readonly serviceId: string
|
|
65
62
|
private readonly connectionManager?: ConnectionManager
|
|
66
63
|
private readonly forwardingTable: Map<string, ForwardingTableEntry> = new Map()
|
|
67
64
|
private ongoingRoutingSessions: Map<string, RoutingSession> = new Map()
|
|
68
|
-
private readonly
|
|
65
|
+
private readonly duplicateRequestDetector: DuplicateDetector = new DuplicateDetector(100000, 100)
|
|
69
66
|
private stopped = false
|
|
70
67
|
|
|
71
68
|
constructor(config: RouterConfig) {
|
|
72
69
|
this.rpcCommunicator = config.rpcCommunicator
|
|
73
70
|
this.ownPeerDescriptor = config.ownPeerDescriptor
|
|
74
|
-
this.ownPeerId = config.ownPeerId
|
|
75
71
|
this.connections = config.connections
|
|
76
72
|
this.addContact = config.addContact
|
|
77
73
|
this.serviceId = config.serviceId
|
|
78
74
|
this.connectionManager = config.connectionManager
|
|
79
75
|
this.rpcCommunicator.registerRpcMethod(RouteMessageWrapper, RouteMessageAck, 'forwardMessage',
|
|
80
|
-
(forwardMessage: RouteMessageWrapper
|
|
76
|
+
(forwardMessage: RouteMessageWrapper) => this.forwardMessage(forwardMessage))
|
|
81
77
|
this.rpcCommunicator.registerRpcMethod(RouteMessageWrapper, RouteMessageAck, 'routeMessage',
|
|
82
|
-
(routedMessage: RouteMessageWrapper
|
|
78
|
+
(routedMessage: RouteMessageWrapper) => this.routeMessage(routedMessage))
|
|
83
79
|
}
|
|
84
80
|
|
|
85
81
|
public async send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void> {
|
|
@@ -114,8 +110,8 @@ export class Router implements IRouter {
|
|
|
114
110
|
if (this.stopped) {
|
|
115
111
|
return createRouteMessageAck(routedMessage, RoutingErrors.STOPPED)
|
|
116
112
|
}
|
|
117
|
-
logger.trace(`
|
|
118
|
-
|
|
113
|
+
logger.trace(`Routing message ${routedMessage.requestId} from ${keyFromPeerDescriptor(routedMessage.sourcePeer!)} `
|
|
114
|
+
+ `to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)}`)
|
|
119
115
|
routedMessage.routingPath.push(this.ownPeerDescriptor)
|
|
120
116
|
const session = this.createRoutingSession(routedMessage, mode, excludedPeer)
|
|
121
117
|
this.addRoutingSession(session)
|
|
@@ -141,7 +137,7 @@ export class Router implements IRouter {
|
|
|
141
137
|
})
|
|
142
138
|
session.start()
|
|
143
139
|
} catch (e) {
|
|
144
|
-
if (
|
|
140
|
+
if (areEqualPeerDescriptors(routedMessage.sourcePeer!, this.ownPeerDescriptor)) {
|
|
145
141
|
logger.warn(
|
|
146
142
|
`Failed to send (routeMessage: ${this.serviceId}) to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)}: ${e}`
|
|
147
143
|
)
|
|
@@ -162,19 +158,19 @@ export class Router implements IRouter {
|
|
|
162
158
|
this.ownPeerDescriptor,
|
|
163
159
|
routedMessage,
|
|
164
160
|
this.connections,
|
|
165
|
-
this.
|
|
161
|
+
areEqualPeerDescriptors(this.ownPeerDescriptor, routedMessage.sourcePeer!) ? 2 : 1,
|
|
166
162
|
mode,
|
|
167
163
|
undefined,
|
|
168
164
|
excludedPeers
|
|
169
165
|
)
|
|
170
166
|
}
|
|
171
167
|
|
|
172
|
-
public
|
|
173
|
-
return this.
|
|
168
|
+
public isMostLikelyDuplicate(requestId: string): boolean {
|
|
169
|
+
return this.duplicateRequestDetector.isMostLikelyDuplicate(requestId)
|
|
174
170
|
}
|
|
175
171
|
|
|
176
|
-
public addToDuplicateDetector(
|
|
177
|
-
this.
|
|
172
|
+
public addToDuplicateDetector(requestId: string): void {
|
|
173
|
+
this.duplicateRequestDetector.add(requestId)
|
|
178
174
|
}
|
|
179
175
|
|
|
180
176
|
public addRoutingSession(session: RoutingSession): void {
|
|
@@ -195,23 +191,23 @@ export class Router implements IRouter {
|
|
|
195
191
|
clearTimeout(entry.timeout)
|
|
196
192
|
})
|
|
197
193
|
this.forwardingTable.clear()
|
|
198
|
-
this.
|
|
194
|
+
this.duplicateRequestDetector.clear()
|
|
199
195
|
}
|
|
200
196
|
|
|
201
197
|
// IRoutingService method
|
|
202
|
-
async routeMessage(routedMessage: RouteMessageWrapper
|
|
198
|
+
async routeMessage(routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
|
|
203
199
|
if (this.stopped) {
|
|
204
200
|
return createRouteMessageAck(routedMessage, 'routeMessage() service is not running')
|
|
205
|
-
} else if (this.
|
|
206
|
-
logger.trace(`
|
|
207
|
-
|
|
201
|
+
} else if (this.duplicateRequestDetector.isMostLikelyDuplicate(routedMessage.requestId)) {
|
|
202
|
+
logger.trace(`Routing message ${routedMessage.requestId} from ${keyFromPeerDescriptor(routedMessage.sourcePeer!)} `
|
|
203
|
+
+ `to ${keyFromPeerDescriptor(routedMessage.destinationPeer!)} is likely a duplicate`)
|
|
208
204
|
return createRouteMessageAck(routedMessage, 'message given to routeMessage() service is likely a duplicate')
|
|
209
205
|
}
|
|
210
206
|
logger.trace(`Processing received routeMessage ${routedMessage.requestId}`)
|
|
211
207
|
this.addContact(routedMessage.sourcePeer!, true)
|
|
212
|
-
this.addToDuplicateDetector(routedMessage.requestId
|
|
213
|
-
if (this.
|
|
214
|
-
logger.trace(
|
|
208
|
+
this.addToDuplicateDetector(routedMessage.requestId)
|
|
209
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, routedMessage.destinationPeer!)) {
|
|
210
|
+
logger.trace(`routing message targeted to self ${routedMessage.requestId}`)
|
|
215
211
|
this.setForwardingEntries(routedMessage)
|
|
216
212
|
this.connectionManager?.handleMessage(routedMessage.message!)
|
|
217
213
|
return createRouteMessageAck(routedMessage)
|
|
@@ -222,7 +218,7 @@ export class Router implements IRouter {
|
|
|
222
218
|
|
|
223
219
|
private setForwardingEntries(routedMessage: RouteMessageWrapper): void {
|
|
224
220
|
const reachableThroughWithoutSelf = routedMessage.reachableThrough.filter((peer) => {
|
|
225
|
-
return !
|
|
221
|
+
return !areEqualPeerDescriptors(peer, this.ownPeerDescriptor)
|
|
226
222
|
})
|
|
227
223
|
|
|
228
224
|
if (reachableThroughWithoutSelf.length > 0) {
|
|
@@ -243,18 +239,18 @@ export class Router implements IRouter {
|
|
|
243
239
|
}
|
|
244
240
|
|
|
245
241
|
// IRoutingService method
|
|
246
|
-
async forwardMessage(forwardMessage: RouteMessageWrapper
|
|
242
|
+
async forwardMessage(forwardMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
|
|
247
243
|
if (this.stopped) {
|
|
248
244
|
return createRouteMessageAck(forwardMessage, 'forwardMessage() service is not running')
|
|
249
|
-
} else if (this.
|
|
250
|
-
logger.trace(`
|
|
251
|
-
|
|
245
|
+
} else if (this.duplicateRequestDetector.isMostLikelyDuplicate(forwardMessage.requestId)) {
|
|
246
|
+
logger.trace(`Forwarding message ${forwardMessage.requestId} from ${keyFromPeerDescriptor(forwardMessage.sourcePeer!)} `
|
|
247
|
+
+ `to ${keyFromPeerDescriptor(forwardMessage.destinationPeer!)} is likely a duplicate`)
|
|
252
248
|
return createRouteMessageAck(forwardMessage, 'message given to forwardMessage() service is likely a duplicate')
|
|
253
249
|
}
|
|
254
250
|
logger.trace(`Processing received forward routeMessage ${forwardMessage.requestId}`)
|
|
255
251
|
this.addContact(forwardMessage.sourcePeer!, true)
|
|
256
|
-
this.addToDuplicateDetector(forwardMessage.requestId
|
|
257
|
-
if (this.
|
|
252
|
+
this.addToDuplicateDetector(forwardMessage.requestId)
|
|
253
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, forwardMessage.destinationPeer!)) {
|
|
258
254
|
return this.forwardToDestination(forwardMessage)
|
|
259
255
|
} else {
|
|
260
256
|
return this.doRouteMessage(forwardMessage, RoutingMode.FORWARD)
|
|
@@ -262,9 +258,9 @@ export class Router implements IRouter {
|
|
|
262
258
|
}
|
|
263
259
|
|
|
264
260
|
private forwardToDestination(routedMessage: RouteMessageWrapper): RouteMessageAck {
|
|
265
|
-
logger.trace(`
|
|
261
|
+
logger.trace(`Forwarding found message targeted to self ${routedMessage.requestId}`)
|
|
266
262
|
const forwardedMessage = routedMessage.message!
|
|
267
|
-
if (this.
|
|
263
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, forwardedMessage.targetDescriptor!)) {
|
|
268
264
|
this.connectionManager?.handleMessage(forwardedMessage)
|
|
269
265
|
return createRouteMessageAck(routedMessage)
|
|
270
266
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DhtPeer } from '../DhtPeer'
|
|
1
|
+
import { RemoteDhtNode } from '../RemoteDhtNode'
|
|
3
2
|
import { SortedContactList } from '../contact/SortedContactList'
|
|
4
3
|
import { PeerID, PeerIDKey } from '../../helpers/PeerID'
|
|
4
|
+
import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
5
5
|
import { Logger } from '@streamr/utils'
|
|
6
6
|
import EventEmitter from 'eventemitter3'
|
|
7
7
|
import { v4 } from 'uuid'
|
|
8
|
-
import { RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
|
|
8
|
+
import { PeerDescriptor, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
|
|
9
9
|
import { RemoteRouter } from './RemoteRouter'
|
|
10
10
|
import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
|
|
11
11
|
import { RoutingServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
@@ -20,7 +20,7 @@ class RemoteContact extends Contact {
|
|
|
20
20
|
|
|
21
21
|
private router: RemoteRouter
|
|
22
22
|
|
|
23
|
-
constructor(peer:
|
|
23
|
+
constructor(peer: RemoteDhtNode, ownPeerDescriptor: PeerDescriptor, rpcCommunicator: RoutingRpcCommunicator) {
|
|
24
24
|
super(peer.getPeerDescriptor())
|
|
25
25
|
this.router = new RemoteRouter(
|
|
26
26
|
ownPeerDescriptor,
|
|
@@ -58,7 +58,7 @@ export class RoutingSession extends EventEmitter<RoutingSessionEvents> {
|
|
|
58
58
|
private contactList: SortedContactList<RemoteContact>
|
|
59
59
|
private readonly ownPeerDescriptor: PeerDescriptor
|
|
60
60
|
private readonly messageToRoute: RouteMessageWrapper
|
|
61
|
-
private connections: Map<PeerIDKey,
|
|
61
|
+
private connections: Map<PeerIDKey, RemoteDhtNode>
|
|
62
62
|
private readonly parallelism: number
|
|
63
63
|
private failedHopCounter = 0
|
|
64
64
|
private successfulHopCounter = 0
|
|
@@ -69,7 +69,7 @@ export class RoutingSession extends EventEmitter<RoutingSessionEvents> {
|
|
|
69
69
|
rpcCommunicator: RoutingRpcCommunicator,
|
|
70
70
|
ownPeerDescriptor: PeerDescriptor,
|
|
71
71
|
messageToRoute: RouteMessageWrapper,
|
|
72
|
-
connections: Map<PeerIDKey,
|
|
72
|
+
connections: Map<PeerIDKey, RemoteDhtNode>,
|
|
73
73
|
parallelism: number,
|
|
74
74
|
mode: RoutingMode = RoutingMode.ROUTE,
|
|
75
75
|
destinationId?: Uint8Array,
|
|
@@ -122,7 +122,7 @@ export class RoutingSession extends EventEmitter<RoutingSessionEvents> {
|
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
private onRequestSucceeded = (
|
|
125
|
+
private onRequestSucceeded = () => {
|
|
126
126
|
logger.trace('onRequestSucceeded() sessionId: ' + this.sessionId)
|
|
127
127
|
if (this.stopped) {
|
|
128
128
|
return
|
|
@@ -187,14 +187,14 @@ export class RoutingSession extends EventEmitter<RoutingSessionEvents> {
|
|
|
187
187
|
while ((this.ongoingRequests.size) < this.parallelism && (uncontacted.length > 0) && !this.stopped) {
|
|
188
188
|
const nextPeer = uncontacted.shift()
|
|
189
189
|
// eslint-disable-next-line max-len
|
|
190
|
-
logger.trace(`Sending routeMessage request
|
|
190
|
+
logger.trace(`Sending routeMessage request to contact: ${keyFromPeerDescriptor(nextPeer!.getPeerDescriptor())} (sessionId=${this.sessionId})`)
|
|
191
191
|
this.contactList.setContacted(nextPeer!.getPeerId())
|
|
192
192
|
this.ongoingRequests.add(nextPeer!.getPeerId().toKey())
|
|
193
193
|
setImmediate(async () => {
|
|
194
194
|
try {
|
|
195
195
|
const succeeded = await this.sendRouteMessageRequest(nextPeer!)
|
|
196
196
|
if (succeeded) {
|
|
197
|
-
this.onRequestSucceeded(
|
|
197
|
+
this.onRequestSucceeded()
|
|
198
198
|
} else {
|
|
199
199
|
this.onRequestFailed(nextPeer!.getPeerId())
|
|
200
200
|
}
|
|
@@ -10,7 +10,7 @@ import { toProtoRpcClient } from '@streamr/proto-rpc'
|
|
|
10
10
|
import { StoreServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
11
11
|
import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
|
|
12
12
|
import { IRecursiveFinder } from '../find/RecursiveFinder'
|
|
13
|
-
import {
|
|
13
|
+
import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
14
14
|
import { Logger } from '@streamr/utils'
|
|
15
15
|
import { LocalDataStore } from './LocalDataStore'
|
|
16
16
|
import { IStoreService } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
@@ -20,7 +20,7 @@ import EventEmitter from 'eventemitter3'
|
|
|
20
20
|
import { Events } from '../DhtNode'
|
|
21
21
|
import { SortedContactList } from '../contact/SortedContactList'
|
|
22
22
|
import { Contact } from '../contact/Contact'
|
|
23
|
-
import {
|
|
23
|
+
import { RemoteDhtNode } from '../RemoteDhtNode'
|
|
24
24
|
|
|
25
25
|
interface DataStoreConfig {
|
|
26
26
|
rpcCommunicator: RoutingRpcCommunicator
|
|
@@ -32,7 +32,7 @@ interface DataStoreConfig {
|
|
|
32
32
|
highestTtl: number
|
|
33
33
|
numberOfCopies: number
|
|
34
34
|
dhtNodeEmitter: EventEmitter<Events>
|
|
35
|
-
getNodesClosestToIdFromBucket: (id: Uint8Array, n?: number) =>
|
|
35
|
+
getNodesClosestToIdFromBucket: (id: Uint8Array, n?: number) => RemoteDhtNode[]
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const logger = new Logger(module)
|
|
@@ -48,7 +48,7 @@ export class DataStore implements IStoreService {
|
|
|
48
48
|
private readonly highestTtl: number
|
|
49
49
|
private readonly numberOfCopies: number
|
|
50
50
|
private readonly dhtNodeEmitter: EventEmitter<Events>
|
|
51
|
-
private readonly getNodesClosestToIdFromBucket: (id: Uint8Array, n?: number) =>
|
|
51
|
+
private readonly getNodesClosestToIdFromBucket: (id: Uint8Array, n?: number) => RemoteDhtNode[]
|
|
52
52
|
|
|
53
53
|
constructor(config: DataStoreConfig) {
|
|
54
54
|
this.rpcCommunicator = config.rpcCommunicator
|
|
@@ -68,7 +68,7 @@ export class DataStore implements IStoreService {
|
|
|
68
68
|
this.rpcCommunicator.registerRpcMethod(DeleteDataRequest, DeleteDataResponse, 'deleteData',
|
|
69
69
|
(request: DeleteDataRequest, context: ServerCallContext) => this.deleteData(request, context))
|
|
70
70
|
|
|
71
|
-
this.dhtNodeEmitter.on('newContact', (peerDescriptor: PeerDescriptor
|
|
71
|
+
this.dhtNodeEmitter.on('newContact', (peerDescriptor: PeerDescriptor) => {
|
|
72
72
|
this.localDataStore.getStore().forEach((dataMap, _dataKey) => {
|
|
73
73
|
dataMap.forEach((dataEntry) => {
|
|
74
74
|
if (this.shouldMigrateDataToNewNode(dataEntry.dataEntry, peerDescriptor)) {
|
|
@@ -151,7 +151,7 @@ export class DataStore implements IStoreService {
|
|
|
151
151
|
const ttl = this.highestTtl // ToDo: make TTL decrease according to some nice curve
|
|
152
152
|
const storerTime = Timestamp.now()
|
|
153
153
|
for (let i = 0; i < closestNodes.length && successfulNodes.length < this.numberOfCopies; i++) {
|
|
154
|
-
if (
|
|
154
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, closestNodes[i])) {
|
|
155
155
|
this.localDataStore.storeEntry({
|
|
156
156
|
kademliaId: key,
|
|
157
157
|
storer: this.ownPeerDescriptor,
|
|
@@ -201,7 +201,7 @@ export class DataStore implements IStoreService {
|
|
|
201
201
|
const closestNodes = result.closestNodes
|
|
202
202
|
const successfulNodes: PeerDescriptor[] = []
|
|
203
203
|
for (let i = 0; i < closestNodes.length && successfulNodes.length < this.numberOfCopies; i++) {
|
|
204
|
-
if (
|
|
204
|
+
if (areEqualPeerDescriptors(this.ownPeerDescriptor, closestNodes[i])) {
|
|
205
205
|
this.localDataStore.markAsDeleted(key, peerIdFromPeerDescriptor(this.ownPeerDescriptor))
|
|
206
206
|
successfulNodes.push(closestNodes[i])
|
|
207
207
|
continue
|
|
@@ -217,7 +217,7 @@ export class DataStore implements IStoreService {
|
|
|
217
217
|
if (response.deleted) {
|
|
218
218
|
logger.trace('remoteStore.deleteData() returned success')
|
|
219
219
|
} else {
|
|
220
|
-
logger.trace('could not delete data from ' +
|
|
220
|
+
logger.trace('could not delete data from ' + keyFromPeerDescriptor(closestNodes[i]))
|
|
221
221
|
}
|
|
222
222
|
successfulNodes.push(closestNodes[i])
|
|
223
223
|
} catch (e) {
|
|
@@ -246,7 +246,7 @@ export class DataStore implements IStoreService {
|
|
|
246
246
|
this.localDataStore.setAllEntriesAsStale(PeerID.fromValue(kademliaId))
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
logger.trace(
|
|
249
|
+
logger.trace('storeData()')
|
|
250
250
|
return StoreDataResponse.create()
|
|
251
251
|
}
|
|
252
252
|
|
|
@@ -260,7 +260,7 @@ export class DataStore implements IStoreService {
|
|
|
260
260
|
|
|
261
261
|
// RPC service implementation
|
|
262
262
|
public async migrateData(request: MigrateDataRequest, context: ServerCallContext): Promise<MigrateDataResponse> {
|
|
263
|
-
logger.trace(
|
|
263
|
+
logger.trace('server-side migrateData()')
|
|
264
264
|
const dataEntry = request.dataEntry!
|
|
265
265
|
|
|
266
266
|
const wasStored = this.localDataStore.storeEntry(dataEntry)
|
|
@@ -271,7 +271,7 @@ export class DataStore implements IStoreService {
|
|
|
271
271
|
if (!this.selfIsOneOfClosestPeers(dataEntry.kademliaId)) {
|
|
272
272
|
this.localDataStore.setAllEntriesAsStale(PeerID.fromValue(dataEntry.kademliaId))
|
|
273
273
|
}
|
|
274
|
-
logger.trace(
|
|
274
|
+
logger.trace('server-side migrateData() at end')
|
|
275
275
|
return MigrateDataResponse.create()
|
|
276
276
|
}
|
|
277
277
|
|
package/src/exports.ts
CHANGED
|
@@ -6,14 +6,8 @@ export { getRandomRegion, getRegionDelayMatrix } from './connection/Simulator/pi
|
|
|
6
6
|
export { PeerDescriptor, Message, NodeType, DataEntry } from './proto/packages/dht/protos/DhtRpc'
|
|
7
7
|
export { ITransport } from './transport/ITransport'
|
|
8
8
|
export { ConnectionManager, ConnectionLocker, PortRange, TlsCertificate } from './connection/ConnectionManager'
|
|
9
|
-
export { PeerID, PeerIDKey } from './helpers/PeerID'
|
|
10
|
-
export { UUID } from './helpers/UUID'
|
|
11
9
|
export { DhtRpcOptions } from './rpc-protocol/DhtRpcOptions'
|
|
12
|
-
export { protoClasses } from './helpers/protoClasses'
|
|
13
|
-
export { SortedContactList } from './dht/contact/SortedContactList'
|
|
14
|
-
export { Contact } from './dht/contact/Contact'
|
|
15
10
|
export { Remote } from './dht/contact/Remote'
|
|
16
|
-
export {
|
|
17
|
-
export { peerIdFromPeerDescriptor, keyFromPeerDescriptor, isSamePeerDescriptor } from './helpers/peerIdFromPeerDescriptor'
|
|
11
|
+
export { areEqualPeerDescriptors } from './helpers/peerIdFromPeerDescriptor'
|
|
18
12
|
export { IceServer } from './connection/WebRTC/WebRtcConnector'
|
|
19
13
|
export { DhtCallContext } from './rpc-protocol/DhtCallContext'
|
package/src/helpers/PeerID.ts
CHANGED
|
@@ -49,13 +49,6 @@ export class PeerID {
|
|
|
49
49
|
return new PeerID({ stringValue })
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
static generateRandom(): PeerID {
|
|
53
|
-
// generate 160 bit random Uint8array
|
|
54
|
-
const value = new Uint8Array(20)
|
|
55
|
-
crypto.randomFillSync(value)
|
|
56
|
-
return new PeerID({ value })
|
|
57
|
-
}
|
|
58
|
-
|
|
59
52
|
// TODO convert to static method?
|
|
60
53
|
// eslint-disable-next-line class-methods-use-this
|
|
61
54
|
private ip2Int(ip: string): number {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const isBrowserEnvironment = (): boolean => false
|
|
@@ -9,6 +9,6 @@ export const keyFromPeerDescriptor = (peerDescriptor: PeerDescriptor): PeerIDKey
|
|
|
9
9
|
return PeerID.fromValue(peerDescriptor.kademliaId).toKey()
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const areEqualPeerDescriptors = (peerDescriptor1: PeerDescriptor, peerDescriptor2: PeerDescriptor): boolean => {
|
|
13
13
|
return peerIdFromPeerDescriptor(peerDescriptor1).equals(peerIdFromPeerDescriptor(peerDescriptor2))
|
|
14
14
|
}
|
|
@@ -253,10 +253,6 @@ export interface PeerDescriptor {
|
|
|
253
253
|
* @generated from protobuf field: optional uint32 region = 7;
|
|
254
254
|
*/
|
|
255
255
|
region?: number;
|
|
256
|
-
/**
|
|
257
|
-
* @generated from protobuf field: optional string nodeName = 8;
|
|
258
|
-
*/
|
|
259
|
-
nodeName?: string;
|
|
260
256
|
}
|
|
261
257
|
/**
|
|
262
258
|
* @generated from protobuf message dht.ConnectivityMethod
|
|
@@ -1019,8 +1015,7 @@ class PeerDescriptor$Type extends MessageType$<PeerDescriptor> {
|
|
|
1019
1015
|
{ no: 4, name: "tcp", kind: "message", T: () => ConnectivityMethod },
|
|
1020
1016
|
{ no: 5, name: "websocket", kind: "message", T: () => ConnectivityMethod },
|
|
1021
1017
|
{ no: 6, name: "openInternet", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
|
|
1022
|
-
{ no: 7, name: "region", kind: "scalar", opt: true, T: 13 /*ScalarType.UINT32*/ }
|
|
1023
|
-
{ no: 8, name: "nodeName", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ }
|
|
1018
|
+
{ no: 7, name: "region", kind: "scalar", opt: true, T: 13 /*ScalarType.UINT32*/ }
|
|
1024
1019
|
]);
|
|
1025
1020
|
}
|
|
1026
1021
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import { Simulator } from '../../src/connection/Simulator/Simulator'
|
|
3
3
|
import { DhtNode } from '../../src/dht/DhtNode'
|
|
4
|
-
import { PeerID } from '../../src/
|
|
4
|
+
import { PeerID } from '../../src/helpers/PeerID'
|
|
5
|
+
import { keyFromPeerDescriptor } from '../../src/helpers/peerIdFromPeerDescriptor'
|
|
5
6
|
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
6
7
|
import { createMockConnectionDhtNode } from '../utils/utils'
|
|
7
8
|
import { execSync } from 'child_process'
|
|
@@ -87,7 +88,8 @@ describe('Kademlia correctness', () => {
|
|
|
87
88
|
correctNeighbors++
|
|
88
89
|
}
|
|
89
90
|
} catch (e) {
|
|
90
|
-
console.error('Node ' + nodes[i].getPeerDescriptor()
|
|
91
|
+
console.error('Node ' + keyFromPeerDescriptor(nodes[i].getPeerDescriptor()) + ' had only '
|
|
92
|
+
+ kademliaNeighbors.length + ' kademlia neighbors')
|
|
91
93
|
}
|
|
92
94
|
if (correctNeighbors === 0) {
|
|
93
95
|
console.log('No correct neighbors found for node ' + i)
|
|
@@ -5,7 +5,8 @@ import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/Dh
|
|
|
5
5
|
import { createMockConnectionDhtNode } from '../utils/utils'
|
|
6
6
|
import { execSync } from 'child_process'
|
|
7
7
|
import fs from 'fs'
|
|
8
|
-
import { PeerID
|
|
8
|
+
import { PeerID } from '../../src/helpers/PeerID'
|
|
9
|
+
import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../src/helpers/peerIdFromPeerDescriptor'
|
|
9
10
|
import { Logger, wait } from '@streamr/utils'
|
|
10
11
|
import { debugVars } from '../../src/helpers/debugHelpers'
|
|
11
12
|
|
|
@@ -31,19 +32,18 @@ describe('Recursive find correctness', () => {
|
|
|
31
32
|
|
|
32
33
|
nodes = []
|
|
33
34
|
const entryPointId = '0'
|
|
34
|
-
entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, Uint8Array.from(dhtIds[0].data), undefined
|
|
35
|
+
entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, Uint8Array.from(dhtIds[0].data), undefined)
|
|
35
36
|
nodes.push(entryPoint)
|
|
36
37
|
nodeIndicesById[entryPoint.getNodeId().toKey()] = 0
|
|
37
38
|
entrypointDescriptor = {
|
|
38
39
|
kademliaId: entryPoint.getNodeId().value,
|
|
39
|
-
type: NodeType.NODEJS
|
|
40
|
-
nodeName: entryPointId
|
|
40
|
+
type: NodeType.NODEJS
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
for (let i = 1; i < NUM_NODES; i++) {
|
|
44
44
|
const nodeId = `${i}`
|
|
45
45
|
|
|
46
|
-
const node = await createMockConnectionDhtNode(nodeId, simulator, Uint8Array.from(dhtIds[i].data), undefined
|
|
46
|
+
const node = await createMockConnectionDhtNode(nodeId, simulator, Uint8Array.from(dhtIds[i].data), undefined)
|
|
47
47
|
nodeIndicesById[node.getNodeId().toKey()] = i
|
|
48
48
|
nodes.push(node)
|
|
49
49
|
}
|
|
@@ -70,7 +70,7 @@ describe('Recursive find correctness', () => {
|
|
|
70
70
|
debugVars['waiting'] = false
|
|
71
71
|
logger.info('waiting over')
|
|
72
72
|
|
|
73
|
-
nodes.forEach((node) => logger.info(node.getPeerDescriptor()
|
|
73
|
+
nodes.forEach((node) => logger.info(keyFromPeerDescriptor(node.getPeerDescriptor()) + ': connections:' +
|
|
74
74
|
node.getNumberOfConnections() + ', kbucket: ' + node.getBucketSize()
|
|
75
75
|
+ ', localLocked: ' + node.getNumberOfLocalLockedConnections()
|
|
76
76
|
+ ', remoteLocked: ' + node.getNumberOfRemoteLockedConnections()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
2
2
|
import { DhtNode } from '../../src/dht/DhtNode'
|
|
3
|
-
import {
|
|
3
|
+
import { areEqualPeerDescriptors } from '../../src/helpers/peerIdFromPeerDescriptor'
|
|
4
4
|
|
|
5
5
|
describe('Layer0-Layer1', () => {
|
|
6
6
|
const epPeerDescriptor: PeerDescriptor = {
|
|
@@ -35,11 +35,11 @@ describe('Layer0-Layer1', () => {
|
|
|
35
35
|
await node1.start()
|
|
36
36
|
await node2.start()
|
|
37
37
|
|
|
38
|
-
stream1Node1 = new DhtNode({
|
|
39
|
-
stream1Node2 = new DhtNode({
|
|
38
|
+
stream1Node1 = new DhtNode({ transport: epDhtNode, serviceId: STREAM_ID1 })
|
|
39
|
+
stream1Node2 = new DhtNode({ transport: node1, serviceId: STREAM_ID1 })
|
|
40
40
|
|
|
41
|
-
stream2Node1 = new DhtNode({
|
|
42
|
-
stream2Node2 = new DhtNode({
|
|
41
|
+
stream2Node1 = new DhtNode({ transport: epDhtNode, serviceId: STREAM_ID2 })
|
|
42
|
+
stream2Node2 = new DhtNode({ transport: node2, serviceId: STREAM_ID2 })
|
|
43
43
|
|
|
44
44
|
await Promise.all([
|
|
45
45
|
stream1Node1.start(),
|
|
@@ -81,9 +81,9 @@ describe('Layer0-Layer1', () => {
|
|
|
81
81
|
expect(stream2Node1.getClosestContacts()).toHaveLength(1)
|
|
82
82
|
expect(stream2Node2.getClosestContacts()).toHaveLength(1)
|
|
83
83
|
|
|
84
|
-
expect(
|
|
85
|
-
expect(
|
|
86
|
-
expect(
|
|
87
|
-
expect(
|
|
84
|
+
expect(areEqualPeerDescriptors(stream1Node1.getClosestContacts()[0], node1.getPeerDescriptor())).toBe(true)
|
|
85
|
+
expect(areEqualPeerDescriptors(stream1Node2.getClosestContacts()[0], epPeerDescriptor)).toBe(true)
|
|
86
|
+
expect(areEqualPeerDescriptors(stream2Node1.getClosestContacts()[0], node2.getPeerDescriptor())).toBe(true)
|
|
87
|
+
expect(areEqualPeerDescriptors(stream2Node2.getClosestContacts()[0], epPeerDescriptor)).toBe(true)
|
|
88
88
|
})
|
|
89
89
|
})
|
|
@@ -54,31 +54,31 @@ describe('Layer 1 on Layer 0 with mocked connections', () => {
|
|
|
54
54
|
|
|
55
55
|
layer1EntryPoint = new DhtNode({
|
|
56
56
|
peerId: binaryToHex(entrypointDescriptor.kademliaId),
|
|
57
|
-
|
|
57
|
+
transport: layer0EntryPoint,
|
|
58
58
|
serviceId: 'layer1'
|
|
59
59
|
})
|
|
60
60
|
|
|
61
61
|
layer1Node1 = new DhtNode({
|
|
62
62
|
peerId: layer0Node1Id,
|
|
63
|
-
|
|
63
|
+
transport: layer0Node1,
|
|
64
64
|
serviceId: 'layer1'
|
|
65
65
|
})
|
|
66
66
|
|
|
67
67
|
layer1Node2 = new DhtNode({
|
|
68
68
|
peerId: layer0Node2Id,
|
|
69
|
-
|
|
69
|
+
transport: layer0Node2,
|
|
70
70
|
serviceId: 'layer1'
|
|
71
71
|
})
|
|
72
72
|
|
|
73
73
|
layer1Node3 = new DhtNode({
|
|
74
74
|
peerId: layer0Node3Id,
|
|
75
|
-
|
|
75
|
+
transport: layer0Node3,
|
|
76
76
|
serviceId: 'layer1'
|
|
77
77
|
})
|
|
78
78
|
|
|
79
79
|
layer1Node4 = new DhtNode({
|
|
80
80
|
peerId: layer0Node4Id,
|
|
81
|
-
|
|
81
|
+
transport: layer0Node4,
|
|
82
82
|
serviceId: 'layer1'
|
|
83
83
|
})
|
|
84
84
|
|