@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
@@ -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)
47
- }
48
-
49
- hasNode(peerDescriptor: PeerDescriptor): boolean {
50
- return this.nodes.has(getNodeIdFromPeerDescriptor(peerDescriptor))
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
+ }
51
49
  }
52
50
 
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
  }
@@ -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,20 @@ 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(remote.getPeerDescriptor(), this.config.streamPartId)
173
+ this.emit('neighborConnected', id)
174
+ },
175
+ this.abortController.signal
176
+ )
177
+ addManagedEventListener(
178
+ this.config.neighbors,
179
+ 'nodeRemoved',
180
+ (_id, remote) => {
181
+ this.config.connectionLocker.weakUnlockConnection(remote.getPeerDescriptor(), this.config.streamPartId)
141
182
  },
142
183
  this.abortController.signal
143
184
  )
@@ -145,13 +186,13 @@ export class RandomGraphNode extends EventEmitter<Events> {
145
186
  addManagedEventListener(
146
187
  this.config.proxyConnectionRpcLocal,
147
188
  'newConnection',
148
- (id: NodeID) => this.config.propagation.onNeighborJoined(id),
189
+ (id: DhtAddress) => this.config.propagation.onNeighborJoined(id),
149
190
  this.abortController.signal
150
191
  )
151
192
  }
152
193
  const candidates = this.getNeighborCandidatesFromLayer1()
153
194
  if (candidates.length > 0) {
154
- this.newContact(candidates)
195
+ this.onContactAdded(candidates)
155
196
  }
156
197
  this.config.neighborFinder.start()
157
198
  await this.config.neighborUpdateManager.start()
@@ -164,20 +205,47 @@ export class RandomGraphNode extends EventEmitter<Events> {
164
205
  (req: LeaveStreamPartNotice, context) => this.deliveryRpcLocal.leaveStreamPartNotice(req, context))
