@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
@@ -20,24 +20,24 @@ describe('EntryPointDiscovery', () => {
20
20
  const deletedPeerDescriptor = createMockPeerDescriptor()
21
21
 
22
22
  const fakeData: DataEntry = {
23
+ key: Uint8Array.from([1, 2, 3]),
23
24
  data: Any.pack(peerDescriptor, PeerDescriptor),
25
+ creator: peerDescriptor.nodeId,
24
26
  ttl: 1000,
25
- storer: peerDescriptor,
26
- kademliaId: Uint8Array.from([1, 2, 3]),
27
27
  stale: false,
28
28
  deleted: false
29
29
  }
30
30
 
31
31
  const fakeDeletedData: DataEntry = {
32
+ key: Uint8Array.from([1, 2, 3]),
32
33
  data: Any.pack(deletedPeerDescriptor, PeerDescriptor),
34
+ creator: deletedPeerDescriptor.nodeId,
33
35
  ttl: 1000,
34
- storer: deletedPeerDescriptor,
35
- kademliaId: Uint8Array.from([1, 2, 3]),
36
36
  stale: false,
37
37
  deleted: true
38
38
  }
39
39
 
40
- const fakeGetEntryPointData = async (): Promise<DataEntry[]> => {
40
+ const fakeFetchEntryPointData = async (): Promise<DataEntry[]> => {
41
41
  return [fakeData, fakeDeletedData]
42
42
  }
43
43
 
@@ -46,7 +46,7 @@ describe('EntryPointDiscovery', () => {
46
46
  return [peerDescriptor]
47
47
  }
48
48
 
49
- const fakeEmptyGetEntryPointData = async (): Promise<DataEntry[]> => {
49
+ const fakeEmptyFetchEntryPointData = async (): Promise<DataEntry[]> => {
50
50
  return []
51
51
  }
52
52
 
@@ -70,7 +70,7 @@ describe('EntryPointDiscovery', () => {
70
70
  localPeerDescriptor: peerDescriptor,
71
71
  streamPartId: STREAM_PART_ID,
72
72
  layer1Node,
73
- getEntryPointData: fakeGetEntryPointData,
73
+ fetchEntryPointData: fakeFetchEntryPointData,
74
74
  storeEntryPointData: fakeStoreEntryPointData,
75
75
  deleteEntryPointData: fakeDeleteEntryPointData,
76
76
  storeInterval: 2000
@@ -79,7 +79,7 @@ describe('EntryPointDiscovery', () => {
79
79
  localPeerDescriptor: peerDescriptor,
80
80
  streamPartId: STREAM_PART_ID,
81
81
  layer1Node,
82
- getEntryPointData: fakeEmptyGetEntryPointData,
82
+ fetchEntryPointData: fakeEmptyFetchEntryPointData,
83
83
  storeEntryPointData: fakeStoreEntryPointData,
84
84
  deleteEntryPointData: fakeDeleteEntryPointData,
85
85
  storeInterval: 2000
@@ -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
@@ -15,7 +15,7 @@ describe('GroupKeyResponseTranslator', () => {
15
15
  })
16
16
  const newGroupKey: GroupKey = {
17
17
  id: 'id',
18
- data: hexToBinary('0000')!
18
+ data: hexToBinary('0000')
19
19
  }
20
20
  const newGroupKeyResponse: GroupKeyResponse = {
21
21
  requestId: 'request',
@@ -1,10 +1,8 @@
1
- import { NodeType } from '@streamr/dht'
2
- import { hexToBinary } from '@streamr/utils'
3
- import { NodeID, getNodeIdFromPeerDescriptor } from '../../src/identifiers'
1
+ import { DhtAddress, NodeType, getNodeIdFromPeerDescriptor, getRawFromDhtAddress } from '@streamr/dht'
4
2
  import { NodeList } from '../../src/logic/NodeList'
5
3
  import { HandshakeRpcLocal } from '../../src/logic/neighbor-discovery/HandshakeRpcLocal'
6
- import { InterleaveNotice, StreamPartHandshakeRequest } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
7
- import { createMockPeerDescriptor, createMockHandshakeRpcRemote, createMockDeliveryRpcRemote, mockConnectionLocker } from '../utils/utils'
4
+ import { InterleaveRequest, StreamPartHandshakeRequest } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
5
+ import { createMockPeerDescriptor, createMockHandshakeRpcRemote, createMockDeliveryRpcRemote } from '../utils/utils'
8
6
  import { StreamPartIDUtils } from '@streamr/protocol'
9
7
 
10
8
  const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
@@ -15,27 +13,28 @@ describe('HandshakeRpcLocal', () => {
15
13
 
16
14
  const localPeerDescriptor = createMockPeerDescriptor()
17
15
 
18
- let targetNeighbors: NodeList
19
- let ongoingHandshakes: Set<NodeID>
16
+ let neighbors: NodeList
17
+ let ongoingHandshakes: Set<DhtAddress>
18
+ let ongoingInterleaves: Set<DhtAddress>
20
19
  let handshakeWithInterleaving: jest.Mock
21
20
 
22
21
  beforeEach(() => {
23
- targetNeighbors = new NodeList(getNodeIdFromPeerDescriptor(localPeerDescriptor), 10)
22
+ neighbors = new NodeList(getNodeIdFromPeerDescriptor(localPeerDescriptor), 10)
24
23
  ongoingHandshakes = new Set()
25
-
24
+ ongoingInterleaves = new Set()
26
25
  handshakeWithInterleaving = jest.fn()
27
26
 
28
27
  rpcLocal = new HandshakeRpcLocal({
29
28
  streamPartId: STREAM_PART_ID,
30
- connectionLocker: mockConnectionLocker,
31
29
  ongoingHandshakes,
30
+ ongoingInterleaves,
32
31
  createRpcRemote: (_p) => createMockHandshakeRpcRemote(),
33
32
  createDeliveryRpcRemote: (_p) => createMockDeliveryRpcRemote(),
34
33
  handshakeWithInterleaving: async (_p, _t) => {
35
34
  handshakeWithInterleaving()
36
35
  return true
37
36
  },
38
- targetNeighbors,
37
+ neighbors,
39
38
  maxNeighborCount: 4
40
39
  })
41
40
  })
@@ -54,10 +53,10 @@ describe('HandshakeRpcLocal', () => {
54
53
  })
55
54
 
56
55
  it('handshake interleave', async () => {
57
- targetNeighbors.add(createMockDeliveryRpcRemote())
58
- targetNeighbors.add(createMockDeliveryRpcRemote())
59
- targetNeighbors.add(createMockDeliveryRpcRemote())
60
- targetNeighbors.add(createMockDeliveryRpcRemote())
56
+ neighbors.add(createMockDeliveryRpcRemote())
57
+ neighbors.add(createMockDeliveryRpcRemote())
58
+ neighbors.add(createMockDeliveryRpcRemote())
59
+ neighbors.add(createMockDeliveryRpcRemote())
61
60
  const req = StreamPartHandshakeRequest.create({
62
61
  streamPartId: STREAM_PART_ID,
63
62
  requestId: 'requestId'
@@ -70,10 +69,10 @@ describe('HandshakeRpcLocal', () => {
70
69
  })
71
70
 
72
71
  it('unaccepted handshake', async () => {
73
- ongoingHandshakes.add('0x2222' as NodeID)
74
- ongoingHandshakes.add('0x3333' as NodeID)
75
- ongoingHandshakes.add('0x4444' as NodeID)
76
- ongoingHandshakes.add('0x5555' as NodeID)
72
+ ongoingHandshakes.add('0x2222' as DhtAddress)
73
+ ongoingHandshakes.add('0x3333' as DhtAddress)
74
+ ongoingHandshakes.add('0x4444' as DhtAddress)
75
+ ongoingHandshakes.add('0x5555' as DhtAddress)
77
76
  const req = StreamPartHandshakeRequest.create({
78
77
  streamPartId: STREAM_PART_ID,
79
78
  requestId: 'requestId'
@@ -85,31 +84,84 @@ describe('HandshakeRpcLocal', () => {
85
84
  })
86
85
 
87
86
  it('handshakeWithInterleaving success', async () => {
88
- const req: InterleaveNotice = {
89
- streamPartId: STREAM_PART_ID,
87
+ const req: InterleaveRequest = {
90
88
  interleaveTargetDescriptor: {
91
- kademliaId: hexToBinary('0x2222'),
89
+ nodeId: getRawFromDhtAddress('0x2222' as DhtAddress),
92
90
  type: NodeType.NODEJS
93
91
  }
94
-
95
92
  }
96
- await rpcLocal.interleaveNotice(req, {
93
+ await rpcLocal.interleaveRequest(req, {
97
94
  incomingSourceDescriptor: createMockPeerDescriptor()
98
95
  } as any)
99
96
  expect(handshakeWithInterleaving).toHaveBeenCalledTimes(1)
100
97
  })
101
98
 
102
99
  it('handshakeWithInterleaving success', async () => {
103
- const req: InterleaveNotice = {
104
- streamPartId: StreamPartIDUtils.parse('other-stream#0'),
100
+ const req: InterleaveRequest = {
105
101
  interleaveTargetDescriptor: {
106
- kademliaId: hexToBinary('0x2222'),
102
+ nodeId: getRawFromDhtAddress('0x2222' as DhtAddress),
107
103
  type: NodeType.NODEJS
108
104
  }
109
105
  }
110
- await rpcLocal.interleaveNotice(req, {
106
+ await rpcLocal.interleaveRequest(req, {
107
+ incomingSourceDescriptor: createMockPeerDescriptor()
108
+ } as any)
109
+ expect(handshakeWithInterleaving).toHaveBeenCalledTimes(1)
110
+ })
111
+
112
+ it('rejects handshakes if interleaving to the requestor is ongoing', async () => {
113
+ neighbors.add(createMockDeliveryRpcRemote())
114
+ neighbors.add(createMockDeliveryRpcRemote())
115
+ neighbors.add(createMockDeliveryRpcRemote())
116
+ neighbors.add(createMockDeliveryRpcRemote())
117
+ const requestor = createMockPeerDescriptor()
118
+ ongoingInterleaves.add(getNodeIdFromPeerDescriptor(requestor))
119
+ const req = StreamPartHandshakeRequest.create({
120
+ streamPartId: STREAM_PART_ID,
121
+ requestId: 'requestId'
122
+ })
123
+ const res = await rpcLocal.handshake(req, {
124
+ incomingSourceDescriptor: requestor
125
+ } as any)
126
+ expect(res.accepted).toEqual(false)
127
+ })
128
+
129
+ it('Rejects if interleaving is required and too many interleaving requests are ongoing', async () => {
130
+ const interleavingPeer1 = createMockPeerDescriptor()
131
+ const interleavingPeer2 = createMockPeerDescriptor()
132
+ const interleavingPeer3 = createMockPeerDescriptor()
133
+ neighbors.add(createMockDeliveryRpcRemote(interleavingPeer1))
134
+ neighbors.add(createMockDeliveryRpcRemote(interleavingPeer2))
135
+ neighbors.add(createMockDeliveryRpcRemote(interleavingPeer3))
136
+ neighbors.add(createMockDeliveryRpcRemote())
137
+ ongoingInterleaves.add(getNodeIdFromPeerDescriptor(interleavingPeer1))
138
+ ongoingInterleaves.add(getNodeIdFromPeerDescriptor(interleavingPeer2))
139
+ ongoingInterleaves.add(getNodeIdFromPeerDescriptor(interleavingPeer3))
140
+ const req = StreamPartHandshakeRequest.create({
141
+ streamPartId: STREAM_PART_ID,
142
+ requestId: 'requestId'
143
+ })
144
+ const res = await rpcLocal.handshake(req, {
111
145
  incomingSourceDescriptor: createMockPeerDescriptor()
112
146
  } as any)
147
+ expect(res.accepted).toEqual(false)
148
+ expect(handshakeWithInterleaving).toHaveBeenCalledTimes(0)
149
+ })
150
+
151
+ it('rejects handshakes if the requestor has more than maxNeighborCount neighbors', async () => {
152
+ neighbors.add(createMockDeliveryRpcRemote())
153
+ neighbors.add(createMockDeliveryRpcRemote())
154
+ neighbors.add(createMockDeliveryRpcRemote())
155
+ neighbors.add(createMockDeliveryRpcRemote())
156
+ neighbors.add(createMockDeliveryRpcRemote())
157
+ const req = StreamPartHandshakeRequest.create({
158
+ streamPartId: STREAM_PART_ID,
159
+ requestId: 'requestId'
160
+ })
161
+ const res = await rpcLocal.handshake(req, {
162
+ incomingSourceDescriptor: createMockPeerDescriptor()
163
+ } as any)
164
+ expect(res.accepted).toEqual(false)
113
165
  expect(handshakeWithInterleaving).toHaveBeenCalledTimes(0)
114
166
  })
115
167
 
@@ -1,9 +1,8 @@
1
- import { ListeningRpcCommunicator, Simulator, SimulatorTransport } from '@streamr/dht'
1
+ import { ListeningRpcCommunicator, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { range } from 'lodash'
3
- import { getNodeIdFromPeerDescriptor } from '../../src/identifiers'
4
3
  import { NodeList } from '../../src/logic/NodeList'
5
4
  import { Handshaker } from '../../src/logic/neighbor-discovery/Handshaker'
6
- import { createMockPeerDescriptor, createMockDeliveryRpcRemote, mockConnectionLocker } from '../utils/utils'
5
+ import { createMockPeerDescriptor, createMockDeliveryRpcRemote } from '../utils/utils'
7
6
  import { StreamPartIDUtils } from '@streamr/protocol'
8
7
 
9
8
  describe('Handshaker', () => {
@@ -14,7 +13,9 @@ describe('Handshaker', () => {
14
13
  const maxNeighborCount = 4
15
14
  const streamPartId = StreamPartIDUtils.parse('stream#0')
16
15
 
17
- let targetNeighbors: NodeList
16
+ let neighbors: NodeList
17
+ let leftNodeView: NodeList
18
+ let rightNodeView: NodeList
18
19
  let nearbyNodeView: NodeList
19
20
  let randomNodeView: NodeList
20
21
 
@@ -28,20 +29,24 @@ describe('Handshaker', () => {
28
29
  const rpcCommunicator = new ListeningRpcCommunicator(streamPartId, simulatorTransport)
29
30
 
30
31
  const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
31
- targetNeighbors = new NodeList(nodeId, 10)
32
+ neighbors = new NodeList(nodeId, 10)
33
+ leftNodeView = new NodeList(nodeId, 20)
34
+ rightNodeView = new NodeList(nodeId, 20)
32
35
  nearbyNodeView = new NodeList(nodeId, 20)
33
36
  randomNodeView = new NodeList(nodeId, 20)
34
37
 
35
38
  handshaker = new Handshaker({
36
39
  localPeerDescriptor: peerDescriptor,
37
40
  streamPartId,
38
- connectionLocker: mockConnectionLocker,
39
- targetNeighbors,
41
+ neighbors,
42
+ leftNodeView,
43
+ rightNodeView,
40
44
  nearbyNodeView,
41
45
  randomNodeView,
42
46
  rpcCommunicator,
43
47
  maxNeighborCount,
44
- rpcRequestTimeout: 5000
48
+ rpcRequestTimeout: 5000,
49
+ ongoingHandshakes: new Set()
45
50
  })
46
51
  })
47
52
 
@@ -56,7 +61,7 @@ describe('Handshaker', () => {
56
61
  })
57
62
 
58
63
  it('attemptHandshakesOnContact with known nodes that cannot be connected to', async () => {
59
- range(2).forEach(() => nearbyNodeView.add(createMockDeliveryRpcRemote()))
64
+ range(2).forEach(() => randomNodeView.add(createMockDeliveryRpcRemote()))
60
65
  const res = await handshaker.attemptHandshakesOnContacts([])
61
66
  expect(res.length).toEqual(2)
62
67
  })
@@ -2,14 +2,13 @@ import { InspectSession, Events } from '../../src/logic/inspect/InspectSession'
2
2
  import { MessageID } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
3
3
  import { waitForEvent3 } from '../../../utils/dist/src/waitForEvent3'
4
4
  import { utf8ToBinary } from '@streamr/utils'
5
- import { NodeID } from '../../src/identifiers'
6
- import { createRandomNodeId } from '../utils/utils'
5
+ import { DhtAddress, createRandomDhtAddress } from '@streamr/dht'
7
6
 
8
7
  describe('InspectSession', () => {
9
8
 
10
9
  let inspectSession: InspectSession
11
- let inspectedNode: NodeID
12
- let anotherNode: NodeID
10
+ let inspectedNode: DhtAddress
11
+ let anotherNode: DhtAddress
13
12
 
14
13
  const publisherId = utf8ToBinary('publisherId')
15
14
  const messageId1: MessageID = {
@@ -31,8 +30,8 @@ describe('InspectSession', () => {
31
30
  }
32
31
 
33
32
  beforeEach(() => {
34
- inspectedNode = createRandomNodeId()
35
- anotherNode = createRandomNodeId()
33
+ inspectedNode = createRandomDhtAddress()
34
+ anotherNode = createRandomDhtAddress()
36
35
  inspectSession = new InspectSession({
37
36
  inspectedNode
38
37
  })
@@ -1,9 +1,8 @@
1
- import { ListeningRpcCommunicator } from '@streamr/dht'
1
+ import { ListeningRpcCommunicator, createRandomDhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { utf8ToBinary } from '@streamr/utils'
3
- import { getNodeIdFromPeerDescriptor } from '../../src/identifiers'
4
3
  import { Inspector } from '../../src/logic/inspect/Inspector'
5
4
  import { MockTransport } from '../utils/mock/Transport'
6
- import { createMockPeerDescriptor, createRandomNodeId, mockConnectionLocker } from '../utils/utils'
5
+ import { createMockPeerDescriptor, mockConnectionLocker } from '../utils/utils'
7
6
  import { StreamPartIDUtils } from '@streamr/protocol'
8
7
 
9
8
  describe('Inspector', () => {
@@ -13,7 +12,7 @@ describe('Inspector', () => {
13
12
 
14
13
  const inspectedDescriptor = createMockPeerDescriptor()
15
14
 
16
- const nodeId = createRandomNodeId()
15
+ const nodeId = createRandomDhtAddress()
17
16
  let mockConnect: jest.Mock
18
17
 
19
18
  const messageRef = {
@@ -3,34 +3,37 @@ import { NodeList } from '../../src/logic/NodeList'
3
3
  import { waitForCondition } from '@streamr/utils'
4
4
  import { range } from 'lodash'
5
5
  import { expect } from 'expect'
6
- import { createMockDeliveryRpcRemote, createRandomNodeId } from '../utils/utils'
7
- import { NodeID, getNodeIdFromPeerDescriptor } from '../../src/identifiers'
6
+ import { createMockDeliveryRpcRemote } from '../utils/utils'
7
+ import { DhtAddress, createRandomDhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
8
8
 
9
9
  describe('NeighborFinder', () => {
10
10
 
11
- const nodeId = createRandomNodeId()
12
- let targetNeighbors: NodeList
11
+ const nodeId = createRandomDhtAddress()
12
+ let neighbors: NodeList
13
13
  let nearbyNodeView: NodeList
14
14
  let neighborFinder: NeighborFinder
15
15
 
16
16
  const minCount = 4
17
17
 
18
18
  beforeEach(() => {
19
- targetNeighbors = new NodeList(nodeId, 15)
19
+ neighbors = new NodeList(nodeId, 15)
20
20
  nearbyNodeView = new NodeList(nodeId, 30)
21
21
  range(30).forEach(() => nearbyNodeView.add(createMockDeliveryRpcRemote()))
22
- const mockDoFindNeighbors = async (excluded: NodeID[]) => {
22
+ const mockDoFindNeighbors = async (excluded: DhtAddress[]) => {
23
23
  const target = nearbyNodeView.getRandom(excluded)
24
24
  if (Math.random() < 0.5) {
25
- targetNeighbors.add(target!)
25
+ neighbors.add(target!)
26
26
  } else {
27
27
  excluded.push(getNodeIdFromPeerDescriptor(target!.getPeerDescriptor()))
28
28
  }
29
29
  return excluded
30
30
  }
31
31
  neighborFinder = new NeighborFinder({
32
- targetNeighbors,
32
+ neighbors,
33
33
  nearbyNodeView,
34
+ leftNodeView: new NodeList(nodeId, 30),
35
+ rightNodeView: new NodeList(nodeId, 30),
36
+ randomNodeView: new NodeList(nodeId, 30),
34
37
  doFindNeighbors: (excluded) => mockDoFindNeighbors(excluded),
35
38
  minCount
36
39
  })
@@ -42,7 +45,7 @@ describe('NeighborFinder', () => {
42
45
 
43
46
  it('Finds target number of nodes', async () => {
44
47
  neighborFinder.start()
45
- await waitForCondition(() => targetNeighbors.size() >= minCount, 10000)
48
+ await waitForCondition(() => neighbors.size() >= minCount, 10000)
46
49
  expect(neighborFinder.isRunning()).toEqual(false)
47
50
  })
48
51
  })
@@ -0,0 +1,139 @@
1
+ import { DhtAddress, ListeningRpcCommunicator, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
+ import { NeighborFinder } from '../../src/logic/neighbor-discovery/NeighborFinder'
3
+ import { NeighborUpdateRpcLocal } from '../../src/logic/neighbor-discovery/NeighborUpdateRpcLocal'
4
+ import { createMockPeerDescriptor } from '../utils/utils'
5
+ import { NodeList } from '../../src/logic/NodeList'
6
+ import { StreamPartIDUtils } from '@streamr/protocol'
7
+ import { MockTransport } from '../utils/mock/Transport'
8
+ import { DeliveryRpcClient } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
9
+ import { DeliveryRpcRemote } from '../../src/logic/DeliveryRpcRemote'
10
+ import { range } from 'lodash'
11
+
12
+ describe('NeighborUpdateRpcLocal', () => {
13
+
14
+ const streamPartId = StreamPartIDUtils.parse('stream#0')
15
+ const localPeerDescriptor = createMockPeerDescriptor()
16
+ const neighborTargetCount = 4
17
+
18
+ let rpcLocal: NeighborUpdateRpcLocal
19
+ let neighbors: NodeList
20
+ let nearbyNodeView: NodeList
21
+ let neighborFinder: NeighborFinder
22
+ let rpcCommunicator: ListeningRpcCommunicator
23
+ let ongoingHandshakes: Set<DhtAddress>
24
+
25
+ const addNeighbors = (count: number) => {
26
+ for (let i = 0; i < count; i++) {
27
+ neighbors.add(new DeliveryRpcRemote(
28
+ localPeerDescriptor,
29
+ createMockPeerDescriptor(),
30
+ rpcCommunicator,
31
+ DeliveryRpcClient
32
+ ))
33
+ }
34
+ }
35
+
36
+ beforeEach(() => {
37
+ rpcCommunicator = new ListeningRpcCommunicator('mock', new MockTransport())
38
+ neighbors = new NodeList(getNodeIdFromPeerDescriptor(localPeerDescriptor), neighborTargetCount + 1)
39
+ nearbyNodeView = new NodeList(getNodeIdFromPeerDescriptor(localPeerDescriptor), neighborTargetCount)
40
+ neighborFinder = {
41
+ start: jest.fn()
42
+ } as any
43
+ ongoingHandshakes = new Set()
44
+
45
+ rpcLocal = new NeighborUpdateRpcLocal({
46
+ localPeerDescriptor,
47
+ neighbors,
48
+ nearbyNodeView,
49
+ neighborFinder,
50
+ streamPartId,
51
+ rpcCommunicator,
52
+ neighborTargetCount,
53
+ ongoingHandshakes
54
+ })
55
+ })
56
+
57
+ afterEach(() => {
58
+ rpcCommunicator.destroy()
59
+ })
60
+
61
+ it('response contains neighbor list of expected size', async () => {
62
+ addNeighbors(neighborTargetCount)
63
+ const res = await rpcLocal.neighborUpdate({
64
+ streamPartId,
65
+ neighborDescriptors: [localPeerDescriptor],
66
+ removeMe: false
67
+ }, { incomingSourceDescriptor: createMockPeerDescriptor() } as any)
68
+ expect(res.neighborDescriptors.length).toEqual(neighborTargetCount)
69
+ })
70
+
71
+ it('updates contacts based on callers neighbors', async () => {
72
+ addNeighbors(neighborTargetCount)
73
+ expect(nearbyNodeView.size()).toEqual(0)
74
+ await rpcLocal.neighborUpdate({
75
+ streamPartId,
76
+ neighborDescriptors: range(neighborTargetCount).map(() => createMockPeerDescriptor()),
77
+ removeMe: false
78
+ }, { incomingSourceDescriptor: createMockPeerDescriptor() } as any)
79
+ expect(nearbyNodeView.size()).toEqual(4)
80
+ })
81
+
82
+ it('does not ask to be removed if caller is a neighbor', async () => {
83
+ const caller = createMockPeerDescriptor()
84
+ const neighbor = new DeliveryRpcRemote(
85
+ localPeerDescriptor,
86
+ caller,
87
+ rpcCommunicator,
88
+ DeliveryRpcClient
89
+ )
90
+ neighbors.add(neighbor)
91
+ const res = await rpcLocal.neighborUpdate({
92
+ streamPartId,
93
+ neighborDescriptors: [localPeerDescriptor],
94
+ removeMe: false
95
+ }, { incomingSourceDescriptor: caller } as any)
96
+ expect(res.removeMe).toEqual(false)
97
+ })
98
+
99
+ it('asks to be removed if caller is not a neighbor', async () => {
100
+ const caller = createMockPeerDescriptor()
101
+ const res = await rpcLocal.neighborUpdate({
102
+ streamPartId,
103
+ neighborDescriptors: [localPeerDescriptor],
104
+ removeMe: false
105
+ }, { incomingSourceDescriptor: caller } as any)
106
+ expect(res.removeMe).toEqual(true)
107
+ })
108
+
109
+ it('asks to be removed if caller is a neighbor and both have too many neighbors', async () => {
110
+ const caller = createMockPeerDescriptor()
111
+ const neighbor = new DeliveryRpcRemote(
112
+ localPeerDescriptor,
113
+ caller,
114
+ rpcCommunicator,
115
+ DeliveryRpcClient
116
+ )
117
+ neighbors.add(neighbor)
118
+ addNeighbors(neighborTargetCount)
119
+ const res = await rpcLocal.neighborUpdate({
120
+ streamPartId,
121
+ neighborDescriptors: [localPeerDescriptor, ...range(neighborTargetCount).map(() => createMockPeerDescriptor())],
122
+ removeMe: false
123
+ }, { incomingSourceDescriptor: caller } as any)
124
+ expect(res.removeMe).toEqual(true)
125
+ expect(neighbors.has(getNodeIdFromPeerDescriptor(caller))).toEqual(false)
126
+ })
127
+
128
+ it('does not ask to be removed if there is an ongoing handshake to the caller', async () => {
129
+ const caller = createMockPeerDescriptor()
130
+ ongoingHandshakes.add(getNodeIdFromPeerDescriptor(caller))
131
+ const res = await rpcLocal.neighborUpdate({
132
+ streamPartId,
133
+ neighborDescriptors: [localPeerDescriptor],
134
+ removeMe: false
135
+ }, { incomingSourceDescriptor: caller } as any)
136
+ expect(res.removeMe).toEqual(false)
137
+ })
138
+
139
+ })