@streamr/trackerless-network 100.0.0-pretestnet.4 → 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
@@ -1,4 +1,4 @@
1
- import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
1
+ import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { waitForCondition } from '@streamr/utils'
3
3
  import { range } from 'lodash'
4
4
  import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
@@ -8,7 +8,7 @@ import { StreamPartIDUtils } from '@streamr/protocol'
8
8
  import { Layer1Node } from '../../src/logic/Layer1Node'
9
9
 
10
10
  describe('RandomGraphNode-DhtNode-Latencies', () => {
11
- const numOfNodes = 64
11
+ const nodeCount = 64
12
12
  let layer1Nodes: Layer1Node[]
13
13
  let dhtEntryPoint: Layer1Node
14
14
  let entryPointRandomGraphNode: RandomGraphNode
@@ -17,12 +17,11 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
17
17
  const streamPartId = StreamPartIDUtils.parse('stream#0')
18
18
  const entrypointDescriptor = createMockPeerDescriptor()
19
19
 
20
- const peerDescriptors: PeerDescriptor[] = range(numOfNodes).map(() => createMockPeerDescriptor())
20
+ const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => createMockPeerDescriptor())
21
21
  beforeEach(async () => {
22
- Simulator.useFakeTimers()
23
22
  const simulator = new Simulator(LatencyType.FIXED, 50)
24
23
  const entrypointCm = new SimulatorTransport(entrypointDescriptor, simulator)
25
- const cms: SimulatorTransport[] = range(numOfNodes).map((i) =>
24
+ const cms: SimulatorTransport[] = range(nodeCount).map((i) =>
26
25
  new SimulatorTransport(peerDescriptors[i], simulator)
27
26
  )
28
27
  await entrypointCm.start()
@@ -33,24 +32,26 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
33
32
  peerDescriptor: entrypointDescriptor,
34
33
  serviceId: streamPartId
35
34
  })
36
- layer1Nodes = range(numOfNodes).map((i) => new DhtNode({
35
+ layer1Nodes = range(nodeCount).map((i) => new DhtNode({
37
36
  transport: cms[i],
38
37
  peerDescriptor: peerDescriptors[i],
39
38
  serviceId: streamPartId
40
39
  }))
41
- graphNodes = range(numOfNodes).map((i) => createRandomGraphNode({
40
+ graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
42
41
  streamPartId,
43
42
  layer1Node: layer1Nodes[i],
44
43
  transport: cms[i],
45
44
  connectionLocker: cms[i],
46
- localPeerDescriptor: peerDescriptors[i]
45
+ localPeerDescriptor: peerDescriptors[i],
46
+ isLocalNodeEntryPoint: () => false
47
47
  }))
48
48
  entryPointRandomGraphNode = createRandomGraphNode({
49
49
  streamPartId,
50
50
  layer1Node: dhtEntryPoint,
51
51
  transport: entrypointCm,
52
52
  connectionLocker: entrypointCm,
53
- localPeerDescriptor: entrypointDescriptor
53
+ localPeerDescriptor: entrypointDescriptor,
54
+ isLocalNodeEntryPoint: () => false
54
55
  })
55
56
 
56
57
  await dhtEntryPoint.start()
@@ -63,7 +64,6 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
63
64
  entryPointRandomGraphNode.stop()
64
65
  await Promise.all(layer1Nodes.map((node) => node.stop()))
65
66
  await Promise.all(graphNodes.map((node) => node.stop()))
66
- Simulator.useFakeTimers(false)
67
67
  })
68
68
 
69
69
  it('happy path single node', async () => {
@@ -72,10 +72,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
72
72
  await graphNodes[0].start()
73
73
  await Promise.all([
74
74
  waitForCondition(() => graphNodes[0].getNearbyNodeView().getIds().length === 1),
75
- waitForCondition(() => graphNodes[0].getTargetNeighborIds().length === 1)
75
+ waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
76
76
  ])
77
77
  expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
78
- expect(graphNodes[0].getTargetNeighborIds().length).toEqual(1)
78
+ expect(graphNodes[0].getNeighbors().length).toEqual(1)
79
79
  })
80
80
 
81
81
  it('happy path 5 nodes', async () => {
@@ -84,14 +84,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
84
84
  await Promise.all(range(4).map(async (i) => {
85
85
  await layer1Nodes[i].joinDht([entrypointDescriptor])
86
86
  }))
87
- await Promise.all(range(4).map((i) => {
88
- return waitForCondition(() => {
89
- return graphNodes[i].getTargetNeighborIds().length >= 4
90
- }, 15000, 2000)
91
- }))
87
+ await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length >= 4), 15000, 1000)
92
88
  range(4).forEach((i) => {
93
89
  expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
94
- expect(graphNodes[i].getTargetNeighborIds().length).toBeGreaterThanOrEqual(4)
90
+ expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
95
91
  })
96
92
  // Check bidirectionality
97
93
  const allNodes = graphNodes
@@ -102,32 +98,35 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
102
98
  const neighbor = allNodes.find((node) => {
103
99
  return node.getOwnNodeId() === ownNodeId
104
100
  })
105
- expect(neighbor!.getTargetNeighborIds()).toContain(nodeId)
101
+ const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
102
+ expect(neighborIds).toContain(nodeId)
106
103
  })
107
104
  })
