@streamr/trackerless-network 102.0.0-beta.0 → 102.0.0-beta.2

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 (231) hide show
  1. package/dist/generated/google/protobuf/any.js.map +1 -0
  2. package/dist/generated/google/protobuf/empty.js.map +1 -0
  3. package/dist/generated/google/protobuf/timestamp.js.map +1 -0
  4. package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.client.d.ts +9 -0
  5. package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.client.js +7 -0
  6. package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +1 -0
  7. package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.d.ts +32 -8
  8. package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.js +23 -7
  9. package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -0
  10. package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.server.d.ts +5 -0
  11. package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +1 -0
  12. package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  13. package/dist/generated/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
  14. package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.d.ts +3 -3
  15. package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.js +1 -1
  16. package/dist/generated/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
  17. package/dist/generated/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
  18. package/dist/package.json +9 -10
  19. package/dist/src/NetworkNode.d.ts +4 -3
  20. package/dist/src/NetworkNode.js.map +1 -1
  21. package/dist/src/NetworkStack.d.ts +2 -2
  22. package/dist/src/NetworkStack.js +4 -4
  23. package/dist/src/NetworkStack.js.map +1 -1
  24. package/dist/src/exports.d.ts +3 -2
  25. package/dist/src/exports.js +3 -2
  26. package/dist/src/exports.js.map +1 -1
  27. package/dist/src/logic/ContentDeliveryLayerNode.d.ts +2 -1
  28. package/dist/src/logic/ContentDeliveryLayerNode.js +5 -5
  29. package/dist/src/logic/ContentDeliveryLayerNode.js.map +1 -1
  30. package/dist/src/logic/ContentDeliveryManager.d.ts +2 -1
  31. package/dist/src/logic/ContentDeliveryManager.js +2 -1
  32. package/dist/src/logic/ContentDeliveryManager.js.map +1 -1
  33. package/dist/src/logic/ContentDeliveryRpcLocal.d.ts +3 -3
  34. package/dist/src/logic/ContentDeliveryRpcLocal.js +1 -1
  35. package/dist/src/logic/ContentDeliveryRpcLocal.js.map +1 -1
  36. package/dist/src/logic/ContentDeliveryRpcRemote.d.ts +2 -2
  37. package/dist/src/logic/ControlLayerNode.d.ts +1 -1
  38. package/dist/src/logic/DiscoveryLayerNode.d.ts +3 -3
  39. package/dist/src/logic/DuplicateMessageDetector.js +1 -1
  40. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
  41. package/dist/src/logic/PeerDescriptorStoreManager.d.ts +1 -1
  42. package/dist/src/logic/PeerDescriptorStoreManager.js +1 -1
  43. package/dist/src/logic/PeerDescriptorStoreManager.js.map +1 -1
  44. package/dist/src/logic/inspect/InspectSession.d.ts +2 -2
  45. package/dist/src/logic/inspect/InspectSession.js +2 -2
  46. package/dist/src/logic/inspect/InspectSession.js.map +1 -1
  47. package/dist/src/logic/inspect/Inspector.d.ts +1 -1
  48. package/dist/src/logic/inspect/Inspector.js +1 -1
  49. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  50. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +2 -2
  51. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +2 -2
  52. package/dist/src/logic/neighbor-discovery/Handshaker.js +2 -2
  53. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  54. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +2 -2
  55. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  56. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +2 -2
  57. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +1 -1
  58. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  59. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +1 -1
  60. package/dist/src/logic/node-info/NodeInfoClient.d.ts +1 -1
  61. package/dist/src/logic/node-info/NodeInfoClient.js +1 -1
  62. package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -1
  63. package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +2 -2
  64. package/dist/src/logic/node-info/NodeInfoRpcLocal.js +1 -1
  65. package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -1
  66. package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +2 -2
  67. package/dist/src/logic/propagation/Propagation.d.ts +1 -1
  68. package/dist/src/logic/propagation/PropagationTaskStore.d.ts +1 -1
  69. package/dist/src/logic/proxy/ProxyClient.d.ts +1 -2
  70. package/dist/src/logic/proxy/ProxyClient.js +2 -3
  71. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  72. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +2 -2
  73. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +4 -4
  74. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  75. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +2 -2
  76. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js +1 -1
  77. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +4 -4
  78. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +1 -1
  79. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  80. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +1 -1
  81. package/dist/src/logic/utils.d.ts +1 -1
  82. package/dist/src/logic/utils.js +2 -2
  83. package/dist/src/logic/utils.js.map +1 -1
  84. package/dist/src/types.d.ts +6 -0
  85. package/dist/src/types.js +3 -0
  86. package/dist/src/types.js.map +1 -0
  87. package/dist/test/benchmark/first-message.js +2 -2
  88. package/dist/test/benchmark/first-message.js.map +1 -1
  89. package/dist/test/utils/utils.d.ts +2 -2
  90. package/dist/test/utils/utils.js +5 -4
  91. package/dist/test/utils/utils.js.map +1 -1
  92. package/jest.config.ts +13 -0
  93. package/package.json +9 -10
  94. package/proto.sh +2 -2
  95. package/protos/NetworkRpc.proto +2 -3
  96. package/.eslintignore +0 -7
  97. package/.eslintrc +0 -3
  98. package/dist/src/proto/google/protobuf/any.js.map +0 -1
  99. package/dist/src/proto/google/protobuf/empty.js.map +0 -1
  100. package/dist/src/proto/google/protobuf/timestamp.js.map +0 -1
  101. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +0 -1
  102. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +0 -1
  103. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +0 -1
  104. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +0 -1
  105. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +0 -1
  106. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +0 -1
  107. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +0 -1
  108. package/jest.config.js +0 -8
  109. package/src/NetworkNode.ts +0 -141
  110. package/src/NetworkStack.ts +0 -198
  111. package/src/exports.ts +0 -16
  112. package/src/logic/ContentDeliveryLayerNode.ts +0 -424
  113. package/src/logic/ContentDeliveryManager.ts +0 -399
  114. package/src/logic/ContentDeliveryRpcLocal.ts +0 -48
  115. package/src/logic/ContentDeliveryRpcRemote.ts +0 -44
  116. package/src/logic/ControlLayerNode.ts +0 -17
  117. package/src/logic/DiscoveryLayerNode.ts +0 -30
  118. package/src/logic/DuplicateMessageDetector.ts +0 -167
  119. package/src/logic/ExternalNetworkRpc.ts +0 -42
  120. package/src/logic/NodeList.ts +0 -114
  121. package/src/logic/PeerDescriptorStoreManager.ts +0 -96
  122. package/src/logic/StreamPartNetworkSplitAvoidance.ts +0 -90
  123. package/src/logic/StreamPartReconnect.ts +0 -38
  124. package/src/logic/createContentDeliveryLayerNode.ts +0 -130
  125. package/src/logic/formStreamPartDeliveryServiceId.ts +0 -7
  126. package/src/logic/inspect/InspectSession.ts +0 -54
  127. package/src/logic/inspect/Inspector.ts +0 -100
  128. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +0 -138
  129. package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +0 -66
  130. package/src/logic/neighbor-discovery/Handshaker.ts +0 -215
  131. package/src/logic/neighbor-discovery/NeighborFinder.ts +0 -77
  132. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +0 -69
  133. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +0 -75
  134. package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +0 -35
  135. package/src/logic/node-info/NodeInfoClient.ts +0 -23
  136. package/src/logic/node-info/NodeInfoRpcLocal.ts +0 -28
  137. package/src/logic/node-info/NodeInfoRpcRemote.ts +0 -11
  138. package/src/logic/propagation/FifoMapWithTTL.ts +0 -116
  139. package/src/logic/propagation/Propagation.ts +0 -84
  140. package/src/logic/propagation/PropagationTaskStore.ts +0 -41
  141. package/src/logic/proxy/ProxyClient.ts +0 -287
  142. package/src/logic/proxy/ProxyConnectionRpcLocal.ts +0 -106
  143. package/src/logic/proxy/ProxyConnectionRpcRemote.ts +0 -26
  144. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +0 -73
  145. package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +0 -29
  146. package/src/logic/utils.ts +0 -18
  147. package/src/proto/google/protobuf/any.ts +0 -326
  148. package/src/proto/google/protobuf/empty.ts +0 -81
  149. package/src/proto/google/protobuf/timestamp.ts +0 -287
  150. package/src/proto/packages/dht/protos/DhtRpc.client.ts +0 -407
  151. package/src/proto/packages/dht/protos/DhtRpc.server.ts +0 -160
  152. package/src/proto/packages/dht/protos/DhtRpc.ts +0 -1244
  153. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +0 -108
  154. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +0 -218
  155. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +0 -85
  156. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +0 -783
  157. package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +0 -60
  158. package/test/benchmark/first-message.ts +0 -169
  159. package/test/end-to-end/content-delivery-layer-node-with-real-connections.test.ts +0 -160
  160. package/test/end-to-end/external-network-rpc.test.ts +0 -67
  161. package/test/end-to-end/inspect.test.ts +0 -124
  162. package/test/end-to-end/proxy-and-full-node.test.ts +0 -143
  163. package/test/end-to-end/proxy-connections.test.ts +0 -228
  164. package/test/end-to-end/proxy-key-exchange.test.ts +0 -126
  165. package/test/end-to-end/webrtc-full-node-network.test.ts +0 -85
  166. package/test/end-to-end/websocket-full-node-network.test.ts +0 -84
  167. package/test/integration/ContentDeliveryLayerNode-Layer1Node-Latencies.test.ts +0 -139
  168. package/test/integration/ContentDeliveryLayerNode-Layer1Node.test.ts +0 -162
  169. package/test/integration/ContentDeliveryManager.test.ts +0 -157
  170. package/test/integration/ContentDeliveryRpcRemote.test.ts +0 -100
  171. package/test/integration/HandshakeRpcRemote.test.ts +0 -79
  172. package/test/integration/Handshakes.test.ts +0 -176
  173. package/test/integration/Inspect.test.ts +0 -89
  174. package/test/integration/NeighborUpdateRpcRemote.test.ts +0 -82
  175. package/test/integration/NetworkNode.test.ts +0 -115
  176. package/test/integration/NetworkRpc.test.ts +0 -52
  177. package/test/integration/NetworkStack.test.ts +0 -72
  178. package/test/integration/NodeInfoRpc.test.ts +0 -109
  179. package/test/integration/Propagation.test.ts +0 -76
  180. package/test/integration/joining-streams-on-offline-peers.test.ts +0 -82
  181. package/test/integration/stream-without-default-entrypoints.test.ts +0 -128
  182. package/test/integration/streamEntryPointReplacing.test.ts +0 -97
  183. package/test/types/global.d.ts +0 -2
  184. package/test/unit/ContentDeliveryLayerNode.test.ts +0 -112
  185. package/test/unit/ContentDeliveryManager.test.ts +0 -95
  186. package/test/unit/ContentDeliveryRpcLocal.test.ts +0 -60
  187. package/test/unit/DuplicateMessageDetector.test.ts +0 -192
  188. package/test/unit/ExternalNetworkRpc.test.ts +0 -48
  189. package/test/unit/FifoMapWithTtl.test.ts +0 -253
  190. package/test/unit/HandshakeRpcLocal.test.ts +0 -168
  191. package/test/unit/Handshaker.test.ts +0 -69
  192. package/test/unit/InspectSession.test.ts +0 -80
  193. package/test/unit/Inspector.test.ts +0 -51
  194. package/test/unit/NeighborFinder.test.ts +0 -51
  195. package/test/unit/NeighborUpdateRpcLocal.test.ts +0 -139
  196. package/test/unit/NetworkNode.test.ts +0 -42
  197. package/test/unit/NodeList.test.ts +0 -164
  198. package/test/unit/NumberPair.test.ts +0 -22
  199. package/test/unit/PeerDescriptorStoreManager.test.ts +0 -103
  200. package/test/unit/Propagation.test.ts +0 -151
  201. package/test/unit/ProxyConnectionRpcRemote.test.ts +0 -39
  202. package/test/unit/StreamPartIDDataKey.test.ts +0 -12
  203. package/test/unit/StreamPartNetworkSplitAvoidance.test.ts +0 -31
  204. package/test/unit/StreamPartReconnect.test.ts +0 -30
  205. package/test/unit/TemporaryConnectionRpcLocal.test.ts +0 -38
  206. package/test/utils/fake/FakePeerDescriptorStoreManager.ts +0 -29
  207. package/test/utils/mock/MockConnectionsView.ts +0 -18
  208. package/test/utils/mock/MockControlLayerNode.ts +0 -78
  209. package/test/utils/mock/MockDiscoveryLayerNode.ts +0 -60
  210. package/test/utils/mock/MockHandshaker.ts +0 -17
  211. package/test/utils/mock/MockNeighborFinder.ts +0 -20
  212. package/test/utils/mock/MockNeighborUpdateManager.ts +0 -21
  213. package/test/utils/mock/MockTransport.ts +0 -30
  214. package/test/utils/utils.ts +0 -143
  215. package/tsconfig.browser.json +0 -12
  216. package/tsconfig.jest.json +0 -16
  217. package/tsconfig.json +0 -3
  218. package/tsconfig.node.json +0 -16
  219. /package/dist/{src/proto → generated}/google/protobuf/any.d.ts +0 -0
  220. /package/dist/{src/proto → generated}/google/protobuf/any.js +0 -0
  221. /package/dist/{src/proto → generated}/google/protobuf/empty.d.ts +0 -0
  222. /package/dist/{src/proto → generated}/google/protobuf/empty.js +0 -0
  223. /package/dist/{src/proto → generated}/google/protobuf/timestamp.d.ts +0 -0
  224. /package/dist/{src/proto → generated}/google/protobuf/timestamp.js +0 -0
  225. /package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.server.js +0 -0
  226. /package/dist/{src/proto → generated}/packages/proto-rpc/protos/ProtoRpc.d.ts +0 -0
  227. /package/dist/{src/proto → generated}/packages/proto-rpc/protos/ProtoRpc.js +0 -0
  228. /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.client.d.ts +0 -0
  229. /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.client.js +0 -0
  230. /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.server.d.ts +0 -0
  231. /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.server.js +0 -0
