@streamr/trackerless-network 100.0.0-pretestnet.6 → 100.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/README.md +57 -0
  2. package/dist/package.json +11 -11
  3. package/dist/src/NetworkNode.d.ts +6 -5
  4. package/dist/src/NetworkNode.js +9 -2
  5. package/dist/src/NetworkNode.js.map +1 -1
  6. package/dist/src/NetworkStack.d.ts +13 -9
  7. package/dist/src/NetworkStack.js +80 -12
  8. package/dist/src/NetworkStack.js.map +1 -1
  9. package/dist/src/exports.d.ts +4 -3
  10. package/dist/src/exports.js +12 -1
  11. package/dist/src/exports.js.map +1 -1
  12. package/dist/src/logic/DeliveryRpcLocal.d.ts +4 -5
  13. package/dist/src/logic/DeliveryRpcLocal.js +6 -5
  14. package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
  15. package/dist/src/logic/DeliveryRpcRemote.d.ts +5 -4
  16. package/dist/src/logic/DeliveryRpcRemote.js +4 -3
  17. package/dist/src/logic/DeliveryRpcRemote.js.map +1 -1
  18. package/dist/src/logic/DuplicateMessageDetector.d.ts +3 -3
  19. package/dist/src/logic/DuplicateMessageDetector.js +10 -6
  20. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
  21. package/dist/src/logic/EntryPointDiscovery.d.ts +8 -5
  22. package/dist/src/logic/EntryPointDiscovery.js +24 -15
  23. package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
  24. package/dist/src/logic/Layer0Node.d.ts +6 -4
  25. package/dist/src/logic/Layer1Node.d.ts +12 -6
  26. package/dist/src/logic/NodeList.d.ts +13 -15
  27. package/dist/src/logic/NodeList.js +18 -15
  28. package/dist/src/logic/NodeList.js.map +1 -1
  29. package/dist/src/logic/RandomGraphNode.d.ts +26 -22
  30. package/dist/src/logic/RandomGraphNode.js +82 -52
  31. package/dist/src/logic/RandomGraphNode.js.map +1 -1
  32. package/dist/src/logic/StreamrNode.d.ts +6 -6
  33. package/dist/src/logic/StreamrNode.js +53 -37
  34. package/dist/src/logic/StreamrNode.js.map +1 -1
  35. package/dist/src/logic/createRandomGraphNode.d.ts +2 -2
  36. package/dist/src/logic/createRandomGraphNode.js +33 -21
  37. package/dist/src/logic/createRandomGraphNode.js.map +1 -1
  38. package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +2 -1
  39. package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -1
  40. package/dist/src/logic/inspect/InspectSession.d.ts +4 -3
  41. package/dist/src/logic/inspect/InspectSession.js +6 -2
  42. package/dist/src/logic/inspect/InspectSession.js.map +1 -1
  43. package/dist/src/logic/inspect/Inspector.d.ts +11 -16
  44. package/dist/src/logic/inspect/Inspector.js +21 -9
  45. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  46. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +7 -9
  47. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +55 -32
  48. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
  49. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +8 -6
  50. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +25 -16
  51. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
  52. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +9 -15
  53. package/dist/src/logic/neighbor-discovery/Handshaker.js +68 -44
  54. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  55. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +8 -10
  56. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +12 -2
  57. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
  58. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +7 -10
  59. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +11 -9
  60. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  61. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +8 -4
  62. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +33 -24
  63. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  64. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +5 -4
  65. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +4 -5
  66. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
  67. package/dist/src/logic/node-info/NodeInfoClient.d.ts +9 -0
  68. package/dist/src/logic/node-info/NodeInfoClient.js +21 -0
  69. package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -0
  70. package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +12 -0
  71. package/dist/src/logic/node-info/NodeInfoRpcLocal.js +22 -0
  72. package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -0
  73. package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +6 -0
  74. package/dist/src/logic/node-info/NodeInfoRpcRemote.js +11 -0
  75. package/dist/src/logic/node-info/NodeInfoRpcRemote.js.map +1 -0
  76. package/dist/src/logic/propagation/FifoMapWithTTL.js +7 -3
  77. package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -1
  78. package/dist/src/logic/propagation/Propagation.d.ts +4 -4
  79. package/dist/src/logic/propagation/Propagation.js +4 -0
  80. package/dist/src/logic/propagation/Propagation.js.map +1 -1
  81. package/dist/src/logic/propagation/PropagationTaskStore.d.ts +2 -2
  82. package/dist/src/logic/propagation/PropagationTaskStore.js +1 -0
  83. package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -1
  84. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +1 -1
  85. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -1
  86. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +1 -1
  87. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
  88. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +87 -53
  89. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
  90. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +7 -0
  91. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +32 -0
  92. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -0
  93. package/dist/src/logic/proxy/ProxyClient.d.ts +8 -6
  94. package/dist/src/logic/proxy/ProxyClient.js +40 -28
  95. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  96. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +6 -7
  97. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +8 -8
  98. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  99. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +3 -3
  100. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js +1 -1
  101. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
  102. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +9 -4
  103. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +21 -6
  104. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  105. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +4 -3
  106. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +13 -3
  107. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
  108. package/dist/src/logic/utils.js.map +1 -1
  109. package/dist/src/proto/google/protobuf/any.js +8 -8
  110. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  111. package/dist/src/proto/google/protobuf/empty.js +2 -4
  112. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  113. package/dist/src/proto/google/protobuf/timestamp.js +10 -10
  114. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  115. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +36 -49
  116. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +54 -52
  117. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  118. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +184 -234
  119. package/dist/src/proto/packages/dht/protos/DhtRpc.js +118 -168
  120. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  121. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +20 -29
  122. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  123. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +42 -5
  124. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +52 -19
  125. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
  126. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +193 -28
  127. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +129 -20
  128. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
  129. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +20 -3
  130. package/dist/test/benchmark/first-message.js +14 -15
  131. package/dist/test/benchmark/first-message.js.map +1 -1
  132. package/dist/test/utils/utils.d.ts +2 -4
  133. package/dist/test/utils/utils.js +20 -19
  134. package/dist/test/utils/utils.js.map +1 -1
  135. package/jest.config.js +3 -38
  136. package/package.json +11 -11
  137. package/protos/NetworkRpc.proto +57 -12
  138. package/src/NetworkNode.ts +13 -6
  139. package/src/NetworkStack.ts +94 -16
  140. package/src/exports.ts +11 -3
  141. package/src/logic/DeliveryRpcLocal.ts +7 -8
  142. package/src/logic/DeliveryRpcRemote.ts +7 -5
  143. package/src/logic/DuplicateMessageDetector.ts +7 -7
  144. package/src/logic/EntryPointDiscovery.ts +26 -19
  145. package/src/logic/Layer0Node.ts +6 -4
  146. package/src/logic/Layer1Node.ts +21 -6
  147. package/src/logic/NodeList.ts +25 -26
  148. package/src/logic/RandomGraphNode.ts +148 -78
  149. package/src/logic/StreamrNode.ts +58 -41
  150. package/src/logic/createRandomGraphNode.ts +37 -25
  151. package/src/logic/formStreamPartDeliveryServiceId.ts +2 -1
  152. package/src/logic/inspect/InspectSession.ts +8 -4
  153. package/src/logic/inspect/Inspector.ts +34 -24
  154. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +72 -38
  155. package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +32 -20
  156. package/src/logic/neighbor-discovery/Handshaker.ts +90 -75
  157. package/src/logic/neighbor-discovery/NeighborFinder.ts +18 -13
  158. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +19 -20
  159. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +43 -33
  160. package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +6 -6
  161. package/src/logic/node-info/NodeInfoClient.ts +23 -0
  162. package/src/logic/node-info/NodeInfoRpcLocal.ts +28 -0
  163. package/src/logic/node-info/NodeInfoRpcRemote.ts +11 -0
  164. package/src/logic/propagation/Propagation.ts +7 -6
  165. package/src/logic/propagation/PropagationTaskStore.ts +2 -2
  166. package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +1 -1
  167. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +1 -2
  168. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +95 -69
  169. package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +37 -0
  170. package/src/logic/proxy/ProxyClient.ts +60 -40
  171. package/src/logic/proxy/ProxyConnectionRpcLocal.ts +15 -19
  172. package/src/logic/proxy/ProxyConnectionRpcRemote.ts +3 -3
  173. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +30 -10
  174. package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +14 -4
  175. package/src/proto/google/protobuf/any.ts +4 -4
  176. package/src/proto/google/protobuf/empty.ts +2 -4
  177. package/src/proto/google/protobuf/timestamp.ts +4 -4
  178. package/src/proto/packages/dht/protos/DhtRpc.client.ts +50 -66
  179. package/src/proto/packages/dht/protos/DhtRpc.server.ts +21 -30
  180. package/src/proto/packages/dht/protos/DhtRpc.ts +242 -316
  181. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  182. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +49 -7
  183. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +21 -4
  184. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +251 -44
  185. package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +60 -0
  186. package/test/benchmark/first-message.ts +38 -17
  187. package/test/end-to-end/inspect.test.ts +16 -4
  188. package/test/end-to-end/proxy-and-full-node.test.ts +26 -13
  189. package/test/end-to-end/proxy-connections.test.ts +23 -11
  190. package/test/end-to-end/proxy-key-exchange.test.ts +25 -15
  191. package/test/end-to-end/random-graph-with-real-connections.test.ts +35 -32
  192. package/test/end-to-end/webrtc-full-node-network.test.ts +11 -12
  193. package/test/end-to-end/websocket-full-node-network.test.ts +12 -12
  194. package/test/integration/DeliveryRpcRemote.test.ts +6 -9
  195. package/test/integration/HandshakeRpcRemote.test.ts +6 -8
  196. package/test/integration/Handshakes.test.ts +29 -27
  197. package/test/integration/Inspect.test.ts +0 -2
  198. package/test/integration/NeighborUpdateRpcRemote.test.ts +6 -7
  199. package/test/integration/NetworkNode.test.ts +27 -12
  200. package/test/integration/NetworkRpc.test.ts +3 -5
  201. package/test/integration/NetworkStack.test.ts +2 -2
  202. package/test/integration/NodeInfoRpc.test.ts +104 -0
  203. package/test/integration/Propagation.test.ts +3 -3
  204. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +24 -25
  205. package/test/integration/RandomGraphNode-Layer1Node.test.ts +26 -24
  206. package/test/integration/StreamrNode.test.ts +4 -16
  207. package/test/integration/joining-streams-on-offline-peers.test.ts +7 -31
  208. package/test/integration/stream-without-default-entrypoints.test.ts +22 -23
  209. package/test/integration/streamEntryPointReplacing.test.ts +94 -0
  210. package/test/unit/DeliveryRpcLocal.test.ts +2 -1
  211. package/test/unit/EntrypointDiscovery.test.ts +11 -8
  212. package/test/unit/GroupKeyResponseTranslator.test.ts +1 -1
  213. package/test/unit/HandshakeRpcLocal.test.ts +80 -28
  214. package/test/unit/Handshaker.test.ts +14 -9
  215. package/test/unit/InspectSession.test.ts +5 -6
  216. package/test/unit/Inspector.test.ts +3 -4
  217. package/test/unit/NeighborFinder.test.ts +12 -9
  218. package/test/unit/NeighborUpdateRpcLocal.test.ts +139 -0
  219. package/test/unit/NodeList.test.ts +77 -80
  220. package/test/unit/Propagation.test.ts +21 -16
  221. package/test/unit/ProxyConnectionRpcRemote.test.ts +18 -12
  222. package/test/unit/RandomGraphNode.test.ts +23 -20
  223. package/test/unit/StreamMessageTranslator.test.ts +10 -8
  224. package/test/unit/StreamPartIDDataKey.test.ts +12 -0
  225. package/test/unit/StreamrNode.test.ts +2 -0
  226. package/test/unit/TemporaryConnectionRpcLocal.test.ts +38 -0
  227. package/test/unit/oldStreamMessageBinaryUtils.test.ts +39 -0
  228. package/test/utils/mock/MockHandshaker.ts +6 -5
  229. package/test/utils/mock/MockLayer0Node.ts +7 -2
  230. package/test/utils/mock/MockLayer1Node.ts +5 -2
  231. package/test/utils/mock/MockNeighborFinder.ts +3 -2
  232. package/test/utils/mock/MockNeighborUpdateManager.ts +3 -2
  233. package/test/utils/mock/Transport.ts +1 -1
  234. package/test/utils/utils.ts +40 -25
  235. package/tsconfig.jest.json +5 -4
  236. package/tsconfig.node.json +2 -2
  237. package/dist/src/identifiers.d.ts +0 -4
  238. package/dist/src/identifiers.js +0 -9
  239. package/dist/src/identifiers.js.map +0 -1
  240. package/src/identifiers.ts +0 -8
  241. package/test/unit/GroupKeyRequestTranslator.test.ts +0 -36
