@streamr/trackerless-network 0.0.1-tatum.5 → 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/package.json +10 -8
- package/dist/src/NetworkNode.js +1 -1
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +1 -3
- package/dist/src/NetworkStack.js +18 -47
- package/dist/src/NetworkStack.js.map +1 -1
- package/dist/src/identifiers.js +2 -2
- package/dist/src/identifiers.js.map +1 -1
- package/dist/src/logic/{StreamNodeServer.d.ts → DeliveryRpcLocal.d.ts} +6 -5
- package/dist/src/logic/{StreamNodeServer.js → DeliveryRpcLocal.js} +5 -5
- package/dist/src/logic/{StreamNodeServer.js.map → DeliveryRpcLocal.js.map} +1 -1
- package/dist/src/logic/{RemoteRandomGraphNode.d.ts → DeliveryRpcRemote.d.ts} +2 -2
- package/dist/src/logic/{RemoteRandomGraphNode.js → DeliveryRpcRemote.js} +5 -5
- package/dist/src/logic/DeliveryRpcRemote.js.map +1 -0
- package/dist/src/logic/EntryPointDiscovery.d.ts +35 -0
- package/dist/src/logic/EntryPointDiscovery.js +145 -0
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -0
- package/dist/src/logic/ILayer0.d.ts +3 -6
- package/dist/src/logic/ILayer1.d.ts +2 -2
- package/dist/src/logic/NodeList.d.ts +10 -10
- package/dist/src/logic/NodeList.js +2 -2
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/RandomGraphNode.d.ts +8 -12
- package/dist/src/logic/RandomGraphNode.js +47 -46
- package/dist/src/logic/RandomGraphNode.js.map +1 -1
- package/dist/src/logic/StreamrNode.d.ts +9 -11
- package/dist/src/logic/StreamrNode.js +72 -75
- package/dist/src/logic/StreamrNode.js.map +1 -1
- package/dist/src/logic/createRandomGraphNode.d.ts +6 -1
- package/dist/src/logic/createRandomGraphNode.js +17 -23
- package/dist/src/logic/createRandomGraphNode.js.map +1 -1
- package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +2 -0
- package/dist/src/logic/formStreamPartDeliveryServiceId.js +8 -0
- package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -0
- package/dist/src/logic/inspect/Inspector.d.ts +3 -2
- package/dist/src/logic/inspect/Inspector.js +5 -5
- package/dist/src/logic/inspect/Inspector.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/{HandshakerServer.d.ts → HandshakeRpcLocal.d.ts} +10 -10
- package/dist/src/logic/neighbor-discovery/{HandshakerServer.js → HandshakeRpcLocal.js} +13 -13
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/{RemoteHandshaker.d.ts → HandshakeRpcRemote.d.ts} +1 -1
- package/dist/src/logic/neighbor-discovery/{RemoteHandshaker.js → HandshakeRpcRemote.js} +8 -7
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +8 -7
- package/dist/src/logic/neighbor-discovery/Handshaker.js +23 -24
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +5 -5
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +3 -2
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +7 -7
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/{NeighborUpdateManagerServer.d.ts → NeighborUpdateRpcLocal.d.ts} +6 -6
- package/dist/src/logic/neighbor-discovery/{NeighborUpdateManagerServer.js → NeighborUpdateRpcLocal.js} +11 -11
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/{RemoteNeighborUpdateManager.d.ts → NeighborUpdateRpcRemote.d.ts} +1 -1
- package/dist/src/logic/neighbor-discovery/{RemoteNeighborUpdateManager.js → NeighborUpdateRpcRemote.js} +5 -5
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -0
- package/dist/src/logic/propagation/Propagation.js +2 -2
- package/dist/src/logic/propagation/Propagation.js.map +1 -1
- package/dist/src/logic/proxy/{ProxyStreamConnectionClient.d.ts → ProxyClient.d.ts} +8 -12
- package/dist/src/logic/proxy/{ProxyStreamConnectionClient.js → ProxyClient.js} +28 -29
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -0
- package/dist/src/logic/proxy/{ProxyStreamConnectionServer.d.ts → ProxyConnectionRpcLocal.d.ts} +5 -7
- package/dist/src/logic/proxy/{ProxyStreamConnectionServer.js → ProxyConnectionRpcLocal.js} +6 -12
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -0
- package/dist/src/logic/proxy/{RemoteProxyServer.d.ts → ProxyConnectionRpcRemote.d.ts} +1 -1
- package/dist/src/logic/proxy/{RemoteProxyServer.js → ProxyConnectionRpcRemote.js} +4 -4
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -0
- package/dist/src/logic/temporary-connection/{TemporaryConnectionRpcServer.d.ts → TemporaryConnectionRpcLocal.d.ts} +5 -4
- package/dist/src/logic/temporary-connection/{TemporaryConnectionRpcServer.js → TemporaryConnectionRpcLocal.js} +6 -6
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -0
- package/dist/src/logic/temporary-connection/{RemoteTemporaryConnectionRpcServer.d.ts → TemporaryConnectionRpcRemote.d.ts} +1 -1
- package/dist/src/logic/temporary-connection/{RemoteTemporaryConnectionRpcServer.js → TemporaryConnectionRpcRemote.js} +4 -4
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -0
- 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/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +4 -4
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +7 -7
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +10 -10
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +7 -7
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +2 -2
- package/dist/test/benchmark/first-message.js +10 -13
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.d.ts +5 -5
- package/dist/test/utils/utils.js +14 -14
- package/dist/test/utils/utils.js.map +1 -1
- package/package.json +10 -8
- package/protos/NetworkRpc.proto +5 -5
- package/src/NetworkNode.ts +1 -1
- package/src/NetworkStack.ts +20 -62
- package/src/identifiers.ts +3 -3
- package/src/logic/{StreamNodeServer.ts → DeliveryRpcLocal.ts} +8 -7
- package/src/logic/{RemoteRandomGraphNode.ts → DeliveryRpcRemote.ts} +3 -3
- package/src/logic/EntryPointDiscovery.ts +181 -0
- package/src/logic/ILayer0.ts +3 -6
- package/src/logic/ILayer1.ts +2 -5
- package/src/logic/NodeList.ts +12 -12
- package/src/logic/RandomGraphNode.ts +67 -69
- package/src/logic/StreamrNode.ts +78 -90
- package/src/logic/createRandomGraphNode.ts +28 -26
- package/src/logic/formStreamPartDeliveryServiceId.ts +5 -0
- package/src/logic/inspect/Inspector.ts +8 -7
- package/src/logic/neighbor-discovery/{HandshakerServer.ts → HandshakeRpcLocal.ts} +20 -20
- package/src/logic/neighbor-discovery/{RemoteHandshaker.ts → HandshakeRpcRemote.ts} +6 -5
- package/src/logic/neighbor-discovery/Handshaker.ts +38 -38
- package/src/logic/neighbor-discovery/NeighborFinder.ts +6 -6
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +15 -12
- package/src/logic/neighbor-discovery/{NeighborUpdateManagerServer.ts → NeighborUpdateRpcLocal.ts} +17 -17
- package/src/logic/neighbor-discovery/{RemoteNeighborUpdateManager.ts → NeighborUpdateRpcRemote.ts} +2 -2
- package/src/logic/propagation/Propagation.ts +2 -2
- package/src/logic/proxy/{ProxyStreamConnectionClient.ts → ProxyClient.ts} +33 -37
- package/src/logic/proxy/{ProxyStreamConnectionServer.ts → ProxyConnectionRpcLocal.ts} +10 -19
- package/src/logic/proxy/{RemoteProxyServer.ts → ProxyConnectionRpcRemote.ts} +1 -1
- package/src/logic/temporary-connection/{TemporaryConnectionRpcServer.ts → TemporaryConnectionRpcLocal.ts} +11 -10
- package/src/logic/temporary-connection/{RemoteTemporaryConnectionRpcServer.ts → TemporaryConnectionRpcRemote.ts} +1 -1
- package/src/proto/packages/dht/protos/DhtRpc.ts +1 -6
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +8 -8
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +2 -2
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +14 -14
- package/test/benchmark/first-message.ts +10 -13
- package/test/end-to-end/inspect.test.ts +12 -12
- package/test/end-to-end/proxy-and-full-node.test.ts +13 -14
- package/test/end-to-end/proxy-connections.test.ts +10 -12
- package/test/end-to-end/proxy-key-exchange.test.ts +12 -13
- package/test/end-to-end/random-graph-with-real-connections.test.ts +7 -7
- package/test/end-to-end/webrtc-full-node-network.test.ts +8 -8
- package/test/end-to-end/websocket-full-node-network.test.ts +8 -10
- package/test/integration/{RemoteRandomGraphNode.test.ts → DeliveryRpcRemote.test.ts} +17 -14
- package/test/integration/{RemoteHandshaker.test.ts → HandshakeRpcRemote.test.ts} +10 -9
- package/test/integration/Handshakes.test.ts +23 -20
- package/test/integration/Inspect.test.ts +3 -2
- package/test/integration/{RemoteNeighborUpdateManager.test.ts → NeighborUpdateRpcRemote.test.ts} +12 -10
- package/test/integration/NetworkNode.test.ts +9 -8
- package/test/integration/NetworkRpc.test.ts +5 -7
- package/test/integration/NetworkStack.test.ts +13 -15
- package/test/integration/Propagation.test.ts +2 -2
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +10 -8
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +17 -17
- package/test/integration/StreamrNode.test.ts +5 -3
- package/test/integration/joining-streams-on-offline-peers.test.ts +16 -18
- package/test/integration/stream-without-default-entrypoints.test.ts +11 -13
- package/test/unit/{StreamNodeServer.test.ts → DeliveryRpcLocal.test.ts} +8 -8
- package/test/unit/EntrypointDiscovery.test.ts +132 -0
- package/test/unit/{HandshakerServer.test.ts → HandshakeRpcLocal.test.ts} +26 -24
- package/test/unit/Handshaker.test.ts +10 -8
- package/test/unit/Inspector.test.ts +4 -3
- package/test/unit/NeighborFinder.test.ts +5 -5
- package/test/unit/NodeList.test.ts +22 -13
- package/test/unit/{RemoteProxyServer.test.ts → ProxyConnectionRpcRemote.test.ts} +4 -4
- package/test/unit/RandomGraphNode.test.ts +12 -11
- package/test/unit/StreamMessageTranslator.test.ts +10 -9
- package/test/unit/StreamrNode.test.ts +8 -8
- package/test/utils/mock/MockLayer0.ts +7 -26
- package/test/utils/mock/MockLayer1.ts +6 -13
- package/test/utils/mock/MockNeighborFinder.ts +1 -2
- package/test/utils/mock/MockNeighborUpdateManager.ts +1 -2
- package/test/utils/mock/Transport.ts +2 -2
- package/test/utils/utils.ts +13 -13
- package/dist/src/logic/RemoteRandomGraphNode.js.map +0 -1
- package/dist/src/logic/StreamPartEntryPointDiscovery.d.ts +0 -39
- package/dist/src/logic/StreamPartEntryPointDiscovery.js +0 -194
- package/dist/src/logic/StreamPartEntryPointDiscovery.js.map +0 -1
- package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +0 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +0 -1
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +0 -1
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +0 -1
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +0 -1
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +0 -1
- package/dist/src/logic/proxy/RemoteProxyServer.js.map +0 -1
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +0 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +0 -1
- package/src/logic/StreamPartEntryPointDiscovery.ts +0 -240
- package/test/unit/StreamPartEntrypointDiscovery.test.ts +0 -164
package/src/logic/StreamrNode.ts
CHANGED
|
@@ -20,9 +20,9 @@ import { ProxyDirection, StreamMessage } from '../proto/packages/trackerless-net
|
|
|
20
20
|
import { ILayer0 } from './ILayer0'
|
|
21
21
|
import { ILayer1 } from './ILayer1'
|
|
22
22
|
import { RandomGraphNode } from './RandomGraphNode'
|
|
23
|
-
import { NETWORK_SPLIT_AVOIDANCE_LIMIT,
|
|
23
|
+
import { NETWORK_SPLIT_AVOIDANCE_LIMIT, EntryPointDiscovery } from './EntryPointDiscovery'
|
|
24
24
|
import { createRandomGraphNode } from './createRandomGraphNode'
|
|
25
|
-
import {
|
|
25
|
+
import { ProxyClient } from './proxy/ProxyClient'
|
|
26
26
|
|
|
27
27
|
export type StreamPartDelivery = {
|
|
28
28
|
broadcast: (msg: StreamMessage) => void
|
|
@@ -31,9 +31,10 @@ export type StreamPartDelivery = {
|
|
|
31
31
|
proxied: false
|
|
32
32
|
layer1: ILayer1
|
|
33
33
|
node: RandomGraphNode
|
|
34
|
+
entryPointDiscovery: EntryPointDiscovery
|
|
34
35
|
} | {
|
|
35
36
|
proxied: true
|
|
36
|
-
client:
|
|
37
|
+
client: ProxyClient
|
|
37
38
|
})
|
|
38
39
|
|
|
39
40
|
export interface Events {
|
|
@@ -53,8 +54,6 @@ export interface StreamrNodeConfig {
|
|
|
53
54
|
metricsContext?: MetricsContext
|
|
54
55
|
streamPartitionNumOfNeighbors?: number
|
|
55
56
|
streamPartitionMinPropagationTargets?: number
|
|
56
|
-
nodeName?: string
|
|
57
|
-
firstConnectionTimeout?: number
|
|
58
57
|
acceptProxyConnections?: boolean
|
|
59
58
|
}
|
|
60
59
|
|
|
@@ -63,12 +62,11 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
63
62
|
private P2PTransport?: ITransport
|
|
64
63
|
private connectionLocker?: ConnectionLocker
|
|
65
64
|
private layer0?: ILayer0
|
|
66
|
-
private streamPartEntryPointDiscovery?: StreamPartEntryPointDiscovery
|
|
67
65
|
private readonly metricsContext: MetricsContext
|
|
68
66
|
private readonly metrics: Metrics
|
|
69
|
-
|
|
70
|
-
private readonly streamParts: Map<
|
|
71
|
-
private readonly knownStreamPartEntryPoints: Map<
|
|
67
|
+
private readonly config: StreamrNodeConfig
|
|
68
|
+
private readonly streamParts: Map<StreamPartID, StreamPartDelivery>
|
|
69
|
+
private readonly knownStreamPartEntryPoints: Map<StreamPartID, PeerDescriptor[]> = new Map()
|
|
72
70
|
private started = false
|
|
73
71
|
private destroyed = false
|
|
74
72
|
|
|
@@ -93,14 +91,6 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
93
91
|
this.layer0 = startedAndJoinedLayer0
|
|
94
92
|
this.P2PTransport = transport
|
|
95
93
|
this.connectionLocker = connectionLocker
|
|
96
|
-
this.streamPartEntryPointDiscovery = new StreamPartEntryPointDiscovery({
|
|
97
|
-
ownPeerDescriptor: this.getPeerDescriptor(),
|
|
98
|
-
streamParts: this.streamParts,
|
|
99
|
-
getEntryPointData: (key) => this.layer0!.getDataFromDht(key),
|
|
100
|
-
getEntryPointDataViaNode: (key, node) => this.layer0!.findDataViaPeer(key, node),
|
|
101
|
-
storeEntryPointData: (key, data) => this.layer0!.storeDataToDht(key, data),
|
|
102
|
-
deleteEntryPointData: (key) => this.layer0!.deleteDataFromDht(key)
|
|
103
|
-
})
|
|
104
94
|
cleanUp = () => this.destroy()
|
|
105
95
|
}
|
|
106
96
|
|
|
@@ -110,15 +100,13 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
110
100
|
}
|
|
111
101
|
logger.trace('Destroying StreamrNode...')
|
|
112
102
|
this.destroyed = true
|
|
113
|
-
this.streamParts.forEach((
|
|
114
|
-
await this.streamPartEntryPointDiscovery!.destroy()
|
|
103
|
+
this.streamParts.forEach((streamPart) => streamPart.stop())
|
|
115
104
|
this.streamParts.clear()
|
|
116
105
|
this.removeAllListeners()
|
|
117
106
|
await this.layer0!.stop()
|
|
118
107
|
await this.P2PTransport!.stop()
|
|
119
108
|
this.layer0 = undefined
|
|
120
109
|
this.P2PTransport = undefined
|
|
121
|
-
this.streamPartEntryPointDiscovery = undefined
|
|
122
110
|
this.connectionLocker = undefined
|
|
123
111
|
}
|
|
124
112
|
|
|
@@ -131,93 +119,100 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
131
119
|
}
|
|
132
120
|
|
|
133
121
|
leaveStreamPart(streamPartId: StreamPartID): void {
|
|
134
|
-
const
|
|
135
|
-
if (
|
|
136
|
-
|
|
122
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
123
|
+
if (streamPart) {
|
|
124
|
+
streamPart.stop()
|
|
137
125
|
this.streamParts.delete(streamPartId)
|
|
138
126
|
}
|
|
139
|
-
this.streamPartEntryPointDiscovery!.removeSelfAsEntryPoint(streamPartId)
|
|
140
127
|
}
|
|
141
128
|
|
|
142
129
|
joinStreamPart(streamPartId: StreamPartID): void {
|
|
143
130
|
logger.debug(`Join stream part ${streamPartId}`)
|
|
144
|
-
let
|
|
145
|
-
if (
|
|
131
|
+
let streamPart = this.streamParts.get(streamPartId)
|
|
132
|
+
if (streamPart !== undefined) {
|
|
146
133
|
return
|
|
147
134
|
}
|
|
148
135
|
const layer1 = this.createLayer1Node(streamPartId, this.knownStreamPartEntryPoints.get(streamPartId) ?? [])
|
|
149
136
|
const node = this.createRandomGraphNode(streamPartId, layer1)
|
|
150
|
-
|
|
137
|
+
const entryPointDiscovery = new EntryPointDiscovery({
|
|
138
|
+
streamPartId,
|
|
139
|
+
ownPeerDescriptor: this.getPeerDescriptor(),
|
|
140
|
+
layer1,
|
|
141
|
+
getEntryPointData: (key) => this.layer0!.getDataFromDht(key),
|
|
142
|
+
storeEntryPointData: (key, data) => this.layer0!.storeDataToDht(key, data),
|
|
143
|
+
deleteEntryPointData: async (key) => {
|
|
144
|
+
if (this.destroyed) {
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
return this.layer0!.deleteDataFromDht(key)
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
streamPart = {
|
|
151
151
|
proxied: false,
|
|
152
152
|
layer1,
|
|
153
153
|
node,
|
|
154
|
+
entryPointDiscovery,
|
|
154
155
|
broadcast: (msg: StreamMessage) => node.broadcast(msg),
|
|
155
156
|
stop: () => {
|
|
157
|
+
entryPointDiscovery.destroy()
|
|
156
158
|
node.stop()
|
|
157
159
|
layer1.stop()
|
|
158
160
|
}
|
|
159
161
|
}
|
|
160
|
-
this.streamParts.set(streamPartId,
|
|
162
|
+
this.streamParts.set(streamPartId, streamPart)
|
|
161
163
|
node.on('message', (message: StreamMessage) => {
|
|
162
164
|
this.emit('newMessage', message)
|
|
163
165
|
})
|
|
164
166
|
setImmediate(async () => {
|
|
165
167
|
try {
|
|
166
|
-
await this.startLayersAndJoinDht(streamPartId)
|
|
168
|
+
await this.startLayersAndJoinDht(streamPartId, entryPointDiscovery)
|
|
167
169
|
} catch (err) {
|
|
168
|
-
logger.warn(`Failed to join to stream ${streamPartId} with error: ${err}`)
|
|
170
|
+
logger.warn(`Failed to join to stream part ${streamPartId} with error: ${err}`)
|
|
169
171
|
}
|
|
170
172
|
})
|
|
171
173
|
}
|
|
172
174
|
|
|
173
|
-
private async startLayersAndJoinDht(streamPartId: StreamPartID): Promise<void> {
|
|
175
|
+
private async startLayersAndJoinDht(streamPartId: StreamPartID, entryPointDiscovery: EntryPointDiscovery): Promise<void> {
|
|
174
176
|
logger.debug(`Start layers and join DHT for stream part ${streamPartId}`)
|
|
175
|
-
const
|
|
176
|
-
if ((
|
|
177
|
-
//
|
|
177
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
178
|
+
if ((streamPart === undefined) || streamPart.proxied) {
|
|
179
|
+
// leaveStreamPart has been called (or leaveStreamPart called, and then setProxies called)
|
|
178
180
|
return
|
|
179
181
|
}
|
|
180
|
-
await
|
|
181
|
-
await
|
|
182
|
+
await streamPart.layer1.start()
|
|
183
|
+
await streamPart.node.start()
|
|
182
184
|
let entryPoints = this.knownStreamPartEntryPoints.get(streamPartId) ?? []
|
|
183
|
-
const
|
|
184
|
-
const discoveryResult = await this.streamPartEntryPointDiscovery!.discoverEntryPointsFromDht(
|
|
185
|
-
streamPartId,
|
|
186
|
-
entryPoints.length,
|
|
187
|
-
forwardingNode
|
|
188
|
-
)
|
|
189
|
-
entryPoints = entryPoints.concat(discoveryResult.discoveredEntryPoints)
|
|
190
|
-
await stream.layer1.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT))
|
|
191
|
-
await this.streamPartEntryPointDiscovery!.storeSelfAsEntryPointIfNecessary(
|
|
192
|
-
streamPartId,
|
|
193
|
-
discoveryResult.entryPointsFromDht,
|
|
185
|
+
const discoveryResult = await entryPointDiscovery.discoverEntryPointsFromDht(
|
|
194
186
|
entryPoints.length
|
|
195
187
|
)
|
|
188
|
+
entryPoints = entryPoints.concat(discoveryResult.discoveredEntryPoints)
|
|
189
|
+
await streamPart.layer1.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT))
|
|
190
|
+
if (discoveryResult.entryPointsFromDht) {
|
|
191
|
+
await entryPointDiscovery.storeSelfAsEntryPointIfNecessary(entryPoints.length)
|
|
192
|
+
}
|
|
196
193
|
}
|
|
197
194
|
|
|
198
195
|
private createLayer1Node = (streamPartId: StreamPartID, entryPoints: PeerDescriptor[]): ILayer1 => {
|
|
199
196
|
return new DhtNode({
|
|
200
|
-
|
|
197
|
+
transport: this.layer0!,
|
|
201
198
|
serviceId: 'layer1::' + streamPartId,
|
|
202
199
|
peerDescriptor: this.layer0!.getPeerDescriptor(),
|
|
203
200
|
entryPoints,
|
|
204
201
|
numberOfNodesPerKBucket: 4,
|
|
205
202
|
rpcRequestTimeout: 5000,
|
|
206
|
-
dhtJoinTimeout: 20000
|
|
207
|
-
nodeName: this.config.nodeName + ':layer1'
|
|
203
|
+
dhtJoinTimeout: 20000
|
|
208
204
|
})
|
|
209
205
|
}
|
|
210
206
|
|
|
211
207
|
private createRandomGraphNode = (streamPartId: StreamPartID, layer1: ILayer1) => {
|
|
212
208
|
return createRandomGraphNode({
|
|
213
|
-
|
|
209
|
+
streamPartId,
|
|
214
210
|
P2PTransport: this.P2PTransport!,
|
|
215
211
|
layer1,
|
|
216
212
|
connectionLocker: this.connectionLocker!,
|
|
217
213
|
ownPeerDescriptor: this.layer0!.getPeerDescriptor(),
|
|
218
214
|
minPropagationTargets: this.config.streamPartitionMinPropagationTargets,
|
|
219
215
|
numOfTargetNeighbors: this.config.streamPartitionNumOfNeighbors,
|
|
220
|
-
name: this.config.nodeName,
|
|
221
216
|
acceptProxyConnections: this.config.acceptProxyConnections
|
|
222
217
|
})
|
|
223
218
|
}
|
|
@@ -234,51 +229,44 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
234
229
|
}
|
|
235
230
|
const enable = (nodes.length > 0) && ((connectionCount === undefined) || (connectionCount > 0))
|
|
236
231
|
if (enable) {
|
|
237
|
-
let
|
|
232
|
+
let client: ProxyClient
|
|
238
233
|
const alreadyProxied = this.isProxiedStreamPart(streamPartId)
|
|
239
234
|
if (alreadyProxied) {
|
|
240
|
-
|
|
235
|
+
client = (this.streamParts.get(streamPartId)! as { client: ProxyClient }).client
|
|
241
236
|
} else {
|
|
242
|
-
|
|
243
|
-
|
|
237
|
+
client = this.createProxyClient(streamPartId)
|
|
238
|
+
this.streamParts.set(streamPartId, {
|
|
239
|
+
proxied: true,
|
|
240
|
+
client,
|
|
241
|
+
broadcast: (msg: StreamMessage) => client.broadcast(msg),
|
|
242
|
+
stop: () => client.stop()
|
|
243
|
+
})
|
|
244
|
+
client.on('message', (message: StreamMessage) => {
|
|
245
|
+
this.emit('newMessage', message)
|
|
246
|
+
})
|
|
247
|
+
await client.start()
|
|
244
248
|
}
|
|
245
|
-
await
|
|
249
|
+
await client.setProxies(nodes, direction, userId, connectionCount)
|
|
246
250
|
} else {
|
|
247
251
|
this.streamParts.get(streamPartId)?.stop()
|
|
248
252
|
this.streamParts.delete(streamPartId)
|
|
249
253
|
}
|
|
250
254
|
}
|
|
251
255
|
|
|
252
|
-
private
|
|
253
|
-
|
|
254
|
-
this.streamParts.set(streamPartId, {
|
|
255
|
-
proxied: true,
|
|
256
|
-
client,
|
|
257
|
-
broadcast: (msg: StreamMessage) => client.broadcast(msg),
|
|
258
|
-
stop: () => client.stop()
|
|
259
|
-
})
|
|
260
|
-
client.on('message', (message: StreamMessage) => {
|
|
261
|
-
this.emit('newMessage', message)
|
|
262
|
-
})
|
|
263
|
-
return client
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
private createProxyStreamConnectionClient(streamPartId: StreamPartID, userId: EthereumAddress): ProxyStreamConnectionClient {
|
|
267
|
-
return new ProxyStreamConnectionClient({
|
|
256
|
+
private createProxyClient(streamPartId: StreamPartID): ProxyClient {
|
|
257
|
+
return new ProxyClient({
|
|
268
258
|
P2PTransport: this.P2PTransport!,
|
|
269
259
|
ownPeerDescriptor: this.layer0!.getPeerDescriptor(),
|
|
270
260
|
streamPartId,
|
|
271
261
|
connectionLocker: this.connectionLocker!,
|
|
272
|
-
minPropagationTargets: this.config.streamPartitionMinPropagationTargets
|
|
273
|
-
nodeName: this.config.nodeName,
|
|
274
|
-
userId
|
|
262
|
+
minPropagationTargets: this.config.streamPartitionMinPropagationTargets
|
|
275
263
|
})
|
|
276
264
|
}
|
|
277
265
|
|
|
278
266
|
async inspect(peerDescriptor: PeerDescriptor, streamPartId: StreamPartID): Promise<boolean> {
|
|
279
|
-
const
|
|
280
|
-
if ((
|
|
281
|
-
return
|
|
267
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
268
|
+
if ((streamPart !== undefined) && !streamPart.proxied) {
|
|
269
|
+
return streamPart.node.inspect(peerDescriptor)
|
|
282
270
|
}
|
|
283
271
|
return false
|
|
284
272
|
}
|
|
@@ -287,18 +275,18 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
287
275
|
this.knownStreamPartEntryPoints.set(streamPartId, entryPoints)
|
|
288
276
|
}
|
|
289
277
|
|
|
290
|
-
isProxiedStreamPart(
|
|
291
|
-
const
|
|
292
|
-
return (
|
|
293
|
-
&&
|
|
294
|
-
&& ((direction === undefined) || (
|
|
278
|
+
isProxiedStreamPart(streamPartId: StreamPartID, direction?: ProxyDirection): boolean {
|
|
279
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
280
|
+
return (streamPart !== undefined)
|
|
281
|
+
&& streamPart.proxied
|
|
282
|
+
&& ((direction === undefined) || (streamPart.client.getDirection() === direction))
|
|
295
283
|
}
|
|
296
284
|
|
|
297
|
-
|
|
285
|
+
getStreamPartDelivery(streamPartId: StreamPartID): StreamPartDelivery | undefined {
|
|
298
286
|
return this.streamParts.get(streamPartId)
|
|
299
287
|
}
|
|
300
288
|
|
|
301
|
-
|
|
289
|
+
hasStreamPart(streamPartId: StreamPartID): boolean {
|
|
302
290
|
return this.streamParts.has(streamPartId)
|
|
303
291
|
}
|
|
304
292
|
|
|
@@ -307,13 +295,13 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
307
295
|
}
|
|
308
296
|
|
|
309
297
|
getNodeId(): NodeID {
|
|
310
|
-
return this.layer0!.
|
|
298
|
+
return getNodeIdFromPeerDescriptor(this.layer0!.getPeerDescriptor())
|
|
311
299
|
}
|
|
312
300
|
|
|
313
301
|
getNeighbors(streamPartId: StreamPartID): NodeID[] {
|
|
314
|
-
const
|
|
315
|
-
return (
|
|
316
|
-
?
|
|
302
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
303
|
+
return (streamPart !== undefined) && (streamPart.proxied === false)
|
|
304
|
+
? streamPart.node.getTargetNeighborIds()
|
|
317
305
|
: []
|
|
318
306
|
}
|
|
319
307
|
|
|
@@ -7,22 +7,29 @@ import { NodeList } from './NodeList'
|
|
|
7
7
|
import { Propagation } from './propagation/Propagation'
|
|
8
8
|
import { StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc'
|
|
9
9
|
import { MarkOptional } from 'ts-essentials'
|
|
10
|
-
import {
|
|
10
|
+
import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
|
|
11
11
|
import { Inspector } from './inspect/Inspector'
|
|
12
|
-
import {
|
|
13
|
-
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
12
|
+
import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
|
|
14
13
|
import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
|
|
14
|
+
import { formStreamPartDeliveryServiceId } from './formStreamPartDeliveryServiceId'
|
|
15
15
|
|
|
16
16
|
type RandomGraphNodeConfig = MarkOptional<StrictRandomGraphNodeConfig,
|
|
17
17
|
'nearbyNodeView' | 'randomNodeView' | 'targetNeighbors' | 'propagation'
|
|
18
|
-
| 'handshaker' | 'neighborFinder' | 'neighborUpdateManager' | '
|
|
19
|
-
| '
|
|
20
|
-
| '
|
|
18
|
+
| 'handshaker' | 'neighborFinder' | 'neighborUpdateManager' | 'numOfTargetNeighbors'
|
|
19
|
+
| 'rpcCommunicator' | 'nodeViewSize'
|
|
20
|
+
| 'inspector' | 'temporaryConnectionRpcLocal'> & {
|
|
21
|
+
maxNumberOfContacts?: number
|
|
22
|
+
minPropagationTargets?: number
|
|
23
|
+
acceptProxyConnections?: boolean
|
|
24
|
+
neighborUpdateInterval?: number
|
|
25
|
+
}
|
|
21
26
|
|
|
22
27
|
const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGraphNodeConfig => {
|
|
23
28
|
const ownNodeId = getNodeIdFromPeerDescriptor(config.ownPeerDescriptor)
|
|
24
|
-
const rpcCommunicator = config.rpcCommunicator ?? new ListeningRpcCommunicator(
|
|
25
|
-
|
|
29
|
+
const rpcCommunicator = config.rpcCommunicator ?? new ListeningRpcCommunicator(
|
|
30
|
+
formStreamPartDeliveryServiceId(config.streamPartId),
|
|
31
|
+
config.P2PTransport
|
|
32
|
+
)
|
|
26
33
|
const numOfTargetNeighbors = config.numOfTargetNeighbors ?? 4
|
|
27
34
|
const maxNumberOfContacts = config.maxNumberOfContacts ?? 20
|
|
28
35
|
const minPropagationTargets = config.minPropagationTargets ?? 2
|
|
@@ -32,21 +39,21 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
|
|
|
32
39
|
const randomNodeView = config.randomNodeView ?? new NodeList(ownNodeId, maxNumberOfContacts)
|
|
33
40
|
const targetNeighbors = config.targetNeighbors ?? new NodeList(ownNodeId, maxNumberOfContacts)
|
|
34
41
|
|
|
35
|
-
const
|
|
36
|
-
|
|
42
|
+
const temporaryConnectionRpcLocal = new TemporaryConnectionRpcLocal({
|
|
43
|
+
streamPartId: config.streamPartId,
|
|
37
44
|
rpcCommunicator,
|
|
38
45
|
ownPeerDescriptor: config.ownPeerDescriptor
|
|
39
46
|
})
|
|
40
|
-
const
|
|
47
|
+
const proxyConnectionRpcLocal = acceptProxyConnections ? new ProxyConnectionRpcLocal({
|
|
41
48
|
ownPeerDescriptor: config.ownPeerDescriptor,
|
|
42
|
-
streamPartId:
|
|
49
|
+
streamPartId: config.streamPartId,
|
|
43
50
|
rpcCommunicator
|
|
44
51
|
}) : undefined
|
|
45
52
|
const propagation = config.propagation ?? new Propagation({
|
|
46
53
|
minPropagationTargets,
|
|
47
54
|
sendToNeighbor: async (neighborId: NodeID, msg: StreamMessage): Promise<void> => {
|
|
48
|
-
const remote = targetNeighbors.
|
|
49
|
-
const proxyConnection =
|
|
55
|
+
const remote = targetNeighbors.get(neighborId) ?? temporaryConnectionRpcLocal.getNodes().get(neighborId)
|
|
56
|
+
const proxyConnection = proxyConnectionRpcLocal?.getConnection(neighborId)
|
|
50
57
|
if (remote) {
|
|
51
58
|
await remote.sendStreamMessage(msg)
|
|
52
59
|
} else if (proxyConnection) {
|
|
@@ -58,33 +65,33 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
|
|
|
58
65
|
})
|
|
59
66
|
const handshaker = config.handshaker ?? new Handshaker({
|
|
60
67
|
ownPeerDescriptor: config.ownPeerDescriptor,
|
|
61
|
-
|
|
68
|
+
streamPartId: config.streamPartId,
|
|
62
69
|
connectionLocker: config.connectionLocker,
|
|
63
70
|
rpcCommunicator,
|
|
64
71
|
nearbyNodeView,
|
|
65
72
|
randomNodeView,
|
|
66
73
|
targetNeighbors,
|
|
67
|
-
|
|
74
|
+
maxNeighborCount: numOfTargetNeighbors
|
|
68
75
|
})
|
|
69
76
|
const neighborFinder = config.neighborFinder ?? new NeighborFinder({
|
|
70
77
|
targetNeighbors,
|
|
71
78
|
nearbyNodeView,
|
|
72
79
|
doFindNeighbors: (excludedIds) => handshaker.attemptHandshakesOnContacts(excludedIds),
|
|
73
|
-
|
|
80
|
+
minCount: numOfTargetNeighbors
|
|
74
81
|
})
|
|
75
82
|
const neighborUpdateManager = config.neighborUpdateManager ?? new NeighborUpdateManager({
|
|
76
83
|
targetNeighbors,
|
|
77
84
|
nearbyNodeView,
|
|
78
85
|
ownPeerDescriptor: config.ownPeerDescriptor,
|
|
79
86
|
neighborFinder,
|
|
80
|
-
|
|
87
|
+
streamPartId: config.streamPartId,
|
|
81
88
|
rpcCommunicator,
|
|
82
89
|
neighborUpdateInterval
|
|
83
90
|
})
|
|
84
91
|
const inspector = config.inspector ?? new Inspector({
|
|
85
92
|
ownPeerDescriptor: config.ownPeerDescriptor,
|
|
86
93
|
rpcCommunicator,
|
|
87
|
-
|
|
94
|
+
streamPartId: config.streamPartId,
|
|
88
95
|
connectionLocker: config.connectionLocker
|
|
89
96
|
})
|
|
90
97
|
return {
|
|
@@ -98,15 +105,10 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
|
|
|
98
105
|
neighborUpdateManager,
|
|
99
106
|
propagation,
|
|
100
107
|
numOfTargetNeighbors,
|
|
101
|
-
minPropagationTargets,
|
|
102
|
-
maxNumberOfContacts,
|
|
103
|
-
name,
|
|
104
108
|
nodeViewSize: maxNumberOfContacts,
|
|
105
|
-
|
|
106
|
-
proxyConnectionServer,
|
|
107
|
-
neighborUpdateInterval,
|
|
109
|
+
proxyConnectionRpcLocal,
|
|
108
110
|
inspector,
|
|
109
|
-
|
|
111
|
+
temporaryConnectionRpcLocal
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
|
|
@@ -4,12 +4,13 @@ import { InspectSession, Events as InspectSessionEvents } from './InspectSession
|
|
|
4
4
|
import { TemporaryConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
|
|
5
5
|
import { ProtoRpcClient, RpcCommunicator, toProtoRpcClient } from '@streamr/proto-rpc'
|
|
6
6
|
import { Logger, waitForEvent3 } from '@streamr/utils'
|
|
7
|
-
import {
|
|
7
|
+
import { TemporaryConnectionRpcRemote } from '../temporary-connection/TemporaryConnectionRpcRemote'
|
|
8
8
|
import { NodeID, getNodeIdFromPeerDescriptor } from '../../identifiers'
|
|
9
|
+
import { StreamPartID } from '@streamr/protocol'
|
|
9
10
|
|
|
10
11
|
interface InspectorConfig {
|
|
11
12
|
ownPeerDescriptor: PeerDescriptor
|
|
12
|
-
|
|
13
|
+
streamPartId: StreamPartID
|
|
13
14
|
rpcCommunicator: RpcCommunicator
|
|
14
15
|
connectionLocker: ConnectionLocker
|
|
15
16
|
inspectionTimeout?: number
|
|
@@ -29,7 +30,7 @@ const DEFAULT_TIMEOUT = 60 * 1000
|
|
|
29
30
|
export class Inspector implements IInspector {
|
|
30
31
|
|
|
31
32
|
private readonly sessions: Map<NodeID, InspectSession> = new Map()
|
|
32
|
-
private readonly
|
|
33
|
+
private readonly streamPartId: StreamPartID
|
|
33
34
|
private readonly client: ProtoRpcClient<TemporaryConnectionRpcClient>
|
|
34
35
|
private readonly ownPeerDescriptor: PeerDescriptor
|
|
35
36
|
private readonly connectionLocker: ConnectionLocker
|
|
@@ -37,7 +38,7 @@ export class Inspector implements IInspector {
|
|
|
37
38
|
private readonly openInspectConnection: (peerDescriptor: PeerDescriptor, lockId: string) => Promise<void>
|
|
38
39
|
|
|
39
40
|
constructor(config: InspectorConfig) {
|
|
40
|
-
this.
|
|
41
|
+
this.streamPartId = config.streamPartId
|
|
41
42
|
this.ownPeerDescriptor = config.ownPeerDescriptor
|
|
42
43
|
this.client = toProtoRpcClient(new TemporaryConnectionRpcClient(config.rpcCommunicator.getRpcClientTransport()))
|
|
43
44
|
this.connectionLocker = config.connectionLocker
|
|
@@ -46,8 +47,8 @@ export class Inspector implements IInspector {
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
async defaultOpenInspectConnection(peerDescriptor: PeerDescriptor, lockId: string): Promise<void> {
|
|
49
|
-
const
|
|
50
|
-
await
|
|
50
|
+
const rpcRemote = new TemporaryConnectionRpcRemote(this.ownPeerDescriptor, peerDescriptor, this.streamPartId, this.client)
|
|
51
|
+
await rpcRemote.openConnection()
|
|
51
52
|
this.connectionLocker.lockConnection(peerDescriptor, lockId)
|
|
52
53
|
}
|
|
53
54
|
|
|
@@ -56,7 +57,7 @@ export class Inspector implements IInspector {
|
|
|
56
57
|
const session = new InspectSession({
|
|
57
58
|
inspectedNode: nodeId
|
|
58
59
|
})
|
|
59
|
-
const lockId = `inspector-${this.
|
|
60
|
+
const lockId = `inspector-${this.streamPartId}`
|
|
60
61
|
this.sessions.set(nodeId, session)
|
|
61
62
|
await this.openInspectConnection(peerDescriptor, lockId)
|
|
62
63
|
let success = false
|
|
@@ -4,28 +4,28 @@ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
|
4
4
|
import { NodeList } from '../NodeList'
|
|
5
5
|
import { ConnectionLocker, DhtCallContext, PeerDescriptor } from '@streamr/dht'
|
|
6
6
|
import { IHandshakeRpc } from '../../proto/packages/trackerless-network/protos/NetworkRpc.server'
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { HandshakeRpcRemote } from './HandshakeRpcRemote'
|
|
8
|
+
import { DeliveryRpcRemote } from '../DeliveryRpcRemote'
|
|
9
9
|
import { NodeID, getNodeIdFromPeerDescriptor } from '../../identifiers'
|
|
10
10
|
import { binaryToHex } from '@streamr/utils'
|
|
11
|
+
import { StreamPartID } from '@streamr/protocol'
|
|
11
12
|
|
|
12
|
-
interface
|
|
13
|
-
|
|
14
|
-
ownPeerDescriptor: PeerDescriptor
|
|
13
|
+
interface HandshakeRpcLocalConfig {
|
|
14
|
+
streamPartId: StreamPartID
|
|
15
15
|
targetNeighbors: NodeList
|
|
16
16
|
connectionLocker: ConnectionLocker
|
|
17
17
|
ongoingHandshakes: Set<NodeID>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
maxNeighborCount: number
|
|
19
|
+
createRpcRemote: (target: PeerDescriptor) => HandshakeRpcRemote
|
|
20
|
+
createDeliveryRpcRemote: (peerDescriptor: PeerDescriptor) => DeliveryRpcRemote
|
|
21
21
|
handshakeWithInterleaving: (target: PeerDescriptor, senderId: NodeID) => Promise<boolean>
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export class
|
|
24
|
+
export class HandshakeRpcLocal implements IHandshakeRpc {
|
|
25
25
|
|
|
26
|
-
private readonly config:
|
|
26
|
+
private readonly config: HandshakeRpcLocalConfig
|
|
27
27
|
|
|
28
|
-
constructor(config:
|
|
28
|
+
constructor(config: HandshakeRpcLocalConfig) {
|
|
29
29
|
this.config = config
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -40,7 +40,7 @@ export class HandshakerServer implements IHandshakeRpc {
|
|
|
40
40
|
|| this.config.ongoingHandshakes.has(getNodeIdFromPeerDescriptor(senderDescriptor))
|
|
41
41
|
) {
|
|
42
42
|
return this.acceptHandshake(request, senderDescriptor)
|
|
43
|
-
} else if (this.config.targetNeighbors.size() + this.config.ongoingHandshakes.size < this.config.
|
|
43
|
+
} else if (this.config.targetNeighbors.size() + this.config.ongoingHandshakes.size < this.config.maxNeighborCount) {
|
|
44
44
|
return this.acceptHandshake(request, senderDescriptor)
|
|
45
45
|
} else if (this.config.targetNeighbors.size(getInterleaveSourceIds()) >= 2) {
|
|
46
46
|
return this.acceptHandshakeWithInterleaving(request, senderDescriptor)
|
|
@@ -54,8 +54,8 @@ export class HandshakerServer implements IHandshakeRpc {
|
|
|
54
54
|
requestId: request.requestId,
|
|
55
55
|
accepted: true
|
|
56
56
|
}
|
|
57
|
-
this.config.targetNeighbors.add(this.config.
|
|
58
|
-
this.config.connectionLocker.lockConnection(requester, this.config.
|
|
57
|
+
this.config.targetNeighbors.add(this.config.createDeliveryRpcRemote(requester))
|
|
58
|
+
this.config.connectionLocker.lockConnection(requester, this.config.streamPartId)
|
|
59
59
|
return res
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -77,13 +77,13 @@ export class HandshakerServer implements IHandshakeRpc {
|
|
|
77
77
|
const furthest = this.config.targetNeighbors.getFurthest(exclude)
|
|
78
78
|
const furthestPeerDescriptor = furthest ? furthest.getPeerDescriptor() : undefined
|
|
79
79
|
if (furthest) {
|
|
80
|
-
const remote = this.config.
|
|
80
|
+
const remote = this.config.createRpcRemote(furthest.getPeerDescriptor())
|
|
81
81
|
remote.interleaveNotice(requester)
|
|
82
82
|
this.config.targetNeighbors.remove(furthest.getPeerDescriptor())
|
|
83
|
-
this.config.connectionLocker.unlockConnection(furthestPeerDescriptor!, this.config.
|
|
83
|
+
this.config.connectionLocker.unlockConnection(furthestPeerDescriptor!, this.config.streamPartId)
|
|
84
84
|
}
|
|
85
|
-
this.config.targetNeighbors.add(this.config.
|
|
86
|
-
this.config.connectionLocker.lockConnection(requester, this.config.
|
|
85
|
+
this.config.targetNeighbors.add(this.config.createDeliveryRpcRemote(requester))
|
|
86
|
+
this.config.connectionLocker.lockConnection(requester, this.config.streamPartId)
|
|
87
87
|
return {
|
|
88
88
|
requestId: request.requestId,
|
|
89
89
|
accepted: true,
|
|
@@ -92,11 +92,11 @@ export class HandshakerServer implements IHandshakeRpc {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
async interleaveNotice(message: InterleaveNotice, context: ServerCallContext): Promise<Empty> {
|
|
95
|
-
if (message.
|
|
95
|
+
if (message.streamPartId === this.config.streamPartId) {
|
|
96
96
|
const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
|
|
97
97
|
const senderId = getNodeIdFromPeerDescriptor(senderPeerDescriptor)
|
|
98
98
|
if (this.config.targetNeighbors.hasNodeById(senderId)) {
|
|
99
|
-
this.config.connectionLocker.unlockConnection(senderPeerDescriptor, this.config.
|
|
99
|
+
this.config.connectionLocker.unlockConnection(senderPeerDescriptor, this.config.streamPartId)
|
|
100
100
|
this.config.targetNeighbors.remove(senderPeerDescriptor)
|
|
101
101
|
}
|
|
102
102
|
this.config.handshakeWithInterleaving(message.interleaveTargetDescriptor!, senderId).catch((_e) => {})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { PeerDescriptor, Remote
|
|
1
|
+
import { PeerDescriptor, Remote } from '@streamr/dht'
|
|
2
2
|
import { Logger, hexToBinary } from '@streamr/utils'
|
|
3
|
+
import { v4 } from 'uuid'
|
|
3
4
|
import { NodeID, getNodeIdFromPeerDescriptor } from '../../identifiers'
|
|
4
5
|
import { InterleaveNotice, StreamPartHandshakeRequest } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
|
|
5
6
|
import { IHandshakeRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
|
|
@@ -11,7 +12,7 @@ interface HandshakeResponse {
|
|
|
11
12
|
interleaveTargetDescriptor?: PeerDescriptor
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export class
|
|
15
|
+
export class HandshakeRpcRemote extends Remote<IHandshakeRpcClient> {
|
|
15
16
|
|
|
16
17
|
async handshake(
|
|
17
18
|
neighborIds: NodeID[],
|
|
@@ -19,8 +20,8 @@ export class RemoteHandshaker extends Remote<IHandshakeRpcClient> {
|
|
|
19
20
|
interleaveSourceId?: NodeID
|
|
20
21
|
): Promise<HandshakeResponse> {
|
|
21
22
|
const request: StreamPartHandshakeRequest = {
|
|
22
|
-
|
|
23
|
-
requestId:
|
|
23
|
+
streamPartId: this.getServiceId(),
|
|
24
|
+
requestId: v4(),
|
|
24
25
|
neighborIds: neighborIds.map((id) => hexToBinary(id)),
|
|
25
26
|
concurrentHandshakeTargetId: (concurrentHandshakeTargetId !== undefined) ? hexToBinary(concurrentHandshakeTargetId) : undefined,
|
|
26
27
|
interleaveSourceId: (interleaveSourceId !== undefined) ? hexToBinary(interleaveSourceId) : undefined
|
|
@@ -41,7 +42,7 @@ export class RemoteHandshaker extends Remote<IHandshakeRpcClient> {
|
|
|
41
42
|
|
|
42
43
|
interleaveNotice(originatorDescriptor: PeerDescriptor): void {
|
|
43
44
|
const notification: InterleaveNotice = {
|
|
44
|
-
|
|
45
|
+
streamPartId: this.getServiceId(),
|
|
45
46
|
interleaveTargetDescriptor: originatorDescriptor
|
|
46
47
|
}
|
|
47
48
|
const options = this.formDhtRpcOptions({
|