@@ -1,399 +0,0 @@
1
- import {
2
- ConnectionLocker,
3
- DhtAddress,
4
- DhtNode,
5
- EXISTING_CONNECTION_TIMEOUT,
6
- ITransport,
7
- PeerDescriptor,
8
- toDhtAddress,
9
- toNodeId
10
- } from '@streamr/dht'
11
- import {
12
- Logger,
13
- Metric,
14
- MetricsContext,
15
- MetricsDefinition,
16
- RateMetric, StreamID, StreamPartID, StreamPartIDUtils,
17
- UserID,
18
- toStreamPartID
19
- } from '@streamr/utils'
20
- import { createHash } from 'crypto'
21
- import { EventEmitter } from 'eventemitter3'
22
- import { sampleSize } from 'lodash'
23
- import { ProxyDirection, StreamMessage, StreamPartitionInfo } from '../proto/packages/trackerless-network/protos/NetworkRpc'
24
- import { ContentDeliveryLayerNode } from './ContentDeliveryLayerNode'
25
- import { ControlLayerNode } from './ControlLayerNode'
26
- import { DiscoveryLayerNode } from './DiscoveryLayerNode'
27
- import { MAX_NODE_COUNT, PeerDescriptorStoreManager } from './PeerDescriptorStoreManager'
28
- import { MIN_NEIGHBOR_COUNT as NETWORK_SPLIT_AVOIDANCE_MIN_NEIGHBOR_COUNT, StreamPartNetworkSplitAvoidance } from './StreamPartNetworkSplitAvoidance'
29
- import { StreamPartReconnect } from './StreamPartReconnect'
30
- import { createContentDeliveryLayerNode } from './createContentDeliveryLayerNode'
31
- import { ProxyClient } from './proxy/ProxyClient'
32
- import { ConnectionManager } from '@streamr/dht/src/exports'
33
-
34
- export type StreamPartDelivery = {
35
- broadcast: (msg: StreamMessage) => void
36
- stop: () => Promise<void>
37
- } & ({
38
- proxied: false
39
- discoveryLayerNode: DiscoveryLayerNode
40
- node: ContentDeliveryLayerNode
41
- networkSplitAvoidance: StreamPartNetworkSplitAvoidance
42
- getDiagnosticInfo: () => Record<string, unknown>
43
- } | {
44
- proxied: true
45
- client: ProxyClient
46
- getDiagnosticInfo: () => Record<string, unknown>
47
- })
48
-
49
- export interface Events {
50
- newMessage: (msg: StreamMessage) => void
51
- }
52
-
53
- const logger = new Logger(module)
54
-
55
- interface Metrics extends MetricsDefinition {
56
- broadcastMessagesPerSecond: Metric
57
- broadcastBytesPerSecond: Metric
58
- }
59
-
60
- export interface ContentDeliveryManagerOptions {
61
- metricsContext?: MetricsContext
62
- streamPartitionNeighborTargetCount?: number
63
- streamPartitionMinPropagationTargets?: number
64
- acceptProxyConnections?: boolean
65
- rpcRequestTimeout?: number
66
- neighborUpdateInterval?: number
67
- }
68
-
69
- export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => {
70
- return toDhtAddress(new Uint8Array((createHash('sha1').update(streamPartId).digest())))
71
- }
72
-
73
- export class ContentDeliveryManager extends EventEmitter<Events> {
74
-
75
- private transport?: ITransport
76
- private connectionLocker?: ConnectionLocker
77
- private controlLayerNode?: ControlLayerNode
78
- private readonly metricsContext: MetricsContext
79
- private readonly metrics: Metrics
80
- private readonly options: ContentDeliveryManagerOptions
81
- private readonly streamParts: Map<StreamPartID, StreamPartDelivery>
82
- private readonly knownStreamPartEntryPoints: Map<StreamPartID, PeerDescriptor[]> = new Map()
83
- private started = false
84
- private destroyed = false
85
-
86
- constructor(options: ContentDeliveryManagerOptions) {
87
- super()
88
- this.options = options
89
- this.streamParts = new Map()
90
- this.metricsContext = options.metricsContext ?? new MetricsContext()
91
- this.metrics = {
92
- broadcastMessagesPerSecond: new RateMetric(),
93
- broadcastBytesPerSecond: new RateMetric()
94
- }
95
- this.metricsContext.addMetrics('node', this.metrics)
96
- }
97
-
98
- async start(startedAndJoinedControlLayerNode: ControlLayerNode, transport: ITransport, connectionLocker: ConnectionLocker): Promise<void> {
99
- if (this.started || this.destroyed) {
100
- return
101
- }
102
- this.started = true
103
- this.controlLayerNode = startedAndJoinedControlLayerNode
104
- this.transport = transport
105
- this.connectionLocker = connectionLocker
106
- }
107
-
108
- async destroy(): Promise<void> {
109
- if (!this.started || this.destroyed) {
110
- return
111
- }
112
- logger.trace('Destroying ContentDeliveryManager')
113
- this.destroyed = true
114
- await Promise.all(Array.from(this.streamParts.values()).map((streamPart) => streamPart.stop()))
115
- this.streamParts.clear()
116
- this.removeAllListeners()
117
- this.controlLayerNode = undefined
118
- this.transport = undefined
119
- this.connectionLocker = undefined
120
- }
121
-
122
- broadcast(msg: StreamMessage): void {
123
- const streamPartId = toStreamPartID(msg.messageId!.streamId as StreamID, msg.messageId!.streamPartition)
124
- logger.debug(`Broadcasting to stream part ${streamPartId}`)
125
- this.joinStreamPart(streamPartId)
126
- this.streamParts.get(streamPartId)!.broadcast(msg)
127
- if (msg.body.oneofKind === 'contentMessage') {
128
- this.metrics.broadcastMessagesPerSecond.record(1)
129
- this.metrics.broadcastBytesPerSecond.record(msg.body.contentMessage.content.length)
130
- }
131
- }
132
-
133
- async leaveStreamPart(streamPartId: StreamPartID): Promise<void> {
134
- const streamPart = this.streamParts.get(streamPartId)
135
- if (streamPart) {
136
- await streamPart.stop()
137
- this.streamParts.delete(streamPartId)
138
- }
139
- }
140
-
141
- joinStreamPart(streamPartId: StreamPartID): void {
142
- let streamPart = this.streamParts.get(streamPartId)
143
- if (streamPart !== undefined) {
144
- return
145
- }
146
- logger.debug(`Join stream part ${streamPartId}`)
147
- const discoveryLayerNode = this.createDiscoveryLayerNode(streamPartId, this.knownStreamPartEntryPoints.get(streamPartId) ?? [])
148
- const peerDescriptorStoreManager = new PeerDescriptorStoreManager({
149
- key: streamPartIdToDataKey(streamPartId),
150
- localPeerDescriptor: this.getPeerDescriptor(),
151
- fetchDataFromDht: (key) => this.controlLayerNode!.fetchDataFromDht(key),
152
- storeDataToDht: (key, data) => this.controlLayerNode!.storeDataToDht(key, data),
153
- deleteDataFromDht: async (key, waitForCompletion) => this.controlLayerNode!.deleteDataFromDht(key, waitForCompletion)
154
- })
155
- const networkSplitAvoidance = new StreamPartNetworkSplitAvoidance({
156
- discoveryLayerNode,
157
- discoverEntryPoints: async () => peerDescriptorStoreManager.fetchNodes()
158
- })
159
- const node = this.createContentDeliveryLayerNode(
160
- streamPartId,
161
- discoveryLayerNode,
162
- () => peerDescriptorStoreManager.isLocalNodeStored()
163
- )
164
- const streamPartReconnect = new StreamPartReconnect(discoveryLayerNode, peerDescriptorStoreManager)
165
- streamPart = {
166
- proxied: false,
167
- discoveryLayerNode,
168
- node,
169
- networkSplitAvoidance,
170
- broadcast: (msg: StreamMessage) => node.broadcast(msg),
171
- stop: async () => {
172
- streamPartReconnect.destroy()
173
- networkSplitAvoidance.destroy()
174
- await peerDescriptorStoreManager.destroy()
175
- node.stop()
176
- await discoveryLayerNode.stop()
177
- },
178
- getDiagnosticInfo: () => node.getDiagnosticInfo()
179
- }
180
- this.streamParts.set(streamPartId, streamPart)
181
- node.on('message', (message: StreamMessage) => {
182
- this.emit('newMessage', message)
183
- })
184
- const handleEntryPointLeave = async () => {
185
- if (this.destroyed || peerDescriptorStoreManager.isLocalNodeStored() || this.knownStreamPartEntryPoints.has(streamPartId)) {
186
- return
187
- }
188
- const entryPoints = await peerDescriptorStoreManager.fetchNodes()
189
- if (entryPoints.length < MAX_NODE_COUNT) {
190
- await peerDescriptorStoreManager.storeAndKeepLocalNode()
191
- }
192
- }
193
- discoveryLayerNode.on('manualRejoinRequired', async () => {
194
- if (!streamPartReconnect.isRunning() && !networkSplitAvoidance.isRunning()) {
195
- logger.debug('Manual rejoin required for stream part', { streamPartId })
196
- await streamPartReconnect.reconnect()
197
- }
198
- })
199
- node.on('entryPointLeaveDetected', () => handleEntryPointLeave())
200
- setImmediate(async () => {
201
- try {
202
- await this.startLayersAndJoinDht(streamPartId, peerDescriptorStoreManager)
203
- } catch (err) {
204
- logger.warn(`Failed to join to stream part ${streamPartId}`, { err })
205
- }
206
- })
207
- }
208
-
209
- private async startLayersAndJoinDht(streamPartId: StreamPartID, peerDescriptorStoreManager: PeerDescriptorStoreManager): Promise<void> {
210
- logger.debug(`Start layers and join DHT for stream part ${streamPartId}`)
211
- const streamPart = this.streamParts.get(streamPartId)
212
- if ((streamPart === undefined) || streamPart.proxied) {
213
- // leaveStreamPart has been called (or leaveStreamPart called, and then setProxies called)
214
- return
215
- }
216
- if ((this.transport! as ConnectionManager).isPrivateClientMode()) {
217
- await (this.transport! as ConnectionManager).disablePrivateClientMode()
218
- }
219
- await streamPart.discoveryLayerNode.start()
220
- await streamPart.node.start()
221
- const knownEntryPoints = this.knownStreamPartEntryPoints.get(streamPartId)
222
- if (knownEntryPoints !== undefined) {
223
- await Promise.all([
224
- streamPart.discoveryLayerNode.joinDht(knownEntryPoints),
225
- streamPart.discoveryLayerNode.joinRing()
226
- ])
227
- } else {
228
- const entryPoints = await peerDescriptorStoreManager.fetchNodes()
229
- await Promise.all([
230
- streamPart.discoveryLayerNode.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_MIN_NEIGHBOR_COUNT)),
231
- streamPart.discoveryLayerNode.joinRing()
232
- ])
233
- if (entryPoints.length < MAX_NODE_COUNT) {
234
- await peerDescriptorStoreManager.storeAndKeepLocalNode()
235
- if (streamPart.discoveryLayerNode.getNeighborCount() < NETWORK_SPLIT_AVOIDANCE_MIN_NEIGHBOR_COUNT) {
236
- setImmediate(() => streamPart.networkSplitAvoidance.avoidNetworkSplit())
237
- }
238
- }
239
- }
240
- }
241
-
242
- private createDiscoveryLayerNode(streamPartId: StreamPartID, entryPoints: PeerDescriptor[]): DiscoveryLayerNode {
243
- return new DhtNode({
244
- transport: this.controlLayerNode!,
245
- connectionsView: this.controlLayerNode!.getConnectionsView(),
246
- serviceId: 'layer1::' + streamPartId,
247
- peerDescriptor: this.controlLayerNode!.getLocalPeerDescriptor(),
248
- entryPoints,
249
- numberOfNodesPerKBucket: 4, // TODO use options option or named constant?
250
- rpcRequestTimeout: EXISTING_CONNECTION_TIMEOUT,
251
- dhtJoinTimeout: 20000, // TODO use options option or named constant?
252
- periodicallyPingNeighbors: true,
253
- periodicallyPingRingContacts: true
254
- })
255
- }
256
-
257
- private createContentDeliveryLayerNode(
258
- streamPartId: StreamPartID,
259
- discoveryLayerNode: DiscoveryLayerNode,
260
- isLocalNodeEntryPoint: () => boolean
261
- ) {
262
- return createContentDeliveryLayerNode({
263
- streamPartId,
264
- transport: this.transport!,
265
- discoveryLayerNode,
266
- connectionLocker: this.connectionLocker!,
267
- localPeerDescriptor: this.controlLayerNode!.getLocalPeerDescriptor(),
268
- minPropagationTargets: this.options.streamPartitionMinPropagationTargets,
269
- neighborTargetCount: this.options.streamPartitionNeighborTargetCount,
270
- acceptProxyConnections: this.options.acceptProxyConnections,
271
- rpcRequestTimeout: this.options.rpcRequestTimeout,
272
- neighborUpdateInterval: this.options.neighborUpdateInterval,
273
- isLocalNodeEntryPoint
274
- })
275
- }
276
-
277
- async setProxies(
278
- streamPartId: StreamPartID,
279
- nodes: PeerDescriptor[],
280
- direction: ProxyDirection,
281
- userId: UserID,
282
- connectionCount?: number
283
- ): Promise<void> {
284
- // TODO explicit default value for "acceptProxyConnections" or make it required
285
- if (this.options.acceptProxyConnections) {
286
- throw new Error('cannot set proxies when acceptProxyConnections=true')
287
- }
288
- const enable = (nodes.length > 0) && ((connectionCount === undefined) || (connectionCount > 0))
289
- if (enable) {
290
- let client: ProxyClient
291
- const alreadyProxied = this.isProxiedStreamPart(streamPartId)
292
- if (alreadyProxied) {
293
- client = (this.streamParts.get(streamPartId)! as { client: ProxyClient }).client
294
- } else {
295
- client = this.createProxyClient(streamPartId)
296
- this.streamParts.set(streamPartId, {
297
- proxied: true,
298
- client,
299
- broadcast: (msg: StreamMessage) => client.broadcast(msg),
300
- stop: async () => client.stop(),
301
- getDiagnosticInfo: () => client.getDiagnosticInfo()
302
- })
303
- client.on('message', (message: StreamMessage) => {
304
- this.emit('newMessage', message)
305
- })
306
- if (Array.from(this.streamParts.values()).every((streamPart) => streamPart.proxied)) {
307
- await (this.transport! as ConnectionManager).enablePrivateClientMode()
308
- }
309
- await client.start()
310
- }
311
- await client.setProxies(nodes, direction, userId, connectionCount)
312
- } else {
313
- await this.streamParts.get(streamPartId)?.stop()
314
- this.streamParts.delete(streamPartId)
315
- }
316
- }
317
-
318
- private createProxyClient(streamPartId: StreamPartID): ProxyClient {
319
- return new ProxyClient({
320
- transport: this.transport!,
321
- localPeerDescriptor: this.controlLayerNode!.getLocalPeerDescriptor(),
322
- streamPartId,
323
- connectionLocker: this.connectionLocker!,
324
- minPropagationTargets: this.options.streamPartitionMinPropagationTargets
325
- })
326
- }
327
-
328
- async inspect(peerDescriptor: PeerDescriptor, streamPartId: StreamPartID): Promise<boolean> {
329
- const streamPart = this.streamParts.get(streamPartId)
330
- if ((streamPart !== undefined) && !streamPart.proxied) {
331
- return streamPart.node.inspect(peerDescriptor)
332
- }
333
- return false
334
- }
335
-
336
- // TODO inline this method?
337
- getNodeInfo(): StreamPartitionInfo[] {
338
- const streamParts = Array.from(this.streamParts.entries()).filter(([_, node]) => node.proxied === false)
339
- return streamParts.map(([streamPartId]) => {
340
- const stream = this.streamParts.get(streamPartId)! as { node: ContentDeliveryLayerNode, discoveryLayerNode: DiscoveryLayerNode }
341
- return {
342
- id: streamPartId,
343
- controlLayerNeighbors: stream.discoveryLayerNode.getNeighbors(),
344
- deprecatedContentDeliveryLayerNeighbors: [],
345
- contentDeliveryLayerNeighbors: stream.node.getInfos()
346
- }
347
- })
348
-
349
- }
350
-
351
- setStreamPartEntryPoints(streamPartId: StreamPartID, entryPoints: PeerDescriptor[]): void {
352
- this.knownStreamPartEntryPoints.set(streamPartId, entryPoints)
353
- }
354
-
355
- isProxiedStreamPart(streamPartId: StreamPartID, direction?: ProxyDirection): boolean {
356
- const streamPart = this.streamParts.get(streamPartId)
357
- return (streamPart !== undefined)
358
- && streamPart.proxied
359
- && ((direction === undefined) || (streamPart.client.getDirection() === direction))
360
- }
361
-
362
- getStreamPartDelivery(streamPartId: StreamPartID): StreamPartDelivery | undefined {
363
- return this.streamParts.get(streamPartId)
364
- }
365
-
366
- hasStreamPart(streamPartId: StreamPartID): boolean {
367
- return this.streamParts.has(streamPartId)
368
- }
369
-
370
- getPeerDescriptor(): PeerDescriptor {
371
- return this.controlLayerNode!.getLocalPeerDescriptor()
372
- }
373
-
374
- getNodeId(): DhtAddress {
375
- return toNodeId(this.controlLayerNode!.getLocalPeerDescriptor())
376
- }
377
-
378
- getNeighbors(streamPartId: StreamPartID): DhtAddress[] {
379
- const streamPart = this.streamParts.get(streamPartId)
380
- return (streamPart !== undefined) && (streamPart.proxied === false)
381
- ? streamPart.node.getNeighbors().map((n) => toNodeId(n))
382
- : []
383
- }
384
-
385
- getStreamParts(): StreamPartID[] {
386
- return Array.from(this.streamParts.keys()).map((id) => StreamPartIDUtils.parse(id))
387
- }
388
-
389
- getDiagnosticInfo(): Record<string, unknown> {
390
- return {
391
- streamParts: this.getStreamParts().map((id) => {
392
- return {
393
- id,
394
- info: this.getStreamPartDelivery(id)!.getDiagnosticInfo()
395
- }
396
- })
397
- }
398
- }
399
- }
@@ -1,48 +0,0 @@
1
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
- import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor, toNodeId } from '@streamr/dht'
3
- import { StreamPartID } from '@streamr/utils'
4
- import { Empty } from '../proto/google/protobuf/empty'
5
- import {
6
- LeaveStreamPartNotice,
7
- MessageID,
8
- MessageRef,
9
- StreamMessage
10
- } from '../proto/packages/trackerless-network/protos/NetworkRpc'
11
- import { IContentDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
12
-
13
- export interface ContentDeliveryRpcLocalOptions {
14
- localPeerDescriptor: PeerDescriptor
15
- streamPartId: StreamPartID
16
- markAndCheckDuplicate: (messageId: MessageID, previousMessageRef?: MessageRef) => boolean
17
- broadcast: (message: StreamMessage, previousNode?: DhtAddress) => void
18
- onLeaveNotice(remoteNodeId: DhtAddress, isLocalNodeEntryPoint: boolean): void
19
- markForInspection(remoteNodeId: DhtAddress, messageId: MessageID): void
20
- rpcCommunicator: ListeningRpcCommunicator
21
- }
22
-
23
- export class ContentDeliveryRpcLocal implements IContentDeliveryRpc {
24
-
25
- private readonly options: ContentDeliveryRpcLocalOptions
26
-
27
- constructor(options: ContentDeliveryRpcLocalOptions) {
28
- this.options = options
29
- }
30
-
31
- async sendStreamMessage(message: StreamMessage, context: ServerCallContext): Promise<Empty> {
32
- const previousNode = toNodeId((context as DhtCallContext).incomingSourceDescriptor!)
33
- this.options.markForInspection(previousNode, message.messageId!)
34
- if (this.options.markAndCheckDuplicate(message.messageId!, message.previousMessageRef)) {
35
- this.options.broadcast(message, previousNode)
36
- }
37
- return Empty
38
- }
39
-
40
- async leaveStreamPartNotice(message: LeaveStreamPartNotice, context: ServerCallContext): Promise<Empty> {
41
- if (message.streamPartId === this.options.streamPartId) {
42
- const sourcePeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
43
- const remoteNodeId = toNodeId(sourcePeerDescriptor)
44
- this.options.onLeaveNotice(remoteNodeId, message.isEntryPoint)
45
- }
46
- return Empty
47
- }
48
- }
@@ -1,44 +0,0 @@
1
- import { RpcRemote } from '@streamr/dht'
2
- import { Logger, StreamPartID } from '@streamr/utils'
3
- import {
4
- LeaveStreamPartNotice,
5
- StreamMessage
6
- } from '../proto/packages/trackerless-network/protos/NetworkRpc'
7
- import { ContentDeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
8
-
9
- const logger = new Logger(module)
10
-
11
- export class ContentDeliveryRpcRemote extends RpcRemote<ContentDeliveryRpcClient> {
12
-
13
- private rtt?: number
14
-
15
- async sendStreamMessage(msg: StreamMessage): Promise<void> {
16
- const options = this.formDhtRpcOptions({
17
- notification: true
18
- })
19
- this.getClient().sendStreamMessage(msg, options).catch(() => {
20
- logger.trace('Failed to sendStreamMessage')
21
- })
22
- }
23
-
24
- leaveStreamPartNotice(streamPartId: StreamPartID, isLocalNodeEntryPoint: boolean): void {
25
- const notification: LeaveStreamPartNotice = {
26
- streamPartId,
27
- isEntryPoint: isLocalNodeEntryPoint
28
- }
29
- const options = this.formDhtRpcOptions({
30
- notification: true
31
- })
32
- this.getClient().leaveStreamPartNotice(notification, options).catch(() => {
33
- logger.debug('Failed to send leaveStreamPartNotice')
34
- })
35
- }
36
-
37
- setRtt(rtt: number): void {
38
- this.rtt = rtt
39
- }
40
-
41
- getRtt(): number | undefined {
42
- return this.rtt
43
- }
44
- }
@@ -1,17 +0,0 @@
1
- import { ConnectionsView, DataEntry, DhtAddress, ITransport, PeerDescriptor } from '@streamr/dht'
2
- import { Any } from '../proto/google/protobuf/any'
3
-
4
- export interface ControlLayerNode extends ITransport {
5
- joinDht(entryPointDescriptors: PeerDescriptor[]): Promise<void>
6
- hasJoined(): boolean
7
- getLocalPeerDescriptor(): PeerDescriptor
8
- fetchDataFromDht(key: DhtAddress): Promise<DataEntry[]>
9
- storeDataToDht(key: DhtAddress, data: Any): Promise<PeerDescriptor[]>
10
- deleteDataFromDht(key: DhtAddress, waitForCompletion: boolean): Promise<void>
11
- waitForNetworkConnectivity(): Promise<void>
12
- getTransport(): ITransport
13
- getNeighbors(): PeerDescriptor[]
14
- getConnectionsView(): ConnectionsView
15
- start(): Promise<void>
16
- stop(): Promise<void>
17
- }
@@ -1,30 +0,0 @@
1
- import { DhtAddress, PeerDescriptor, RingContacts } from '@streamr/dht'
2
-
3
- export interface DiscoveryLayerNodeEvents {
4
- manualRejoinRequired: () => void
5
- nearbyContactAdded: (peerDescriptor: PeerDescriptor) => void
6
- nearbyContactRemoved: (peerDescriptor: PeerDescriptor) => void
7
- randomContactAdded: (peerDescriptor: PeerDescriptor) => void
8
- randomContactRemoved: (peerDescriptor: PeerDescriptor) => void
9
- ringContactAdded: (peerDescriptor: PeerDescriptor) => void
10
- ringContactRemoved: (peerDescriptor: PeerDescriptor) => void
11
- }
12
-
13
- export interface DiscoveryLayerNode {
14
- on<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
15
- once<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
16
- off<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
17
- on<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
18
- once<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
19
- off<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
20
- removeContact: (nodeId: DhtAddress) => void
21
- getClosestContacts: (maxCount?: number) => PeerDescriptor[]
22
- getRandomContacts: (maxCount?: number) => PeerDescriptor[]
23
- getRingContacts: () => RingContacts
24
- getNeighbors: () => PeerDescriptor[]
25
- getNeighborCount(): number
26
- joinDht: (entryPoints: PeerDescriptor[], doRandomJoin?: boolean, retry?: boolean) => Promise<void>
27
- joinRing: () => Promise<void>
28
- start: () => Promise<void>
29
- stop: () => Promise<void>
30
- }