libp2p 0.42.2 → 0.43.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 (295) hide show
  1. package/README.md +4 -4
  2. package/dist/index.min.js +29 -29
  3. package/dist/src/address-manager/index.d.ts +1 -10
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +46 -29
  6. package/dist/src/address-manager/index.js.map +1 -1
  7. package/dist/src/autonat/constants.d.ts +4 -0
  8. package/dist/src/autonat/constants.d.ts.map +1 -0
  9. package/dist/src/autonat/constants.js +4 -0
  10. package/dist/src/autonat/constants.js.map +1 -0
  11. package/dist/src/autonat/index.d.ts +64 -0
  12. package/dist/src/autonat/index.d.ts.map +1 -0
  13. package/dist/src/autonat/index.js +417 -0
  14. package/dist/src/autonat/index.js.map +1 -0
  15. package/dist/src/autonat/pb/index.d.ts +57 -0
  16. package/dist/src/autonat/pb/index.d.ts.map +1 -0
  17. package/dist/src/autonat/pb/index.js +250 -0
  18. package/dist/src/autonat/pb/index.js.map +1 -0
  19. package/dist/src/circuit/constants.d.ts +31 -6
  20. package/dist/src/circuit/constants.d.ts.map +1 -1
  21. package/dist/src/circuit/constants.js +37 -7
  22. package/dist/src/circuit/constants.js.map +1 -1
  23. package/dist/src/circuit/index.d.ts +16 -61
  24. package/dist/src/circuit/index.d.ts.map +1 -1
  25. package/dist/src/circuit/index.js +2 -68
  26. package/dist/src/circuit/index.js.map +1 -1
  27. package/dist/src/circuit/pb/index.d.ts +83 -43
  28. package/dist/src/circuit/pb/index.d.ts.map +1 -1
  29. package/dist/src/circuit/pb/index.js +363 -127
  30. package/dist/src/circuit/pb/index.js.map +1 -1
  31. package/dist/src/circuit/server/advert-service.d.ts +43 -0
  32. package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
  33. package/dist/src/circuit/server/advert-service.js +69 -0
  34. package/dist/src/circuit/server/advert-service.js.map +1 -0
  35. package/dist/src/circuit/server/index.d.ts +60 -0
  36. package/dist/src/circuit/server/index.d.ts.map +1 -0
  37. package/dist/src/circuit/server/index.js +287 -0
  38. package/dist/src/circuit/server/index.js.map +1 -0
  39. package/dist/src/circuit/server/reservation-store.d.ts +49 -0
  40. package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
  41. package/dist/src/circuit/server/reservation-store.js +57 -0
  42. package/dist/src/circuit/server/reservation-store.js.map +1 -0
  43. package/dist/src/circuit/server/reservation-voucher.d.ts +18 -0
  44. package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
  45. package/dist/src/circuit/server/reservation-voucher.js +33 -0
  46. package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
  47. package/dist/src/circuit/transport/discovery.d.ts +45 -0
  48. package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
  49. package/dist/src/circuit/transport/discovery.js +82 -0
  50. package/dist/src/circuit/transport/discovery.js.map +1 -0
  51. package/dist/src/circuit/transport/index.d.ts +33 -0
  52. package/dist/src/circuit/transport/index.d.ts.map +1 -0
  53. package/dist/src/circuit/transport/index.js +225 -0
  54. package/dist/src/circuit/transport/index.js.map +1 -0
  55. package/dist/src/circuit/transport/listener.d.ts +9 -0
  56. package/dist/src/circuit/transport/listener.d.ts.map +1 -0
  57. package/dist/src/circuit/transport/listener.js +76 -0
  58. package/dist/src/circuit/transport/listener.js.map +1 -0
  59. package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
  60. package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
  61. package/dist/src/circuit/transport/reservation-store.js +165 -0
  62. package/dist/src/circuit/transport/reservation-store.js.map +1 -0
  63. package/dist/src/circuit/utils.d.ts +7 -0
  64. package/dist/src/circuit/utils.d.ts.map +1 -1
  65. package/dist/src/circuit/utils.js +87 -0
  66. package/dist/src/circuit/utils.js.map +1 -1
  67. package/dist/src/components.d.ts +2 -1
  68. package/dist/src/components.d.ts.map +1 -1
  69. package/dist/src/components.js +13 -13
  70. package/dist/src/components.js.map +1 -1
  71. package/dist/src/config.d.ts.map +1 -1
  72. package/dist/src/config.js +21 -25
  73. package/dist/src/config.js.map +1 -1
  74. package/dist/src/connection/index.d.ts +2 -2
  75. package/dist/src/connection/index.d.ts.map +1 -1
  76. package/dist/src/connection/index.js +4 -4
  77. package/dist/src/connection/index.js.map +1 -1
  78. package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
  79. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  80. package/dist/src/connection-manager/auto-dialler.js +18 -18
  81. package/dist/src/connection-manager/auto-dialler.js.map +1 -1
  82. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
  83. package/dist/src/connection-manager/dialer/dial-request.js +13 -6
  84. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
  85. package/dist/src/connection-manager/dialer/index.d.ts +10 -1
  86. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  87. package/dist/src/connection-manager/dialer/index.js +24 -9
  88. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  89. package/dist/src/connection-manager/index.d.ts +1 -4
  90. package/dist/src/connection-manager/index.d.ts.map +1 -1
  91. package/dist/src/connection-manager/index.js +8 -5
  92. package/dist/src/connection-manager/index.js.map +1 -1
  93. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  94. package/dist/src/connection-manager/latency-monitor.js +1 -1
  95. package/dist/src/connection-manager/latency-monitor.js.map +1 -1
  96. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  97. package/dist/src/content-routing/index.d.ts +6 -4
  98. package/dist/src/content-routing/index.d.ts.map +1 -1
  99. package/dist/src/content-routing/index.js +9 -9
  100. package/dist/src/content-routing/index.js.map +1 -1
  101. package/dist/src/content-routing/utils.d.ts +3 -3
  102. package/dist/src/content-routing/utils.d.ts.map +1 -1
  103. package/dist/src/content-routing/utils.js +2 -2
  104. package/dist/src/content-routing/utils.js.map +1 -1
  105. package/dist/src/dht/dht-content-routing.d.ts +2 -1
  106. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  107. package/dist/src/dht/dht-content-routing.js +2 -2
  108. package/dist/src/dht/dht-content-routing.js.map +1 -1
  109. package/dist/src/dht/dht-peer-routing.d.ts +3 -2
  110. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  111. package/dist/src/dht/dht-peer-routing.js +2 -2
  112. package/dist/src/dht/dht-peer-routing.js.map +1 -1
  113. package/dist/src/dht/dummy-dht.d.ts +1 -1
  114. package/dist/src/dht/dummy-dht.d.ts.map +1 -1
  115. package/dist/src/dht/dummy-dht.js +12 -12
  116. package/dist/src/dht/dummy-dht.js.map +1 -1
  117. package/dist/src/errors.d.ts +2 -1
  118. package/dist/src/errors.d.ts.map +1 -1
  119. package/dist/src/errors.js +1 -0
  120. package/dist/src/errors.js.map +1 -1
  121. package/dist/src/fetch/index.d.ts.map +1 -1
  122. package/dist/src/fetch/index.js +6 -6
  123. package/dist/src/fetch/index.js.map +1 -1
  124. package/dist/src/fetch/pb/proto.d.ts +3 -3
  125. package/dist/src/fetch/pb/proto.d.ts.map +1 -1
  126. package/dist/src/fetch/pb/proto.js +4 -3
  127. package/dist/src/fetch/pb/proto.js.map +1 -1
  128. package/dist/src/get-peer.js +2 -2
  129. package/dist/src/get-peer.js.map +1 -1
  130. package/dist/src/identify/index.d.ts +3 -1
  131. package/dist/src/identify/index.d.ts.map +1 -1
  132. package/dist/src/identify/index.js +19 -14
  133. package/dist/src/identify/index.js.map +1 -1
  134. package/dist/src/identify/pb/message.d.ts +2 -2
  135. package/dist/src/identify/pb/message.d.ts.map +1 -1
  136. package/dist/src/identify/pb/message.js +1 -0
  137. package/dist/src/identify/pb/message.js.map +1 -1
  138. package/dist/src/index.d.ts +14 -8
  139. package/dist/src/index.d.ts.map +1 -1
  140. package/dist/src/index.js.map +1 -1
  141. package/dist/src/insecure/index.d.ts.map +1 -1
  142. package/dist/src/insecure/index.js.map +1 -1
  143. package/dist/src/insecure/pb/proto.d.ts +3 -3
  144. package/dist/src/insecure/pb/proto.d.ts.map +1 -1
  145. package/dist/src/insecure/pb/proto.js +4 -5
  146. package/dist/src/insecure/pb/proto.js.map +1 -1
  147. package/dist/src/libp2p.d.ts +7 -3
  148. package/dist/src/libp2p.d.ts.map +1 -1
  149. package/dist/src/libp2p.js +35 -35
  150. package/dist/src/libp2p.js.map +1 -1
  151. package/dist/src/nat-manager.d.ts.map +1 -1
  152. package/dist/src/nat-manager.js +5 -3
  153. package/dist/src/nat-manager.js.map +1 -1
  154. package/dist/src/peer-record-updater.d.ts.map +1 -1
  155. package/dist/src/peer-routing.d.ts.map +1 -1
  156. package/dist/src/peer-routing.js +5 -5
  157. package/dist/src/peer-routing.js.map +1 -1
  158. package/dist/src/ping/index.d.ts.map +1 -1
  159. package/dist/src/ping/index.js +2 -2
  160. package/dist/src/ping/index.js.map +1 -1
  161. package/dist/src/pnet/crypto.d.ts +1 -1
  162. package/dist/src/pnet/crypto.d.ts.map +1 -1
  163. package/dist/src/pnet/crypto.js +1 -1
  164. package/dist/src/pnet/crypto.js.map +1 -1
  165. package/dist/src/pnet/index.js +3 -3
  166. package/dist/src/pnet/index.js.map +1 -1
  167. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  168. package/dist/src/pubsub/dummy-pubsub.js +9 -9
  169. package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
  170. package/dist/src/registrar.d.ts.map +1 -1
  171. package/dist/src/registrar.js +4 -4
  172. package/dist/src/registrar.js.map +1 -1
  173. package/dist/src/transport-manager.d.ts.map +1 -1
  174. package/dist/src/transport-manager.js +8 -9
  175. package/dist/src/transport-manager.js.map +1 -1
  176. package/dist/src/upgrader.d.ts +2 -1
  177. package/dist/src/upgrader.d.ts.map +1 -1
  178. package/dist/src/upgrader.js +38 -33
  179. package/dist/src/upgrader.js.map +1 -1
  180. package/dist/typedoc-urls.json +19 -6
  181. package/package.json +36 -33
  182. package/src/address-manager/index.ts +62 -35
  183. package/src/autonat/constants.ts +4 -0
  184. package/src/autonat/index.ts +567 -0
  185. package/src/autonat/pb/index.proto +35 -0
  186. package/src/autonat/pb/index.ts +320 -0
  187. package/src/circuit/constants.ts +48 -7
  188. package/src/circuit/index.ts +17 -129
  189. package/src/circuit/pb/index.proto +57 -32
  190. package/src/circuit/pb/index.ts +448 -138
  191. package/src/circuit/server/advert-service.ts +108 -0
  192. package/src/circuit/server/index.ts +421 -0
  193. package/src/circuit/server/reservation-store.ts +111 -0
  194. package/src/circuit/server/reservation-voucher.ts +51 -0
  195. package/src/circuit/transport/discovery.ts +127 -0
  196. package/src/circuit/transport/index.ts +325 -0
  197. package/src/circuit/transport/listener.ts +99 -0
  198. package/src/circuit/transport/reservation-store.ts +249 -0
  199. package/src/circuit/utils.ts +108 -0
  200. package/src/components.ts +22 -21
  201. package/src/config.ts +21 -25
  202. package/src/connection/index.ts +10 -10
  203. package/src/connection-manager/auto-dialler.ts +36 -40
  204. package/src/connection-manager/dialer/dial-request.ts +13 -6
  205. package/src/connection-manager/dialer/index.ts +34 -15
  206. package/src/connection-manager/index.ts +22 -23
  207. package/src/connection-manager/latency-monitor.ts +9 -9
  208. package/src/connection-manager/visibility-change-emitter.ts +4 -4
  209. package/src/content-routing/index.ts +18 -16
  210. package/src/content-routing/utils.ts +5 -5
  211. package/src/dht/dht-content-routing.ts +5 -4
  212. package/src/dht/dht-peer-routing.ts +5 -4
  213. package/src/dht/dummy-dht.ts +13 -13
  214. package/src/errors.ts +2 -1
  215. package/src/fetch/index.ts +13 -13
  216. package/src/fetch/pb/proto.ts +8 -7
  217. package/src/get-peer.ts +3 -3
  218. package/src/identify/index.ts +29 -24
  219. package/src/identify/pb/message.ts +3 -2
  220. package/src/index.ts +15 -8
  221. package/src/insecure/index.ts +2 -1
  222. package/src/insecure/pb/proto.ts +8 -9
  223. package/src/libp2p.ts +52 -46
  224. package/src/nat-manager.ts +11 -9
  225. package/src/peer-record-updater.ts +4 -4
  226. package/src/peer-routing.ts +9 -9
  227. package/src/ping/index.ts +6 -6
  228. package/src/pnet/crypto.ts +3 -3
  229. package/src/pnet/index.ts +3 -3
  230. package/src/pnet/key-generator.ts +1 -1
  231. package/src/pubsub/dummy-pubsub.ts +9 -9
  232. package/src/registrar.ts +12 -12
  233. package/src/transport-manager.ts +17 -18
  234. package/src/upgrader.ts +43 -42
  235. package/src/version.ts +1 -1
  236. package/dist/src/circuit/auto-relay.d.ts +0 -46
  237. package/dist/src/circuit/auto-relay.d.ts.map +0 -1
  238. package/dist/src/circuit/auto-relay.js +0 -220
  239. package/dist/src/circuit/auto-relay.js.map +0 -1
  240. package/dist/src/circuit/circuit/hop.d.ts +0 -42
  241. package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
  242. package/dist/src/circuit/circuit/hop.js +0 -142
  243. package/dist/src/circuit/circuit/hop.js.map +0 -1
  244. package/dist/src/circuit/circuit/stop.d.ts +0 -24
  245. package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
  246. package/dist/src/circuit/circuit/stop.js +0 -51
  247. package/dist/src/circuit/circuit/stop.js.map +0 -1
  248. package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
  249. package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
  250. package/dist/src/circuit/circuit/stream-handler.js +0 -59
  251. package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
  252. package/dist/src/circuit/circuit/utils.d.ts +0 -7
  253. package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
  254. package/dist/src/circuit/circuit/utils.js +0 -43
  255. package/dist/src/circuit/circuit/utils.js.map +0 -1
  256. package/dist/src/circuit/listener.d.ts +0 -9
  257. package/dist/src/circuit/listener.d.ts.map +0 -1
  258. package/dist/src/circuit/listener.js +0 -62
  259. package/dist/src/circuit/listener.js.map +0 -1
  260. package/dist/src/circuit/multicodec.d.ts +0 -2
  261. package/dist/src/circuit/multicodec.d.ts.map +0 -1
  262. package/dist/src/circuit/multicodec.js +0 -2
  263. package/dist/src/circuit/multicodec.js.map +0 -1
  264. package/dist/src/circuit/transport.d.ts +0 -51
  265. package/dist/src/circuit/transport.d.ts.map +0 -1
  266. package/dist/src/circuit/transport.js +0 -223
  267. package/dist/src/circuit/transport.js.map +0 -1
  268. package/dist/src/keychain/cms.d.ts +0 -33
  269. package/dist/src/keychain/cms.d.ts.map +0 -1
  270. package/dist/src/keychain/cms.js +0 -129
  271. package/dist/src/keychain/cms.js.map +0 -1
  272. package/dist/src/keychain/index.d.ts +0 -151
  273. package/dist/src/keychain/index.d.ts.map +0 -1
  274. package/dist/src/keychain/index.js +0 -519
  275. package/dist/src/keychain/index.js.map +0 -1
  276. package/dist/src/keychain/util.d.ts +0 -21
  277. package/dist/src/keychain/util.d.ts.map +0 -1
  278. package/dist/src/keychain/util.js +0 -79
  279. package/dist/src/keychain/util.js.map +0 -1
  280. package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
  281. package/src/circuit/README.md +0 -111
  282. package/src/circuit/auto-relay.ts +0 -292
  283. package/src/circuit/circuit/hop.ts +0 -220
  284. package/src/circuit/circuit/stop.ts +0 -83
  285. package/src/circuit/circuit/stream-handler.ts +0 -87
  286. package/src/circuit/circuit/utils.ts +0 -44
  287. package/src/circuit/listener.ts +0 -83
  288. package/src/circuit/multicodec.ts +0 -2
  289. package/src/circuit/transport.ts +0 -278
  290. package/src/keychain/README.md +0 -55
  291. package/src/keychain/cms.ts +0 -150
  292. package/src/keychain/doc/private-key.png +0 -0
  293. package/src/keychain/doc/private-key.xml +0 -1
  294. package/src/keychain/index.ts +0 -629
  295. package/src/keychain/util.ts +0 -82