108
105
  }, 60000)
109
106
 
110
107
  it('happy path 64 nodes', async () => {
111
- await Promise.all(range(numOfNodes).map((i) => graphNodes[i].start()))
112
- await Promise.all(range(numOfNodes).map((i) => {
108
+ await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
109
+ await Promise.all(range(nodeCount).map((i) => {
113
110
  layer1Nodes[i].joinDht([entrypointDescriptor])
114
111
  }))
115
112
  await Promise.all(graphNodes.map((node) =>
116
- waitForCondition(() => node.getTargetNeighborIds().length >= 4, 10000)
113
+ waitForCondition(() => node.getNeighbors().length >= 4, 10000)
117
114
  ))
118
115
 
119
116
  await Promise.all(graphNodes.map((node) =>
120
- waitForCondition(() => node.getNumberOfOutgoingHandshakes() === 0)
117
+ waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
121
118
  ))
122
119
 
123
120
  await waitForCondition(() => {
124
121
  let mismatchCounter = 0
125
122
  graphNodes.forEach((node) => {
126
123
  const nodeId = node.getOwnNodeId()
127
- node.getTargetNeighborIds().forEach((neighborId) => {
124
+ node.getNeighbors().forEach((neighbor) => {
125
+ const neighborId = getNodeIdFromPeerDescriptor(neighbor)
128
126
  if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
129
127
  const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
130
- if (!neighbor!.getTargetNeighborIds().includes(nodeId)) {
128
+ const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
129
+ if (!neighborIds.includes(nodeId)) {
131
130
  mismatchCounter += 1
132
131
  }
133
132
  }
@@ -1,4 +1,4 @@
1
- import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getRandomRegion } from '@streamr/dht'
1
+ import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor, getRandomRegion } from '@streamr/dht'
2
2
  import { Logger, waitForCondition } from '@streamr/utils'
3
3
  import { range } from 'lodash'
4
4
  import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
@@ -10,7 +10,7 @@ import { Layer1Node } from '../../src/logic/Layer1Node'
10
10
  const logger = new Logger(module)
11
11
 
12
12
  describe('RandomGraphNode-DhtNode', () => {
13
- const numOfNodes = 64
13
+ const nodeCount = 64
14
14
  let layer1Nodes: Layer1Node[]
15
15
  let dhtEntryPoint: Layer1Node
16
16
  let entryPointRandomGraphNode: RandomGraphNode
@@ -21,14 +21,12 @@ describe('RandomGraphNode-DhtNode', () => {
21
21
  region: getRandomRegion()
22
22
  })
23
23
 
24
- const peerDescriptors: PeerDescriptor[] = range(numOfNodes).map(() => {
24
+ const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => {
25
25
  return createMockPeerDescriptor({
26
26
  region: getRandomRegion()
27
27
  })
28
28
  })
29
29
  beforeEach(async () => {
30
-
31
- Simulator.useFakeTimers()
32
30
  const simulator = new Simulator()
33
31
  const entrypointCm = new SimulatorTransport(
34
32
  entrypointDescriptor,
@@ -36,7 +34,7 @@ describe('RandomGraphNode-DhtNode', () => {
36
34
  )
37
35
  await entrypointCm.start()
38
36
 
39
- const cms: ConnectionManager[] = range(numOfNodes).map((i) =>
37
+ const cms: ConnectionManager[] = range(nodeCount).map((i) =>
40
38
  new SimulatorTransport(
41
39
  peerDescriptors[i],
42
40
  simulator
@@ -50,19 +48,20 @@ describe('RandomGraphNode-DhtNode', () => {
50
48
  serviceId: streamPartId
51
49
  })
52
50
 
53
- layer1Nodes = range(numOfNodes).map((i) => new DhtNode({
51
+ layer1Nodes = range(nodeCount).map((i) => new DhtNode({
54
52
  transport: cms[i],
55
53
  peerDescriptor: peerDescriptors[i],
56
54
  serviceId: streamPartId
57
55
  }))
58
56
 
59
- graphNodes = range(numOfNodes).map((i) => createRandomGraphNode({
57
+ graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
60
58
  streamPartId,
61
59
  layer1Node: layer1Nodes[i],
62
60
  transport: cms[i],
63
61
  connectionLocker: cms[i],
64
62
  localPeerDescriptor: peerDescriptors[i],
65
- neighborUpdateInterval: 2000
63
+ neighborUpdateInterval: 2000,
64
+ isLocalNodeEntryPoint: () => false
66
65
  }))
67
66
 
68
67
  entryPointRandomGraphNode = createRandomGraphNode({
@@ -71,7 +70,8 @@ describe('RandomGraphNode-DhtNode', () => {
71
70
  transport: entrypointCm,
72
71
  connectionLocker: entrypointCm,
73
72
  localPeerDescriptor: entrypointDescriptor,
74
- neighborUpdateInterval: 2000
73
+ neighborUpdateInterval: 2000,
74
+ isLocalNodeEntryPoint: () => false
75
75
  })
76
76
 
77
77
  await dhtEntryPoint.start()
@@ -84,7 +84,6 @@ describe('RandomGraphNode-DhtNode', () => {
84
84
  entryPointRandomGraphNode.stop()
85
85
  await Promise.all(layer1Nodes.map((node) => node.stop()))
86
86
  await Promise.all(graphNodes.map((node) => node.stop()))
87
- Simulator.useFakeTimers(false)
88
87
  })
89
88
 
90
89
  it('happy path single node ', async () => {
@@ -93,9 +92,9 @@ describe('RandomGraphNode-DhtNode', () => {
93
92
 
94
93
  await graphNodes[0].start()
95
94
 
96
- await waitForCondition(() => graphNodes[0].getTargetNeighborIds().length === 1)
95
+ await waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
97
96
  expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
98
- expect(graphNodes[0].getTargetNeighborIds().length).toEqual(1)
97
+ expect(graphNodes[0].getNeighbors().length).toEqual(1)
99
98
  })
100
99
 
101
100
  it('happy path 4 nodes', async () => {
@@ -105,10 +104,10 @@ describe('RandomGraphNode-DhtNode', () => {
105
104
  await layer1Nodes[i].joinDht([entrypointDescriptor])
106
105
  }))
107
106
 
108
- await waitForCondition(() => range(4).every((i) => graphNodes[i].getTargetNeighborIds().length === 4))
107
+ await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length === 4))
109
108
  range(4).forEach((i) => {
110
109
  expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
111
- expect(graphNodes[i].getTargetNeighborIds().length).toBeGreaterThanOrEqual(4)
110
+ expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
112
111
  })
113
112
 
114
113
  // Check bidirectionality
@@ -119,36 +118,39 @@ describe('RandomGraphNode-DhtNode', () => {
119
118
  const neighbor = allNodes.find((node) => {
120
119
  return node.getOwnNodeId() === nodeId
121
120
  })
122
- expect(neighbor!.getTargetNeighborIds().includes(allNodes[i].getOwnNodeId())).toEqual(true)
121
+ const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
122
+ expect(neighborIds.includes(allNodes[i].getOwnNodeId())).toEqual(true)
123
123
  })
124
124
  })
125
125
  }, 10000)
126
126
 
127
127
  it('happy path 64 nodes', async () => {
128
- await Promise.all(range(numOfNodes).map((i) => graphNodes[i].start()))
129
- await Promise.all(range(numOfNodes).map((i) => {
128
+ await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
129
+ await Promise.all(range(nodeCount).map((i) => {
130
130
  layer1Nodes[i].joinDht([entrypointDescriptor])
131
131
  }))
132
132
  await Promise.all(graphNodes.map((node) =>
133
- waitForCondition(() => node.getTargetNeighborIds().length >= 4, 10000)
133
+ waitForCondition(() => node.getNeighbors().length >= 4, 10000)
134
134
  ))
135
135
 
136
136
  const avg = graphNodes.reduce((acc, curr) => {
137
- return acc + curr.getTargetNeighborIds().length
138
- }, 0) / numOfNodes
137
+ return acc + curr.getNeighbors().length
138
+ }, 0) / nodeCount
139
139
 
140
140
  logger.info(`AVG Number of neighbors: ${avg}`)
141
141
  await Promise.all(graphNodes.map((node) =>
142
- waitForCondition(() => node.getNumberOfOutgoingHandshakes() === 0)
142
+ waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
143
143
  ))
144
144
  await waitForCondition(() => {
145
145
  let mismatchCounter = 0
146
146
  graphNodes.forEach((node) => {
147
147
  const nodeId = node.getOwnNodeId()
148
- node.getTargetNeighborIds().forEach((neighborId) => {
148
+ node.getNeighbors().forEach((neighbor) => {
149
+ const neighborId = getNodeIdFromPeerDescriptor(neighbor)
149
150
  if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
150
151
  const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
151
- if (!neighbor!.getTargetNeighborIds().includes(nodeId)) {
152
+ const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
153
+ if (!neighborIds.includes(nodeId)) {
152
154
  mismatchCounter += 1
153
155
  }
154
156
  }
@@ -1,13 +1,7 @@
1
- import {
2
- DhtNode,
3
- PeerDescriptor,
4
- Simulator,
5
- SimulatorTransport,
6
- NodeType
7
- } from '@streamr/dht'
1
+ import { DhtNode, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
8
2
  import { StreamrNode, Events } from '../../src/logic/StreamrNode'
9
3
  import { waitForEvent3, waitForCondition } from '@streamr/utils'
10
- import { createStreamMessage } from '../utils/utils'
4
+ import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
11
5
  import { StreamPartIDUtils } from '@streamr/protocol'
12
6
  import { randomEthereumAddress } from '@streamr/test-utils'
13
7
  import { Layer0Node } from '../../src/logic/Layer0Node'
@@ -21,14 +15,8 @@ describe('StreamrNode', () => {
21
15
  let node1: StreamrNode
22
16
  let node2: StreamrNode
23
17
 
24
- const peerDescriptor1: PeerDescriptor = {
25
- kademliaId: new Uint8Array([1, 2, 3]),
26
- type: NodeType.NODEJS
27
- }
28
- const peerDescriptor2: PeerDescriptor = {
29
- kademliaId: new Uint8Array([1, 1, 1]),
30
- type: NodeType.NODEJS
31
- }
18
+ const peerDescriptor1: PeerDescriptor = createMockPeerDescriptor()
19
+ const peerDescriptor2: PeerDescriptor = createMockPeerDescriptor()
32
20
  const STREAM_PART_ID = StreamPartIDUtils.parse('test#0')
33
21
 
34
22
  const msg = createStreamMessage(
@@ -1,9 +1,9 @@
1
- import { NodeType, PeerDescriptor, Simulator, SimulatorTransport, LatencyType, getRandomRegion } from '@streamr/dht'
1
+ import { PeerDescriptor, Simulator, SimulatorTransport, LatencyType } from '@streamr/dht'
2
2
  import { NetworkStack } from '../../src/NetworkStack'
3
3
  import { streamPartIdToDataKey } from '../../src/logic/EntryPointDiscovery'
4
4
  import { StreamPartIDUtils } from '@streamr/protocol'
5
5
  import { Any } from '../../src/proto/google/protobuf/any'
6
- import { createStreamMessage } from '../utils/utils'
6
+ import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
7
7
  import { waitForCondition } from '@streamr/utils'
8
8
  import { randomEthereumAddress } from '@streamr/test-utils'
9
9
 
@@ -11,35 +11,11 @@ const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
11
11
 
12
12
  describe('Joining stream parts on offline nodes', () => {
13
13
 
14
- const entryPointPeerDescriptor: PeerDescriptor = {
15
- kademliaId: new Uint8Array([1, 2, 3]),
16
- type: NodeType.NODEJS,
17
- region: getRandomRegion()
18
- }
19
-
20
- const node1PeerDescriptor: PeerDescriptor = {
21
- kademliaId: new Uint8Array([1, 1, 1]),
22
- type: NodeType.NODEJS,
23
- region: getRandomRegion()
24
- }
25
-
26
- const node2PeerDescriptor: PeerDescriptor = {
27
- kademliaId: new Uint8Array([2, 2, 2]),
28
- type: NodeType.NODEJS,
29
- region: getRandomRegion()
30
- }
31
-
32
- const offlineDescriptor1: PeerDescriptor = {
33
- kademliaId: new Uint8Array([3, 3, 3]),
34
- type: NodeType.NODEJS,
35
- region: getRandomRegion()
36
- }
37
-
38
- const offlineDescriptor2: PeerDescriptor = {
39
- kademliaId: new Uint8Array([4, 4, 4]),
40
- type: NodeType.NODEJS,
41
- region: getRandomRegion()
42
- }
14
+ const entryPointPeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
15
+ const node1PeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
16
+ const node2PeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
17
+ const offlineDescriptor1: PeerDescriptor = createMockPeerDescriptor()
18
+ const offlineDescriptor2: PeerDescriptor = createMockPeerDescriptor()
43
19
 
44
20
  let entryPoint: NetworkStack
45
21
  let node1: NetworkStack
@@ -1,7 +1,10 @@
1
- import { LatencyType, NodeType, PeerDescriptor, Simulator, SimulatorTransport, getRandomRegion } from '@streamr/dht'
1
+ import { LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
2
2
  import {
3
+ ContentType,
4
+ EncryptionType,
3
5
  MessageID,
4
6
  MessageRef,
7
+ SignatureType,
5
8
  StreamMessage,
6
9
  StreamMessageType,
7
10
  StreamPartIDUtils
@@ -18,12 +21,8 @@ describe('stream without default entrypoints', () => {
18
21
 
19
22
  let entrypoint: NetworkNode
20
23
  let nodes: NetworkNode[]
21
- let numOfReceivedMessages: number
22
- const entryPointPeerDescriptor: PeerDescriptor = {
23
- kademliaId: new Uint8Array([1, 2, 3]),
24
- type: NodeType.NODEJS,
25
- region: getRandomRegion()
26
- }
24
+ let receivedMessageCount: number
25
+ const entryPointPeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
27
26
 
28
27
  const streamMessage = new StreamMessage({
29
28
  messageId: new MessageID(
@@ -39,14 +38,16 @@ describe('stream without default entrypoints', () => {
39
38
  hello: 'world'
40
39
  })),
41
40
  messageType: StreamMessageType.MESSAGE,
41
+ contentType: ContentType.JSON,
42
+ encryptionType: EncryptionType.NONE,
43
+ signatureType: SignatureType.SECP256K1,
42
44
  signature: hexToBinary('0x1234'),
43
45
  })
44
46
 
45
47
  beforeEach(async () => {
46
- Simulator.useFakeTimers()
47
48
  const simulator = new Simulator(LatencyType.REAL)
48
49
  nodes = []
49
- numOfReceivedMessages = 0
50
+ receivedMessageCount = 0
50
51
  const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
51
52
  await entryPointTransport.start()
52
53
  entrypoint = createNetworkNode({
@@ -76,43 +77,41 @@ describe('stream without default entrypoints', () => {
76
77
  afterEach(async () => {
77
78
  await entrypoint.stop()
78
79
  await Promise.all(nodes.map((node) => node.stop()))
79
- Simulator.useFakeTimers(false)
80
80
  })
81
81
 
82
82
  it('can join stream without configured entrypoints one by one', async () => {
83
83
  await nodes[0].join(STREAM_PART_ID)
84
84
  nodes[0].addMessageListener((_msg) => {
85
- numOfReceivedMessages += 1
85
+ receivedMessageCount += 1
86
86
  })
87
87
  await Promise.all([
88
- waitForCondition(() => numOfReceivedMessages === 1, 10000),
88
+ waitForCondition(() => receivedMessageCount === 1, 10000),
89
89
  nodes[1].broadcast(streamMessage)
90
90
  ])
91
91
  })
92
92
 
93
93
  it('can join without configured entrypoints simultaneously', async () => {
94
94
  nodes[0].addMessageListener((_msg) => {
95
- numOfReceivedMessages += 1
95
+ receivedMessageCount += 1
96
96
  })
97
97
  await Promise.all([
98
- waitForCondition(() => numOfReceivedMessages === 1, 15000),
98
+ waitForCondition(() => receivedMessageCount === 1, 15000),
99
99
  nodes[0].join(STREAM_PART_ID),
100
100
  nodes[1].broadcast(streamMessage),
101
101
  ])
102
102
  })
103
103
 
104
104
  it('multiple nodes can join without configured entrypoints simultaneously', async () => {
105
- const numOfSubscribers = 8
106
- await Promise.all(range(numOfSubscribers).map(async (i) => {
105
+ const subscriberCount = 8
106
+ await Promise.all(range(subscriberCount).map(async (i) => {
107
107
  await nodes[i].join(STREAM_PART_ID, { minCount: 4, timeout: 15000 })
108
- nodes[i].addMessageListener((_msg) => {
109
- numOfReceivedMessages += 1
108
+ nodes[i].addMessageListener(() => {
109
+ receivedMessageCount += 1
110
110
  })
111
111
  }))
112
- await Promise.all([
113
- waitForCondition(() => numOfReceivedMessages === numOfSubscribers, 15000),
114
- nodes[9].broadcast(streamMessage)
115
- ])
112
+ const nonjoinedNode = nodes[subscriberCount]
113
+ await nonjoinedNode.broadcast(streamMessage)
114
+ await waitForCondition(() => receivedMessageCount === subscriberCount, 15000)
116
115
  }, 45000)
117
116
 
118
117
  it('nodes store themselves as entrypoints on streamPart if number of entrypoints is low', async () => {
@@ -120,7 +119,7 @@ describe('stream without default entrypoints', () => {
120
119
  await nodes[i].join(STREAM_PART_ID, { minCount: (i > 0) ? 1 : 0, timeout: 15000 })
121
120
  }
122
121
  await waitForCondition(async () => {
123
- const entryPointData = await nodes[15].stack.getLayer0Node().getDataFromDht(streamPartIdToDataKey(STREAM_PART_ID))
122
+ const entryPointData = await nodes[15].stack.getLayer0Node().fetchDataFromDht(streamPartIdToDataKey(STREAM_PART_ID))
124
123
  return entryPointData.length >= 7
125
124
  }, 15000)
126
125
 
@@ -0,0 +1,94 @@
1
+ import { Simulator, SimulatorTransport, LatencyType } from '@streamr/dht'
2
+ import { NetworkStack } from '../../src/NetworkStack'
3
+ import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
4
+ import { ENTRYPOINT_STORE_LIMIT } from '../../src/logic/EntryPointDiscovery'
5
+ import { range } from 'lodash'
6
+ import { StreamPartIDUtils } from '@streamr/protocol'
7
+ import { waitForCondition } from '@streamr/utils'
8
+ import { randomEthereumAddress } from '@streamr/test-utils'
9
+
10
+ describe('Stream Entry Points are replaced when known entry points leave streams', () => {
11
+
12
+ let simulator: Simulator
13
+ let layer0EntryPoint: NetworkStack
14
+ const entryPointPeerDescriptor = createMockPeerDescriptor()
15
+ let initialNodesOnStream: NetworkStack[]
16
+ let laterNodesOnStream: NetworkStack[]
17
+ let newNodeInStream: NetworkStack
18
+
19
+ const NUM_OF_LATER_NODES = 16
20
+
21
+ const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
22
+
23
+ const startNode = async () => {
24
+ const peerDescriptor = createMockPeerDescriptor()
25
+ const transport = new SimulatorTransport(peerDescriptor, simulator)
26
+ await transport.start()
27
+ const node = new NetworkStack({
28
+ layer0: {
29
+ transport,
30
+ peerDescriptor,
31
+ entryPoints: [entryPointPeerDescriptor]
32
+ }
33
+ })
34
+ await node.start()
35
+ return node
36
+ }
37
+
38
+ beforeEach(async () => {
39
+ simulator = new Simulator(LatencyType.REAL)
40
+ const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
41
+ layer0EntryPoint = new NetworkStack({
42
+ layer0: {
43
+ transport: entryPointTransport,
44
+ peerDescriptor: entryPointPeerDescriptor,
45
+ entryPoints: [entryPointPeerDescriptor]
46
+ }
47
+ })
48
+ await entryPointTransport.start()
49
+ await layer0EntryPoint.start()
50
+
51
+ initialNodesOnStream = await Promise.all(range(ENTRYPOINT_STORE_LIMIT).map(async () => {
52
+ return await startNode()
53
+ }))
54
+
55
+ laterNodesOnStream = await Promise.all(range(NUM_OF_LATER_NODES).map(async () => {
56
+ return await startNode()
57
+ }))
58
+ newNodeInStream = await startNode()
59
+ })
60
+
61
+ afterEach(async () => {
62
+ await Promise.all([
63
+ layer0EntryPoint.stop(),
64
+ ...initialNodesOnStream.map((node) => node.stop()),
65
+ ...laterNodesOnStream.map((node) => node.stop()),
66
+ newNodeInStream.stop()
67
+ ])
68
+ simulator.stop()
69
+ })
70
+
71
+ // TODO: Investigate why 60 second timeouts are needed
72
+ it('stream entry points are replaced when nodes leave streams', async () => {
73
+ await Promise.all(initialNodesOnStream.map((node) => node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })))
74
+
75
+ let receivedMessages = 0
76
+ for (const node of laterNodesOnStream) {
77
+ await node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })
78
+ node.getStreamrNode().on('newMessage', () => {
79
+ receivedMessages += 1
80
+ })
81
+ }
82
+
83
+ await Promise.all(initialNodesOnStream.map((node) => node.getStreamrNode().leaveStreamPart(STREAM_PART_ID)))
84
+ await waitForCondition(() => laterNodesOnStream.every((node) => node.getStreamrNode().getNeighbors(STREAM_PART_ID).length >= 4), 60000, 1000)
85
+
86
+ const msg = createStreamMessage(
87
+ JSON.stringify({ hello: 'WORLD' }),
88
+ STREAM_PART_ID,
89
+ randomEthereumAddress()
90
+ )
91
+ newNodeInStream.getStreamrNode().broadcast(msg)
92
+ await waitForCondition(() => receivedMessages === NUM_OF_LATER_NODES, 30000)
93
+ }, 200000)
94
+ })
@@ -50,7 +50,8 @@ describe('DeliveryRpcLocal', () => {
50
50
 
51
51
  it('Server leaveStreamPartNotice()', async () => {
52
52
  const leaveNotice: LeaveStreamPartNotice = {
53
- streamPartId: StreamPartIDUtils.parse('stream#0')
53
+ streamPartId: StreamPartIDUtils.parse('stream#0'),
54
+ isEntryPoint: false
54
55
  }
55
56
  await rpcLocal.leaveStreamPartNotice(leaveNotice, { incomingSourceDescriptor: mockSender } as any)
56
57
  expect(mockOnLeaveNotice).toHaveBeenCalledTimes(1)