@streamr/trackerless-network 100.0.0-testnet-one.3 → 100.0.0-testnet-two.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 (125) hide show
  1. package/dist/package.json +7 -7
  2. package/dist/src/NetworkStack.d.ts +1 -5
  3. package/dist/src/NetworkStack.js +1 -3
  4. package/dist/src/NetworkStack.js.map +1 -1
  5. package/dist/src/logic/DeliveryRpcLocal.d.ts +1 -1
  6. package/dist/src/logic/DeliveryRpcLocal.js +3 -3
  7. package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
  8. package/dist/src/logic/DeliveryRpcRemote.d.ts +3 -3
  9. package/dist/src/logic/DeliveryRpcRemote.js +3 -2
  10. package/dist/src/logic/DeliveryRpcRemote.js.map +1 -1
  11. package/dist/src/logic/EntryPointDiscovery.d.ts +3 -0
  12. package/dist/src/logic/EntryPointDiscovery.js +11 -5
  13. package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
  14. package/dist/src/logic/RandomGraphNode.d.ts +10 -8
  15. package/dist/src/logic/RandomGraphNode.js +23 -17
  16. package/dist/src/logic/RandomGraphNode.js.map +1 -1
  17. package/dist/src/logic/StreamrNode.js +13 -4
  18. package/dist/src/logic/StreamrNode.js.map +1 -1
  19. package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +2 -1
  20. package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -1
  21. package/dist/src/logic/inspect/Inspector.d.ts +5 -11
  22. package/dist/src/logic/inspect/Inspector.js +2 -3
  23. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  24. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +3 -3
  25. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +39 -13
  26. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
  27. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +5 -3
  28. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +18 -8
  29. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
  30. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +1 -6
  31. package/dist/src/logic/neighbor-discovery/Handshaker.js +6 -6
  32. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  33. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +1 -6
  34. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
  35. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +3 -8
  36. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +1 -3
  37. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  38. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +2 -2
  39. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +1 -2
  40. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  41. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +2 -2
  42. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
  43. package/dist/src/logic/proxy/ProxyClient.d.ts +4 -1
  44. package/dist/src/logic/proxy/ProxyClient.js +7 -6
  45. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  46. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +2 -3
  47. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  48. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +2 -2
  49. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
  50. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +2 -2
  51. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  52. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +2 -2
  53. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
  54. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +21 -22
  55. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +18 -18
  56. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  57. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +36 -60
  58. package/dist/src/proto/packages/dht/protos/DhtRpc.js +34 -53
  59. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  60. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +11 -12
  61. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +6 -5
  62. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +2 -2
  63. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
  64. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +26 -10
  65. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +21 -9
  66. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
  67. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +4 -3
  68. package/dist/test/benchmark/first-message.js +4 -6
  69. package/dist/test/benchmark/first-message.js.map +1 -1
  70. package/dist/test/utils/utils.d.ts +1 -1
  71. package/dist/test/utils/utils.js +8 -7
  72. package/dist/test/utils/utils.js.map +1 -1
  73. package/package.json +7 -7
  74. package/protos/NetworkRpc.proto +8 -4
  75. package/src/NetworkStack.ts +1 -7
  76. package/src/logic/DeliveryRpcLocal.ts +4 -4
  77. package/src/logic/DeliveryRpcRemote.ts +5 -4
  78. package/src/logic/EntryPointDiscovery.ts +10 -6
  79. package/src/logic/RandomGraphNode.ts +38 -25
  80. package/src/logic/StreamrNode.ts +22 -5
  81. package/src/logic/formStreamPartDeliveryServiceId.ts +2 -1
  82. package/src/logic/inspect/Inspector.ts +15 -16
  83. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +46 -15
  84. package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +21 -10
  85. package/src/logic/neighbor-discovery/Handshaker.ts +15 -24
  86. package/src/logic/neighbor-discovery/NeighborFinder.ts +1 -7
  87. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +10 -12
  88. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +4 -4
  89. package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +2 -2
  90. package/src/logic/proxy/ProxyClient.ts +19 -7
  91. package/src/logic/proxy/ProxyConnectionRpcLocal.ts +3 -3
  92. package/src/logic/proxy/ProxyConnectionRpcRemote.ts +3 -3
  93. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +3 -2
  94. package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +2 -2
  95. package/src/proto/packages/dht/protos/DhtRpc.client.ts +31 -32
  96. package/src/proto/packages/dht/protos/DhtRpc.server.ts +11 -12
  97. package/src/proto/packages/dht/protos/DhtRpc.ts +49 -80
  98. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +7 -6
  99. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +4 -3
  100. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +36 -15
  101. package/test/benchmark/first-message.ts +8 -6
  102. package/test/end-to-end/random-graph-with-real-connections.test.ts +10 -5
  103. package/test/end-to-end/webrtc-full-node-network.test.ts +1 -1
  104. package/test/end-to-end/websocket-full-node-network.test.ts +2 -2
  105. package/test/integration/DeliveryRpcRemote.test.ts +3 -3
  106. package/test/integration/HandshakeRpcRemote.test.ts +2 -4
  107. package/test/integration/Handshakes.test.ts +8 -7
  108. package/test/integration/Inspect.test.ts +0 -2
  109. package/test/integration/NeighborUpdateRpcRemote.test.ts +2 -2
  110. package/test/integration/NetworkNode.test.ts +0 -2
  111. package/test/integration/NetworkRpc.test.ts +0 -3
  112. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +4 -4
  113. package/test/integration/RandomGraphNode-Layer1Node.test.ts +4 -5
  114. package/test/integration/stream-without-default-entrypoints.test.ts +4 -7
  115. package/test/integration/streamEntryPointReplacing.test.ts +94 -0
  116. package/test/unit/DeliveryRpcLocal.test.ts +2 -1
  117. package/test/unit/EntrypointDiscovery.test.ts +5 -2
  118. package/test/unit/HandshakeRpcLocal.test.ts +47 -9
  119. package/test/unit/NodeList.test.ts +10 -12
  120. package/test/unit/ProxyConnectionRpcRemote.test.ts +18 -10
  121. package/test/unit/RandomGraphNode.test.ts +6 -4
  122. package/test/utils/mock/MockHandshaker.ts +3 -2
  123. package/test/utils/mock/MockNeighborFinder.ts +3 -2
  124. package/test/utils/mock/MockNeighborUpdateManager.ts +3 -2
  125. package/test/utils/utils.ts +16 -8