165
206
  this.config.rpcCommunicator.registerRpcMethod(TemporaryConnectionRequest, TemporaryConnectionResponse, 'openConnection',
166
207
  (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.openConnection(req, context))
208
+ this.config.rpcCommunicator.registerRpcNotification(CloseTemporaryConnection, 'closeConnection',
209
+ (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.closeConnection(req, context))
167
210
  }
168
211
 
169
- private newContact(closestNodes: PeerDescriptor[]): void {
212
+ private onRingContactEvent(ringPeers: RingContacts): void {
213
+ logger.trace(`onRingContactAdded`)
214
+ if (this.isStopped()) {
215
+ return
216
+ }
217
+ this.config.leftNodeView.replaceAll(ringPeers.left.map((peer) =>
218
+ new DeliveryRpcRemote(
219
+ this.config.localPeerDescriptor,
220
+ peer,
221
+ this.config.rpcCommunicator,
222
+ DeliveryRpcClient,
223
+ this.config.rpcRequestTimeout
224
+ )
225
+ ))
226
+ this.config.rightNodeView.replaceAll(ringPeers.right.map((peer) =>
227
+ new DeliveryRpcRemote(
228
+ this.config.localPeerDescriptor,
229
+ peer,
230
+ this.config.rpcCommunicator,
231
+ DeliveryRpcClient,
232
+ this.config.rpcRequestTimeout
233
+ )
234
+ ))
235
+ }
236
+
237
+ private onContactAdded(closestNodes: PeerDescriptor[]): void {
170
238
  logger.trace(`New nearby contact found`)
171
239
  if (this.isStopped()) {
172
240
  return
173
241
  }
174
242
  this.updateNearbyNodeView(closestNodes)
175
- if (this.config.targetNeighbors.size() < this.config.numOfTargetNeighbors) {
243
+ if (this.config.neighbors.size() < this.config.neighborTargetCount) {
176
244
  this.config.neighborFinder.start()
177
245
  }
178
246
  }
179
247
 
180
- private removedContact(closestNodes: PeerDescriptor[]): void {
248
+ private onContactRemoved(closestNodes: PeerDescriptor[]): void {
181
249
  logger.trace(`Nearby contact removed`)
182
250
  if (this.isStopped()) {
183
251
  return
@@ -190,12 +258,12 @@ export class RandomGraphNode extends EventEmitter<Events> {
190
258
  new DeliveryRpcRemote(
191
259
  this.config.localPeerDescriptor,
192
260
  descriptor,
193
- this.config.streamPartId,
194
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
261
+ this.config.rpcCommunicator,
262
+ DeliveryRpcClient,
195
263
  this.config.rpcRequestTimeout
196
264
  )
197
265
  ))
198
- for (const descriptor of this.config.layer1Node.getKBucketPeers()) {
266
+ for (const descriptor of this.config.layer1Node.getNeighbors()) {
199
267
  if (this.config.nearbyNodeView.size() >= this.config.nodeViewSize) {
200
268
  break
201
269
  }
@@ -203,8 +271,8 @@ export class RandomGraphNode extends EventEmitter<Events> {
203
271
  new DeliveryRpcRemote(
204
272
  this.config.localPeerDescriptor,
205
273
  descriptor,
206
- this.config.streamPartId,
207
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
274
+ this.config.rpcCommunicator,
275
+ DeliveryRpcClient,
208
276
  this.config.rpcRequestTimeout
209
277
 
210
278
  )
@@ -212,7 +280,7 @@ export class RandomGraphNode extends EventEmitter<Events> {
212
280
  }
213
281
  }
214
282
 
215
- private newRandomContact(randomNodes: PeerDescriptor[]): void {
283
+ private onRandomContactAdded(randomNodes: PeerDescriptor[]): void {
216
284
  if (this.isStopped()) {
217
285
  return
218
286
  }
@@ -220,17 +288,17 @@ export class RandomGraphNode extends EventEmitter<Events> {
220
288
  new DeliveryRpcRemote(
221
289
  this.config.localPeerDescriptor,
222
290
  descriptor,
223
- this.config.streamPartId,
224
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
291
+ this.config.rpcCommunicator,
292
+ DeliveryRpcClient,
225
293
  this.config.rpcRequestTimeout
226
294
  )
227
295
  ))
228
- if (this.config.targetNeighbors.size() < this.config.numOfTargetNeighbors) {
296
+ if (this.config.neighbors.size() < this.config.neighborTargetCount) {
229
297
  this.config.neighborFinder.start()
230
298
  }
231
299
  }
232
300
 
233
- private removedRandomContact(randomNodes: PeerDescriptor[]): void {
301
+ private onRandomContactRemoved(randomNodes: PeerDescriptor[]): void {
234
302
  logger.trace(`New nearby contact found`)
235
303
  if (this.isStopped()) {
236
304
  return
@@ -239,34 +307,34 @@ export class RandomGraphNode extends EventEmitter<Events> {
239
307
  new DeliveryRpcRemote(
240
308
  this.config.localPeerDescriptor,
241
309
  descriptor,
242
- this.config.streamPartId,
243
- toProtoRpcClient(new DeliveryRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
310
+ this.config.rpcCommunicator,
311
+ DeliveryRpcClient,
244
312
  this.config.rpcRequestTimeout
245
313
  )
246
314
  ))
247
315
  }
248
316
 
249
317
  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)
318
+ const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
319
+ if (this.config.neighbors.has(nodeId)) {
320
+ this.config.neighbors.remove(nodeId)
321
+ this.config.neighborFinder.start([nodeId])
322
+ this.config.temporaryConnectionRpcLocal.removeNode(nodeId)
255
323
  }
256
324
  }
257
325
 
258
326
  private getNeighborCandidatesFromLayer1(): PeerDescriptor[] {
259
- const uniqueNodes = new Set<PeerDescriptor>()
327
+ const nodes: PeerDescriptor[] = []
260
328
  this.config.layer1Node.getClosestContacts(this.config.nodeViewSize).forEach((peer: PeerDescriptor) => {
261
- uniqueNodes.add(peer)
329
+ nodes.push(peer)
262
330
  })
263
- this.config.layer1Node.getKBucketPeers().forEach((peer: PeerDescriptor) => {
264
- uniqueNodes.add(peer)
331
+ this.config.layer1Node.getNeighbors().forEach((peer: PeerDescriptor) => {
332
+ nodes.push(peer)
265
333
  })
266
- return Array.from(uniqueNodes)
334
+ return uniqBy(nodes, (p) => getNodeIdFromPeerDescriptor(p))
267
335
  }
268
336
 
269
- hasProxyConnection(nodeId: NodeID): boolean {
337
+ hasProxyConnection(nodeId: DhtAddress): boolean {
270
338
  if (this.config.proxyConnectionRpcLocal) {
271
339
  return this.config.proxyConnectionRpcLocal.hasConnection(nodeId)
272
340
  }
@@ -279,52 +347,54 @@ export class RandomGraphNode extends EventEmitter<Events> {
279
347
  }
280
348
  this.abortController.abort()
281
349
  this.config.proxyConnectionRpcLocal?.stop()
282
- this.config.targetNeighbors.getAll().map((remote) => remote.leaveStreamPartNotice())
350
+ this.config.neighbors.getAll().map(
351
+ (remote) => remote.leaveStreamPartNotice(this.config.streamPartId, this.config.isLocalNodeEntryPoint())
352
+ )
283
353
  this.config.rpcCommunicator.destroy()
284
354
  this.removeAllListeners()
285
355
  this.config.nearbyNodeView.stop()
286
- this.config.targetNeighbors.stop()
356
+ this.config.neighbors.stop()
287
357
  this.config.randomNodeView.stop()
288
358
  this.config.neighborFinder.stop()
289
359
  this.config.neighborUpdateManager.stop()
290
360
  this.config.inspector.stop()
291
361
  }
292
362
 
293
- broadcast(msg: StreamMessage, previousNode?: NodeID): void {
363
+ broadcast(msg: StreamMessage, previousNode?: DhtAddress): void {
294
364
  if (!previousNode) {
295
365
  markAndCheckDuplicate(this.duplicateDetectors, msg.messageId!, msg.previousMessageRef)
296
366
  }
297
367
  this.emit('message', msg)
298
- this.config.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), previousNode ?? null)
368
+ const skipBackPropagation = previousNode !== undefined && !this.config.temporaryConnectionRpcLocal.hasNode(previousNode)
369
+ this.config.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), skipBackPropagation ? previousNode : null)
299
370
  }
300
371
 
301
372
  inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
302
373
  return this.config.inspector.inspect(peerDescriptor)
303
374
  }
304
375
 
305
- private getPropagationTargets(msg: StreamMessage): NodeID[] {
306
- let propagationTargets = this.config.targetNeighbors.getIds()
376
+ private getPropagationTargets(msg: StreamMessage): DhtAddress[] {
377
+ let propagationTargets = this.config.neighbors.getIds()
307
378
  if (this.config.proxyConnectionRpcLocal) {
308
- propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal!.getPropagationTargets(msg))
379
+ propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal.getPropagationTargets(msg))
309
380
  }
310
- propagationTargets = propagationTargets.filter((target) => !this.config.inspector.isInspected(target ))
311
381
  propagationTargets = propagationTargets.concat(this.config.temporaryConnectionRpcLocal.getNodes().getIds())
312
382
  return propagationTargets
313
383
  }
314
384
 
315
- getOwnNodeId(): NodeID {
385
+ getOwnNodeId(): DhtAddress {
316
386
  return getNodeIdFromPeerDescriptor(this.config.localPeerDescriptor)
317
387
  }
318
388
 
319
- getNumberOfOutgoingHandshakes(): number {
389
+ getOutgoingHandshakeCount(): number {
320
390
  return this.config.handshaker.getOngoingHandshakes().size
321
391
  }
322
392
 
323
- getTargetNeighborIds(): NodeID[] {
393
+ getNeighbors(): PeerDescriptor[] {
324
394
  if (!this.started && this.isStopped()) {
325
395
  return []
326
396
  }
327
- return this.config.targetNeighbors.getIds()
397
+ return this.config.neighbors.getAll().map((n) => n.getPeerDescriptor())
328
398
  }
329
399
 
330
400
  getNearbyNodeView(): NodeList {