@@ -0,0 +1,69 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import { codes } from '../../errors.js';
3
+ import { namespaceToCid } from '../utils.js';
4
+ import { DEFAULT_ADVERT_BOOT_DELAY, RELAY_RENDEZVOUS_NS } from '../constants.js';
5
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events';
6
+ import pRetry from 'p-retry';
7
+ const log = logger('libp2p:circuit-relay:advert-service');
8
+ export class AdvertService extends EventEmitter {
9
+ /**
10
+ * Creates an instance of Relay
11
+ */
12
+ constructor(components, init) {
13
+ super();
14
+ this.contentRouting = components.contentRouting;
15
+ this.bootDelay = init?.bootDelay ?? DEFAULT_ADVERT_BOOT_DELAY;
16
+ this.started = false;
17
+ }
18
+ isStarted() {
19
+ return this.started;
20
+ }
21
+ /**
22
+ * Start Relay service
23
+ */
24
+ start() {
25
+ if (this.started) {
26
+ return;
27
+ }
28
+ // Advertise service if HOP enabled and advertising enabled
29
+ this.timeout = setTimeout(() => {
30
+ this._advertiseService().catch(err => {
31
+ log.error('could not advertise service', err);
32
+ });
33
+ }, this.bootDelay);
34
+ this.started = true;
35
+ }
36
+ /**
37
+ * Stop Relay service
38
+ */
39
+ stop() {
40
+ try {
41
+ clearTimeout(this.timeout);
42
+ }
43
+ catch (err) { }
44
+ this.started = false;
45
+ }
46
+ /**
47
+ * Advertise hop relay service in the network.
48
+ */
49
+ async _advertiseService() {
50
+ await pRetry(async () => {
51
+ try {
52
+ const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS);
53
+ await this.contentRouting.provide(cid);
54
+ this.dispatchEvent(new CustomEvent('advert:success'));
55
+ }
56
+ catch (err) {
57
+ this.safeDispatchEvent('advert:error', { detail: err });
58
+ if (err.code === codes.ERR_NO_ROUTERS_AVAILABLE) {
59
+ log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err);
60
+ this.stop();
61
+ return;
62
+ }
63
+ log.error('could not advertise service', err);
64
+ throw err;
65
+ }
66
+ });
67
+ }
68
+ }
69
+ //# sourceMappingURL=advert-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advert-service.js","sourceRoot":"","sources":["../../../../src/circuit/server/advert-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,MAAM,GAAG,GAAG,MAAM,CAAC,qCAAqC,CAAC,CAAA;AAqBzD,MAAM,OAAO,aAAc,SAAQ,YAAiC;IAMlE;;OAEG;IACH,YAAa,UAAmC,EAAE,IAAwB;QACxE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,cAAc,CAAA;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,yBAAyB,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAM;SACP;QAED,2DAA2D;QAC3D,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACnC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;YAC/C,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAElB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI;YACF,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SAC3B;QAAC,OAAO,GAAG,EAAE,GAAG;QAEjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;YACtB,IAAI;gBACF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,mBAAmB,CAAC,CAAA;gBACrD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBAEtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAA;aACtD;YAAC,OAAO,GAAQ,EAAE;gBACjB,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;gBAEvD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,wBAAwB,EAAE;oBAC/C,GAAG,CAAC,KAAK,CAAC,2FAA2F,EAAE,GAAG,CAAC,CAAA;oBAC3G,IAAI,CAAC,IAAI,EAAE,CAAA;oBACX,OAAM;iBACP;gBAED,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;gBAC7C,MAAM,GAAG,CAAA;aACV;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,60 @@
1
+ import type { PeerStore } from '@libp2p/interface-peer-store';
2
+ import { ReservationStoreInit } from './reservation-store.js';
3
+ import type { Registrar } from '@libp2p/interface-registrar';
4
+ import { AdvertServiceComponents, AdvertServiceInit } from './advert-service.js';
5
+ import { ProtobufStream } from 'it-pb-stream';
6
+ import { HopMessage, StopMessage } from '../pb/index.js';
7
+ import type { Connection, Stream } from '@libp2p/interface-connection';
8
+ import type { ConnectionGater } from '@libp2p/interface-connection-gater';
9
+ import type { PeerId } from '@libp2p/interface-peer-id';
10
+ import type { AddressManager } from '@libp2p/interface-address-manager';
11
+ import type { ConnectionManager } from '@libp2p/interface-connection-manager';
12
+ import type { CircuitRelayService, RelayReservation } from '../index.js';
13
+ export interface CircuitRelayServerInit {
14
+ /**
15
+ * Incoming hop requests must complete within this time in ms otherwise
16
+ * the stream will be reset (default: 30s)
17
+ */
18
+ hopTimeout?: number;
19
+ /**
20
+ * If true, advertise this service via libp2p content routing to allow
21
+ * peers to locate us on the network (default: false)
22
+ */
23
+ advertise?: boolean | AdvertServiceInit;
24
+ /**
25
+ * Configuration of reservations
26
+ */
27
+ reservations?: ReservationStoreInit;
28
+ /**
29
+ * The maximum number of simultaneous HOP inbound streams that can be open at once
30
+ */
31
+ maxInboundHopStreams?: number;
32
+ /**
33
+ * The maximum number of simultaneous HOP outbound streams that can be open at once
34
+ */
35
+ maxOutboundHopStreams?: number;
36
+ }
37
+ export interface HopProtocolOptions {
38
+ connection: Connection;
39
+ request: HopMessage;
40
+ stream: ProtobufStream<Stream>;
41
+ }
42
+ export interface StopOptions {
43
+ connection: Connection;
44
+ request: StopMessage;
45
+ }
46
+ export interface CircuitRelayServerComponents extends AdvertServiceComponents {
47
+ registrar: Registrar;
48
+ peerStore: PeerStore;
49
+ addressManager: AddressManager;
50
+ peerId: PeerId;
51
+ connectionManager: ConnectionManager;
52
+ connectionGater: ConnectionGater;
53
+ }
54
+ export interface RelayServerEvents {
55
+ 'relay:reservation': CustomEvent<RelayReservation>;
56
+ 'relay:advert:success': CustomEvent<unknown>;
57
+ 'relay:advert:error': CustomEvent<Error>;
58
+ }
59
+ export declare function circuitRelayServer(init?: CircuitRelayServerInit): (components: CircuitRelayServerComponents) => CircuitRelayService;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/circuit/server/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,EAAoB,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EAAiB,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE/F,OAAO,EAAY,cAAc,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,UAAU,EAAuB,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAGvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AASxE,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAA;IAEvC;;OAEG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAA;IAEnC;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAClD,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5C,oBAAoB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;CACzC;AAyUD,wBAAgB,kBAAkB,CAAE,IAAI,GAAE,sBAA2B,GAAG,CAAC,UAAU,EAAE,4BAA4B,KAAK,mBAAmB,CAIxI"}
@@ -0,0 +1,287 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import { createLimitedRelay } from '../utils.js';
3
+ import { CIRCUIT_PROTO_CODE, DEFAULT_HOP_TIMEOUT, RELAY_SOURCE_TAG, RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from '../constants.js';
4
+ import { ReservationStore } from './reservation-store.js';
5
+ import { AdvertService } from './advert-service.js';
6
+ import pDefer from 'p-defer';
7
+ import { pbStream } from 'it-pb-stream';
8
+ import { HopMessage, Status, StopMessage } from '../pb/index.js';
9
+ import { multiaddr } from '@multiformats/multiaddr';
10
+ import { peerIdFromBytes } from '@libp2p/peer-id';
11
+ import { RecordEnvelope } from '@libp2p/peer-record';
12
+ import { ReservationVoucherRecord } from './reservation-voucher.js';
13
+ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events';
14
+ import { setMaxListeners } from 'events';
15
+ const log = logger('libp2p:circuit-relay:server');
16
+ const isRelayAddr = (ma) => ma.protoCodes().includes(CIRCUIT_PROTO_CODE);
17
+ class CircuitRelayServer extends EventEmitter {
18
+ /**
19
+ * Creates an instance of Relay
20
+ */
21
+ constructor(components, init = {}) {
22
+ super();
23
+ this.registrar = components.registrar;
24
+ this.peerStore = components.peerStore;
25
+ this.addressManager = components.addressManager;
26
+ this.peerId = components.peerId;
27
+ this.connectionManager = components.connectionManager;
28
+ this.connectionGater = components.connectionGater;
29
+ this.started = false;
30
+ this.hopTimeout = init?.hopTimeout ?? DEFAULT_HOP_TIMEOUT;
31
+ this.shutdownController = new AbortController();
32
+ this.maxInboundHopStreams = init.maxInboundHopStreams;
33
+ this.maxOutboundHopStreams = init.maxOutboundHopStreams;
34
+ try {
35
+ // fails on node < 15.4
36
+ setMaxListeners?.(Infinity, this.shutdownController.signal);
37
+ }
38
+ catch { }
39
+ if (init.advertise != null && init.advertise !== false) {
40
+ this.advertService = new AdvertService(components, init.advertise === true ? undefined : init.advertise);
41
+ this.advertService.addEventListener('advert:success', () => {
42
+ this.dispatchEvent(new CustomEvent('relay:advert:success'));
43
+ });
44
+ this.advertService.addEventListener('advert:error', (evt) => {
45
+ this.safeDispatchEvent('relay:advert:error', { detail: evt.detail });
46
+ });
47
+ }
48
+ this.reservationStore = new ReservationStore(init.reservations);
49
+ }
50
+ isStarted() {
51
+ return this.started;
52
+ }
53
+ /**
54
+ * Start Relay service
55
+ */
56
+ async start() {
57
+ if (this.started) {
58
+ return;
59
+ }
60
+ // Advertise service if HOP enabled and advertising enabled
61
+ this.advertService?.start();
62
+ await this.registrar.handle(RELAY_V2_HOP_CODEC, (data) => {
63
+ void this.onHop(data).catch(err => {
64
+ log.error(err);
65
+ });
66
+ }, {
67
+ maxInboundStreams: this.maxInboundHopStreams,
68
+ maxOutboundStreams: this.maxOutboundHopStreams
69
+ });
70
+ this.reservationStore.start();
71
+ this.started = true;
72
+ }
73
+ /**
74
+ * Stop Relay service
75
+ */
76
+ async stop() {
77
+ this.advertService?.stop();
78
+ this.reservationStore.stop();
79
+ this.shutdownController.abort();
80
+ await this.registrar.unhandle(RELAY_V2_HOP_CODEC);
81
+ this.started = false;
82
+ }
83
+ async onHop({ connection, stream }) {
84
+ log('received circuit v2 hop protocol stream from %s', connection.remotePeer);
85
+ const hopTimeoutPromise = pDefer();
86
+ const timeout = setTimeout(() => {
87
+ hopTimeoutPromise.reject('timed out');
88
+ }, this.hopTimeout);
89
+ const pbstr = pbStream(stream);
90
+ try {
91
+ const request = await Promise.race([
92
+ pbstr.pb(HopMessage).read(),
93
+ hopTimeoutPromise.promise
94
+ ]);
95
+ if (request?.type == null) {
96
+ throw new Error('request was invalid, could not read from stream');
97
+ }
98
+ log('received', request.type);
99
+ await Promise.race([
100
+ this.handleHopProtocol({
101
+ connection,
102
+ stream: pbstr,
103
+ request
104
+ }),
105
+ hopTimeoutPromise.promise
106
+ ]);
107
+ }
108
+ catch (err) {
109
+ log.error('error while handling hop', err);
110
+ pbstr.pb(HopMessage).write({
111
+ type: HopMessage.Type.STATUS,
112
+ status: Status.MALFORMED_MESSAGE
113
+ });
114
+ stream.abort(err);
115
+ }
116
+ finally {
117
+ clearTimeout(timeout);
118
+ }
119
+ }
120
+ async handleHopProtocol({ stream, request, connection }) {
121
+ log('received hop message');
122
+ switch (request.type) {
123
+ case HopMessage.Type.RESERVE:
124
+ await this.handleReserve({ stream, request, connection });
125
+ break;
126
+ case HopMessage.Type.CONNECT:
127
+ await this.handleConnect({ stream, request, connection });
128
+ break;
129
+ default: {
130
+ log.error('invalid hop request type %s via peer %s', request.type, connection.remotePeer);
131
+ stream.pb(HopMessage).write({ type: HopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE });
132
+ }
133
+ }
134
+ }
135
+ async handleReserve({ stream, request, connection }) {
136
+ const hopstr = stream.pb(HopMessage);
137
+ log('hop reserve request from %s', connection.remotePeer);
138
+ if (isRelayAddr(connection.remoteAddr)) {
139
+ log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer);
140
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED });
141
+ return;
142
+ }
143
+ if ((await this.connectionGater.denyInboundRelayReservation?.(connection.remotePeer)) === true) {
144
+ log.error('reservation for %p denied by connection gater', connection.remotePeer);
145
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED });
146
+ return;
147
+ }
148
+ const result = this.reservationStore.reserve(connection.remotePeer, connection.remoteAddr);
149
+ if (result.status !== Status.OK) {
150
+ hopstr.write({ type: HopMessage.Type.STATUS, status: result.status });
151
+ return;
152
+ }
153
+ try {
154
+ // tag relay target peer
155
+ // result.expire is non-null if `ReservationStore.reserve` returns with status == OK
156
+ if (result.expire != null) {
157
+ const ttl = new Date().getTime() - result.expire;
158
+ await this.peerStore.tagPeer(connection.remotePeer, RELAY_SOURCE_TAG, { value: 1, ttl });
159
+ }
160
+ hopstr.write({
161
+ type: HopMessage.Type.STATUS,
162
+ status: Status.OK,
163
+ reservation: await this.makeReservation(connection.remotePeer, BigInt(result.expire ?? 0)),
164
+ limit: this.reservationStore.get(connection.remotePeer)?.limit
165
+ });
166
+ log('sent confirmation response to %s', connection.remotePeer);
167
+ }
168
+ catch (err) {
169
+ log.error('failed to send confirmation response to %p', connection.remotePeer, err);
170
+ this.reservationStore.removeReservation(connection.remotePeer);
171
+ }
172
+ }
173
+ async makeReservation(remotePeer, expire) {
174
+ const addrs = [];
175
+ for (const relayAddr of this.addressManager.getAddresses()) {
176
+ addrs.push(relayAddr.bytes);
177
+ }
178
+ const voucher = await RecordEnvelope.seal(new ReservationVoucherRecord({
179
+ peer: remotePeer,
180
+ relay: this.peerId,
181
+ expiration: Number(expire)
182
+ }), this.peerId);
183
+ return {
184
+ addrs,
185
+ expire,
186
+ voucher: voucher.marshal()
187
+ };
188
+ }
189
+ async handleConnect({ stream, request, connection }) {
190
+ const hopstr = stream.pb(HopMessage);
191
+ if (isRelayAddr(connection.remoteAddr)) {
192
+ log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer);
193
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED });
194
+ return;
195
+ }
196
+ log('hop connect request from %s', connection.remotePeer);
197
+ let dstPeer;
198
+ try {
199
+ if (request.peer == null) {
200
+ log.error('no peer info in hop connect request');
201
+ throw new Error('no peer info in request');
202
+ }
203
+ request.peer.addrs.forEach(multiaddr);
204
+ dstPeer = peerIdFromBytes(request.peer.id);
205
+ }
206
+ catch (err) {
207
+ log.error('invalid hop connect request via peer %p %s', connection.remotePeer, err);
208
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE });
209
+ return;
210
+ }
211
+ if (!this.reservationStore.hasReservation(dstPeer)) {
212
+ log.error('hop connect denied for destination peer %p not having a reservation for %p with status %s', dstPeer, connection.remotePeer, Status.NO_RESERVATION);
213
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION });
214
+ return;
215
+ }
216
+ if ((await this.connectionGater.denyOutboundRelayedConnection?.(connection.remotePeer, dstPeer)) === true) {
217
+ log.error('hop connect for %p to %p denied by connection gater', connection.remotePeer, dstPeer);
218
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED });
219
+ return;
220
+ }
221
+ const connections = this.connectionManager.getConnections(dstPeer);
222
+ if (connections.length === 0) {
223
+ log('hop connect denied for destination peer %p not having a connection for %p as there is no destination connection', dstPeer, connection.remotePeer);
224
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION });
225
+ return;
226
+ }
227
+ const destinationConnection = connections[0];
228
+ const destinationStream = await this.stopHop({
229
+ connection: destinationConnection,
230
+ request: {
231
+ type: StopMessage.Type.CONNECT,
232
+ peer: {
233
+ id: connection.remotePeer.toBytes(),
234
+ addrs: []
235
+ }
236
+ }
237
+ });
238
+ if (destinationStream == null) {
239
+ log.error('failed to open stream to destination peer %s', destinationConnection?.remotePeer);
240
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.CONNECTION_FAILED });
241
+ return;
242
+ }
243
+ hopstr.write({ type: HopMessage.Type.STATUS, status: Status.OK });
244
+ const sourceStream = stream.unwrap();
245
+ log('connection from %p to %p established - merging streans', connection.remotePeer, dstPeer);
246
+ const limit = this.reservationStore.get(dstPeer)?.limit;
247
+ // Short circuit the two streams to create the relayed connection
248
+ createLimitedRelay(sourceStream, destinationStream, this.shutdownController.signal, limit);
249
+ }
250
+ /**
251
+ * Send a STOP request to the target peer that the dialing peer wants to contact
252
+ */
253
+ async stopHop({ connection, request }) {
254
+ log('starting circuit relay v2 stop request to %s', connection.remotePeer);
255
+ const stream = await connection.newStream([RELAY_V2_STOP_CODEC]);
256
+ const pbstr = pbStream(stream);
257
+ const stopstr = pbstr.pb(StopMessage);
258
+ stopstr.write(request);
259
+ let response;
260
+ try {
261
+ response = await stopstr.read();
262
+ }
263
+ catch (err) {
264
+ log.error('error parsing stop message response from %s', connection.remotePeer);
265
+ }
266
+ if (response == null) {
267
+ log.error('could not read response from %s', connection.remotePeer);
268
+ stream.close();
269
+ return;
270
+ }
271
+ if (response.status === Status.OK) {
272
+ log('stop request to %s was successful', connection.remotePeer);
273
+ return pbstr.unwrap();
274
+ }
275
+ log('stop request failed with code %d', response.status);
276
+ stream.close();
277
+ }
278
+ get reservations() {
279
+ return this.reservationStore.reservations;
280
+ }
281
+ }
282
+ export function circuitRelayServer(init = {}) {
283
+ return (components) => {
284
+ return new CircuitRelayServer(components, init);
285
+ };
286
+ }
287
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/circuit/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { Limit, Status } from '../pb/index.js';
2
+ import type { Multiaddr } from '@multiformats/multiaddr';
3
+ import type { PeerId } from '@libp2p/interface-peer-id';
4
+ import type { Startable } from '@libp2p/interfaces/startable';
5
+ import { PeerMap } from '@libp2p/peer-collections';
6
+ import type { RecursivePartial } from '@libp2p/interfaces';
7
+ import type { RelayReservation } from '../index.js';
8
+ export type ReservationStatus = Status.OK | Status.PERMISSION_DENIED | Status.RESERVATION_REFUSED;
9
+ export interface ReservationStoreInit {
10
+ maxReservations?: number;
11
+ reservationClearInterval?: number;
12
+ applyDefaultLimit?: boolean;
13
+ /**
14
+ * reservation ttl, default: 2 hours
15
+ */
16
+ reservationTtl?: number;
17
+ /**
18
+ * The maximum time a relayed connection can be open for
19
+ */
20
+ defaultDurationLimit?: number;
21
+ /**
22
+ * The maximum amount of data allowed to be transferred over a relayed connection
23
+ */
24
+ defaultDataLimit?: bigint;
25
+ }
26
+ export type ReservationStoreOptions = RecursivePartial<ReservationStoreInit>;
27
+ export declare class ReservationStore implements Startable {
28
+ readonly reservations: PeerMap<RelayReservation>;
29
+ private _started;
30
+ private interval;
31
+ private readonly maxReservations;
32
+ private readonly reservationClearInterval;
33
+ private readonly applyDefaultLimit;
34
+ private readonly reservationTtl;
35
+ private readonly defaultDurationLimit;
36
+ private readonly defaultDataLimit;
37
+ constructor(options?: ReservationStoreOptions);
38
+ isStarted(): boolean;
39
+ start(): void;
40
+ stop(): void;
41
+ reserve(peer: PeerId, addr: Multiaddr, limit?: Limit): {
42
+ status: ReservationStatus;
43
+ expire?: number;
44
+ };
45
+ removeReservation(peer: PeerId): void;
46
+ hasReservation(dst: PeerId): boolean;
47
+ get(peer: PeerId): RelayReservation | undefined;
48
+ }
49
+ //# sourceMappingURL=reservation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservation-store.d.ts","sourceRoot":"","sources":["../../../../src/circuit/server/reservation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAA;AAEjG,MAAM,WAAW,oBAAoB;IAInC,eAAe,CAAC,EAAE,MAAM,CAAA;IAIxB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAIjC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAA;AAE5E,qBAAa,gBAAiB,YAAW,SAAS;IAChD,SAAgB,YAAY,4BAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAQ;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE5B,OAAO,GAAE,uBAA4B;IASlD,SAAS,IAAK,OAAO;IAIrB,KAAK,IAAK,IAAI;IAkBd,IAAI,IAAK,IAAI;IAIb,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAatG,iBAAiB,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,cAAc,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIrC,GAAG,CAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;CAGjD"}
@@ -0,0 +1,57 @@
1
+ import { Status } from '../pb/index.js';
2
+ import { PeerMap } from '@libp2p/peer-collections';
3
+ import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT, DEFAULT_MAX_RESERVATION_CLEAR_INTERVAL, DEFAULT_MAX_RESERVATION_STORE_SIZE, DEFAULT_MAX_RESERVATION_TTL } from '../constants.js';
4
+ export class ReservationStore {
5
+ constructor(options = {}) {
6
+ this.reservations = new PeerMap();
7
+ this._started = false;
8
+ this.maxReservations = options.maxReservations ?? DEFAULT_MAX_RESERVATION_STORE_SIZE;
9
+ this.reservationClearInterval = options.reservationClearInterval ?? DEFAULT_MAX_RESERVATION_CLEAR_INTERVAL;
10
+ this.applyDefaultLimit = options.applyDefaultLimit !== false;
11
+ this.reservationTtl = options.reservationTtl ?? DEFAULT_MAX_RESERVATION_TTL;
12
+ this.defaultDurationLimit = options.defaultDurationLimit ?? DEFAULT_DURATION_LIMIT;
13
+ this.defaultDataLimit = options.defaultDataLimit ?? DEFAULT_DATA_LIMIT;
14
+ }
15
+ isStarted() {
16
+ return this._started;
17
+ }
18
+ start() {
19
+ if (this._started) {
20
+ return;
21
+ }
22
+ this._started = true;
23
+ this.interval = setInterval(() => {
24
+ const now = (new Date()).getTime();
25
+ this.reservations.forEach((r, k) => {
26
+ if (r.expire.getTime() < now) {
27
+ this.reservations.delete(k);
28
+ }
29
+ });
30
+ }, this.reservationClearInterval);
31
+ }
32
+ stop() {
33
+ clearInterval(this.interval);
34
+ }
35
+ reserve(peer, addr, limit) {
36
+ if (this.reservations.size >= this.maxReservations && !this.reservations.has(peer)) {
37
+ return { status: Status.RESERVATION_REFUSED };
38
+ }
39
+ const expire = new Date(Date.now() + this.reservationTtl);
40
+ let checkedLimit;
41
+ if (this.applyDefaultLimit) {
42
+ checkedLimit = limit ?? { data: this.defaultDataLimit, duration: this.defaultDurationLimit };
43
+ }
44
+ this.reservations.set(peer, { addr, expire, limit: checkedLimit });
45
+ return { status: Status.OK, expire: expire.getTime() };
46
+ }
47
+ removeReservation(peer) {
48
+ this.reservations.delete(peer);
49
+ }
50
+ hasReservation(dst) {
51
+ return this.reservations.has(dst);
52
+ }
53
+ get(peer) {
54
+ return this.reservations.get(peer);
55
+ }
56
+ }
57
+ //# sourceMappingURL=reservation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../../src/circuit/server/reservation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { PeerId } from '@libp2p/interface-peer-id';
2
+ import type { Record } from '@libp2p/interface-record';
3
+ export interface ReservationVoucherOptions {
4
+ relay: PeerId;
5
+ peer: PeerId;
6
+ expiration: number;
7
+ }
8
+ export declare class ReservationVoucherRecord implements Record {
9
+ readonly domain = "libp2p-relay-rsvp";
10
+ readonly codec: Uint8Array;
11
+ private readonly relay;
12
+ private readonly peer;
13
+ private readonly expiration;
14
+ constructor({ relay, peer, expiration }: ReservationVoucherOptions);
15
+ marshal(): Uint8Array;
16
+ equals(other: Record): boolean;
17
+ }
18
+ //# sourceMappingURL=reservation-voucher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservation-voucher.d.ts","sourceRoot":"","sources":["../../../../src/circuit/server/reservation-voucher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAGtD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,wBAAyB,YAAW,MAAM;IACrD,SAAgB,MAAM,uBAAsB;IAC5C,SAAgB,KAAK,aAA+B;IAEpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEtB,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,yBAAyB;IAMnE,OAAO,IAAK,UAAU;IAQtB,MAAM,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO;CAkBhC"}
@@ -0,0 +1,33 @@
1
+ import { ReservationVoucher } from '../pb/index.js';
2
+ export class ReservationVoucherRecord {
3
+ constructor({ relay, peer, expiration }) {
4
+ this.domain = 'libp2p-relay-rsvp';
5
+ this.codec = new Uint8Array([0x03, 0x02]);
6
+ this.relay = relay;
7
+ this.peer = peer;
8
+ this.expiration = expiration;
9
+ }
10
+ marshal() {
11
+ return ReservationVoucher.encode({
12
+ relay: this.relay.toBytes(),
13
+ peer: this.peer.toBytes(),
14
+ expiration: BigInt(this.expiration)
15
+ });
16
+ }
17
+ equals(other) {
18
+ if (!(other instanceof ReservationVoucherRecord)) {
19
+ return false;
20
+ }
21
+ if (!this.peer.equals(other.peer)) {
22
+ return false;
23
+ }
24
+ if (!this.relay.equals(other.relay)) {
25
+ return false;
26
+ }
27
+ if (this.expiration !== other.expiration) {
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ }
33
+ //# sourceMappingURL=reservation-voucher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservation-voucher.js","sourceRoot":"","sources":["../../../../src/circuit/server/reservation-voucher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAQnD,MAAM,OAAO,wBAAwB;IAQnC,YAAa,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAA6B;QAPnD,WAAM,GAAG,mBAAmB,CAAA;QAC5B,UAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAOlD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,kBAAkB,CAAC,MAAM,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACzB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SACpC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAE,KAAa;QACnB,IAAI,CAAC,CAAC,KAAK,YAAY,wBAAwB,CAAC,EAAE;YAChD,OAAO,KAAK,CAAA;SACb;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACjC,OAAO,KAAK,CAAA;SACb;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACnC,OAAO,KAAK,CAAA;SACb;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE;YACxC,OAAO,KAAK,CAAA;SACb;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}