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

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 +12 -12
  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 +19 -16
  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 +85 -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 +12 -12
  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 +26 -27
  148. package/src/logic/RandomGraphNode.ts +158 -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,21 +1,36 @@
1
- import { PeerDescriptor } from '@streamr/dht'
1
+ import { DhtAddress, PeerDescriptor, RingContacts } from '@streamr/dht'
2
2
 
3
3
  export interface Layer1NodeEvents {
4
- newContact: (peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => void
4
+ contactAdded: (peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => void
5
5
  contactRemoved: (peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => void
6
- newRandomContact: (peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => void
6
+ randomContactAdded: (peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => void
7
7
  randomContactRemoved: (peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => void
8
+ ringContactAdded: (peerDescriptor: PeerDescriptor, closestPeers: RingContacts) => void
9
+ ringContactRemoved: (peerDescriptor: PeerDescriptor, closestPeers: RingContacts) => void
8
10
  }
9
11
 
10
12
  export interface Layer1Node {
11
13
  on<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
12
14
  once<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
13
15
  off<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
14
- removeContact: (peerDescriptor: PeerDescriptor) => void
16
+ on<T extends keyof Layer1NodeEvents>(
17
+ eventName: T,
18
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts) => void
19
+ ): void
20
+ once<T extends keyof Layer1NodeEvents>(
21
+ eventName: T,
22
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts) => void
23
+ ): void
24
+ off<T extends keyof Layer1NodeEvents>(
25
+ eventName: T,
26
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts
27
+ ) => void): void
28
+ removeContact: (nodeId: DhtAddress) => void
15
29
  getClosestContacts: (maxCount?: number) => PeerDescriptor[]
16
- getKBucketPeers: () => PeerDescriptor[]
17
- getBucketSize: () => number
30
+ getNeighbors: () => PeerDescriptor[]
31
+ getNeighborCount(): number
18
32
  joinDht: (entryPoints: PeerDescriptor[], doRandomJoin?: boolean, retry?: boolean) => Promise<void>
33
+ joinRing: () => Promise<void>
19
34
  start: () => Promise<void>
20
35
  stop: () => Promise<void>
21
36
  }
@@ -1,25 +1,27 @@
1
- import { PeerDescriptor } from '@streamr/dht'
1
+ import { DhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { sample } from 'lodash'
3
3
  import { DeliveryRpcRemote } from './DeliveryRpcRemote'
4
4
  import { EventEmitter } from 'eventemitter3'
5
- import { getNodeIdFromPeerDescriptor, NodeID } from '../identifiers'
6
5
 
7
6
  export interface Events {
8
- nodeAdded: (id: NodeID, remote: DeliveryRpcRemote) => any
7
+ nodeAdded: (id: DhtAddress, remote: DeliveryRpcRemote) => void
8
+ nodeRemoved: (id: DhtAddress, remote: DeliveryRpcRemote) => void
9
9
  }
10
10
 
11
- const getValuesOfIncludedKeys = (nodes: Map<NodeID, DeliveryRpcRemote>, exclude: NodeID[]): DeliveryRpcRemote[] => {
11
+ const getValuesOfIncludedKeys = (nodes: Map<DhtAddress, DeliveryRpcRemote>, exclude: DhtAddress[]): DeliveryRpcRemote[] => {
12
12
  return Array.from(nodes.entries())
13
13
  .filter(([id, _node]) => !exclude.includes(id))
14
14
  .map(([_id, node]) => node)
15
15
  }
16
16
 
17
+ // The items in the list are in the insertion order
18
+
17
19
  export class NodeList extends EventEmitter<Events> {
18
- private readonly nodes: Map<NodeID, DeliveryRpcRemote>
20
+ private readonly nodes: Map<DhtAddress, DeliveryRpcRemote>
19
21
  private readonly limit: number
20
- private ownId: NodeID
22
+ private ownId: DhtAddress
21
23
 
22
- constructor(ownId: NodeID, limit: number) {
24
+ constructor(ownId: DhtAddress, limit: number) {
23
25
  super()
24
26
  this.nodes = new Map()
25
27
  this.limit = limit
@@ -38,22 +40,19 @@ export class NodeList extends EventEmitter<Events> {
38
40
  }
39
41
  }
40
42
 
41
- remove(peerDescriptor: PeerDescriptor): void {
42
- this.nodes.delete(getNodeIdFromPeerDescriptor(peerDescriptor))
43
- }
44
-
45
- removeById(nodeId: NodeID): void {
46
- this.nodes.delete(nodeId)
43
+ remove(nodeId: DhtAddress): void {
44
+ if (this.nodes.has(nodeId)) {
45
+ const remote = this.nodes.get(nodeId)!
46
+ this.nodes.delete(nodeId)
47
+ this.emit('nodeRemoved', nodeId, remote)
48
+ }
47
49
  }
48
50
 
49
- hasNode(peerDescriptor: PeerDescriptor): boolean {
50
- return this.nodes.has(getNodeIdFromPeerDescriptor(peerDescriptor))
51
- }
52
-
53
- hasNodeById(nodeId: NodeID): boolean {
51
+ has(nodeId: DhtAddress): boolean {
54
52
  return this.nodes.has(nodeId)
55
53
  }
56
54
 
55
+ // Replace nodes does not emit nodeRemoved events, use with caution
57
56
  replaceAll(neighbors: DeliveryRpcRemote[]): void {
58
57
  this.nodes.clear()
59
58
  const limited = neighbors.splice(0, this.limit)
@@ -62,36 +61,36 @@ export class NodeList extends EventEmitter<Events> {
62
61
  })
63
62
  }
64
63
 
65
- getIds(): NodeID[] {
64
+ getIds(): DhtAddress[] {
66
65
  return Array.from(this.nodes.keys())
67
66
  }
68
67
 
69
- get(id: NodeID): DeliveryRpcRemote | undefined {
68
+ get(id: DhtAddress): DeliveryRpcRemote | undefined {
70
69
  return this.nodes.get(id)
71
70
  }
72
71
 
73
- size(exclude: NodeID[] = []): number {
72
+ size(exclude: DhtAddress[] = []): number {
74
73
  return Array.from(this.nodes.keys()).filter((node) => !exclude.includes(node)).length
75
74
  }
76
75
 
77
- getRandom(exclude: NodeID[]): DeliveryRpcRemote | undefined {
76
+ getRandom(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
78
77
  return sample(getValuesOfIncludedKeys(this.nodes, exclude))
79
78
  }
80
79
 
81
- getClosest(exclude: NodeID[]): DeliveryRpcRemote | undefined {
80
+ getFirst(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
82
81
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
83
82
  return included[0]
84
83
  }
85
84
 
86
- getClosestAndFurthest(exclude: NodeID[]): DeliveryRpcRemote[] {
85
+ getFirstAndLast(exclude: DhtAddress[]): DeliveryRpcRemote[] {
87
86
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
88
87
  if (included.length === 0) {
89
88
  return []
90
89
  }
91
- return included.length > 1 ? [this.getClosest(exclude)!, this.getFurthest(exclude)!] : [this.getClosest(exclude)!]
90
+ return included.length > 1 ? [this.getFirst(exclude)!, this.getLast(exclude)!] : [this.getFirst(exclude)!]
92
91
  }
93
92
 
94
- getFurthest(exclude: NodeID[]): DeliveryRpcRemote | undefined {
93
+ getLast(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
95
94
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
96
95
  return included[included.length - 1]
97
96
  }
@@ -101,7 +100,7 @@ export class NodeList extends EventEmitter<Events> {
101
100
  }
102
101
 
103
102
  stop(): void {
104
- this.nodes.clear()
103
+ this.nodes.forEach((node) => this.remove(getNodeIdFromPeerDescriptor(node.getPeerDescriptor())))
105
104
  this.removeAllListeners()
106
105
  }
107
106
  }
@@ -3,7 +3,10 @@ import {
3
3
  PeerDescriptor,
4
4
  ListeningRpcCommunicator,
5
5
  ITransport,
6
- ConnectionLocker
6
+ ConnectionLocker,
7
+ DhtAddress,
8
+ getNodeIdFromPeerDescriptor,
9
+ RingContacts
7
10
  } from '@streamr/dht'
8
11
  import {
9
12
  StreamMessage,
@@ -12,6 +15,7 @@ import {
12
15
  TemporaryConnectionRequest,
13
16
  TemporaryConnectionResponse,
14
17
  MessageID,
18
+ CloseTemporaryConnection,
15
19
  } from '../proto/packages/trackerless-network/protos/NetworkRpc'
16
20
  import { NodeList } from './NodeList'
17
21
  import { DeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
@@ -19,23 +23,23 @@ import { DeliveryRpcRemote } from './DeliveryRpcRemote'
19
23
  import { IDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
20
24
  import { DuplicateMessageDetector } from './DuplicateMessageDetector'
21
25
  import { Logger, addManagedEventListener } from '@streamr/utils'
22
- import { toProtoRpcClient } from '@streamr/proto-rpc'
23
- import { IHandshaker } from './neighbor-discovery/Handshaker'
26
+ import { Handshaker } from './neighbor-discovery/Handshaker'
24
27
  import { Propagation } from './propagation/Propagation'
25
- import { INeighborFinder } from './neighbor-discovery/NeighborFinder'
26
- import { INeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
28
+ import { NeighborFinder } from './neighbor-discovery/NeighborFinder'
29
+ import { NeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
27
30
  import { DeliveryRpcLocal } from './DeliveryRpcLocal'
28
31
  import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
29
- import { IInspector } from './inspect/Inspector'
32
+ import { Inspector } from './inspect/Inspector'
30
33
  import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
31
34
  import { markAndCheckDuplicate } from './utils'
32
- import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
33
35
  import { Layer1Node } from './Layer1Node'
34
36
  import { StreamPartID } from '@streamr/protocol'
37
+ import { uniqBy } from 'lodash'
35
38
 
36
39
  export interface Events {
37
40
  message: (message: StreamMessage) => void
38
- targetNeighborConnected: (nodeId: NodeID) => void
41
+ neighborConnected: (nodeId: DhtAddress) => void
42
+ entryPointLeaveDetected: () => void
39
43
  }
40
44
 
41
45
  export interface StrictRandomGraphNodeConfig {
@@ -47,15 +51,19 @@ export interface StrictRandomGraphNodeConfig {
47
51
  nodeViewSize: number
48
52
  nearbyNodeView: NodeList
49
53
  randomNodeView: NodeList
50
- targetNeighbors: NodeList
51
- handshaker: IHandshaker
52
- neighborFinder: INeighborFinder
53
- neighborUpdateManager: INeighborUpdateManager
54
+ leftNodeView: NodeList
55
+ rightNodeView: NodeList
56
+ neighbors: NodeList
57
+ handshaker: Handshaker
58
+ neighborFinder: NeighborFinder
59
+ neighborUpdateManager: NeighborUpdateManager
54
60
  propagation: Propagation
55
61
  rpcCommunicator: ListeningRpcCommunicator
56
- numOfTargetNeighbors: number
57
- inspector: IInspector
62
+ neighborTargetCount: number
63
+ inspector: Inspector
58
64
  temporaryConnectionRpcLocal: TemporaryConnectionRpcLocal
65
+ isLocalNodeEntryPoint: () => boolean
66
+
59
67
  proxyConnectionRpcLocal?: ProxyConnectionRpcLocal
60
68
  rpcRequestTimeout?: number
61
69
  }
@@ -79,23 +87,31 @@ export class RandomGraphNode extends EventEmitter<Events> {
79
87
  streamPartId: this.config.streamPartId,
80
88
  rpcCommunicator: this.config.rpcCommunicator,
81
89
  markAndCheckDuplicate: (msg: MessageID, prev?: MessageRef) => markAndCheckDuplicate(this.duplicateDetectors, msg, prev),
82
- broadcast: (message: StreamMessage, previousNode?: NodeID) => this.broadcast(message, previousNode),
83
- onLeaveNotice: (senderId: NodeID) => {
84
- const contact = this.config.nearbyNodeView.get(senderId)
85
- || this.config.randomNodeView.get(senderId)
86
- || this.config.targetNeighbors.get(senderId)
87
- || this.config.proxyConnectionRpcLocal?.getConnection(senderId )?.remote
90
+ broadcast: (message: StreamMessage, previousNode?: DhtAddress) => this.broadcast(message, previousNode),
91
+ onLeaveNotice: (sourceId: DhtAddress, sourceIsStreamEntryPoint: boolean) => {
92
+ if (this.abortController.signal.aborted) {
93
+ return
94
+ }
95
+ const contact = this.config.nearbyNodeView.get(sourceId)
96
+ || this.config.randomNodeView.get(sourceId)
97
+ || this.config.neighbors.get(sourceId)
98
+ || this.config.proxyConnectionRpcLocal?.getConnection(sourceId)?.remote
88
99
  // TODO: check integrity of notifier?
89
100
  if (contact) {
90
- this.config.layer1Node.removeContact(contact.getPeerDescriptor())
91
- this.config.targetNeighbors.remove(contact.getPeerDescriptor())
92
- this.config.nearbyNodeView.remove(contact.getPeerDescriptor())
93
- this.config.connectionLocker.unlockConnection(contact.getPeerDescriptor(), this.config.streamPartId)
94
- this.config.neighborFinder.start([senderId])
95
- this.config.proxyConnectionRpcLocal?.removeConnection(senderId)
101
+ this.config.layer1Node.removeContact(sourceId)
102
+ this.config.neighbors.remove(sourceId)
103
+ this.config.nearbyNodeView.remove(sourceId)
104
+ this.config.randomNodeView.remove(sourceId)
105
+ this.config.leftNodeView.remove(sourceId)
106
+ this.config.rightNodeView.remove(sourceId)
107
+ this.config.neighborFinder.start([sourceId])
108
+ this.config.proxyConnectionRpcLocal?.removeConnection(sourceId)
109
+ }
110
+ if (sourceIsStreamEntryPoint) {
111
+ this.emit('entryPointLeaveDetected')
96
112
  }
97
113
  },
98
- markForInspection: (senderId: NodeID, messageId: MessageID) => this.config.inspector.markMessage(senderId, messageId)
114
+ markForInspection: (senderId: DhtAddress, messageId: MessageID) => this.config.inspector.markMessage(senderId, messageId)
99
115
  })
100
116
  }
101
117
 
@@ -104,28 +120,44 @@ export class RandomGraphNode extends EventEmitter<Events> {
104
120
  this.registerDefaultServerMethods()
105
121
  addManagedEventListener<any, any>(
106
122
  this.config.layer1Node as any,
107
- 'newContact',
108
- (_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.newContact(closestPeers),
123
+ 'contactAdded',
124
+ (_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.onContactAdded(closestPeers),
109
125
  this.abortController.signal
110
126
  )
111
127
  addManagedEventListener<any, any>(
112
128
  this.config.layer1Node as any,
113
129
  'contactRemoved',
114
- (_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.removedContact(closestPeers),
130
+ (_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.onContactRemoved(closestPeers),
115
131
  this.abortController.signal
116
132
  )
117
133
  addManagedEventListener<any, any>(
118
134
  this.config.layer1Node as any,
119
- 'newRandomContact',
120
- (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.newRandomContact(randomPeers),
135
+ 'randomContactAdded',
136
+ (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactAdded(randomPeers),
121
137
  this.abortController.signal
122
- )
138
+ )
123
139
  addManagedEventListener<any, any>(
124
140
  this.config.layer1Node as any,
125
141
  'randomContactRemoved',
126
- (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.removedRandomContact(randomPeers),
142
+ (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactRemoved(randomPeers),
143
+ this.abortController.signal
144
+ )
145
+ addManagedEventListener<any, any>(
146
+ this.config.layer1Node as any,
147
+ 'ringContactAdded',
148
+ (_: PeerDescriptor, peers: RingContacts) => {
149
+ this.onRingContactEvent(peers)
150
+ },
127
151
  this.abortController.signal
128
- )
152
+ )
153
+ addManagedEventListener<any, any>(
154
+ this.config.layer1Node as any,
155
+ 'ringContactRemoved',
156
+ (_: PeerDescriptor, peers: RingContacts) => {
157
+ this.onRingContactEvent(peers)
158
+ },
159
+ this.abortController.signal
160
+ )
129
161
  addManagedEventListener<any, any>(
130
162
  this.config.transport as any,
131
163
  'disconnected',
@@ -133,11 +165,26 @@ export class RandomGraphNode extends EventEmitter<Events> {
133
165
  this.abortController.signal
134
166
  )
135
167
  addManagedEventListener(
136
- this.config.targetNeighbors,
168
+ this.config.neighbors,
137
169
  'nodeAdded',
138
- (id, _remote) => {
170
+ (id, remote) => {
139
171
  this.config.propagation.onNeighborJoined(id)
140
- this.emit('targetNeighborConnected', id)
172
+ this.config.connectionLocker.weakLockConnection(
173
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
174
+ this.config.streamPartId
175
+ )
176
+ this.emit('neighborConnected', id)
177
+ },
178
+ this.abortController.signal
179
+ )
180
+ addManagedEventListener(
181
+ this.config.neighbors,
182
+ 'nodeRemoved',
183
+ (_id, remote) => {
184
+ this.config.connectionLocker.weakUnlockConnection(
185
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
186
+ this.config.streamPartId
187
+ )
141
188
  },
142
189
  this.abortController.signal
143
190
  )
@@ -145,13 +192,13 @@ export class RandomGraphNode extends EventEmitter<Events> {
145
192
  addManagedEventListener(
146
193
  this.config.proxyConnectionRpcLocal,
147
194
  'newConnection',
148
- (id: NodeID) => this.config.propagation.onNeighborJoined(id),
195
+ (id: DhtAddress) => this.config.propagation.onNeighborJoined(id),
149
196
  this.abortController.signal
150
197
  )
151
198
  }
152
199
  const candidates = this.getNeighborCandidatesFromLayer1()
153
200
  if (candidates.length > 0) {
154
- this.newContact(candidates)
201
+ this.onContactAdded(candidates)
155
202
  }
156
203
  this.config.neighborFinder.start()
157
204
  await this.config.neighborUpdateManager.start()
@@ -164,20 +211,47 @@ export class RandomGraphNode extends EventEmitter<Events> {
164
211
  (req: LeaveStreamPartNotice, context) => this.deliveryRpcLocal.leaveStreamPartNotice(req, context))
165
212
  this.config.rpcCommunicator.registerRpcMethod(TemporaryConnectionRequest, TemporaryConnectionResponse, 'openConnection',
166
213
  (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.openConnection(req, context))
214
+ this.config.rpcCommunicator.registerRpcNotification(CloseTemporaryConnection, 'closeConnection',
215
+ (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.closeConnection(req, context))
167
216
  }
168
217
 
169
- private newContact(closestNodes: PeerDescriptor[]): void {
218
+ private onRingContactEvent(ringPeers: RingContacts): void {
219
+ logger.trace(`onRingContactAdded`)
220
+ if (this.isStopped()) {
221
+ return
222
+ }
223
+ this.config.leftNodeView.replaceAll(ringPeers.left.map((peer) =>
224
+ new DeliveryRpcRemote(
225
+ this.config.localPeerDescriptor,
226
+ peer,
227
+ this.config.rpcCommunicator,
228
+ DeliveryRpcClient,
229
+ this.config.rpcRequestTimeout
230
+ )
231
+ ))
232
+ this.config.rightNodeView.replaceAll(ringPeers.right.map((peer) =>
233
+ new DeliveryRpcRemote(
234
+ this.config.localPeerDescriptor,
235
+ peer,
236
+ this.config.rpcCommunicator,
237
+ DeliveryRpcClient,
238
+ this.config.rpcRequestTimeout
239
+ )
240
+ ))
241
+ }
242
+
243
+ private onContactAdded(closestNodes: PeerDescriptor[]): void {
170
244
  logger.trace(`New nearby contact found`)
171
245
  if (this.isStopped()) {
172
246
  return
173
247
  }
174
248
  this.updateNearbyNodeView(closestNodes)
175
- if (this.config.targetNeighbors.size() < this.config.numOfTargetNeighbors) {
249
+ if (this.config.neighbors.size() < this.config.neighborTargetCount) {
176
250
  this.config.neighborFinder.start()
177
251
  }
178
252
  }
179
253
 
180
- private removedContact(closestNodes: PeerDescriptor[]): void {
254
+ private onContactRemoved(closestNodes: PeerDescriptor[]): void {
181
255
  logger.trace(`Nearby contact removed`)
182
256
  if (this.isStopped()) {
183
257
  return
@@ -190,12 +264,12 @@ export class RandomGraphNode extends EventEmitter<Events> {
190
264
  new DeliveryRpcRemote(
191
265
  this.config.localPeerDescriptor,
192
266
  descriptor,
193
- this.config.streamPartId,
194
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
267
+ this.config.rpcCommunicator,
268
+ DeliveryRpcClient,
195
269
  this.config.rpcRequestTimeout
196
270
  )
197
271
  ))
198
- for (const descriptor of this.config.layer1Node.getKBucketPeers()) {
272
+ for (const descriptor of this.config.layer1Node.getNeighbors()) {
199
273
  if (this.config.nearbyNodeView.size() >= this.config.nodeViewSize) {
200
274
  break
201
275
  }
@@ -203,8 +277,8 @@ export class RandomGraphNode extends EventEmitter<Events> {
203
277
  new DeliveryRpcRemote(
204
278
  this.config.localPeerDescriptor,
205
279
  descriptor,
206
- this.config.streamPartId,
207
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
280
+ this.config.rpcCommunicator,
281
+ DeliveryRpcClient,
208
282
  this.config.rpcRequestTimeout
209
283
 
210
284
  )
@@ -212,7 +286,7 @@ export class RandomGraphNode extends EventEmitter<Events> {
212
286
  }
213
287
  }
214
288
 
215
- private newRandomContact(randomNodes: PeerDescriptor[]): void {
289
+ private onRandomContactAdded(randomNodes: PeerDescriptor[]): void {
216
290
  if (this.isStopped()) {
217
291
  return
218
292
  }
@@ -220,17 +294,17 @@ export class RandomGraphNode extends EventEmitter<Events> {
220
294
  new DeliveryRpcRemote(
221
295
  this.config.localPeerDescriptor,
222
296
  descriptor,
223
- this.config.streamPartId,
224
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
297
+ this.config.rpcCommunicator,
298
+ DeliveryRpcClient,
225
299
  this.config.rpcRequestTimeout
226
300
  )
227
301
  ))
228
- if (this.config.targetNeighbors.size() < this.config.numOfTargetNeighbors) {
302
+ if (this.config.neighbors.size() < this.config.neighborTargetCount) {
229
303
  this.config.neighborFinder.start()
230
304
  }
231
305
  }
232
306
 
233
- private removedRandomContact(randomNodes: PeerDescriptor[]): void {
307
+ private onRandomContactRemoved(randomNodes: PeerDescriptor[]): void {
234
308
  logger.trace(`New nearby contact found`)
235
309
  if (this.isStopped()) {
236
310
  return
@@ -239,34 +313,34 @@ export class RandomGraphNode extends EventEmitter<Events> {
239
313
  new DeliveryRpcRemote(
240
314
  this.config.localPeerDescriptor,
241
315
  descriptor,
242
- this.config.streamPartId,
243
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
316
+ this.config.rpcCommunicator,
317
+ DeliveryRpcClient,
244
318
  this.config.rpcRequestTimeout
245
319
  )
246
320
  ))
247
321
  }
248
322
 
249
323
  private onNodeDisconnected(peerDescriptor: PeerDescriptor): void {
250
- if (this.config.targetNeighbors.hasNode(peerDescriptor)) {
251
- this.config.targetNeighbors.remove(peerDescriptor)
252
- this.config.connectionLocker.unlockConnection(peerDescriptor, this.config.streamPartId)
253
- this.config.neighborFinder.start([getNodeIdFromPeerDescriptor(peerDescriptor)])
254
- this.config.temporaryConnectionRpcLocal.removeNode(peerDescriptor)
324
+ const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
325
+ if (this.config.neighbors.has(nodeId)) {
326
+ this.config.neighbors.remove(nodeId)
327
+ this.config.neighborFinder.start([nodeId])
328
+ this.config.temporaryConnectionRpcLocal.removeNode(nodeId)
255
329
  }
256
330
  }
257
331
 
258
332
  private getNeighborCandidatesFromLayer1(): PeerDescriptor[] {
259
- const uniqueNodes = new Set<PeerDescriptor>()
333
+ const nodes: PeerDescriptor[] = []
260
334
  this.config.layer1Node.getClosestContacts(this.config.nodeViewSize).forEach((peer: PeerDescriptor) => {
261
- uniqueNodes.add(peer)
335
+ nodes.push(peer)
262
336
  })
263
- this.config.layer1Node.getKBucketPeers().forEach((peer: PeerDescriptor) => {
264
- uniqueNodes.add(peer)
337
+ this.config.layer1Node.getNeighbors().forEach((peer: PeerDescriptor) => {
338
+ nodes.push(peer)
265
339
  })
266
- return Array.from(uniqueNodes)
340
+ return uniqBy(nodes, (p) => getNodeIdFromPeerDescriptor(p))
267
341
  }
268
342
 
269
- hasProxyConnection(nodeId: NodeID): boolean {
343
+ hasProxyConnection(nodeId: DhtAddress): boolean {
270
344
  if (this.config.proxyConnectionRpcLocal) {
271
345
  return this.config.proxyConnectionRpcLocal.hasConnection(nodeId)
272
346
  }
@@ -279,52 +353,58 @@ export class RandomGraphNode extends EventEmitter<Events> {
279
353
  }
280
354
  this.abortController.abort()
281
355
  this.config.proxyConnectionRpcLocal?.stop()
282
- this.config.targetNeighbors.getAll().map((remote) => remote.leaveStreamPartNotice())
356
+ this.config.neighbors.getAll().map((remote) => {
357
+ remote.leaveStreamPartNotice(this.config.streamPartId, this.config.isLocalNodeEntryPoint())
358
+ this.config.connectionLocker.weakUnlockConnection(
359
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
360
+ this.config.streamPartId
361
+ )
362
+ })
283
363
  this.config.rpcCommunicator.destroy()
284
364
  this.removeAllListeners()
285
365
  this.config.nearbyNodeView.stop()
286
- this.config.targetNeighbors.stop()
366
+ this.config.neighbors.stop()
287
367
  this.config.randomNodeView.stop()
288
368
  this.config.neighborFinder.stop()
289
369
  this.config.neighborUpdateManager.stop()
290
370
  this.config.inspector.stop()
291
371
  }
292
372
 
293
- broadcast(msg: StreamMessage, previousNode?: NodeID): void {
373
+ broadcast(msg: StreamMessage, previousNode?: DhtAddress): void {
294
374
  if (!previousNode) {
295
375
  markAndCheckDuplicate(this.duplicateDetectors, msg.messageId!, msg.previousMessageRef)
296
376
  }
297
377
  this.emit('message', msg)
298
- this.config.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), previousNode ?? null)
378
+ const skipBackPropagation = previousNode !== undefined && !this.config.temporaryConnectionRpcLocal.hasNode(previousNode)
379
+ this.config.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), skipBackPropagation ? previousNode : null)
299
380
  }
300
381
 
301
382
  inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
302
383
  return this.config.inspector.inspect(peerDescriptor)
303
384
  }
304
385
 
305
- private getPropagationTargets(msg: StreamMessage): NodeID[] {
306
- let propagationTargets = this.config.targetNeighbors.getIds()
386
+ private getPropagationTargets(msg: StreamMessage): DhtAddress[] {
387
+ let propagationTargets = this.config.neighbors.getIds()
307
388
  if (this.config.proxyConnectionRpcLocal) {
308
- propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal!.getPropagationTargets(msg))
389
+ propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal.getPropagationTargets(msg))
309
390
  }
310
- propagationTargets = propagationTargets.filter((target) => !this.config.inspector.isInspected(target ))
311
391
  propagationTargets = propagationTargets.concat(this.config.temporaryConnectionRpcLocal.getNodes().getIds())
312
392
  return propagationTargets
313
393
  }
314
394
 
315
- getOwnNodeId(): NodeID {
395
+ getOwnNodeId(): DhtAddress {
316
396
  return getNodeIdFromPeerDescriptor(this.config.localPeerDescriptor)
317
397
  }
318
398
 
319
- getNumberOfOutgoingHandshakes(): number {
399
+ getOutgoingHandshakeCount(): number {
320
400
  return this.config.handshaker.getOngoingHandshakes().size
321
401
  }
322
402
 
323
- getTargetNeighborIds(): NodeID[] {
403
+ getNeighbors(): PeerDescriptor[] {
324
404
  if (!this.started && this.isStopped()) {
325
405
  return []
326
406
  }
327
- return this.config.targetNeighbors.getIds()
407
+ return this.config.neighbors.getAll().map((n) => n.getPeerDescriptor())
328
408
  }
329
409
 
330
410
  getNearbyNodeView(): NodeList {