@@ -31,7 +31,7 @@ const prepareLayer0 = async () => {
31
31
  region: getRandomRegion()
32
32
  })
33
33
  layer0Ep = peerDescriptor
34
- const entryPoint = createNetworkNodeWithSimulator(peerDescriptor, simulator, [peerDescriptor])
34
+ const entryPoint = await createNetworkNodeWithSimulator(peerDescriptor, simulator, [peerDescriptor])
35
35
  await entryPoint.start()
36
36
  nodes.push(entryPoint)
37
37
 
@@ -44,7 +44,7 @@ const prepareStream = async (streamId: string) => {
44
44
  region: getRandomRegion()
45
45
  })
46
46
  const streamPartId = toStreamPartID(toStreamID(streamId), 0)
47
- const streamPublisher = createNetworkNodeWithSimulator(peerDescriptor, simulator, [layer0Ep])
47
+ const streamPublisher = await createNetworkNodeWithSimulator(peerDescriptor, simulator, [layer0Ep])
48
48
  await streamPublisher.start()
49
49
  streamPublisher.join(streamPartId)
50
50
  nodes.push(streamPublisher)
@@ -76,7 +76,7 @@ const measureJoiningTime = async () => {
76
76
  0,
77
77
  i,
78
78
  Math.floor(Math.random() * 20000),
79
- 'node' as any,
79
+ '2222' as any,
80
80
  'msgChainId'
81
81
  ),
82
82
  prevMsgRef: null,
@@ -90,7 +90,11 @@ const measureJoiningTime = async () => {
90
90
  }, 1000)
91
91
  // get random node from network to use as entrypoint
92
92
  const randomNode = nodes[Math.floor(Math.random() * nodes.length)]
93
- const streamSubscriber = createNetworkNodeWithSimulator(peerDescriptor, simulator, [randomNode.stack.getLayer0Node().getLocalPeerDescriptor()])
93
+ const streamSubscriber = await createNetworkNodeWithSimulator(
94
+ peerDescriptor,
95
+ simulator,
96
+ [randomNode.stack.getLayer0Node().getLocalPeerDescriptor()]
97
+ )
94
98
  currentNode = streamSubscriber
95
99
  const start = performance.now()
96
100
  await streamSubscriber.start()
@@ -109,7 +113,6 @@ const measureJoiningTime = async () => {
109
113
  }
110
114
 
