@streamr/trackerless-network 0.0.1-tatum.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 (262) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc +3 -0
  3. package/README.md +6 -0
  4. package/bin/bootstrap-node.ts +73 -0
  5. package/bin/full-node-webrtc.ts +102 -0
  6. package/bin/full-node-websocket.ts +102 -0
  7. package/bin/network.ts +43 -0
  8. package/dist/package.json +53 -0
  9. package/dist/src/NameDirectory.d.ts +5 -0
  10. package/dist/src/NameDirectory.js +44 -0
  11. package/dist/src/NameDirectory.js.map +1 -0
  12. package/dist/src/NetworkNode.d.ts +35 -0
  13. package/dist/src/NetworkNode.js +130 -0
  14. package/dist/src/NetworkNode.js.map +1 -0
  15. package/dist/src/NetworkStack.d.ts +32 -0
  16. package/dist/src/NetworkStack.js +108 -0
  17. package/dist/src/NetworkStack.js.map +1 -0
  18. package/dist/src/exports.d.ts +6 -0
  19. package/dist/src/exports.js +12 -0
  20. package/dist/src/exports.js.map +1 -0
  21. package/dist/src/identifiers.d.ts +1 -0
  22. package/dist/src/identifiers.js +3 -0
  23. package/dist/src/identifiers.js.map +1 -0
  24. package/dist/src/logic/DuplicateMessageDetector.d.ts +55 -0
  25. package/dist/src/logic/DuplicateMessageDetector.js +155 -0
  26. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -0
  27. package/dist/src/logic/ILayer0.d.ts +13 -0
  28. package/dist/src/logic/ILayer0.js +3 -0
  29. package/dist/src/logic/ILayer0.js.map +1 -0
  30. package/dist/src/logic/IStreamNode.d.ts +12 -0
  31. package/dist/src/logic/IStreamNode.js +3 -0
  32. package/dist/src/logic/IStreamNode.js.map +1 -0
  33. package/dist/src/logic/PeerList.d.ts +27 -0
  34. package/dist/src/logic/PeerList.js +84 -0
  35. package/dist/src/logic/PeerList.js.map +1 -0
  36. package/dist/src/logic/RandomGraphNode.d.ts +68 -0
  37. package/dist/src/logic/RandomGraphNode.js +201 -0
  38. package/dist/src/logic/RandomGraphNode.js.map +1 -0
  39. package/dist/src/logic/Remote.d.ts +9 -0
  40. package/dist/src/logic/Remote.js +15 -0
  41. package/dist/src/logic/Remote.js.map +1 -0
  42. package/dist/src/logic/RemoteRandomGraphNode.d.ts +8 -0
  43. package/dist/src/logic/RemoteRandomGraphNode.js +35 -0
  44. package/dist/src/logic/RemoteRandomGraphNode.js.map +1 -0
  45. package/dist/src/logic/StreamEntryPointDiscovery.d.ts +36 -0
  46. package/dist/src/logic/StreamEntryPointDiscovery.js +179 -0
  47. package/dist/src/logic/StreamEntryPointDiscovery.js.map +1 -0
  48. package/dist/src/logic/StreamNodeServer.d.ts +20 -0
  49. package/dist/src/logic/StreamNodeServer.js +26 -0
  50. package/dist/src/logic/StreamNodeServer.js.map +1 -0
  51. package/dist/src/logic/StreamrNode.d.ts +76 -0
  52. package/dist/src/logic/StreamrNode.js +303 -0
  53. package/dist/src/logic/StreamrNode.js.map +1 -0
  54. package/dist/src/logic/createRandomGraphNode.d.ts +5 -0
  55. package/dist/src/logic/createRandomGraphNode.js +110 -0
  56. package/dist/src/logic/createRandomGraphNode.js.map +1 -0
  57. package/dist/src/logic/inspect/InspectSession.d.ts +18 -0
  58. package/dist/src/logic/inspect/InspectSession.js +38 -0
  59. package/dist/src/logic/inspect/InspectSession.js.map +1 -0
  60. package/dist/src/logic/inspect/Inspector.d.ts +33 -0
  61. package/dist/src/logic/inspect/Inspector.js +63 -0
  62. package/dist/src/logic/inspect/Inspector.js.map +1 -0
  63. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +35 -0
  64. package/dist/src/logic/neighbor-discovery/Handshaker.js +121 -0
  65. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -0
  66. package/dist/src/logic/neighbor-discovery/HandshakerServer.d.ts +30 -0
  67. package/dist/src/logic/neighbor-discovery/HandshakerServer.js +78 -0
  68. package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +1 -0
  69. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +23 -0
  70. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +44 -0
  71. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -0
  72. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +30 -0
  73. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +42 -0
  74. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -0
  75. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.d.ts +20 -0
  76. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js +42 -0
  77. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +1 -0
  78. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.d.ts +12 -0
  79. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js +54 -0
  80. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +1 -0
  81. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.d.ts +11 -0
  82. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js +37 -0
  83. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +1 -0
  84. package/dist/src/logic/propagation/FifoMapWithTTL.d.ts +36 -0
  85. package/dist/src/logic/propagation/FifoMapWithTTL.js +81 -0
  86. package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -0
  87. package/dist/src/logic/propagation/Propagation.d.ts +31 -0
  88. package/dist/src/logic/propagation/Propagation.js +64 -0
  89. package/dist/src/logic/propagation/Propagation.js.map +1 -0
  90. package/dist/src/logic/propagation/PropagationTaskStore.d.ts +21 -0
  91. package/dist/src/logic/propagation/PropagationTaskStore.js +32 -0
  92. package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -0
  93. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.d.ts +5 -0
  94. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js +17 -0
  95. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js.map +1 -0
  96. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.d.ts +6 -0
  97. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +27 -0
  98. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -0
  99. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.d.ts +6 -0
  100. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +33 -0
  101. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -0
  102. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.d.ts +6 -0
  103. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +109 -0
  104. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -0
  105. package/dist/src/logic/proxy/ProxyStreamConnectionClient.d.ts +44 -0
  106. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js +189 -0
  107. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +1 -0
  108. package/dist/src/logic/proxy/ProxyStreamConnectionServer.d.ts +34 -0
  109. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js +64 -0
  110. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +1 -0
  111. package/dist/src/logic/proxy/RemoteProxyServer.d.ts +7 -0
  112. package/dist/src/logic/proxy/RemoteProxyServer.js +36 -0
  113. package/dist/src/logic/proxy/RemoteProxyServer.js.map +1 -0
  114. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.d.ts +6 -0
  115. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js +28 -0
  116. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +1 -0
  117. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.d.ts +20 -0
  118. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js +29 -0
  119. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +1 -0
  120. package/dist/src/logic/utils.d.ts +3 -0
  121. package/dist/src/logic/utils.js +16 -0
  122. package/dist/src/logic/utils.js.map +1 -0
  123. package/dist/src/proto/google/protobuf/any.d.ts +173 -0
  124. package/dist/src/proto/google/protobuf/any.js +155 -0
  125. package/dist/src/proto/google/protobuf/any.js.map +1 -0
  126. package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
  127. package/dist/src/proto/google/protobuf/empty.js +34 -0
  128. package/dist/src/proto/google/protobuf/empty.js.map +1 -0
  129. package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
  130. package/dist/src/proto/google/protobuf/timestamp.js +136 -0
  131. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
  132. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
  133. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
  134. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
  135. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
  136. package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
  137. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
  138. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
  139. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
  140. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
  141. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
  142. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
  143. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  144. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +156 -0
  145. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +122 -0
  146. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
  147. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +524 -0
  148. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +350 -0
  149. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
  150. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +65 -0
  151. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js +3 -0
  152. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
  153. package/dist/test/benchmark/first-message.d.ts +1 -0
  154. package/dist/test/benchmark/first-message.js +137 -0
  155. package/dist/test/benchmark/first-message.js.map +1 -0
  156. package/dist/test/utils/utils.d.ts +12 -0
  157. package/dist/test/utils/utils.js +86 -0
  158. package/dist/test/utils/utils.js.map +1 -0
  159. package/jest.config.js +36 -0
  160. package/karma.config.js +20 -0
  161. package/log.txt +501 -0
  162. package/package.json +53 -0
  163. package/proto.sh +2 -0
  164. package/protos/NetworkRpc.proto +161 -0
  165. package/src/NameDirectory.ts +44 -0
  166. package/src/NetworkNode.ts +169 -0
  167. package/src/NetworkStack.ts +144 -0
  168. package/src/exports.ts +6 -0
  169. package/src/identifiers.ts +1 -0
  170. package/src/logic/DuplicateMessageDetector.ts +167 -0
  171. package/src/logic/ILayer0.ts +14 -0
  172. package/src/logic/IStreamNode.ts +17 -0
  173. package/src/logic/PeerList.ts +106 -0
  174. package/src/logic/RandomGraphNode.ts +310 -0
  175. package/src/logic/Remote.ts +19 -0
  176. package/src/logic/RemoteRandomGraphNode.ts +39 -0
  177. package/src/logic/StreamEntryPointDiscovery.ts +221 -0
  178. package/src/logic/StreamNodeServer.ts +44 -0
  179. package/src/logic/StreamrNode.ts +416 -0
  180. package/src/logic/createRandomGraphNode.ts +114 -0
  181. package/src/logic/inspect/InspectSession.ts +49 -0
  182. package/src/logic/inspect/Inspector.ts +89 -0
  183. package/src/logic/neighbor-discovery/Handshaker.ts +180 -0
  184. package/src/logic/neighbor-discovery/HandshakerServer.ts +99 -0
  185. package/src/logic/neighbor-discovery/NeighborFinder.ts +61 -0
  186. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +67 -0
  187. package/src/logic/neighbor-discovery/NeighborUpdateManagerServer.ts +61 -0
  188. package/src/logic/neighbor-discovery/RemoteHandshaker.ts +64 -0
  189. package/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts +41 -0
  190. package/src/logic/propagation/FifoMapWithTTL.ts +108 -0
  191. package/src/logic/propagation/Propagation.ts +83 -0
  192. package/src/logic/propagation/PropagationTaskStore.ts +40 -0
  193. package/src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts +16 -0
  194. package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +28 -0
  195. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +38 -0
  196. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +142 -0
  197. package/src/logic/proxy/ProxyStreamConnectionClient.ts +255 -0
  198. package/src/logic/proxy/ProxyStreamConnectionServer.ts +97 -0
  199. package/src/logic/proxy/RemoteProxyServer.ts +36 -0
  200. package/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.ts +27 -0
  201. package/src/logic/temporary-connection/TemporaryConnectionRpcServer.ts +50 -0
  202. package/src/logic/utils.ts +17 -0
  203. package/src/proto/google/protobuf/any.ts +319 -0
  204. package/src/proto/google/protobuf/empty.ts +84 -0
  205. package/src/proto/google/protobuf/timestamp.ts +281 -0
  206. package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
  207. package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
  208. package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
  209. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
  210. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +176 -0
  211. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +68 -0
  212. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +667 -0
  213. package/test/benchmark/first-message.ts +155 -0
  214. package/test/end-to-end/inspect.test.ts +119 -0
  215. package/test/end-to-end/proxy-and-full-node.test.ts +140 -0
  216. package/test/end-to-end/proxy-connections.test.ts +228 -0
  217. package/test/end-to-end/proxy-key-exchange.test.ts +142 -0
  218. package/test/end-to-end/random-graph-with-real-connections.test.ts +154 -0
  219. package/test/end-to-end/webrtc-full-node-network.test.ts +97 -0
  220. package/test/end-to-end/websocket-full-node-network.test.ts +93 -0
  221. package/test/integration/Handshakes.test.ts +167 -0
  222. package/test/integration/Inspect.test.ts +102 -0
  223. package/test/integration/NetworkNode.test.ts +99 -0
  224. package/test/integration/NetworkRpc.test.ts +61 -0
  225. package/test/integration/NetworkStack.test.ts +74 -0
  226. package/test/integration/NetworkStackStoppedDuringStart.test.ts +45 -0
  227. package/test/integration/Propagation.test.ts +79 -0
  228. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +141 -0
  229. package/test/integration/RandomGraphNode-Layer1Node.test.ts +226 -0
  230. package/test/integration/RemoteHandshaker.test.ts +78 -0
  231. package/test/integration/RemoteNeighborUpdateManager.test.ts +82 -0
  232. package/test/integration/RemoteRandomGraphNode.test.ts +102 -0
  233. package/test/integration/StreamrNode.test.ts +145 -0
  234. package/test/integration/stream-without-default-entrypoints.test.ts +132 -0
  235. package/test/unit/ContentMessageTranslator.test.ts +20 -0
  236. package/test/unit/DuplicateMessageDetector.test.ts +192 -0
  237. package/test/unit/FifoMapWithTtl.test.ts +229 -0
  238. package/test/unit/GroupKeyRequestTranslator.test.ts +36 -0
  239. package/test/unit/GroupKeyResponseTranslator.test.ts +39 -0
  240. package/test/unit/Handshaker.test.ts +63 -0
  241. package/test/unit/HandshakerServer.test.ts +123 -0
  242. package/test/unit/InspectSession.test.ts +78 -0
  243. package/test/unit/Inspector.test.ts +57 -0
  244. package/test/unit/NeighborFinder.test.ts +48 -0
  245. package/test/unit/NumberPair.test.ts +22 -0
  246. package/test/unit/PeerList.test.ts +150 -0
  247. package/test/unit/Propagation.test.ts +134 -0
  248. package/test/unit/RandomGraphNode.test.ts +73 -0
  249. package/test/unit/StreamEntrypointDiscovery.test.ts +152 -0
  250. package/test/unit/StreamMessageTranslator.test.ts +67 -0
  251. package/test/unit/StreamNodeServer.test.ts +63 -0
  252. package/test/unit/StreamrNode.test.ts +74 -0
  253. package/test/utils/mock/MockHandshaker.ts +15 -0
  254. package/test/utils/mock/MockLayer0.ts +71 -0
  255. package/test/utils/mock/MockLayer1.ts +6 -0
  256. package/test/utils/mock/MockNeighborFinder.ts +19 -0
  257. package/test/utils/mock/MockNeighborUpdateManager.ts +21 -0
  258. package/test/utils/mock/Transport.ts +25 -0
  259. package/test/utils/utils.ts +104 -0
  260. package/tsconfig.browser.json +12 -0
  261. package/tsconfig.jest.json +15 -0
  262. package/tsconfig.node.json +18 -0
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoteHandshaker = void 0;
4
+ const Remote_1 = require("../Remote");
5
+ const dht_1 = require("@streamr/dht");
6
+ const utils_1 = require("@streamr/utils");
7
+ const logger = new utils_1.Logger(module);
8
+ class RemoteHandshaker extends Remote_1.Remote {
9
+ async handshake(ownPeerDescriptor, neighbors, concurrentHandshakeTargetId, interleavingFrom) {
10
+ const request = {
11
+ randomGraphId: this.graphId,
12
+ requestId: new dht_1.UUID().toString(),
13
+ senderId: (0, dht_1.keyFromPeerDescriptor)(ownPeerDescriptor),
14
+ neighbors,
15
+ concurrentHandshakeTargetId,
16
+ interleavingFrom,
17
+ senderDescriptor: ownPeerDescriptor
18
+ };
19
+ const options = {
20
+ sourceDescriptor: ownPeerDescriptor,
21
+ targetDescriptor: this.remotePeerDescriptor
22
+ };
23
+ try {
24
+ const response = await this.client.handshake(request, options);
25
+ return {
26
+ accepted: response.accepted,
27
+ interleaveTarget: response.interleaveTarget
28
+ };
29
+ }
30
+ catch (err) {
31
+ logger.debug(`handshake to ${(0, dht_1.keyFromPeerDescriptor)(this.getPeerDescriptor())} failed: ${err}`);
32
+ return {
33
+ accepted: false
34
+ };
35
+ }
36
+ }
37
+ interleaveNotice(ownPeerDescriptor, originatorDescriptor) {
38
+ const options = {
39
+ sourceDescriptor: ownPeerDescriptor,
40
+ targetDescriptor: this.remotePeerDescriptor,
41
+ notification: true
42
+ };
43
+ const notification = {
44
+ randomGraphId: this.graphId,
45
+ interleaveTarget: originatorDescriptor,
46
+ senderId: (0, dht_1.keyFromPeerDescriptor)(ownPeerDescriptor)
47
+ };
48
+ this.client.interleaveNotice(notification, options).catch(() => {
49
+ logger.debug('Failed to send interleaveNotice');
50
+ });
51
+ }
52
+ }
53
+ exports.RemoteHandshaker = RemoteHandshaker;
54
+ //# sourceMappingURL=RemoteHandshaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteHandshaker.js","sourceRoot":"","sources":["../../../../src/logic/neighbor-discovery/RemoteHandshaker.ts"],"names":[],"mappings":";;;AAAA,sCAAkC;AAClC,sCAAyF;AAEzF,0CAAuC;AAGvC,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAOjC,MAAa,gBAAiB,SAAQ,eAA2B;IAE7D,KAAK,CAAC,SAAS,CACX,iBAAiC,EACjC,SAAmB,EACnB,2BAAoC,EACpC,gBAAyB;QAEzB,MAAM,OAAO,GAA2B;YACpC,aAAa,EAAE,IAAI,CAAC,OAAO;YAC3B,SAAS,EAAE,IAAI,UAAI,EAAE,CAAC,QAAQ,EAAE;YAChC,QAAQ,EAAE,IAAA,2BAAqB,EAAC,iBAAiB,CAAC;YAClD,SAAS;YACT,2BAA2B;YAC3B,gBAAgB;YAChB,gBAAgB,EAAE,iBAAiB;SACtC,CAAA;QACD,MAAM,OAAO,GAAkB;YAC3B,gBAAgB,EAAE,iBAAmC;YACrD,gBAAgB,EAAE,IAAI,CAAC,oBAAsC;SAChE,CAAA;QACD,IAAI;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC9D,OAAO;gBACH,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;aAC9C,CAAA;SACJ;QAAC,OAAO,GAAQ,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAA,2BAAqB,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;YAC9F,OAAO;gBACH,QAAQ,EAAE,KAAK;aAClB,CAAA;SACJ;IACL,CAAC;IAED,gBAAgB,CAAC,iBAAiC,EAAE,oBAAoC;QACpF,MAAM,OAAO,GAAkB;YAC3B,gBAAgB,EAAE,iBAAmC;YACrD,gBAAgB,EAAE,IAAI,CAAC,oBAAsC;YAC7D,YAAY,EAAE,IAAI;SACrB,CAAA;QACD,MAAM,YAAY,GAAqB;YACnC,aAAa,EAAE,IAAI,CAAC,OAAO;YAC3B,gBAAgB,EAAE,oBAAoB;YACtC,QAAQ,EAAE,IAAA,2BAAqB,EAAC,iBAAiB,CAAC;SACrD,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3D,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACN,CAAC;CACJ;AAlDD,4CAkDC"}
@@ -0,0 +1,11 @@
1
+ import { PeerDescriptor } from '@streamr/dht';
2
+ import { Remote } from '../Remote';
3
+ import { INeighborUpdateRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client';
4
+ interface UpdateNeighborsResponse {
5
+ peers: PeerDescriptor[];
6
+ removeMe: boolean;
7
+ }
8
+ export declare class RemoteNeighborUpdateManager extends Remote<INeighborUpdateRpcClient> {
9
+ updateNeighbors(ownPeerDescriptor: PeerDescriptor, neighbors: PeerDescriptor[]): Promise<UpdateNeighborsResponse>;
10
+ }
11
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoteNeighborUpdateManager = void 0;
4
+ const dht_1 = require("@streamr/dht");
5
+ const utils_1 = require("@streamr/utils");
6
+ const Remote_1 = require("../Remote");
7
+ const logger = new utils_1.Logger(module);
8
+ class RemoteNeighborUpdateManager extends Remote_1.Remote {
9
+ async updateNeighbors(ownPeerDescriptor, neighbors) {
10
+ const options = {
11
+ sourceDescriptor: ownPeerDescriptor,
12
+ targetDescriptor: this.remotePeerDescriptor,
13
+ };
14
+ const request = {
15
+ senderId: (0, dht_1.keyFromPeerDescriptor)(ownPeerDescriptor),
16
+ randomGraphId: this.graphId,
17
+ neighborDescriptors: neighbors,
18
+ removeMe: false
19
+ };
20
+ try {
21
+ const response = await this.client.neighborUpdate(request, options);
22
+ return {
23
+ peers: response.neighborDescriptors,
24
+ removeMe: response.removeMe
25
+ };
26
+ }
27
+ catch (err) {
28
+ logger.debug(`updateNeighbors to ${(0, dht_1.keyFromPeerDescriptor)(this.getPeerDescriptor())} failed: ${err}`);
29
+ return {
30
+ peers: [],
31
+ removeMe: true
32
+ };
33
+ }
34
+ }
35
+ }
36
+ exports.RemoteNeighborUpdateManager = RemoteNeighborUpdateManager;
37
+ //# sourceMappingURL=RemoteNeighborUpdateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteNeighborUpdateManager.js","sourceRoot":"","sources":["../../../../src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts"],"names":[],"mappings":";;;AAAA,sCAAmF;AACnF,0CAAuC;AAEvC,sCAAkC;AAGlC,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAOjC,MAAa,2BAA4B,SAAQ,eAAgC;IAE7E,KAAK,CAAC,eAAe,CAAC,iBAAiC,EAAE,SAA2B;QAChF,MAAM,OAAO,GAAkB;YAC3B,gBAAgB,EAAE,iBAAmC;YACrD,gBAAgB,EAAE,IAAI,CAAC,oBAAsC;SAChE,CAAA;QACD,MAAM,OAAO,GAAmB;YAC5B,QAAQ,EAAE,IAAA,2BAAqB,EAAC,iBAAiB,CAAC;YAClD,aAAa,EAAE,IAAI,CAAC,OAAO;YAC3B,mBAAmB,EAAE,SAAS;YAC9B,QAAQ,EAAE,KAAK;SAClB,CAAA;QACD,IAAI;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACnE,OAAO;gBACH,KAAK,EAAE,QAAQ,CAAC,mBAAoB;gBACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC9B,CAAA;SACJ;QAAC,OAAO,GAAQ,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAA,2BAAqB,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;YACpG,OAAO;gBACH,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,IAAI;aACjB,CAAA;SACJ;IACL,CAAC;CACJ;AA3BD,kEA2BC"}
@@ -0,0 +1,36 @@
1
+ import { Node } from 'yallist';
2
+ interface Item<K, V> {
3
+ value: V;
4
+ dropQueueNode: Node<K>;
5
+ expiresAt: number;
6
+ }
7
+ export interface FifoMapWithTtlOptions<K> {
8
+ ttlInMs: number;
9
+ maxSize: number;
10
+ onItemDropped?: (key: K) => void;
11
+ timeProvider?: () => number;
12
+ debugMode?: boolean;
13
+ }
14
+ /**
15
+ * A "Map" implementation with a maximum size and TTL expiration on entries.
16
+ *
17
+ * When full, room is made for new entries by dropping existing by FIFO method.
18
+ *
19
+ * Entries have a TTL after which they are considered stale. Stale items are
20
+ * not returned when querying.
21
+ *
22
+ */
23
+ export declare class FifoMapWithTTL<K, V> {
24
+ private readonly items;
25
+ private readonly dropQueue;
26
+ private readonly ttlInMs;
27
+ private readonly maxSize;
28
+ private readonly onItemDropped;
29
+ private readonly timeProvider;
30
+ constructor({ ttlInMs, maxSize, onItemDropped, timeProvider }: FifoMapWithTtlOptions<K>);
31
+ set(key: K, value: V): void;
32
+ delete(key: K): void;
33
+ get(key: K): V | undefined;
34
+ values(): Item<K, V>[];
35
+ }
36
+ export {};
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FifoMapWithTTL = void 0;
4
+ const yallist_1 = require("yallist");
5
+ /**
6
+ * A "Map" implementation with a maximum size and TTL expiration on entries.
7
+ *
8
+ * When full, room is made for new entries by dropping existing by FIFO method.
9
+ *
10
+ * Entries have a TTL after which they are considered stale. Stale items are
11
+ * not returned when querying.
12
+ *
13
+ */
14
+ class FifoMapWithTTL {
15
+ constructor({ ttlInMs, maxSize, onItemDropped = () => { }, timeProvider = Date.now }) {
16
+ // class invariant: the keys present in `items` and `dropQueue` are the same set.
17
+ this.items = new Map();
18
+ this.dropQueue = (0, yallist_1.create)(); // queue is used to determine deletion order when full
19
+ if (ttlInMs < 0) {
20
+ throw new Error(`ttlInMs (${ttlInMs}) cannot be < 0`);
21
+ }
22
+ if (maxSize < 0) {
23
+ throw new Error(`maxSize (${maxSize}) cannot be < 0`);
24
+ }
25
+ this.ttlInMs = ttlInMs;
26
+ this.maxSize = maxSize;
27
+ this.onItemDropped = onItemDropped;
28
+ this.timeProvider = timeProvider;
29
+ }
30
+ set(key, value) {
31
+ if (this.maxSize === 0) {
32
+ return;
33
+ }
34
+ if (this.items.size > this.maxSize) {
35
+ throw new Error('assertion error: maximum size exceeded');
36
+ }
37
+ // delete an existing entry if exists
38
+ this.delete(key);
39
+ // make room for new entry
40
+ if (this.items.size === this.maxSize) {
41
+ const keyToDel = this.dropQueue.shift();
42
+ if (keyToDel === undefined) {
43
+ throw new Error('assertion error: queue empty but still have items');
44
+ }
45
+ this.items.delete(keyToDel);
46
+ this.onItemDropped(keyToDel);
47
+ }
48
+ // add entry
49
+ const dropQueueNode = new yallist_1.Node(key);
50
+ this.dropQueue.pushNode(dropQueueNode);
51
+ this.items.set(key, {
52
+ value,
53
+ dropQueueNode,
54
+ expiresAt: this.timeProvider() + this.ttlInMs
55
+ });
56
+ }
57
+ delete(key) {
58
+ const item = this.items.get(key);
59
+ if (item !== undefined) {
60
+ this.items.delete(key);
61
+ this.dropQueue.removeNode(item.dropQueueNode);
62
+ this.onItemDropped(key);
63
+ }
64
+ }
65
+ get(key) {
66
+ const item = this.items.get(key);
67
+ if (item === undefined) {
68
+ return undefined;
69
+ }
70
+ if (item.expiresAt <= this.timeProvider()) {
71
+ this.delete(key);
72
+ return undefined;
73
+ }
74
+ return item.value;
75
+ }
76
+ values() {
77
+ return [...this.items.values()];
78
+ }
79
+ }
80
+ exports.FifoMapWithTTL = FifoMapWithTTL;
81
+ //# sourceMappingURL=FifoMapWithTTL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FifoMapWithTTL.js","sourceRoot":"","sources":["../../../../src/logic/propagation/FifoMapWithTTL.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { StreamMessage } from '../../proto/packages/trackerless-network/protos/NetworkRpc';
2
+ type SendToNeighborFn = (neighborId: string, msg: StreamMessage) => Promise<void>;
3
+ interface ConstructorOptions {
4
+ sendToNeighbor: SendToNeighborFn;
5
+ minPropagationTargets: number;
6
+ ttl?: number;
7
+ maxMessages?: number;
8
+ }
9
+ /**
10
+ * Message propagation logic of a node. Given a message, this class will actively attempt to propagate it to
11
+ * `minPropagationTargets` neighbors until success or TTL expiration.
12
+ *
13
+ * Setting `minPropagationTargets = 0` effectively disables any propagation reattempts. A message will then
14
+ * only be propagated exactly once, to neighbors that are present at that moment, in a fire-and-forget manner.
15
+ */
16
+ export declare class Propagation {
17
+ private readonly sendToNeighbor;
18
+ private readonly minPropagationTargets;
19
+ private readonly activeTaskStore;
20
+ constructor({ sendToNeighbor, minPropagationTargets, ttl, maxMessages }: ConstructorOptions);
21
+ /**
22
+ * Node should invoke this when it learns about a new message
23
+ */
24
+ feedUnseenMessage(message: StreamMessage, targets: string[], source: string | null): void;
25
+ /**
26
+ * Node should invoke this when it learns about a new node stream assignment
27
+ */
28
+ onNeighborJoined(neighborId: string): void;
29
+ private sendAndAwaitThenMark;
30
+ }
31
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Propagation = void 0;
4
+ const PropagationTaskStore_1 = require("./PropagationTaskStore");
5
+ const DEFAULT_MAX_MESSAGES = 150;
6
+ const DEFAULT_TTL = 30 * 1000;
7
+ /**
8
+ * Message propagation logic of a node. Given a message, this class will actively attempt to propagate it to
9
+ * `minPropagationTargets` neighbors until success or TTL expiration.
10
+ *
11
+ * Setting `minPropagationTargets = 0` effectively disables any propagation reattempts. A message will then
12
+ * only be propagated exactly once, to neighbors that are present at that moment, in a fire-and-forget manner.
13
+ */
14
+ class Propagation {
15
+ constructor({ sendToNeighbor, minPropagationTargets, ttl = DEFAULT_TTL, maxMessages = DEFAULT_MAX_MESSAGES }) {
16
+ this.sendToNeighbor = sendToNeighbor;
17
+ this.minPropagationTargets = minPropagationTargets;
18
+ this.activeTaskStore = new PropagationTaskStore_1.PropagationTaskStore(ttl, maxMessages);
19
+ }
20
+ /**
21
+ * Node should invoke this when it learns about a new message
22
+ */
23
+ feedUnseenMessage(message, targets, source) {
24
+ const task = {
25
+ message,
26
+ source,
27
+ handledNeighbors: new Set()
28
+ };
29
+ this.activeTaskStore.add(task);
30
+ for (const target of targets) {
31
+ this.sendAndAwaitThenMark(task, target);
32
+ }
33
+ }
34
+ /**
35
+ * Node should invoke this when it learns about a new node stream assignment
36
+ */
37
+ onNeighborJoined(neighborId) {
38
+ const tasksOfStream = this.activeTaskStore.get();
39
+ for (const task of tasksOfStream) {
40
+ this.sendAndAwaitThenMark(task, neighborId);
41
+ }
42
+ }
43
+ sendAndAwaitThenMark({ message, source, handledNeighbors }, neighborId) {
44
+ if (!handledNeighbors.has(neighborId) && neighborId !== source) {
45
+ (async () => {
46
+ try {
47
+ await this.sendToNeighbor(neighborId, message);
48
+ }
49
+ catch {
50
+ return;
51
+ }
52
+ // Side-note: due to asynchronicity, the task being modified at this point could already be stale and
53
+ // deleted from `activeTaskStore`. However, as modifying it or re-deleting it is pretty much
54
+ // inconsequential at this point, leaving the logic as is.
55
+ handledNeighbors.add(neighborId);
56
+ if (handledNeighbors.size >= this.minPropagationTargets) {
57
+ this.activeTaskStore.delete(message.messageRef);
58
+ }
59
+ })();
60
+ }
61
+ }
62
+ }
63
+ exports.Propagation = Propagation;
64
+ //# sourceMappingURL=Propagation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Propagation.js","sourceRoot":"","sources":["../../../../src/logic/propagation/Propagation.ts"],"names":[],"mappings":";;;AACA,iEAA8E;AAW9E,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAChC,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAA;AAE7B;;;;;;GAMG;AAEH,MAAa,WAAW;IAKpB,YAAY,EACR,cAAc,EACd,qBAAqB,EACrB,GAAG,GAAG,WAAW,EACjB,WAAW,GAAG,oBAAoB,EACjB;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;QAClD,IAAI,CAAC,eAAe,GAAG,IAAI,2CAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IACrE,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAsB,EAAE,OAAiB,EAAE,MAAqB;QAC9E,MAAM,IAAI,GAAG;YACT,OAAO;YACP,MAAM;YACN,gBAAgB,EAAE,IAAI,GAAG,EAAU;SACtC,CAAA;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC1B,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;SAC1C;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAAkB;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAA;QAChD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;YAC9B,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;SAC9C;IACL,CAAC;IAEO,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAmB,EAAE,UAAkB;QACnG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,MAAM,EAAE;YAC5D,CAAC,KAAK,IAAI,EAAE;gBACR,IAAI;oBACA,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;iBACjD;gBAAC,MAAM;oBACJ,OAAM;iBACT;gBACD,qGAAqG;gBACrG,4FAA4F;gBAC5F,0DAA0D;gBAC1D,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAChC,IAAI,gBAAgB,CAAC,IAAI,IAAI,IAAI,CAAC,qBAAqB,EAAE;oBACrD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,UAAW,CAAC,CAAA;iBACnD;YACL,CAAC,CAAC,EAAE,CAAA;SACP;IACL,CAAC;CACJ;AA3DD,kCA2DC"}
@@ -0,0 +1,21 @@
1
+ import { MessageRef, StreamMessage } from '../../proto/packages/trackerless-network/protos/NetworkRpc';
2
+ export interface PropagationTask {
3
+ message: StreamMessage;
4
+ source: string | null;
5
+ handledNeighbors: Set<string>;
6
+ }
7
+ /**
8
+ * Keeps track of propagation tasks for the needs of message propagation logic.
9
+ *
10
+ * Properties:
11
+ * - Allows fetching propagation tasks by StreamPartID
12
+ * - Upper bound on number of tasks stored, replacement policy if FIFO
13
+ * - Items have a TTL, after which they are considered stale and not returned when querying
14
+ **/
15
+ export declare class PropagationTaskStore {
16
+ private readonly tasks;
17
+ constructor(ttlInMs: number, maxTasks: number);
18
+ get(): PropagationTask[];
19
+ add(task: PropagationTask): void;
20
+ delete(messageId: MessageRef): void;
21
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PropagationTaskStore = void 0;
4
+ const FifoMapWithTTL_1 = require("./FifoMapWithTTL");
5
+ /**
6
+ * Keeps track of propagation tasks for the needs of message propagation logic.
7
+ *
8
+ * Properties:
9
+ * - Allows fetching propagation tasks by StreamPartID
10
+ * - Upper bound on number of tasks stored, replacement policy if FIFO
11
+ * - Items have a TTL, after which they are considered stale and not returned when querying
12
+ **/
13
+ class PropagationTaskStore {
14
+ constructor(ttlInMs, maxTasks) {
15
+ this.tasks = new FifoMapWithTTL_1.FifoMapWithTTL({
16
+ ttlInMs,
17
+ maxSize: maxTasks
18
+ });
19
+ }
20
+ get() {
21
+ return this.tasks.values().map((task) => task.value);
22
+ }
23
+ add(task) {
24
+ const messageId = task.message.messageRef;
25
+ this.tasks.set(messageId, task);
26
+ }
27
+ delete(messageId) {
28
+ this.tasks.delete(messageId); // causes `onKeyDropped` to be invoked
29
+ }
30
+ }
31
+ exports.PropagationTaskStore = PropagationTaskStore;
32
+ //# sourceMappingURL=PropagationTaskStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropagationTaskStore.js","sourceRoot":"","sources":["../../../../src/logic/propagation/PropagationTaskStore.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AAQjD;;;;;;;GAOG;AACH,MAAa,oBAAoB;IAG7B,YAAY,OAAe,EAAE,QAAgB;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,+BAAc,CAA8B;YACzD,OAAO;YACP,OAAO,EAAE,QAAQ;SACpB,CAAC,CAAA;IACN,CAAC;IAED,GAAG;QACC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAC,IAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAW,CAAA;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,CAAC,SAAqB;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA,CAAC,sCAAsC;IACvE,CAAC;CACJ;AAtBD,oDAsBC"}
@@ -0,0 +1,5 @@
1
+ import { ContentMessage } from '../../../proto/packages/trackerless-network/protos/NetworkRpc';
2
+ export declare class ContentMessageTranslator {
3
+ static toProtobuf(msg: string): ContentMessage;
4
+ static toClientProtocol(msg: ContentMessage): string;
5
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentMessageTranslator = void 0;
4
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
5
+ class ContentMessageTranslator {
6
+ static toProtobuf(msg) {
7
+ const translatedMessage = {
8
+ body: msg
9
+ };
10
+ return translatedMessage;
11
+ }
12
+ static toClientProtocol(msg) {
13
+ return msg.body;
14
+ }
15
+ }
16
+ exports.ContentMessageTranslator = ContentMessageTranslator;
17
+ //# sourceMappingURL=ContentMessageTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentMessageTranslator.js","sourceRoot":"","sources":["../../../../../src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts"],"names":[],"mappings":";;;AAEA,kEAAkE;AAClE,MAAa,wBAAwB;IAEjC,MAAM,CAAC,UAAU,CAAC,GAAW;QACzB,MAAM,iBAAiB,GAAmB;YACtC,IAAI,EAAE,GAAG;SACZ,CAAA;QACD,OAAO,iBAAiB,CAAA;IAC5B,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAmB;QACvC,OAAO,GAAG,CAAC,IAAI,CAAA;IACnB,CAAC;CACJ;AAZD,4DAYC"}
@@ -0,0 +1,6 @@
1
+ import { GroupKeyRequest as OldGroupKeyRequest } from '@streamr/protocol';
2
+ import { GroupKeyRequest } from '../../../proto/packages/trackerless-network/protos/NetworkRpc';
3
+ export declare class GroupKeyRequestTranslator {
4
+ static toProtobuf(msg: OldGroupKeyRequest): GroupKeyRequest;
5
+ static toClientProtocol(msg: GroupKeyRequest): OldGroupKeyRequest;
6
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroupKeyRequestTranslator = void 0;
4
+ const protocol_1 = require("@streamr/protocol");
5
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
6
+ class GroupKeyRequestTranslator {
7
+ static toProtobuf(msg) {
8
+ const translated = {
9
+ recipient: msg.recipient,
10
+ requestId: msg.requestId,
11
+ rsaPublicKey: msg.rsaPublicKey,
12
+ groupKeyIds: msg.groupKeyIds
13
+ };
14
+ return translated;
15
+ }
16
+ static toClientProtocol(msg) {
17
+ const translated = new protocol_1.GroupKeyRequest({
18
+ recipient: msg.recipient,
19
+ requestId: msg.requestId,
20
+ rsaPublicKey: msg.rsaPublicKey,
21
+ groupKeyIds: msg.groupKeyIds
22
+ });
23
+ return translated;
24
+ }
25
+ }
26
+ exports.GroupKeyRequestTranslator = GroupKeyRequestTranslator;
27
+ //# sourceMappingURL=GroupKeyRequestTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupKeyRequestTranslator.js","sourceRoot":"","sources":["../../../../../src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts"],"names":[],"mappings":";;;AAAA,gDAAyE;AAIzE,kEAAkE;AAClE,MAAa,yBAAyB;IAElC,MAAM,CAAC,UAAU,CAAC,GAAuB;QACrC,MAAM,UAAU,GAAoB;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;SAC/B,CAAA;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAoB;QACxC,MAAM,UAAU,GAAG,IAAI,0BAAkB,CAAC;YACtC,SAAS,EAAE,GAAG,CAAC,SAA4B;YAC3C,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;SAC/B,CAAC,CAAA;QACF,OAAO,UAAU,CAAA;IACrB,CAAC;CAEJ;AAtBD,8DAsBC"}
@@ -0,0 +1,6 @@
1
+ import { GroupKeyResponse as OldGroupKeyResponse } from '@streamr/protocol';
2
+ import { GroupKeyResponse } from '../../../proto/packages/trackerless-network/protos/NetworkRpc';
3
+ export declare class GroupKeyResponseTranslator {
4
+ static toProtobuf(msg: OldGroupKeyResponse): GroupKeyResponse;
5
+ static toClientProtocol(msg: GroupKeyResponse): OldGroupKeyResponse;
6
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroupKeyResponseTranslator = void 0;
4
+ const protocol_1 = require("@streamr/protocol");
5
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
6
+ class GroupKeyResponseTranslator {
7
+ static toProtobuf(msg) {
8
+ const encryptedGroupKeys = msg.encryptedGroupKeys.map((groupKey) => {
9
+ const encryptedGroupKey = {
10
+ encryptedGroupKeyHex: groupKey.encryptedGroupKeyHex,
11
+ groupKeyId: groupKey.groupKeyId,
12
+ serialized: groupKey.serialized ?? undefined
13
+ };
14
+ return encryptedGroupKey;
15
+ });
16
+ const translated = {
17
+ recipient: msg.recipient,
18
+ requestId: msg.requestId,
19
+ encryptedGroupKeys
20
+ };
21
+ return translated;
22
+ }
23
+ static toClientProtocol(msg) {
24
+ const encryptedGroupKeys = msg.encryptedGroupKeys.map((groupKey) => new protocol_1.EncryptedGroupKey(groupKey.groupKeyId, groupKey.encryptedGroupKeyHex, groupKey.serialized));
25
+ return new protocol_1.GroupKeyResponse({
26
+ requestId: msg.requestId,
27
+ recipient: msg.recipient,
28
+ encryptedGroupKeys
29
+ });
30
+ }
31
+ }
32
+ exports.GroupKeyResponseTranslator = GroupKeyResponseTranslator;
33
+ //# sourceMappingURL=GroupKeyResponseTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupKeyResponseTranslator.js","sourceRoot":"","sources":["../../../../../src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts"],"names":[],"mappings":";;;AAAA,gDAAsH;AAItH,kEAAkE;AAClE,MAAa,0BAA0B;IAEnC,MAAM,CAAC,UAAU,CAAC,GAAwB;QAEtC,MAAM,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/D,MAAM,iBAAiB,GAAsB;gBACzC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;gBACnD,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,SAAS;aAC/C,CAAA;YACD,OAAO,iBAAiB,CAAA;QAC5B,CAAC,CAAC,CAAA;QACF,MAAM,UAAU,GAAqB;YACjC,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,kBAAkB;SACrB,CAAA;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAqB;QACzC,MAAM,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAA2B,EAAE,EAAE,CAAC,IAAI,4BAAoB,CAC3G,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,oBAAoB,EAC7B,QAAQ,CAAC,UAAU,CACtB,CAAC,CAAA;QACF,OAAO,IAAI,2BAAmB,CAAC;YAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAA4B;YAC3C,kBAAkB;SACrB,CAAC,CAAA;IACN,CAAC;CACJ;AAhCD,gEAgCC"}
@@ -0,0 +1,6 @@
1
+ import { StreamMessage as OldStreamMessage } from '@streamr/protocol';
2
+ import { StreamMessage } from '../../../proto/packages/trackerless-network/protos/NetworkRpc';
3
+ export declare class StreamMessageTranslator {
4
+ static toProtobuf(msg: OldStreamMessage): StreamMessage;
5
+ static toClientProtocol<T>(msg: StreamMessage): OldStreamMessage<T>;
6
+ }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamMessageTranslator = void 0;
4
+ const protocol_1 = require("@streamr/protocol");
5
+ const NetworkRpc_1 = require("../../../proto/packages/trackerless-network/protos/NetworkRpc");
6
+ const ContentMessageTranslator_1 = require("./ContentMessageTranslator");
7
+ const GroupKeyRequestTranslator_1 = require("./GroupKeyRequestTranslator");
8
+ const GroupKeyResponseTranslator_1 = require("./GroupKeyResponseTranslator");
9
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
10
+ class StreamMessageTranslator {
11
+ static toProtobuf(msg) {
12
+ let content;
13
+ let contentType;
14
+ if (msg.messageType === protocol_1.StreamMessageType.MESSAGE) {
15
+ content = NetworkRpc_1.ContentMessage.toBinary(ContentMessageTranslator_1.ContentMessageTranslator.toProtobuf(msg.serializedContent));
16
+ contentType = NetworkRpc_1.StreamMessageType.MESSAGE;
17
+ }
18
+ else if (msg.messageType === protocol_1.StreamMessageType.GROUP_KEY_REQUEST) {
19
+ content = NetworkRpc_1.GroupKeyRequest.toBinary(GroupKeyRequestTranslator_1.GroupKeyRequestTranslator.toProtobuf(protocol_1.GroupKeyRequest.deserialize(msg.serializedContent, protocol_1.StreamMessageType.GROUP_KEY_REQUEST)));
20
+ contentType = NetworkRpc_1.StreamMessageType.GROUP_KEY_REQUEST;
21
+ }
22
+ else if (msg.messageType === protocol_1.StreamMessageType.GROUP_KEY_RESPONSE) {
23
+ content = NetworkRpc_1.GroupKeyResponse.toBinary(GroupKeyResponseTranslator_1.GroupKeyResponseTranslator.toProtobuf(protocol_1.GroupKeyResponse.deserialize(msg.serializedContent, protocol_1.StreamMessageType.GROUP_KEY_RESPONSE)));
24
+ contentType = NetworkRpc_1.StreamMessageType.GROUP_KEY_RESPONSE;
25
+ }
26
+ else {
27
+ throw new Error('invalid message type');
28
+ }
29
+ const messageRef = {
30
+ timestamp: msg.getTimestamp(),
31
+ sequenceNumber: msg.getSequenceNumber(),
32
+ streamId: msg.getStreamId(),
33
+ streamPartition: msg.getStreamPartition(),
34
+ publisherId: msg.getPublisherId(),
35
+ messageChainId: msg.getMsgChainId()
36
+ };
37
+ let previousMessageRef = undefined;
38
+ if (msg.getPreviousMessageRef()) {
39
+ previousMessageRef = {
40
+ timestamp: msg.getPreviousMessageRef().timestamp,
41
+ sequenceNumber: msg.getPreviousMessageRef().sequenceNumber,
42
+ streamId: msg.getStreamId(),
43
+ streamPartition: msg.getStreamPartition(),
44
+ publisherId: msg.getPublisherId(),
45
+ messageChainId: msg.getMsgChainId()
46
+ };
47
+ }
48
+ let newGroupKey = undefined;
49
+ if (msg.getNewGroupKey()) {
50
+ newGroupKey = {
51
+ encryptedGroupKeyHex: msg.getNewGroupKey().encryptedGroupKeyHex,
52
+ groupKeyId: msg.getNewGroupKey().groupKeyId,
53
+ serialized: msg.getNewGroupKey().serialized ?? undefined
54
+ };
55
+ }
56
+ const translated = {
57
+ content: content,
58
+ encryptionType: msg.encryptionType,
59
+ messageRef: messageRef,
60
+ previousMessageRef,
61
+ messageType: contentType,
62
+ signature: msg.signature,
63
+ groupKeyId: msg.groupKeyId ?? undefined,
64
+ newGroupKey,
65
+ };
66
+ return translated;
67
+ }
68
+ static toClientProtocol(msg) {
69
+ let content;
70
+ let contentType;
71
+ if (msg.messageType === NetworkRpc_1.StreamMessageType.MESSAGE) {
72
+ contentType = protocol_1.StreamMessageType.MESSAGE;
73
+ content = ContentMessageTranslator_1.ContentMessageTranslator.toClientProtocol(NetworkRpc_1.ContentMessage.fromBinary(msg.content));
74
+ }
75
+ else if (msg.messageType === NetworkRpc_1.StreamMessageType.GROUP_KEY_REQUEST) {
76
+ contentType = protocol_1.StreamMessageType.GROUP_KEY_REQUEST;
77
+ content = GroupKeyRequestTranslator_1.GroupKeyRequestTranslator.toClientProtocol(NetworkRpc_1.GroupKeyRequest.fromBinary(msg.content)).serialize();
78
+ }
79
+ else if (msg.messageType === NetworkRpc_1.StreamMessageType.GROUP_KEY_RESPONSE) {
80
+ contentType = protocol_1.StreamMessageType.GROUP_KEY_RESPONSE;
81
+ content = GroupKeyResponseTranslator_1.GroupKeyResponseTranslator.toClientProtocol(NetworkRpc_1.GroupKeyResponse.fromBinary(msg.content)).serialize();
82
+ }
83
+ else {
84
+ throw new Error('invalid message type');
85
+ }
86
+ const messageId = new protocol_1.MessageID(msg.messageRef.streamId, msg.messageRef.streamPartition, Number(msg.messageRef.timestamp), msg.messageRef.sequenceNumber, msg.messageRef.publisherId, msg.messageRef.messageChainId);
87
+ let prevMsgRef = undefined;
88
+ if (msg.previousMessageRef) {
89
+ prevMsgRef = new protocol_1.MessageRef(Number(msg.previousMessageRef.timestamp), msg.previousMessageRef.sequenceNumber);
90
+ }
91
+ let newGroupKey = undefined;
92
+ if (msg.newGroupKey) {
93
+ newGroupKey = new protocol_1.EncryptedGroupKey(msg.newGroupKey.groupKeyId, msg.newGroupKey.encryptedGroupKeyHex, msg.newGroupKey.serialized);
94
+ }
95
+ const translated = new protocol_1.StreamMessage({
96
+ signature: msg.signature,
97
+ newGroupKey,
98
+ groupKeyId: msg.groupKeyId,
99
+ content,
100
+ messageType: contentType,
101
+ encryptionType: msg.encryptionType,
102
+ messageId,
103
+ prevMsgRef
104
+ });
105
+ return translated;
106
+ }
107
+ }
108
+ exports.StreamMessageTranslator = StreamMessageTranslator;
109
+ //# sourceMappingURL=StreamMessageTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamMessageTranslator.js","sourceRoot":"","sources":["../../../../../src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts"],"names":[],"mappings":"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"}