@@ -3,7 +3,9 @@ import {
3
3
  DhtNode,
4
4
  ITransport,
5
5
  PeerDescriptor,
6
- EXISTING_CONNECTION_TIMEOUT
6
+ EXISTING_CONNECTION_TIMEOUT,
7
+ DhtAddress,
8
+ getNodeIdFromPeerDescriptor
7
9
  } from '@streamr/dht'
8
10
  import { StreamID, StreamPartID, StreamPartIDUtils, toStreamPartID } from '@streamr/protocol'
9
11
  import {
@@ -16,8 +18,7 @@ import {
16
18
  } from '@streamr/utils'
17
19
  import { EventEmitter } from 'eventemitter3'
18
20
  import { sampleSize } from 'lodash'
19
- import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
20
- import { ProxyDirection, StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc'
21
+ import { ProxyDirection, StreamPartitionInfo, StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc'
21
22
  import { Layer0Node } from './Layer0Node'
22
23
  import { Layer1Node } from './Layer1Node'
23
24
  import { RandomGraphNode } from './RandomGraphNode'
@@ -44,8 +45,6 @@ export interface Events {
44
45
 
45
46
  const logger = new Logger(module)
46
47
 
47
- let cleanUp: () => Promise<void> = async () => { }
48
-
49
48
  interface Metrics extends MetricsDefinition {
50
49
  broadcastMessagesPerSecond: Metric
51
50
  broadcastBytesPerSecond: Metric
@@ -53,7 +52,7 @@ interface Metrics extends MetricsDefinition {
53
52
 
54
53
  export interface StreamrNodeConfig {
55
54
  metricsContext?: MetricsContext
56
- streamPartitionNumOfNeighbors?: number
55
+ streamPartitionNeighborTargetCount?: number
57
56
  streamPartitionMinPropagationTargets?: number
58
57
  acceptProxyConnections?: boolean
59
58
  rpcRequestTimeout?: number
@@ -93,7 +92,6 @@ export class StreamrNode extends EventEmitter<Events> {
93
92
  this.layer0Node = startedAndJoinedLayer0Node
94
93
  this.transport = transport
95
94
  this.connectionLocker = connectionLocker
96
- cleanUp = () => this.destroy()
97
95
  }
98
96
 
99
97
  async destroy(): Promise<void> {
@@ -112,10 +110,13 @@ export class StreamrNode extends EventEmitter<Events> {
112
110
 
113
111
  broadcast(msg: StreamMessage): void {
114
112
  const streamPartId = toStreamPartID(msg.messageId!.streamId as StreamID, msg.messageId!.streamPartition)
113
+ logger.debug(`Broadcasting to stream part ${streamPartId}`)
115
114
  this.joinStreamPart(streamPartId)
116
115
  this.streamParts.get(streamPartId)!.broadcast(msg)
117
- this.metrics.broadcastMessagesPerSecond.record(1)
118
- this.metrics.broadcastBytesPerSecond.record(msg.content.length)
116
+ if (msg.body.oneofKind === 'contentMessage') {
117
+ this.metrics.broadcastMessagesPerSecond.record(1)
118
+ this.metrics.broadcastBytesPerSecond.record(msg.body.contentMessage.content.length)
119
+ }
119
120
  }
120
121
 
121
122
  async leaveStreamPart(streamPartId: StreamPartID): Promise<void> {
@@ -127,26 +128,25 @@ export class StreamrNode extends EventEmitter<Events> {
127
128
  }
128
129
 
129
130
  joinStreamPart(streamPartId: StreamPartID): void {
130
- logger.debug(`Join stream part ${streamPartId}`)
131
131
  let streamPart = this.streamParts.get(streamPartId)
132
132
  if (streamPart !== undefined) {
133
133
  return
134
134
  }
135
+ logger.debug(`Join stream part ${streamPartId}`)
135
136
  const layer1Node = this.createLayer1Node(streamPartId, this.knownStreamPartEntryPoints.get(streamPartId) ?? [])
136
- const node = this.createRandomGraphNode(streamPartId, layer1Node)
137
137
  const entryPointDiscovery = new EntryPointDiscovery({
138
138
  streamPartId,
139
139
  localPeerDescriptor: this.getPeerDescriptor(),
140
140
  layer1Node,
141
- getEntryPointData: (key) => this.layer0Node!.getDataFromDht(key),
141
+ fetchEntryPointData: (key) => this.layer0Node!.fetchDataFromDht(key),
142
142
  storeEntryPointData: (key, data) => this.layer0Node!.storeDataToDht(key, data),
143
- deleteEntryPointData: async (key) => {
144
- if (this.destroyed) {
145
- return
146
- }
147
- return this.layer0Node!.deleteDataFromDht(key)
148
- }
143
+ deleteEntryPointData: async (key) => this.layer0Node!.deleteDataFromDht(key, false)
149
144
  })
145
+ const node = this.createRandomGraphNode(
146
+ streamPartId,
147
+ layer1Node,
148
+ () => entryPointDiscovery.isLocalNodeEntryPoint()
149
+ )
150
150
  streamPart = {
151
151
  proxied: false,
152
152
  layer1Node,
@@ -163,6 +163,14 @@ export class StreamrNode extends EventEmitter<Events> {
163
163
  node.on('message', (message: StreamMessage) => {
164
164
  this.emit('newMessage', message)
165
165
  })
166
+ const handleEntryPointLeave = async () => {
167
+ if (this.destroyed || entryPointDiscovery.isLocalNodeEntryPoint() || this.knownStreamPartEntryPoints.has(streamPartId)) {
168
+ return
169
+ }
170
+ const entryPoints = await entryPointDiscovery.discoverEntryPointsFromDht(0)
171
+ await entryPointDiscovery.storeSelfAsEntryPointIfNecessary(entryPoints.discoveredEntryPoints.length)
172
+ }
173
+ node.on('entryPointLeaveDetected', () => handleEntryPointLeave())
166
174
  setImmediate(async () => {
167
175
  try {
168
176
  await this.startLayersAndJoinDht(streamPartId, entryPointDiscovery)
@@ -186,7 +194,10 @@ export class StreamrNode extends EventEmitter<Events> {
186
194
  entryPoints.length
187
195
  )
188
196
  entryPoints = entryPoints.concat(discoveryResult.discoveredEntryPoints)
189
- await streamPart.layer1Node.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT))
197
+ await Promise.all([
198
+ streamPart.layer1Node.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT)),
199
+ streamPart.layer1Node.joinRing()
200
+ ])
190
201
  if (discoveryResult.entryPointsFromDht) {
191
202
  await entryPointDiscovery.storeSelfAsEntryPointIfNecessary(entryPoints.length)
192
203
  }
@@ -198,13 +209,17 @@ export class StreamrNode extends EventEmitter<Events> {
198
209
  serviceId: 'layer1::' + streamPartId,
199
210
  peerDescriptor: this.layer0Node!.getLocalPeerDescriptor(),
200
211
  entryPoints,
201
- numberOfNodesPerKBucket: 4,
212
+ numberOfNodesPerKBucket: 4, // TODO use config option or named constant?
202
213
  rpcRequestTimeout: EXISTING_CONNECTION_TIMEOUT,
203
- dhtJoinTimeout: 20000
214
+ dhtJoinTimeout: 20000 // TODO use config option or named constant?
204
215
  })
205
216
  }
206
217
 
207
- private createRandomGraphNode(streamPartId: StreamPartID, layer1Node: Layer1Node) {
218
+ private createRandomGraphNode(
219
+ streamPartId: StreamPartID,
220
+ layer1Node: Layer1Node,
221
+ isLocalNodeEntryPoint: () => boolean
222
+ ) {
208
223
  return createRandomGraphNode({
209
224
  streamPartId,
210
225
  transport: this.transport!,
@@ -212,9 +227,10 @@ export class StreamrNode extends EventEmitter<Events> {
212
227
  connectionLocker: this.connectionLocker!,
213
228
  localPeerDescriptor: this.layer0Node!.getLocalPeerDescriptor(),
214
229
  minPropagationTargets: this.config.streamPartitionMinPropagationTargets,
215
- numOfTargetNeighbors: this.config.streamPartitionNumOfNeighbors,
230
+ neighborTargetCount: this.config.streamPartitionNeighborTargetCount,
216
231
  acceptProxyConnections: this.config.acceptProxyConnections,
217
- rpcRequestTimeout: this.config.rpcRequestTimeout
232
+ rpcRequestTimeout: this.config.rpcRequestTimeout,
233
+ isLocalNodeEntryPoint
218
234
  })
219
235
  }
220
236
 
@@ -225,6 +241,7 @@ export class StreamrNode extends EventEmitter<Events> {
225
241
  userId: EthereumAddress,
226
242
  connectionCount?: number
227
243
  ): Promise<void> {
244
+ // TODO explicit default value for "acceptProxyConnections" or make it required
228
245
  if (this.config.acceptProxyConnections) {
229
246
  throw new Error('cannot set proxies when acceptProxyConnections=true')
230
247
  }
@@ -272,6 +289,20 @@ export class StreamrNode extends EventEmitter<Events> {
272
289
  return false
273
290
  }
274
291
 
292
+ // TODO inline this method?
293
+ getNodeInfo(): StreamPartitionInfo[] {
294
+ const streamParts = Array.from(this.streamParts.entries()).filter(([_, node]) => node.proxied === false)
295
+ return streamParts.map(([streamPartId]) => {
296
+ const stream = this.streamParts.get(streamPartId)! as { node: RandomGraphNode, layer1Node: Layer1Node }
297
+ return {
298
+ id: streamPartId,
299
+ controlLayerNeighbors: stream.layer1Node.getNeighbors(),
300
+ deliveryLayerNeighbors: stream.node.getNeighbors()
301
+ }
302
+ })
303
+
304
+ }
305
+
275
306
  setStreamPartEntryPoints(streamPartId: StreamPartID, entryPoints: PeerDescriptor[]): void {
276
307
  this.knownStreamPartEntryPoints.set(streamPartId, entryPoints)
277
308
  }
@@ -295,14 +326,14 @@ export class StreamrNode extends EventEmitter<Events> {
295
326
  return this.layer0Node!.getLocalPeerDescriptor()
296
327
  }
297
328
 
298
- getNodeId(): NodeID {
329
+ getNodeId(): DhtAddress {
299
330
  return getNodeIdFromPeerDescriptor(this.layer0Node!.getLocalPeerDescriptor())
300
331
  }
301
332
 
302
- getNeighbors(streamPartId: StreamPartID): NodeID[] {
333
+ getNeighbors(streamPartId: StreamPartID): DhtAddress[] {
303
334
  const streamPart = this.streamParts.get(streamPartId)
304
335
  return (streamPart !== undefined) && (streamPart.proxied === false)
305
- ? streamPart.node.getTargetNeighborIds()
336
+ ? streamPart.node.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
306
337
  : []
307
338
  }
308
339
 
@@ -310,17 +341,3 @@ export class StreamrNode extends EventEmitter<Events> {
310
341
  return Array.from(this.streamParts.keys()).map((id) => StreamPartIDUtils.parse(id))
311
342
  }
312
343
  }
313
-
314
- [`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `unhandledRejection`, `SIGTERM`].forEach((term) => {
315
- process.on(term, async () => {
316
- await cleanUp()
317
- process.exit()
318
- })
319
- })
320
-
321
- declare let window: any
322
- if (typeof window === 'object') {
323
- window.addEventListener('unload', async () => {
324
- await cleanUp()
325
- })
326
- }
@@ -1,4 +1,4 @@
1
- import { ListeningRpcCommunicator } from '@streamr/dht'
1
+ import { DhtAddress, ListeningRpcCommunicator, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { Handshaker } from './neighbor-discovery/Handshaker'
3
3
  import { NeighborFinder } from './neighbor-discovery/NeighborFinder'
4
4
  import { NeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
@@ -10,15 +10,14 @@ import { MarkOptional } from 'ts-essentials'
10
10
  import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
11
11
  import { Inspector } from './inspect/Inspector'
12
12
  import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
13
- import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
14
13
  import { formStreamPartDeliveryServiceId } from './formStreamPartDeliveryServiceId'
15
14
 
16
15
  type RandomGraphNodeConfig = MarkOptional<StrictRandomGraphNodeConfig,
17
- 'nearbyNodeView' | 'randomNodeView' | 'targetNeighbors' | 'propagation'
18
- | 'handshaker' | 'neighborFinder' | 'neighborUpdateManager' | 'numOfTargetNeighbors'
16
+ 'nearbyNodeView' | 'randomNodeView' | 'neighbors' | 'leftNodeView' | 'rightNodeView' | 'propagation'
17
+ | 'handshaker' | 'neighborFinder' | 'neighborUpdateManager' | 'neighborTargetCount'
19
18
  | 'rpcCommunicator' | 'nodeViewSize'
20
19
  | 'inspector' | 'temporaryConnectionRpcLocal'> & {
21
- maxNumberOfContacts?: number
20
+ maxContactCount?: number
22
21
  minPropagationTargets?: number
23
22
  acceptProxyConnections?: boolean
24
23
  neighborUpdateInterval?: number
@@ -30,19 +29,23 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
30
29
  formStreamPartDeliveryServiceId(config.streamPartId),
31
30
  config.transport
32
31
  )
33
- const numOfTargetNeighbors = config.numOfTargetNeighbors ?? 4
34
- const maxNumberOfContacts = config.maxNumberOfContacts ?? 20
32
+ const neighborTargetCount = config.neighborTargetCount ?? 4
33
+ const maxContactCount = config.maxContactCount ?? 20
35
34
  const minPropagationTargets = config.minPropagationTargets ?? 2
36
35
  const acceptProxyConnections = config.acceptProxyConnections ?? false
37
36
  const neighborUpdateInterval = config.neighborUpdateInterval ?? 10000
38
- const nearbyNodeView = config.nearbyNodeView ?? new NodeList(ownNodeId, numOfTargetNeighbors + 1)
39
- const randomNodeView = config.randomNodeView ?? new NodeList(ownNodeId, maxNumberOfContacts)
40
- const targetNeighbors = config.targetNeighbors ?? new NodeList(ownNodeId, maxNumberOfContacts)
37
+ const neighbors = config.neighbors ?? new NodeList(ownNodeId, maxContactCount)
38
+ const leftNodeView = config.leftNodeView ?? new NodeList(ownNodeId, maxContactCount)
39
+ const rightNodeView = config.rightNodeView ?? new NodeList(ownNodeId, maxContactCount)
40
+ const nearbyNodeView = config.nearbyNodeView ?? new NodeList(ownNodeId, maxContactCount)
41
+ const randomNodeView = config.randomNodeView ?? new NodeList(ownNodeId, maxContactCount)
42
+ const ongoingHandshakes = new Set<DhtAddress>()
41
43
 
42
44
  const temporaryConnectionRpcLocal = new TemporaryConnectionRpcLocal({
43
- streamPartId: config.streamPartId,
44
45
  rpcCommunicator,
45
- localPeerDescriptor: config.localPeerDescriptor
46
+ localPeerDescriptor: config.localPeerDescriptor,
47
+ streamPartId: config.streamPartId,
48
+ connectionLocker: config.connectionLocker
46
49
  })
47
50
  const proxyConnectionRpcLocal = acceptProxyConnections ? new ProxyConnectionRpcLocal({
48
51
  localPeerDescriptor: config.localPeerDescriptor,
@@ -51,8 +54,8 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
51
54
  }) : undefined
52
55
  const propagation = config.propagation ?? new Propagation({
53
56
  minPropagationTargets,
54
- sendToNeighbor: async (neighborId: NodeID, msg: StreamMessage): Promise<void> => {
55
- const remote = targetNeighbors.get(neighborId) ?? temporaryConnectionRpcLocal.getNodes().get(neighborId)
57
+ sendToNeighbor: async (neighborId: DhtAddress, msg: StreamMessage): Promise<void> => {
58
+ const remote = neighbors.get(neighborId) ?? temporaryConnectionRpcLocal.getNodes().get(neighborId)
56
59
  const proxyConnection = proxyConnectionRpcLocal?.getConnection(neighborId)
57
60
  if (remote) {
58
61
  await remote.sendStreamMessage(msg)
@@ -66,28 +69,35 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
66
69
  const handshaker = config.handshaker ?? new Handshaker({
67
70
  localPeerDescriptor: config.localPeerDescriptor,
68
71
  streamPartId: config.streamPartId,
69
- connectionLocker: config.connectionLocker,
70
72
  rpcCommunicator,
73
+ neighbors,
74
+ leftNodeView,
75
+ rightNodeView,
71
76
  nearbyNodeView,
72
77
  randomNodeView,
73
- targetNeighbors,
74
- maxNeighborCount: numOfTargetNeighbors,
75
- rpcRequestTimeout: config.rpcRequestTimeout
78
+ maxNeighborCount: neighborTargetCount,
79
+ rpcRequestTimeout: config.rpcRequestTimeout,
80
+ ongoingHandshakes
76
81
  })
77
82
  const neighborFinder = config.neighborFinder ?? new NeighborFinder({
78
- targetNeighbors,
83
+ neighbors,
84
+ leftNodeView,
85
+ rightNodeView,
79
86
  nearbyNodeView,
87
+ randomNodeView,
80
88
  doFindNeighbors: (excludedIds) => handshaker.attemptHandshakesOnContacts(excludedIds),
81
- minCount: numOfTargetNeighbors
89
+ minCount: neighborTargetCount
82
90
  })
83
91
  const neighborUpdateManager = config.neighborUpdateManager ?? new NeighborUpdateManager({
84
- targetNeighbors,
92
+ neighbors,
85
93
  nearbyNodeView,
86
94
  localPeerDescriptor: config.localPeerDescriptor,
87
95
  neighborFinder,
88
96
  streamPartId: config.streamPartId,
89
97
  rpcCommunicator,
90
- neighborUpdateInterval
98
+ neighborUpdateInterval,
99
+ neighborTargetCount,
100
+ ongoingHandshakes
91
101
  })
92
102
  const inspector = config.inspector ?? new Inspector({
93
103
  localPeerDescriptor: config.localPeerDescriptor,
@@ -97,16 +107,18 @@ const createConfigWithDefaults = (config: RandomGraphNodeConfig): StrictRandomGr
97
107
  })
98
108
  return {
99
109
  ...config,
110
+ neighbors,
111
+ leftNodeView,
112
+ rightNodeView,
100
113
  nearbyNodeView,
101
114
  randomNodeView,
102
- targetNeighbors,
103
115
  rpcCommunicator,
104
116
  handshaker,
105
117
  neighborFinder,
106
118
  neighborUpdateManager,
107
119
  propagation,
108
- numOfTargetNeighbors,
109
- nodeViewSize: maxNumberOfContacts,
120
+ neighborTargetCount,
121
+ nodeViewSize: maxContactCount,
110
122
  proxyConnectionRpcLocal,
111
123
  inspector,
112
124
  temporaryConnectionRpcLocal
@@ -1,5 +1,6 @@
1
+ import { ServiceID } from '@streamr/dht'
1
2
  import { StreamPartID } from '@streamr/protocol'
2
3
 
3
- export const formStreamPartDeliveryServiceId = (streamPartId: StreamPartID): string => {
4
+ export const formStreamPartDeliveryServiceId = (streamPartId: StreamPartID): ServiceID => {
4
5
  return `stream-part-delivery-${streamPartId}`
5
6
  }
@@ -1,14 +1,14 @@
1
1
  import { EventEmitter } from 'eventemitter3'
2
- import { NodeID } from '../../identifiers'
3
2
  import { MessageID } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
4
3
  import { binaryToHex } from '@streamr/utils'
4
+ import { DhtAddress } from '@streamr/dht'
5
5
 
6
6
  export interface Events {
7
7
  done: () => void
8
8
  }
9
9
 
10
10
  interface InspectSessionConfig {
11
- inspectedNode: NodeID
11
+ inspectedNode: DhtAddress
12
12
  }
13
13
 
14
14
  const createMessageKey = (messageId: MessageID): string => {
@@ -18,14 +18,14 @@ export class InspectSession extends EventEmitter<Events> {
18
18
 
19
19
  // Boolean indicates if the message has been received by the inspected node
20
20
  private readonly inspectionMessages: Map<string, boolean> = new Map()
21
- private readonly inspectedNode: NodeID
21
+ private readonly inspectedNode: DhtAddress
22
22
 
23
23
  constructor(config: InspectSessionConfig) {
24
24
  super()
25
25
  this.inspectedNode = config.inspectedNode
26
26
  }
27
27
 
28
- markMessage(senderId: NodeID, messageId: MessageID): void {
28
+ markMessage(senderId: DhtAddress, messageId: MessageID): void {
29
29
  const messageKey = createMessageKey(messageId)
30
30
  if (!this.inspectionMessages.has(messageKey)) {
31
31
  this.inspectionMessages.set(messageKey, senderId === this.inspectedNode)
@@ -44,6 +44,10 @@ export class InspectSession extends EventEmitter<Events> {
44
44
  return this.inspectionMessages.size
45
45
  }
46
46
 
47
+ onlyMarkedByInspectedNode(): boolean {
48
+ return Array.from(this.inspectionMessages.values()).every((value) => value === true)
49
+ }
50
+
47
51
  stop(): void {
48
52
  this.emit('done')
49
53
  }
@@ -1,55 +1,65 @@
1
- import { PeerDescriptor, ConnectionLocker } from '@streamr/dht'
1
+ import { PeerDescriptor, ConnectionLocker, LockID, DhtAddress, getNodeIdFromPeerDescriptor, ListeningRpcCommunicator } from '@streamr/dht'
2
2
  import { MessageID } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
3
3
  import { InspectSession, Events as InspectSessionEvents } from './InspectSession'
4
4
  import { TemporaryConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
5
- import { ProtoRpcClient, RpcCommunicator, toProtoRpcClient } from '@streamr/proto-rpc'
6
5
  import { Logger, waitForEvent3 } from '@streamr/utils'
7
6
  import { TemporaryConnectionRpcRemote } from '../temporary-connection/TemporaryConnectionRpcRemote'
8
- import { NodeID, getNodeIdFromPeerDescriptor } from '../../identifiers'
9
7
  import { StreamPartID } from '@streamr/protocol'
10
8
 
11
9
  interface InspectorConfig {
12
10
  localPeerDescriptor: PeerDescriptor
13
11
  streamPartId: StreamPartID
14
- rpcCommunicator: RpcCommunicator
12
+ rpcCommunicator: ListeningRpcCommunicator
15
13
  connectionLocker: ConnectionLocker
16
14
  inspectionTimeout?: number
17
- openInspectConnection?: (peerDescriptor: PeerDescriptor, lockId: string) => Promise<void>
18
- }
19
-
20
- export interface IInspector {
21
- inspect(peerDescriptor: PeerDescriptor): Promise<boolean>
22
- markMessage(sender: NodeID, messageId: MessageID): void
23
- isInspected(nodeId: NodeID): boolean
24
- stop(): void
15
+ openInspectConnection?: (peerDescriptor: PeerDescriptor, lockId: LockID) => Promise<void>
16
+ closeInspectConnection?: (peerDescriptor: PeerDescriptor, lockId: LockID) => Promise<void>
25
17
  }
26
18
 
27
19
  const logger = new Logger(module)
28
20
  const DEFAULT_TIMEOUT = 60 * 1000
29
21
 
30
- export class Inspector implements IInspector {
22
+ export class Inspector {
31
23
 
32
- private readonly sessions: Map<NodeID, InspectSession> = new Map()
24
+ private readonly sessions: Map<DhtAddress, InspectSession> = new Map()
33
25
  private readonly streamPartId: StreamPartID
34
- private readonly client: ProtoRpcClient<TemporaryConnectionRpcClient>
35
26
  private readonly localPeerDescriptor: PeerDescriptor
27
+ private readonly rpcCommunicator: ListeningRpcCommunicator
36
28
  private readonly connectionLocker: ConnectionLocker
37
29
  private readonly inspectionTimeout: number
38
- private readonly openInspectConnection: (peerDescriptor: PeerDescriptor, lockId: string) => Promise<void>
30
+ private readonly openInspectConnection: (peerDescriptor: PeerDescriptor, lockId: LockID) => Promise<void>
31
+ private readonly closeInspectConnection: (peerDescriptor: PeerDescriptor, lockId: LockID) => Promise<void>
39
32
 
40
33
  constructor(config: InspectorConfig) {
41
34
  this.streamPartId = config.streamPartId
42
35
  this.localPeerDescriptor = config.localPeerDescriptor
43
- this.client = toProtoRpcClient(new TemporaryConnectionRpcClient(config.rpcCommunicator.getRpcClientTransport()))
36
+ this.rpcCommunicator = config.rpcCommunicator
44
37
  this.connectionLocker = config.connectionLocker
45
38
  this.inspectionTimeout = config.inspectionTimeout ?? DEFAULT_TIMEOUT
46
39
  this.openInspectConnection = config.openInspectConnection ?? this.defaultOpenInspectConnection
40
+ this.closeInspectConnection = config.closeInspectConnection ?? this.defaultCloseInspectConnection
47
41
  }
48
42
 
49
- async defaultOpenInspectConnection(peerDescriptor: PeerDescriptor, lockId: string): Promise<void> {
50
- const rpcRemote = new TemporaryConnectionRpcRemote(this.localPeerDescriptor, peerDescriptor, this.streamPartId, this.client)
43
+ async defaultOpenInspectConnection(peerDescriptor: PeerDescriptor, lockId: LockID): Promise<void> {
44
+ const rpcRemote = new TemporaryConnectionRpcRemote(
45
+ this.localPeerDescriptor,
46
+ peerDescriptor,
47
+ this.rpcCommunicator,
48
+ TemporaryConnectionRpcClient
49
+ )
51
50
  await rpcRemote.openConnection()
52
- this.connectionLocker.lockConnection(peerDescriptor, lockId)
51
+ this.connectionLocker.weakLockConnection(getNodeIdFromPeerDescriptor(peerDescriptor), lockId)
52
+ }
53
+
54
+ async defaultCloseInspectConnection(peerDescriptor: PeerDescriptor, lockId: LockID): Promise<void> {
55
+ const rpcRemote = new TemporaryConnectionRpcRemote(
56
+ this.localPeerDescriptor,
57
+ peerDescriptor,
58
+ this.rpcCommunicator,
59
+ TemporaryConnectionRpcClient
60
+ )
61
+ await rpcRemote.closeConnection()
62
+ this.connectionLocker.weakUnlockConnection(getNodeIdFromPeerDescriptor(peerDescriptor), lockId)
53
63
  }
54
64
 
55
65
  async inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
@@ -67,17 +77,17 @@ export class Inspector implements IInspector {
67
77
  } catch (err) {
68
78
  logger.trace('Inspect session timed out, removing')
69
79
  } finally {
80
+ await this.closeInspectConnection(peerDescriptor, lockId)
70
81
  this.sessions.delete(nodeId)
71
- this.connectionLocker.unlockConnection(peerDescriptor, lockId)
72
82
  }
73
- return success || session.getInspectedMessageCount() < 1
83
+ return success || session.getInspectedMessageCount() < 1 || session.onlyMarkedByInspectedNode()
74
84
  }
75
85
 
76
- markMessage(sender: NodeID, messageId: MessageID): void {
86
+ markMessage(sender: DhtAddress, messageId: MessageID): void {
77
87
  this.sessions.forEach((session) => session.markMessage(sender, messageId))
78
88
  }
79
89
 
80
- isInspected(nodeId: NodeID): boolean {
90
+ isInspected(nodeId: DhtAddress): boolean {
81
91
  return this.sessions.has(nodeId)
82
92
  }
83
93