111
115
  const run = async () => {
112
- Simulator.useFakeTimers()
113
116
  await prepareLayer0()
114
117
  for (let i = 0; i < 20; i++) {
115
118
  await prepareStream(`stream-${i}`)
@@ -124,7 +127,6 @@ const run = async () => {
124
127
  }
125
128
  fs.closeSync(logFile)
126
129
  await shutdownNetwork()
127
- Simulator.useFakeTimers(false)
128
130
  }
129
131
 
130
132
  // eslint-disable-next-line promise/catch-or-return, promise/always-return
@@ -50,7 +50,8 @@ describe('random graph with real connections', () => {
50
50
  layer1Node: epDhtNode,
51
51
  transport: epDhtNode.getTransport(),
52
52
  connectionLocker: epDhtNode.getTransport() as ConnectionManager,
53
- localPeerDescriptor: epPeerDescriptor
53
+ localPeerDescriptor: epPeerDescriptor,
54
+ isLocalNodeEntryPoint: () => false
54
55
  }
55
56
  )
56
57
  randomGraphNode2 = createRandomGraphNode({
@@ -58,28 +59,32 @@ describe('random graph with real connections', () => {
58
59
  layer1Node: dhtNode1,
59
60
  transport: dhtNode1.getTransport(),
60
61
  connectionLocker: dhtNode1.getTransport() as ConnectionManager,
61
- localPeerDescriptor: dhtNode1.getLocalPeerDescriptor()
62
+ localPeerDescriptor: dhtNode1.getLocalPeerDescriptor(),
63
+ isLocalNodeEntryPoint: () => false
62
64
  })
63
65
  randomGraphNode3 = createRandomGraphNode({
64
66
  streamPartId,
65
67
  layer1Node: dhtNode2,
66
68
  transport: dhtNode2.getTransport(),
67
69
  connectionLocker: dhtNode2.getTransport() as ConnectionManager,
68
- localPeerDescriptor: dhtNode2.getLocalPeerDescriptor()
70
+ localPeerDescriptor: dhtNode2.getLocalPeerDescriptor(),
71
+ isLocalNodeEntryPoint: () => false
69
72
  })
70
73
  randomGraphNode4 = createRandomGraphNode({
71
74
  streamPartId,
72
75
  layer1Node: dhtNode3,
73
76
  transport: dhtNode3.getTransport(),
74
77
  connectionLocker: dhtNode3.getTransport() as ConnectionManager,
75
- localPeerDescriptor: dhtNode3.getLocalPeerDescriptor()
78
+ localPeerDescriptor: dhtNode3.getLocalPeerDescriptor(),
79
+ isLocalNodeEntryPoint: () => false
76
80
  })
77
81
  randomGraphNode5 = createRandomGraphNode({
78
82
  streamPartId,
79
83
  layer1Node: dhtNode4,
80
84
  transport: dhtNode4.getTransport(),
81
85
  connectionLocker: dhtNode4.getTransport() as ConnectionManager,
82
- localPeerDescriptor: dhtNode4.getLocalPeerDescriptor()
86
+ localPeerDescriptor: dhtNode4.getLocalPeerDescriptor(),
87
+ isLocalNodeEntryPoint: () => false
83
88
  })
84
89
  await epDhtNode.joinDht([epPeerDescriptor])
85
90
  await Promise.all([
@@ -65,7 +65,7 @@ describe('Full node network with WebRTC connections', () => {
65
65
  waitForCondition(() => {
66
66
  return node.getStreamrNode()!.getNeighbors(streamPartId).length >= 3
67
67
  }
68
- , 120000)
68
+ , 30000)
69
69
  ))
70
70
  let numOfMessagesReceived = 0
71
71
  const successIds: string[] = []
@@ -8,7 +8,7 @@ import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
8
8
 
9
9
  describe('Full node network with WebSocket connections only', () => {
10
10
 
11
- const NUM_OF_NODES = 48
11
+ const NUM_OF_NODES = 32
12
12
  const epPeerDescriptor = createMockPeerDescriptor({
13
13
  websocket: { host: '127.0.0.1', port: 15555, tls: false }
14
14
  })
@@ -62,7 +62,7 @@ describe('Full node network with WebSocket connections only', () => {
62
62
  waitForCondition(() => {
63
63
  return node.getStreamrNode()!.getNeighbors(streamPartId).length >= 4
64
64
  }
65
- , 120000)
65
+ , 30000)
66
66
  ))
67
67
  let numOfMessagesReceived = 0
68
68
  const successIds: string[] = []
@@ -13,7 +13,6 @@ import {
13
13
  } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
14
14
  import { Empty } from '../../src/proto/google/protobuf/empty'
15
15
  import { waitForCondition } from '@streamr/utils'
16
- import { toProtoRpcClient } from '@streamr/proto-rpc'
17
16
  import { createStreamMessage } from '../utils/utils'
18
17
  import { StreamPartIDUtils } from '@streamr/protocol'
19
18
  import { randomEthereumAddress } from '@streamr/test-utils'
@@ -73,7 +72,8 @@ describe('DeliveryRpcRemote', () => {
73
72
  clientNode,
74
73
  serverNode,
75
74
  STREAM_PART_ID,
76
- toProtoRpcClient(new DeliveryRpcClient(clientRpc.getRpcClientTransport()))
75
+ clientRpc,
76
+ DeliveryRpcClient
77
77
  )
78
78
  })
79
79
 
@@ -97,7 +97,7 @@ describe('DeliveryRpcRemote', () => {
97
97
  })
98
98
 
99
99
  it('leaveNotice', async () => {
100
- rpcRemote.leaveStreamPartNotice()
100
+ rpcRemote.leaveStreamPartNotice(false)
101
101
  await waitForCondition(() => recvCounter === 1)
102
102
  })
103
103
 
@@ -9,7 +9,6 @@ import {
9
9
  Simulator,
10
10
  SimulatorTransport
11
11
  } from '@streamr/dht'
12
- import { toProtoRpcClient } from '@streamr/proto-rpc'
13
12
  import {
14
13
  HandshakeRpcClient,
15
14
  } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
@@ -34,7 +33,6 @@ describe('HandshakeRpcRemote', () => {
34
33
  let mockConnectionManager2: SimulatorTransport
35
34
 
36
35
  beforeEach(async () => {
37
- Simulator.useFakeTimers()
38
36
  simulator = new Simulator()
39
37
  mockConnectionManager1 = new SimulatorTransport(serverNode, simulator)
40
38
  await mockConnectionManager1.start()
@@ -61,7 +59,8 @@ describe('HandshakeRpcRemote', () => {
61
59
  clientNode,
62
60
  serverNode,
63
61
  'test-stream-part',
64
- toProtoRpcClient(new HandshakeRpcClient(clientRpc.getRpcClientTransport()))
62
+ clientRpc,
63
+ HandshakeRpcClient
65
64
  )
66
65
  })
67
66
 
@@ -71,7 +70,6 @@ describe('HandshakeRpcRemote', () => {
71
70
  await mockConnectionManager1.stop()
72
71
  await mockConnectionManager2.stop()
73
72
  simulator.stop()
74
- Simulator.useFakeTimers(false)
75
73
  })
76
74
 
77
75
  it('handshake', async () => {
@@ -6,7 +6,6 @@ import {
6
6
  Simulator,
7
7
  SimulatorTransport
8
8
  } from '@streamr/dht'
9
- import { toProtoRpcClient } from '@streamr/proto-rpc'
10
9
  import {
11
10
  HandshakeRpcClient
12
11
  } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
@@ -70,7 +69,6 @@ describe('Handshakes', () => {
70
69
  let simulatorTransport3: SimulatorTransport
71
70
 
72
71
  beforeEach(async () => {
73
- Simulator.useFakeTimers()
74
72
  simulator = new Simulator()
75
73
  simulatorTransport1 = new SimulatorTransport(peerDescriptor1, simulator)
76
74
  await simulatorTransport1.start()
@@ -107,7 +105,6 @@ describe('Handshakes', () => {
107
105
  await simulatorTransport2.stop()
108
106
  await simulatorTransport3.stop()
109
107
  simulator.stop()
110
- Simulator.useFakeTimers(false)
111
108
  })
112
109
 
113
110
  it('Two nodes can handshake', async () => {
@@ -118,7 +115,8 @@ describe('Handshakes', () => {
118
115
  peerDescriptor2,
119
116
  peerDescriptor1,
120
117
  streamPartId,
121
- toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport()))
118
+ rpcCommunicator2,
119
+ HandshakeRpcClient
122
120
  )
123
121
  )
124
122
  expect(res).toEqual(true)
@@ -133,7 +131,8 @@ describe('Handshakes', () => {
133
131
  peerDescriptor2,
134
132
  peerDescriptor1,
135
133
  streamPartId,
136
- toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport()))
134
+ rpcCommunicator2,
135
+ HandshakeRpcClient
137
136
  )
138
137
  )
139
138
  expect(res).toEqual(true)
@@ -148,7 +147,8 @@ describe('Handshakes', () => {
148
147
  peerDescriptor2,
149
148
  peerDescriptor1,
150
149
  streamPartId,
151
- toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport()))
150
+ rpcCommunicator2,
151
+ HandshakeRpcClient
152
152
  )
153
153
  )
154
154
  expect(res).toEqual(false)
@@ -164,7 +164,8 @@ describe('Handshakes', () => {
164
164
  peerDescriptor2,
165
165
  peerDescriptor1,
166
166
  streamPartId,
167
- toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport()))
167
+ rpcCommunicator2,
168
+ HandshakeRpcClient
168
169
  )
169
170
  )
170
171
  expect(res).toEqual(true)
@@ -38,7 +38,6 @@ describe('inspect', () => {
38
38
  }
39
39
 
40
40
  beforeEach(async () => {
41
- Simulator.useFakeTimers()
42
41
  simulator = new Simulator(LatencyType.REAL)
43
42
 
44
43
  publisherNode = await initiateNode(publisherDescriptor, simulator)
@@ -65,7 +64,6 @@ describe('inspect', () => {
65
64
  inspectorNode.stop(),
66
65
  ...inspectedNodes.map((node) => node.stop())
67
66
  ])
68
- Simulator.useFakeTimers(false)
69
67
  })
70
68
 
71
69
  it('gets successful inspections from all suspects', async () => {
@@ -5,7 +5,6 @@ import {
5
5
  Simulator,
6
6
  SimulatorTransport
7
7
  } from '@streamr/dht'
8
- import { toProtoRpcClient } from '@streamr/proto-rpc'
9
8
  import { NeighborUpdateRpcRemote } from '../../src/logic/neighbor-discovery/NeighborUpdateRpcRemote'
10
9
  import { NeighborUpdate } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
11
10
  import {
@@ -64,7 +63,8 @@ describe('NeighborUpdateRpcRemote', () => {
64
63
  clientNode,
65
64
  serverNode,
66
65
  'test-stream-part',
67
- toProtoRpcClient(new NeighborUpdateRpcClient(clientRpc.getRpcClientTransport()))
66
+ clientRpc,
67
+ NeighborUpdateRpcClient
68
68
  )
69
69
  })
70
70
 
@@ -30,7 +30,6 @@ describe('NetworkNode', () => {
30
30
  }
31
31
 
32
32
  beforeEach(async () => {
33
- Simulator.useFakeTimers()
34
33
  const simulator = new Simulator()
35
34
  transport1 = new SimulatorTransport(pd1, simulator)
36
35
  await transport1.start()
@@ -63,7 +62,6 @@ describe('NetworkNode', () => {
63
62
  node1.stop(),
64
63
  node2.stop()
65
64
  ])
66
- Simulator.useFakeTimers(false)
67
65
  })
68
66
 
69
67
  it('wait for join + broadcast and subscribe', async () => {
@@ -9,7 +9,6 @@ import { waitForCondition } from '@streamr/utils'
9
9
  import { Empty } from '../../src/proto/google/protobuf/empty'
10
10
  import { createStreamMessage } from '../utils/utils'
11
11
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
12
- import { Simulator } from '@streamr/dht'
13
12
  import { StreamPartIDUtils } from '@streamr/protocol'
14
13
  import { randomEthereumAddress } from '@streamr/test-utils'
15
14
 
@@ -20,7 +19,6 @@ describe('Network RPC', () => {
20
19
  let recvCounter = 0
21
20
 
22
21
  beforeEach(() => {
23
- Simulator.useFakeTimers()
24
22
  rpcCommunicator1 = new RpcCommunicator()
25
23
  rpcCommunicator2 = new RpcCommunicator()
26
24
  rpcCommunicator1.on('outgoingMessage', (message: RpcMessage) => {
@@ -40,7 +38,6 @@ describe('Network RPC', () => {
40
38
  afterEach(() => {
41
39
  rpcCommunicator1.stop()
42
40
  rpcCommunicator2.stop()
43
- Simulator.useFakeTimers(false)
44
41
  })
45
42
 
46
43
  it('sends Data', async () => {
@@ -19,7 +19,6 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
19
19
 
20
20
  const peerDescriptors: PeerDescriptor[] = range(numOfNodes).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
24
  const cms: SimulatorTransport[] = range(numOfNodes).map((i) =>
@@ -43,14 +42,16 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
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 () => {
@@ -27,8 +27,6 @@ describe('RandomGraphNode-DhtNode', () => {
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,
@@ -62,7 +60,8 @@ describe('RandomGraphNode-DhtNode', () => {
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 () => {
@@ -43,7 +43,6 @@ describe('stream without default entrypoints', () => {
43
43
  })
44
44
 
45
45
  beforeEach(async () => {
46
- Simulator.useFakeTimers()
47
46
  const simulator = new Simulator(LatencyType.REAL)
48
47
  nodes = []
49
48
  numOfReceivedMessages = 0
@@ -76,7 +75,6 @@ describe('stream without default entrypoints', () => {
76
75
  afterEach(async () => {
77
76
  await entrypoint.stop()
78
77
  await Promise.all(nodes.map((node) => node.stop()))
79
- Simulator.useFakeTimers(false)
80
78
  })
81
79
 
82
80
  it('can join stream without configured entrypoints one by one', async () => {
@@ -105,14 +103,13 @@ describe('stream without default entrypoints', () => {
105
103
  const numOfSubscribers = 8
106
104
  await Promise.all(range(numOfSubscribers).map(async (i) => {
107
105
  await nodes[i].join(STREAM_PART_ID, { minCount: 4, timeout: 15000 })
108
- nodes[i].addMessageListener((_msg) => {
106
+ nodes[i].addMessageListener(() => {
109
107
  numOfReceivedMessages += 1
110
108
  })
111
109
  }))
112
- await Promise.all([
113
- waitForCondition(() => numOfReceivedMessages === numOfSubscribers, 15000),
114
- nodes[9].broadcast(streamMessage)
115
- ])
110
+ const nonjoinedNode = nodes[numOfSubscribers]
111
+ await nonjoinedNode.broadcast(streamMessage)
112
+ await waitForCondition(() => numOfReceivedMessages === numOfSubscribers, 15000)
116
113
  }, 45000)
117
114
 
118
115
  it('nodes store themselves as entrypoints on streamPart if number of entrypoints is low', async () => {
@@ -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
+ it('stream entry points are replaced when nodes leave streams', async () => {
72
+ // TODO: Investigate why CI needs more than 15 seconds to find 4 neighbors for the stream.
73
+ await Promise.all(initialNodesOnStream.map((node) => node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 30000 })))
74
+
75
+ let receivedMessages = 0
76
+ for (const node of laterNodesOnStream) {
77
+ await node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 30000 })
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), 30000, 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, 15000)
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)
@@ -22,7 +22,7 @@ describe('EntryPointDiscovery', () => {
22
22
  const fakeData: DataEntry = {
23
23
  key: Uint8Array.from([1, 2, 3]),
24
24
  data: Any.pack(peerDescriptor, PeerDescriptor),
25
- creator: peerDescriptor,
25
+ creator: peerDescriptor.nodeId,
26
26
  ttl: 1000,
27
27
  stale: false,
28
28
  deleted: false
@@ -31,7 +31,7 @@ describe('EntryPointDiscovery', () => {
31
31
  const fakeDeletedData: DataEntry = {
32
32
  key: Uint8Array.from([1, 2, 3]),
33
33
  data: Any.pack(deletedPeerDescriptor, PeerDescriptor),
34
- creator: deletedPeerDescriptor,
34
+ creator: deletedPeerDescriptor.nodeId,
35
35
  ttl: 1000,
36
36
  stale: false,
37
37
  deleted: true
@@ -112,17 +112,20 @@ describe('EntryPointDiscovery', () => {
112
112
  it('store on empty stream', async () => {
113
113
  await entryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(0)
114
114
  expect(storeCalled).toEqual(1)
115
+ expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
115
116
  })
116
117
 
117
118
  it('store on stream without saturated entrypoint count', async () => {
118
119
  addNodesToStreamPart(layer1Node, 4)
119
120
  await entryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(0)
120
121
  expect(storeCalled).toEqual(1)
122
+ expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
121
123
  })
122
124
 
123
125
  it('will keep stored until destroyed', async () => {
124
126
  await entryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(0)
125
127
  expect(storeCalled).toEqual(1)
128
+ expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
126
129
  await wait(4500)
127
130
  await entryPointDiscoveryWithData.destroy()
128
131
  // we have configured storeInterval to 2 seconds, i.e. after 4.5 seconds it should have been called 2 more items