@streamr/trackerless-network 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/package.json +10 -8
- package/dist/src/NetworkNode.js +2 -2
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +5 -6
- package/dist/src/NetworkStack.js +27 -56
- 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/{StreamPartEntryPointDiscovery.d.ts → EntryPointDiscovery.d.ts} +10 -12
- package/dist/src/logic/{StreamPartEntryPointDiscovery.js → EntryPointDiscovery.js} +18 -40
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -0
- package/dist/src/logic/Layer0Node.d.ts +14 -0
- package/dist/src/logic/{ILayer1.js → Layer0Node.js} +1 -1
- package/dist/src/logic/Layer0Node.js.map +1 -0
- package/dist/src/logic/{ILayer1.d.ts → Layer1Node.d.ts} +5 -5
- package/dist/src/logic/{ILayer0.js → Layer1Node.js} +1 -1
- package/dist/src/logic/Layer1Node.js.map +1 -0
- package/dist/src/logic/NodeList.d.ts +10 -10
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/RandomGraphNode.d.ts +11 -15
- package/dist/src/logic/RandomGraphNode.js +46 -45
- package/dist/src/logic/RandomGraphNode.js.map +1 -1
- package/dist/src/logic/StreamrNode.d.ts +15 -18
- package/dist/src/logic/StreamrNode.js +78 -87
- 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 +1 -1
- 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 +5 -5
- 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} +9 -9
- 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} +7 -10
- package/dist/src/logic/proxy/{ProxyStreamConnectionClient.js → ProxyClient.js} +24 -22
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -0
- package/dist/src/logic/proxy/{ProxyStreamConnectionServer.d.ts → ProxyConnectionRpcLocal.d.ts} +5 -5
- package/dist/src/logic/proxy/{ProxyStreamConnectionServer.js → ProxyConnectionRpcLocal.js} +6 -6
- 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.client.d.ts +10 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +7 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +54 -118
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +50 -49
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +6 -0
- 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 +16 -17
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.d.ts +7 -6
- package/dist/test/utils/utils.js +18 -17
- package/dist/test/utils/utils.js.map +1 -1
- package/package.json +10 -8
- package/protos/NetworkRpc.proto +5 -5
- package/src/NetworkNode.ts +2 -2
- package/src/NetworkStack.ts +31 -72
- 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/{StreamPartEntryPointDiscovery.ts → EntryPointDiscovery.ts} +24 -48
- package/src/logic/Layer0Node.ts +15 -0
- package/src/logic/{ILayer1.ts → Layer1Node.ts} +5 -5
- package/src/logic/NodeList.ts +12 -12
- package/src/logic/RandomGraphNode.ts +73 -74
- package/src/logic/StreamrNode.ts +90 -103
- 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 +2 -2
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +13 -10
- package/src/logic/neighbor-discovery/{NeighborUpdateManagerServer.ts → NeighborUpdateRpcLocal.ts} +15 -15
- 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} +29 -29
- package/src/logic/proxy/{ProxyStreamConnectionServer.ts → ProxyConnectionRpcLocal.ts} +10 -11
- 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.client.ts +13 -0
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +6 -0
- package/src/proto/packages/dht/protos/DhtRpc.ts +88 -166
- 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 +19 -20
- package/test/end-to-end/inspect.test.ts +12 -12
- package/test/end-to-end/proxy-and-full-node.test.ts +17 -18
- package/test/end-to-end/proxy-connections.test.ts +9 -11
- package/test/end-to-end/proxy-key-exchange.test.ts +12 -13
- package/test/end-to-end/random-graph-with-real-connections.test.ts +27 -22
- 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 +4 -3
- 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 +14 -13
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +23 -20
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +30 -29
- package/test/integration/StreamrNode.test.ts +16 -13
- package/test/integration/joining-streams-on-offline-peers.test.ts +16 -18
- package/test/integration/stream-without-default-entrypoints.test.ts +12 -14
- package/test/unit/{StreamNodeServer.test.ts → DeliveryRpcLocal.test.ts} +8 -8
- package/test/unit/{StreamPartEntrypointDiscovery.test.ts → EntrypointDiscovery.test.ts} +27 -44
- 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 +15 -13
- package/test/unit/StreamMessageTranslator.test.ts +10 -9
- package/test/unit/StreamrNode.test.ts +10 -10
- package/test/utils/mock/{MockLayer0.ts → MockLayer0Node.ts} +23 -26
- package/test/utils/mock/{MockLayer1.ts → MockLayer1Node.ts} +5 -10
- 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 +18 -16
- package/dist/src/logic/ILayer0.d.ts +0 -13
- package/dist/src/logic/ILayer0.js.map +0 -1
- package/dist/src/logic/ILayer1.js.map +0 -1
- package/dist/src/logic/RemoteRandomGraphNode.js.map +0 -1
- 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/ILayer0.ts +0 -14
package/src/logic/StreamrNode.ts
CHANGED
|
@@ -17,24 +17,24 @@ import { EventEmitter } from 'eventemitter3'
|
|
|
17
17
|
import { sampleSize } from 'lodash'
|
|
18
18
|
import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
|
|
19
19
|
import { ProxyDirection, StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc'
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
20
|
+
import { Layer0Node } from './Layer0Node'
|
|
21
|
+
import { Layer1Node } from './Layer1Node'
|
|
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
|
|
29
29
|
stop: () => void
|
|
30
30
|
} & ({
|
|
31
31
|
proxied: false
|
|
32
|
-
|
|
32
|
+
layer1Node: Layer1Node
|
|
33
33
|
node: RandomGraphNode
|
|
34
|
-
entryPointDiscovery:
|
|
34
|
+
entryPointDiscovery: EntryPointDiscovery
|
|
35
35
|
} | {
|
|
36
36
|
proxied: true
|
|
37
|
-
client:
|
|
37
|
+
client: ProxyClient
|
|
38
38
|
})
|
|
39
39
|
|
|
40
40
|
export interface Events {
|
|
@@ -54,21 +54,19 @@ export interface StreamrNodeConfig {
|
|
|
54
54
|
metricsContext?: MetricsContext
|
|
55
55
|
streamPartitionNumOfNeighbors?: number
|
|
56
56
|
streamPartitionMinPropagationTargets?: number
|
|
57
|
-
nodeName?: string
|
|
58
|
-
firstConnectionTimeout?: number
|
|
59
57
|
acceptProxyConnections?: boolean
|
|
60
58
|
}
|
|
61
59
|
|
|
62
60
|
// TODO rename class?
|
|
63
61
|
export class StreamrNode extends EventEmitter<Events> {
|
|
64
|
-
private
|
|
62
|
+
private transport?: ITransport
|
|
65
63
|
private connectionLocker?: ConnectionLocker
|
|
66
|
-
private
|
|
64
|
+
private layer0Node?: Layer0Node
|
|
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
|
|
|
@@ -84,14 +82,14 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
84
82
|
this.metricsContext.addMetrics('node', this.metrics)
|
|
85
83
|
}
|
|
86
84
|
|
|
87
|
-
async start(
|
|
85
|
+
async start(startedAndJoinedLayer0Node: Layer0Node, transport: ITransport, connectionLocker: ConnectionLocker): Promise<void> {
|
|
88
86
|
if (this.started || this.destroyed) {
|
|
89
87
|
return
|
|
90
88
|
}
|
|
91
|
-
logger.info(`Starting new StreamrNode with id ${getNodeIdFromPeerDescriptor(
|
|
89
|
+
logger.info(`Starting new StreamrNode with id ${getNodeIdFromPeerDescriptor(startedAndJoinedLayer0Node.getPeerDescriptor())}`)
|
|
92
90
|
this.started = true
|
|
93
|
-
this.
|
|
94
|
-
this.
|
|
91
|
+
this.layer0Node = startedAndJoinedLayer0Node
|
|
92
|
+
this.transport = transport
|
|
95
93
|
this.connectionLocker = connectionLocker
|
|
96
94
|
cleanUp = () => this.destroy()
|
|
97
95
|
}
|
|
@@ -102,13 +100,14 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
102
100
|
}
|
|
103
101
|
logger.trace('Destroying StreamrNode...')
|
|
104
102
|
this.destroyed = true
|
|
105
|
-
this.streamParts.forEach((
|
|
103
|
+
this.streamParts.forEach((streamPart) => streamPart.stop())
|
|
106
104
|
this.streamParts.clear()
|
|
107
105
|
this.removeAllListeners()
|
|
108
|
-
|
|
109
|
-
await this.
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
106
|
+
// TODO stopping should be in NetworkStack#stop?
|
|
107
|
+
await this.layer0Node!.stop()
|
|
108
|
+
await this.transport!.stop()
|
|
109
|
+
this.layer0Node = undefined
|
|
110
|
+
this.transport = undefined
|
|
112
111
|
this.connectionLocker = undefined
|
|
113
112
|
}
|
|
114
113
|
|
|
@@ -121,48 +120,47 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
121
120
|
}
|
|
122
121
|
|
|
123
122
|
leaveStreamPart(streamPartId: StreamPartID): void {
|
|
124
|
-
const
|
|
125
|
-
if (
|
|
126
|
-
|
|
123
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
124
|
+
if (streamPart) {
|
|
125
|
+
streamPart.stop()
|
|
127
126
|
this.streamParts.delete(streamPartId)
|
|
128
127
|
}
|
|
129
128
|
}
|
|
130
129
|
|
|
131
130
|
joinStreamPart(streamPartId: StreamPartID): void {
|
|
132
131
|
logger.debug(`Join stream part ${streamPartId}`)
|
|
133
|
-
let
|
|
134
|
-
if (
|
|
132
|
+
let streamPart = this.streamParts.get(streamPartId)
|
|
133
|
+
if (streamPart !== undefined) {
|
|
135
134
|
return
|
|
136
135
|
}
|
|
137
|
-
const
|
|
138
|
-
const node = this.createRandomGraphNode(streamPartId,
|
|
139
|
-
const entryPointDiscovery = new
|
|
136
|
+
const layer1Node = this.createLayer1Node(streamPartId, this.knownStreamPartEntryPoints.get(streamPartId) ?? [])
|
|
137
|
+
const node = this.createRandomGraphNode(streamPartId, layer1Node)
|
|
138
|
+
const entryPointDiscovery = new EntryPointDiscovery({
|
|
140
139
|
streamPartId,
|
|
141
140
|
ownPeerDescriptor: this.getPeerDescriptor(),
|
|
142
|
-
|
|
143
|
-
getEntryPointData: (key) => this.
|
|
144
|
-
|
|
145
|
-
storeEntryPointData: (key, data) => this.layer0!.storeDataToDht(key, data),
|
|
141
|
+
layer1Node,
|
|
142
|
+
getEntryPointData: (key) => this.layer0Node!.getDataFromDht(key),
|
|
143
|
+
storeEntryPointData: (key, data) => this.layer0Node!.storeDataToDht(key, data),
|
|
146
144
|
deleteEntryPointData: async (key) => {
|
|
147
145
|
if (this.destroyed) {
|
|
148
146
|
return
|
|
149
147
|
}
|
|
150
|
-
return this.
|
|
148
|
+
return this.layer0Node!.deleteDataFromDht(key)
|
|
151
149
|
}
|
|
152
150
|
})
|
|
153
|
-
|
|
151
|
+
streamPart = {
|
|
154
152
|
proxied: false,
|
|
155
|
-
|
|
153
|
+
layer1Node,
|
|
156
154
|
node,
|
|
157
155
|
entryPointDiscovery,
|
|
158
156
|
broadcast: (msg: StreamMessage) => node.broadcast(msg),
|
|
159
157
|
stop: () => {
|
|
160
158
|
entryPointDiscovery.destroy()
|
|
161
159
|
node.stop()
|
|
162
|
-
|
|
160
|
+
layer1Node.stop()
|
|
163
161
|
}
|
|
164
162
|
}
|
|
165
|
-
this.streamParts.set(streamPartId,
|
|
163
|
+
this.streamParts.set(streamPartId, streamPart)
|
|
166
164
|
node.on('message', (message: StreamMessage) => {
|
|
167
165
|
this.emit('newMessage', message)
|
|
168
166
|
})
|
|
@@ -170,56 +168,52 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
170
168
|
try {
|
|
171
169
|
await this.startLayersAndJoinDht(streamPartId, entryPointDiscovery)
|
|
172
170
|
} catch (err) {
|
|
173
|
-
logger.warn(`Failed to join to stream ${streamPartId} with error: ${err}`)
|
|
171
|
+
logger.warn(`Failed to join to stream part ${streamPartId} with error: ${err}`)
|
|
174
172
|
}
|
|
175
173
|
})
|
|
176
174
|
}
|
|
177
175
|
|
|
178
|
-
private async startLayersAndJoinDht(streamPartId: StreamPartID, entryPointDiscovery:
|
|
176
|
+
private async startLayersAndJoinDht(streamPartId: StreamPartID, entryPointDiscovery: EntryPointDiscovery): Promise<void> {
|
|
179
177
|
logger.debug(`Start layers and join DHT for stream part ${streamPartId}`)
|
|
180
|
-
const
|
|
181
|
-
if ((
|
|
182
|
-
//
|
|
178
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
179
|
+
if ((streamPart === undefined) || streamPart.proxied) {
|
|
180
|
+
// leaveStreamPart has been called (or leaveStreamPart called, and then setProxies called)
|
|
183
181
|
return
|
|
184
182
|
}
|
|
185
|
-
await
|
|
186
|
-
await
|
|
183
|
+
await streamPart.layer1Node.start()
|
|
184
|
+
await streamPart.node.start()
|
|
187
185
|
let entryPoints = this.knownStreamPartEntryPoints.get(streamPartId) ?? []
|
|
188
|
-
const forwardingNode = this.layer0!.isJoinOngoing() ? this.layer0!.getKnownEntryPoints()[0] : undefined
|
|
189
186
|
const discoveryResult = await entryPointDiscovery.discoverEntryPointsFromDht(
|
|
190
|
-
entryPoints.length
|
|
191
|
-
forwardingNode
|
|
187
|
+
entryPoints.length
|
|
192
188
|
)
|
|
193
189
|
entryPoints = entryPoints.concat(discoveryResult.discoveredEntryPoints)
|
|
194
|
-
await
|
|
190
|
+
await streamPart.layer1Node.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT))
|
|
195
191
|
if (discoveryResult.entryPointsFromDht) {
|
|
196
192
|
await entryPointDiscovery.storeSelfAsEntryPointIfNecessary(entryPoints.length)
|
|
197
193
|
}
|
|
198
194
|
}
|
|
199
195
|
|
|
200
|
-
private createLayer1Node = (streamPartId: StreamPartID, entryPoints: PeerDescriptor[]):
|
|
196
|
+
private createLayer1Node = (streamPartId: StreamPartID, entryPoints: PeerDescriptor[]): Layer1Node => {
|
|
201
197
|
return new DhtNode({
|
|
202
|
-
|
|
198
|
+
transport: this.layer0Node!,
|
|
203
199
|
serviceId: 'layer1::' + streamPartId,
|
|
204
|
-
peerDescriptor: this.
|
|
200
|
+
peerDescriptor: this.layer0Node!.getPeerDescriptor(),
|
|
205
201
|
entryPoints,
|
|
206
202
|
numberOfNodesPerKBucket: 4,
|
|
207
203
|
rpcRequestTimeout: 5000,
|
|
208
|
-
dhtJoinTimeout: 20000
|
|
209
|
-
nodeName: this.config.nodeName + ':layer1'
|
|
204
|
+
dhtJoinTimeout: 20000
|
|
210
205
|
})
|
|
211
206
|
}
|
|
212
207
|
|
|
213
|
-
private createRandomGraphNode = (streamPartId: StreamPartID,
|
|
208
|
+
private createRandomGraphNode = (streamPartId: StreamPartID, layer1Node: Layer1Node) => {
|
|
214
209
|
return createRandomGraphNode({
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
210
|
+
streamPartId,
|
|
211
|
+
transport: this.transport!,
|
|
212
|
+
layer1Node,
|
|
218
213
|
connectionLocker: this.connectionLocker!,
|
|
219
|
-
ownPeerDescriptor: this.
|
|
214
|
+
ownPeerDescriptor: this.layer0Node!.getPeerDescriptor(),
|
|
220
215
|
minPropagationTargets: this.config.streamPartitionMinPropagationTargets,
|
|
221
216
|
numOfTargetNeighbors: this.config.streamPartitionNumOfNeighbors,
|
|
222
|
-
name: this.config.nodeName,
|
|
223
217
|
acceptProxyConnections: this.config.acceptProxyConnections
|
|
224
218
|
})
|
|
225
219
|
}
|
|
@@ -236,51 +230,44 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
236
230
|
}
|
|
237
231
|
const enable = (nodes.length > 0) && ((connectionCount === undefined) || (connectionCount > 0))
|
|
238
232
|
if (enable) {
|
|
239
|
-
let
|
|
233
|
+
let client: ProxyClient
|
|
240
234
|
const alreadyProxied = this.isProxiedStreamPart(streamPartId)
|
|
241
235
|
if (alreadyProxied) {
|
|
242
|
-
|
|
236
|
+
client = (this.streamParts.get(streamPartId)! as { client: ProxyClient }).client
|
|
243
237
|
} else {
|
|
244
|
-
|
|
245
|
-
|
|
238
|
+
client = this.createProxyClient(streamPartId)
|
|
239
|
+
this.streamParts.set(streamPartId, {
|
|
240
|
+
proxied: true,
|
|
241
|
+
client,
|
|
242
|
+
broadcast: (msg: StreamMessage) => client.broadcast(msg),
|
|
243
|
+
stop: () => client.stop()
|
|
244
|
+
})
|
|
245
|
+
client.on('message', (message: StreamMessage) => {
|
|
246
|
+
this.emit('newMessage', message)
|
|
247
|
+
})
|
|
248
|
+
await client.start()
|
|
246
249
|
}
|
|
247
|
-
await
|
|
250
|
+
await client.setProxies(nodes, direction, userId, connectionCount)
|
|
248
251
|
} else {
|
|
249
252
|
this.streamParts.get(streamPartId)?.stop()
|
|
250
253
|
this.streamParts.delete(streamPartId)
|
|
251
254
|
}
|
|
252
255
|
}
|
|
253
256
|
|
|
254
|
-
private
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
client,
|
|
259
|
-
broadcast: (msg: StreamMessage) => client.broadcast(msg),
|
|
260
|
-
stop: () => client.stop()
|
|
261
|
-
})
|
|
262
|
-
client.on('message', (message: StreamMessage) => {
|
|
263
|
-
this.emit('newMessage', message)
|
|
264
|
-
})
|
|
265
|
-
return client
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
private createProxyStreamConnectionClient(streamPartId: StreamPartID, userId: EthereumAddress): ProxyStreamConnectionClient {
|
|
269
|
-
return new ProxyStreamConnectionClient({
|
|
270
|
-
P2PTransport: this.P2PTransport!,
|
|
271
|
-
ownPeerDescriptor: this.layer0!.getPeerDescriptor(),
|
|
257
|
+
private createProxyClient(streamPartId: StreamPartID): ProxyClient {
|
|
258
|
+
return new ProxyClient({
|
|
259
|
+
transport: this.transport!,
|
|
260
|
+
ownPeerDescriptor: this.layer0Node!.getPeerDescriptor(),
|
|
272
261
|
streamPartId,
|
|
273
262
|
connectionLocker: this.connectionLocker!,
|
|
274
|
-
minPropagationTargets: this.config.streamPartitionMinPropagationTargets
|
|
275
|
-
nodeName: this.config.nodeName,
|
|
276
|
-
userId
|
|
263
|
+
minPropagationTargets: this.config.streamPartitionMinPropagationTargets
|
|
277
264
|
})
|
|
278
265
|
}
|
|
279
266
|
|
|
280
267
|
async inspect(peerDescriptor: PeerDescriptor, streamPartId: StreamPartID): Promise<boolean> {
|
|
281
|
-
const
|
|
282
|
-
if ((
|
|
283
|
-
return
|
|
268
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
269
|
+
if ((streamPart !== undefined) && !streamPart.proxied) {
|
|
270
|
+
return streamPart.node.inspect(peerDescriptor)
|
|
284
271
|
}
|
|
285
272
|
return false
|
|
286
273
|
}
|
|
@@ -289,33 +276,33 @@ export class StreamrNode extends EventEmitter<Events> {
|
|
|
289
276
|
this.knownStreamPartEntryPoints.set(streamPartId, entryPoints)
|
|
290
277
|
}
|
|
291
278
|
|
|
292
|
-
isProxiedStreamPart(
|
|
293
|
-
const
|
|
294
|
-
return (
|
|
295
|
-
&&
|
|
296
|
-
&& ((direction === undefined) || (
|
|
279
|
+
isProxiedStreamPart(streamPartId: StreamPartID, direction?: ProxyDirection): boolean {
|
|
280
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
281
|
+
return (streamPart !== undefined)
|
|
282
|
+
&& streamPart.proxied
|
|
283
|
+
&& ((direction === undefined) || (streamPart.client.getDirection() === direction))
|
|
297
284
|
}
|
|
298
285
|
|
|
299
|
-
|
|
286
|
+
getStreamPartDelivery(streamPartId: StreamPartID): StreamPartDelivery | undefined {
|
|
300
287
|
return this.streamParts.get(streamPartId)
|
|
301
288
|
}
|
|
302
289
|
|
|
303
|
-
|
|
290
|
+
hasStreamPart(streamPartId: StreamPartID): boolean {
|
|
304
291
|
return this.streamParts.has(streamPartId)
|
|
305
292
|
}
|
|
306
293
|
|
|
307
294
|
getPeerDescriptor(): PeerDescriptor {
|
|
308
|
-
return this.
|
|
295
|
+
return this.layer0Node!.getPeerDescriptor()
|
|
309
296
|
}
|
|
310
297
|
|
|
311
298
|
getNodeId(): NodeID {
|
|
312
|
-
return this.
|
|
299
|
+
return getNodeIdFromPeerDescriptor(this.layer0Node!.getPeerDescriptor())
|
|
313
300
|
}
|
|
314
301
|
|
|
315
302
|
getNeighbors(streamPartId: StreamPartID): NodeID[] {
|
|
316
|
-
const
|
|
317
|
-
return (
|
|
318
|
-
?
|
|
303
|
+
const streamPart = this.streamParts.get(streamPartId)
|
|
304
|
+
return (streamPart !== undefined) && (streamPart.proxied === false)
|
|
305
|
+
? streamPart.node.getTargetNeighborIds()
|
|
319
306
|
: []
|
|
320
307
|
}
|
|
321
308
|
|
|
@@ -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.transport
|
|
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.get(neighborId) ??
|
|
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) => {})
|