@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,287 +0,0 @@
1
- import {
2
- ConnectionLocker,
3
- DhtAddress,
4
- ITransport,
5
- ListeningRpcCommunicator,
6
- PeerDescriptor,
7
- toNodeId
8
- } from '@streamr/dht'
9
- import { Logger, StreamPartID, UserID, addManagedEventListener, wait } from '@streamr/utils'
10
- import { EventEmitter } from 'eventemitter3'
11
- import { sampleSize } from 'lodash'
12
- import {
13
- LeaveStreamPartNotice,
14
- MessageID,
15
- MessageRef,
16
- ProxyDirection,
17
- StreamMessage
18
- } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
19
- import { ContentDeliveryRpcClient, ProxyConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
20
- import { ContentDeliveryRpcLocal } from '../ContentDeliveryRpcLocal'
21
- import { ContentDeliveryRpcRemote } from '../ContentDeliveryRpcRemote'
22
- import { DuplicateMessageDetector } from '../DuplicateMessageDetector'
23
- import { NodeList } from '../NodeList'
24
- import { formStreamPartContentDeliveryServiceId } from '../formStreamPartDeliveryServiceId'
25
- import { Propagation } from '../propagation/Propagation'
26
- import { markAndCheckDuplicate } from '../utils'
27
- import { ProxyConnectionRpcRemote } from './ProxyConnectionRpcRemote'
28
-
29
- // TODO use options option or named constant?
30
- export const retry = async <T>(task: () => Promise<T>, description: string, abortSignal: AbortSignal, delay = 10000): Promise<T> => {
31
- // eslint-disable-next-line no-constant-condition
32
- while (true) {
33
- try {
34
- const result = await task()
35
- return result
36
- } catch {
37
- logger.warn(`Failed ${description} (retrying after delay)`, {
38
- delayInMs: delay
39
- })
40
- }
41
- await wait(delay, abortSignal)
42
- }
43
- }
44
-
45
- interface ProxyClientOptions {
46
- transport: ITransport
47
- localPeerDescriptor: PeerDescriptor
48
- streamPartId: StreamPartID
49
- connectionLocker: ConnectionLocker
50
- minPropagationTargets?: number // TODO could be required option if we apply all defaults somewhere at higher level
51
- }
52
-
53
- interface ProxyDefinition {
54
- nodes: Map<DhtAddress, PeerDescriptor>
55
- connectionCount: number
56
- direction: ProxyDirection
57
- userId: UserID
58
- }
59
-
60
- interface ProxyConnection {
61
- peerDescriptor: PeerDescriptor
62
- direction: ProxyDirection
63
- }
64
-
65
- interface Events {
66
- message: (message: StreamMessage) => void
67
- }
68
-
69
- const logger = new Logger(module)
70
-
71
- const SERVICE_ID = 'system/proxy-client'
72
-
73
- export class ProxyClient extends EventEmitter<Events> {
74
-
75
- private readonly rpcCommunicator: ListeningRpcCommunicator
76
- private readonly contentDeliveryRpcLocal: ContentDeliveryRpcLocal
77
- private readonly options: ProxyClientOptions
78
- private readonly duplicateDetectors: Map<string, DuplicateMessageDetector> = new Map()
79
- private definition?: ProxyDefinition
80
- private readonly connections: Map<DhtAddress, ProxyConnection> = new Map()
81
- private readonly propagation: Propagation
82
- private readonly neighbors: NodeList
83
- private readonly abortController: AbortController
84
-
85
- constructor(options: ProxyClientOptions) {
86
- super()
87
- this.options = options
88
- this.rpcCommunicator = new ListeningRpcCommunicator(formStreamPartContentDeliveryServiceId(options.streamPartId), options.transport)
89
- // TODO use options option or named constant?
90
- this.neighbors = new NodeList(toNodeId(this.options.localPeerDescriptor), 1000)
91
- this.contentDeliveryRpcLocal = new ContentDeliveryRpcLocal({
92
- localPeerDescriptor: this.options.localPeerDescriptor,
93
- streamPartId: this.options.streamPartId,
94
- markAndCheckDuplicate: (msg: MessageID, prev?: MessageRef) => markAndCheckDuplicate(this.duplicateDetectors, msg, prev),
95
- broadcast: (message: StreamMessage, previousNode?: DhtAddress) => this.broadcast(message, previousNode),
96
- onLeaveNotice: (remoteNodeId: DhtAddress) => {
97
- const contact = this.neighbors.get(remoteNodeId)
98
- if (contact) {
99
- // TODO should we catch possible promise rejection?
100
- setImmediate(() => this.onNodeDisconnected(contact.getPeerDescriptor()))
101
- }
102
- },
103
- rpcCommunicator: this.rpcCommunicator,
104
- markForInspection: () => {}
105
- })
106
- this.propagation = new Propagation({
107
- // TODO use options option or named constant?
108
- minPropagationTargets: options.minPropagationTargets ?? 2,
109
- sendToNeighbor: async (neighborId: DhtAddress, msg: StreamMessage): Promise<void> => {
110
- const remote = this.neighbors.get(neighborId)
111
- if (remote) {
112
- await remote.sendStreamMessage(msg)
113
- } else {
114
- throw new Error('Propagation target not found')
115
- }
116
- }
117
- })
118
- this.abortController = new AbortController()
119
- }
120
-
121
- private registerDefaultServerMethods(): void {
122
- this.rpcCommunicator.registerRpcNotification(StreamMessage, 'sendStreamMessage',
123
- (msg: StreamMessage, context) => this.contentDeliveryRpcLocal.sendStreamMessage(msg, context))
124
- this.rpcCommunicator.registerRpcNotification(LeaveStreamPartNotice, 'leaveStreamPartNotice',
125
- (req: LeaveStreamPartNotice, context) => this.contentDeliveryRpcLocal.leaveStreamPartNotice(req, context))
126
- }
127
-
128
- async setProxies(
129
- nodes: PeerDescriptor[],
130
- direction: ProxyDirection,
131
- userId: UserID,
132
- connectionCount?: number
133
- ): Promise<void> {
134
- logger.trace('Setting proxies', { streamPartId: this.options.streamPartId, peerDescriptors: nodes, direction, userId, connectionCount })
135
- if (connectionCount !== undefined && connectionCount > nodes.length) {
136
- throw new Error('Cannot set connectionCount above the size of the configured array of nodes')
137
- }
138
- const nodesIds = new Map<DhtAddress, PeerDescriptor>()
139
- nodes.forEach((peerDescriptor) => {
140
- nodesIds.set(toNodeId(peerDescriptor), peerDescriptor)
141
- })
142
- this.definition = {
143
- nodes: nodesIds,
144
- userId,
145
- direction,
146
- connectionCount: connectionCount ?? nodes.length
147
- }
148
- await this.updateConnections()
149
- }
150
-
151
- private async updateConnections(): Promise<void> {
152
- await Promise.all(this.getInvalidConnections().map(async (id) => {
153
- await this.closeConnection(id)
154
- }))
155
- const connectionCountDiff = this.definition!.connectionCount - this.connections.size
156
- if (connectionCountDiff > 0) {
157
- await this.openRandomConnections(connectionCountDiff)
158
- } else if (connectionCountDiff < 0) {
159
- await this.closeRandomConnections(-connectionCountDiff)
160
- }
161
- }
162
-
163
- private getInvalidConnections(): DhtAddress[] {
164
- return Array.from(this.connections.keys()).filter((id) => {
165
- return !this.definition!.nodes.has(id)
166
- || this.definition!.direction !== this.connections.get(id)!.direction
167
- })
168
- }
169
-
170
- private async openRandomConnections(connectionCount: number): Promise<void> {
171
- const proxiesToAttempt = sampleSize(Array.from(this.definition!.nodes.keys()).filter((id) =>
172
- !this.connections.has(id)
173
- ), connectionCount)
174
- await Promise.all(proxiesToAttempt.map((id) =>
175
- this.attemptConnection(id, this.definition!.direction, this.definition!.userId)
176
- ))
177
- }
178
-
179
- private async attemptConnection(nodeId: DhtAddress, direction: ProxyDirection, userId: UserID): Promise<void> {
180
- const peerDescriptor = this.definition!.nodes.get(nodeId)!
181
- const rpcRemote = new ProxyConnectionRpcRemote(
182
- this.options.localPeerDescriptor,
183
- peerDescriptor,
184
- this.rpcCommunicator,
185
- ProxyConnectionRpcClient
186
- )
187
- const accepted = await rpcRemote.requestConnection(direction, userId)
188
- if (accepted) {
189
- this.options.connectionLocker.lockConnection(peerDescriptor, SERVICE_ID)
190
- this.connections.set(nodeId, { peerDescriptor, direction })
191
- const remote = new ContentDeliveryRpcRemote(
192
- this.options.localPeerDescriptor,
193
- peerDescriptor,
194
- this.rpcCommunicator,
195
- ContentDeliveryRpcClient
196
- )
197
- this.neighbors.add(remote)
198
- this.propagation.onNeighborJoined(nodeId)
199
- logger.info('Open proxy connection', {
200
- nodeId,
201
- streamPartId: this.options.streamPartId
202
- })
203
- } else {
204
- logger.warn('Unable to open proxy connection', {
205
- nodeId,
206
- streamPartId: this.options.streamPartId
207
- })
208
- }
209
- }
210
-
211
- private async closeRandomConnections(connectionCount: number): Promise<void> {
212
- const proxiesToDisconnect = sampleSize(Array.from(this.connections.keys()), connectionCount)
213
- await Promise.allSettled(proxiesToDisconnect.map((node) => this.closeConnection(node)))
214
- }
215
-
216
- private async closeConnection(nodeId: DhtAddress): Promise<void> {
217
- if (this.connections.has(nodeId)) {
218
- logger.info('Close proxy connection', {
219
- nodeId
220
- })
221
- const server = this.neighbors.get(nodeId)
222
- server?.leaveStreamPartNotice(this.options.streamPartId, false)
223
- this.removeConnection(this.connections.get(nodeId)!.peerDescriptor)
224
- }
225
- }
226
-
227
- private removeConnection(peerDescriptor: PeerDescriptor): void {
228
- const nodeId = toNodeId(peerDescriptor)
229
- this.connections.delete(nodeId)
230
- this.neighbors.remove(nodeId)
231
- this.options.connectionLocker.unlockConnection(peerDescriptor, SERVICE_ID)
232
- }
233
-
234
- broadcast(msg: StreamMessage, previousNode?: DhtAddress): void {
235
- if (!previousNode) {
236
- markAndCheckDuplicate(this.duplicateDetectors, msg.messageId!, msg.previousMessageRef)
237
- }
238
- this.emit('message', msg)
239
- this.propagation.feedUnseenMessage(msg, this.neighbors.getIds(), previousNode ?? null)
240
- }
241
-
242
- hasConnection(nodeId: DhtAddress, direction: ProxyDirection): boolean {
243
- return this.connections.has(nodeId) && this.connections.get(nodeId)!.direction === direction
244
- }
245
-
246
- getDirection(): ProxyDirection {
247
- return this.definition!.direction
248
- }
249
-
250
- private async onNodeDisconnected(peerDescriptor: PeerDescriptor): Promise<void> {
251
- const nodeId = toNodeId(peerDescriptor)
252
- if (this.connections.has(nodeId)) {
253
- this.options.connectionLocker.unlockConnection(peerDescriptor, SERVICE_ID)
254
- this.removeConnection(peerDescriptor)
255
- await retry(() => this.updateConnections(), 'updating proxy connections', this.abortController.signal)
256
- }
257
- }
258
-
259
- async start(): Promise<void> {
260
- this.registerDefaultServerMethods()
261
- addManagedEventListener(
262
- this.options.transport,
263
- 'disconnected',
264
- // TODO should we catch possible promise rejection?
265
- (peerDescriptor: PeerDescriptor) => this.onNodeDisconnected(peerDescriptor),
266
- this.abortController.signal
267
- )
268
- }
269
-
270
- public getDiagnosticInfo(): Record<string, unknown> {
271
- return {
272
- neighbors: this.neighbors.getAll().map((neighbor) => neighbor.getPeerDescriptor()),
273
- }
274
- }
275
-
276
- stop(): void {
277
- this.neighbors.getAll().forEach((remote) => {
278
- this.options.connectionLocker.unlockConnection(remote.getPeerDescriptor(), SERVICE_ID)
279
- remote.leaveStreamPartNotice(this.options.streamPartId, false)
280
- })
281
- this.neighbors.stop()
282
- this.rpcCommunicator.destroy()
283
- this.connections.clear()
284
- this.abortController.abort()
285
- }
286
-
287
- }
@@ -1,106 +0,0 @@
1
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
- import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor, toNodeId } from '@streamr/dht'
3
- import { Logger, StreamPartID, UserID, binaryToHex, toEthereumAddress } from '@streamr/utils'
4
- import { EventEmitter } from 'eventemitter3'
5
- import {
6
- ProxyConnectionRequest,
7
- ProxyConnectionResponse,
8
- ProxyDirection,
9
- StreamMessage
10
- } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
11
- import { ContentDeliveryRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
12
- import { IProxyConnectionRpc } from '../../proto/packages/trackerless-network/protos/NetworkRpc.server'
13
- import { ContentDeliveryRpcRemote } from '../ContentDeliveryRpcRemote'
14
-
15
- const logger = new Logger(module)
16
-
17
- interface ProxyConnection {
18
- direction: ProxyDirection // Direction is from the client's point of view
19
- userId: UserID
20
- remote: ContentDeliveryRpcRemote
21
- }
22
-
23
- interface ProxyConnectionRpcLocalOptions {
24
- localPeerDescriptor: PeerDescriptor
25
- streamPartId: StreamPartID
26
- rpcCommunicator: ListeningRpcCommunicator
27
- }
28
-
29
- export interface Events {
30
- newConnection: (nodeId: DhtAddress) => void
31
- }
32
-
33
- export class ProxyConnectionRpcLocal extends EventEmitter<Events> implements IProxyConnectionRpc {
34
-
35
- private readonly options: ProxyConnectionRpcLocalOptions
36
- private readonly connections: Map<DhtAddress, ProxyConnection> = new Map()
37
-
38
- constructor(options: ProxyConnectionRpcLocalOptions) {
39
- super()
40
- this.options = options
41
- this.options.rpcCommunicator.registerRpcMethod(ProxyConnectionRequest, ProxyConnectionResponse, 'requestConnection',
42
- (msg: ProxyConnectionRequest, context) => this.requestConnection(msg, context))
43
- }
44
-
45
- getConnection(nodeId: DhtAddress): ProxyConnection | undefined {
46
- return this.connections.get(nodeId)
47
- }
48
-
49
- hasConnection(nodeId: DhtAddress): boolean {
50
- return this.connections.has(nodeId)
51
- }
52
-
53
- removeConnection(nodeId: DhtAddress): void {
54
- this.connections.delete(nodeId)
55
- }
56
-
57
- stop(): void {
58
- this.connections.forEach((connection) => connection.remote.leaveStreamPartNotice(this.options.streamPartId, false))
59
- this.connections.clear()
60
- this.removeAllListeners()
61
- }
62
-
63
- getPropagationTargets(msg: StreamMessage): DhtAddress[] {
64
- if (msg.body.oneofKind === 'groupKeyRequest') {
65
- try {
66
- const recipientId = msg.body.groupKeyRequest.recipientId
67
- return this.getNodeIdsForUserId(toEthereumAddress(binaryToHex(recipientId, true)))
68
- } catch (err) {
69
- logger.trace(`Could not parse GroupKeyRequest`, { err })
70
- return []
71
- }
72
- } else {
73
- return this.getSubscribers()
74
- }
75
- }
76
-
77
- private getNodeIdsForUserId(userId: UserID): DhtAddress[] {
78
- return Array.from(this.connections.keys()).filter((nodeId) => this.connections.get(nodeId)!.userId === userId)
79
- }
80
-
81
- private getSubscribers(): DhtAddress[] {
82
- return Array.from(this.connections.keys()).filter((key) => this.connections.get(key)!.direction === ProxyDirection.SUBSCRIBE)
83
- }
84
-
85
- // IProxyConnectionRpc server method
86
- async requestConnection(request: ProxyConnectionRequest, context: ServerCallContext): Promise<ProxyConnectionResponse> {
87
- const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
88
- const remoteNodeId = toNodeId(senderPeerDescriptor)
89
- this.connections.set(remoteNodeId, {
90
- direction: request.direction,
91
- userId: toEthereumAddress(binaryToHex(request.userId, true)),
92
- remote: new ContentDeliveryRpcRemote(
93
- this.options.localPeerDescriptor,
94
- senderPeerDescriptor,
95
- this.options.rpcCommunicator,
96
- ContentDeliveryRpcClient
97
- )
98
- })
99
- const response: ProxyConnectionResponse = {
100
- accepted: true
101
- }
102
- logger.trace(`Accepted connection request from ${remoteNodeId} to ${this.options.streamPartId}`)
103
- this.emit('newConnection', remoteNodeId)
104
- return response
105
- }
106
- }
@@ -1,26 +0,0 @@
1
- import { EXISTING_CONNECTION_TIMEOUT, RpcRemote } from '@streamr/dht'
2
- import { Logger, UserID, hexToBinary } from '@streamr/utils'
3
- import { ProxyConnectionRequest, ProxyDirection } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
4
- import { ProxyConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
5
-
6
- const logger = new Logger(module)
7
-
8
- export class ProxyConnectionRpcRemote extends RpcRemote<ProxyConnectionRpcClient> {
9
-
10
- async requestConnection(direction: ProxyDirection, userId: UserID): Promise<boolean> {
11
- const request: ProxyConnectionRequest = {
12
- direction,
13
- userId: hexToBinary(userId)
14
- }
15
- const options = this.formDhtRpcOptions({
16
- timeout: EXISTING_CONNECTION_TIMEOUT
17
- })
18
- try {
19
- const res = await this.getClient().requestConnection(request, options)
20
- return res.accepted
21
- } catch (err) {
22
- logger.debug(`ProxyConnectionRequest failed with error`, { err })
23
- return false
24
- }
25
- }
26
- }
@@ -1,73 +0,0 @@
1
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
- import { ConnectionLocker, DhtAddress, DhtCallContext, ListeningRpcCommunicator, toNodeId } from '@streamr/dht'
3
- import { StreamPartID } from '@streamr/utils'
4
- import { Empty } from '../../proto/google/protobuf/empty'
5
- import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
6
- import {
7
- CloseTemporaryConnection,
8
- TemporaryConnectionRequest,
9
- TemporaryConnectionResponse
10
- } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
11
- import { ContentDeliveryRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
12
- import { ITemporaryConnectionRpc } from '../../proto/packages/trackerless-network/protos/NetworkRpc.server'
13
- import { ContentDeliveryRpcRemote } from '../ContentDeliveryRpcRemote'
14
- import { NodeList } from '../NodeList'
15
-
16
- interface TemporaryConnectionRpcLocalOptions {
17
- rpcCommunicator: ListeningRpcCommunicator
18
- localPeerDescriptor: PeerDescriptor
19
- streamPartId: StreamPartID
20
- connectionLocker: ConnectionLocker
21
- }
22
-
23
- const LOCK_ID_BASE = 'system/content-delivery/temporary-connection/'
24
-
25
- export class TemporaryConnectionRpcLocal implements ITemporaryConnectionRpc {
26
-
27
- private readonly options: TemporaryConnectionRpcLocalOptions
28
- private readonly temporaryNodes: NodeList
29
- private readonly lockId: string
30
- constructor(options: TemporaryConnectionRpcLocalOptions) {
31
- this.options = options
32
- // TODO use options option or named constant?
33
- this.temporaryNodes = new NodeList(toNodeId(options.localPeerDescriptor), 10)
34
- this.lockId = LOCK_ID_BASE + options.streamPartId
35
- }
36
-
37
- getNodes(): NodeList {
38
- return this.temporaryNodes
39
- }
40
-
41
- hasNode(node: DhtAddress): boolean {
42
- return this.temporaryNodes.has(node)
43
- }
44
-
45
- removeNode(nodeId: DhtAddress): void {
46
- this.temporaryNodes.remove(nodeId)
47
- this.options.connectionLocker.weakUnlockConnection(nodeId, this.lockId)
48
- }
49
-
50
- async openConnection(
51
- _request: TemporaryConnectionRequest,
52
- context: ServerCallContext
53
- ): Promise<TemporaryConnectionResponse> {
54
- const sender = (context as DhtCallContext).incomingSourceDescriptor!
55
- const remote = new ContentDeliveryRpcRemote(
56
- this.options.localPeerDescriptor,
57
- sender,
58
- this.options.rpcCommunicator,
59
- ContentDeliveryRpcClient
60
- )
61
- this.temporaryNodes.add(remote)
62
- this.options.connectionLocker.weakLockConnection(toNodeId(sender), this.lockId)
63
- return {
64
- accepted: true
65
- }
66
- }
67
-
68
- async closeConnection(_request: CloseTemporaryConnection, context: ServerCallContext): Promise<Empty> {
69
- const remoteNodeId = toNodeId((context as DhtCallContext).incomingSourceDescriptor!)
70
- this.removeNode(remoteNodeId)
71
- return {}
72
- }
73
- }
@@ -1,29 +0,0 @@
1
- import { RpcRemote, toNodeId } from '@streamr/dht'
2
- import { Logger } from '@streamr/utils'
3
- import { TemporaryConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
4
-
5
- const logger = new Logger(module)
6
-
7
- export class TemporaryConnectionRpcRemote extends RpcRemote<TemporaryConnectionRpcClient> {
8
-
9
- async openConnection(): Promise<boolean> {
10
- try {
11
- const response = await this.getClient().openConnection({}, this.formDhtRpcOptions())
12
- return response.accepted
13
- } catch (err: any) {
14
- logger.debug(`temporaryConnection to ${toNodeId(this.getPeerDescriptor())} failed`, { err })
15
- return false
16
- }
17
- }
18
-
19
- async closeConnection(): Promise<void> {
20
- try {
21
- await this.getClient().closeConnection({}, this.formDhtRpcOptions({
22
- connect: false,
23
- notification: true
24
- }))
25
- } catch (err) {
26
- logger.trace(`closeConnection to ${toNodeId(this.getPeerDescriptor())} failed`, { err })
27
- }
28
- }
29
- }
@@ -1,18 +0,0 @@
1
- import { DuplicateMessageDetector, NumberPair } from './DuplicateMessageDetector'
2
- import { MessageID, MessageRef } from '../proto/packages/trackerless-network/protos/NetworkRpc'
3
- import { binaryToHex } from '@streamr/utils'
4
-
5
- export const markAndCheckDuplicate = (
6
- duplicateDetectors: Map<string, DuplicateMessageDetector>,
7
- currentMessage: MessageID,
8
- previousMessageRef?: MessageRef
9
- ): boolean => {
10
- const detectorKey = `${binaryToHex(currentMessage.publisherId)}-${currentMessage.messageChainId}`
11
- const previousNumberPair = previousMessageRef ?
12
- new NumberPair(Number(previousMessageRef.timestamp), previousMessageRef.sequenceNumber) : null
13
- const currentNumberPair = new NumberPair(Number(currentMessage.timestamp), currentMessage.sequenceNumber)
14
- if (!duplicateDetectors.has(detectorKey)) {
15
- duplicateDetectors.set(detectorKey, new DuplicateMessageDetector())
16
- }
17
- return duplicateDetectors.get(detectorKey)!.markAndCheck(previousNumberPair, currentNumberPair)
18
- }