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.
- package/README.md +4 -4
- package/dist/index.min.js +29 -29
- package/dist/src/address-manager/index.d.ts +1 -10
- package/dist/src/address-manager/index.d.ts.map +1 -1
- package/dist/src/address-manager/index.js +46 -29
- package/dist/src/address-manager/index.js.map +1 -1
- package/dist/src/autonat/constants.d.ts +4 -0
- package/dist/src/autonat/constants.d.ts.map +1 -0
- package/dist/src/autonat/constants.js +4 -0
- package/dist/src/autonat/constants.js.map +1 -0
- package/dist/src/autonat/index.d.ts +64 -0
- package/dist/src/autonat/index.d.ts.map +1 -0
- package/dist/src/autonat/index.js +417 -0
- package/dist/src/autonat/index.js.map +1 -0
- package/dist/src/autonat/pb/index.d.ts +57 -0
- package/dist/src/autonat/pb/index.d.ts.map +1 -0
- package/dist/src/autonat/pb/index.js +250 -0
- package/dist/src/autonat/pb/index.js.map +1 -0
- package/dist/src/circuit/constants.d.ts +31 -6
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +37 -7
- package/dist/src/circuit/constants.js.map +1 -1
- package/dist/src/circuit/index.d.ts +16 -61
- package/dist/src/circuit/index.d.ts.map +1 -1
- package/dist/src/circuit/index.js +2 -68
- package/dist/src/circuit/index.js.map +1 -1
- package/dist/src/circuit/pb/index.d.ts +83 -43
- package/dist/src/circuit/pb/index.d.ts.map +1 -1
- package/dist/src/circuit/pb/index.js +363 -127
- package/dist/src/circuit/pb/index.js.map +1 -1
- package/dist/src/circuit/server/advert-service.d.ts +43 -0
- package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
- package/dist/src/circuit/server/advert-service.js +69 -0
- package/dist/src/circuit/server/advert-service.js.map +1 -0
- package/dist/src/circuit/server/index.d.ts +60 -0
- package/dist/src/circuit/server/index.d.ts.map +1 -0
- package/dist/src/circuit/server/index.js +287 -0
- package/dist/src/circuit/server/index.js.map +1 -0
- package/dist/src/circuit/server/reservation-store.d.ts +49 -0
- package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-store.js +57 -0
- package/dist/src/circuit/server/reservation-store.js.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts +18 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.js +33 -0
- package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
- package/dist/src/circuit/transport/discovery.d.ts +45 -0
- package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
- package/dist/src/circuit/transport/discovery.js +82 -0
- package/dist/src/circuit/transport/discovery.js.map +1 -0
- package/dist/src/circuit/transport/index.d.ts +33 -0
- package/dist/src/circuit/transport/index.d.ts.map +1 -0
- package/dist/src/circuit/transport/index.js +225 -0
- package/dist/src/circuit/transport/index.js.map +1 -0
- package/dist/src/circuit/transport/listener.d.ts +9 -0
- package/dist/src/circuit/transport/listener.d.ts.map +1 -0
- package/dist/src/circuit/transport/listener.js +76 -0
- package/dist/src/circuit/transport/listener.js.map +1 -0
- package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
- package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/transport/reservation-store.js +165 -0
- package/dist/src/circuit/transport/reservation-store.js.map +1 -0
- package/dist/src/circuit/utils.d.ts +7 -0
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +87 -0
- package/dist/src/circuit/utils.js.map +1 -1
- package/dist/src/components.d.ts +2 -1
- package/dist/src/components.d.ts.map +1 -1
- package/dist/src/components.js +13 -13
- package/dist/src/components.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +21 -25
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection/index.d.ts +2 -2
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/index.js +4 -4
- package/dist/src/connection/index.js.map +1 -1
- package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
- package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dialler.js +18 -18
- package/dist/src/connection-manager/auto-dialler.js.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.js +13 -6
- package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
- package/dist/src/connection-manager/dialer/index.d.ts +10 -1
- package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/index.js +24 -9
- package/dist/src/connection-manager/dialer/index.js.map +1 -1
- package/dist/src/connection-manager/index.d.ts +1 -4
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +8 -5
- package/dist/src/connection-manager/index.js.map +1 -1
- package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
- package/dist/src/connection-manager/latency-monitor.js +1 -1
- package/dist/src/connection-manager/latency-monitor.js.map +1 -1
- package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
- package/dist/src/content-routing/index.d.ts +6 -4
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +9 -9
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/content-routing/utils.d.ts +3 -3
- package/dist/src/content-routing/utils.d.ts.map +1 -1
- package/dist/src/content-routing/utils.js +2 -2
- package/dist/src/content-routing/utils.js.map +1 -1
- package/dist/src/dht/dht-content-routing.d.ts +2 -1
- package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.js +2 -2
- package/dist/src/dht/dht-content-routing.js.map +1 -1
- package/dist/src/dht/dht-peer-routing.d.ts +3 -2
- package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-peer-routing.js +2 -2
- package/dist/src/dht/dht-peer-routing.js.map +1 -1
- package/dist/src/dht/dummy-dht.d.ts +1 -1
- package/dist/src/dht/dummy-dht.d.ts.map +1 -1
- package/dist/src/dht/dummy-dht.js +12 -12
- package/dist/src/dht/dummy-dht.js.map +1 -1
- package/dist/src/errors.d.ts +2 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +6 -6
- package/dist/src/fetch/index.js.map +1 -1
- package/dist/src/fetch/pb/proto.d.ts +3 -3
- package/dist/src/fetch/pb/proto.d.ts.map +1 -1
- package/dist/src/fetch/pb/proto.js +4 -3
- package/dist/src/fetch/pb/proto.js.map +1 -1
- package/dist/src/get-peer.js +2 -2
- package/dist/src/get-peer.js.map +1 -1
- package/dist/src/identify/index.d.ts +3 -1
- package/dist/src/identify/index.d.ts.map +1 -1
- package/dist/src/identify/index.js +19 -14
- package/dist/src/identify/index.js.map +1 -1
- package/dist/src/identify/pb/message.d.ts +2 -2
- package/dist/src/identify/pb/message.d.ts.map +1 -1
- package/dist/src/identify/pb/message.js +1 -0
- package/dist/src/identify/pb/message.js.map +1 -1
- package/dist/src/index.d.ts +14 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/insecure/index.d.ts.map +1 -1
- package/dist/src/insecure/index.js.map +1 -1
- package/dist/src/insecure/pb/proto.d.ts +3 -3
- package/dist/src/insecure/pb/proto.d.ts.map +1 -1
- package/dist/src/insecure/pb/proto.js +4 -5
- package/dist/src/insecure/pb/proto.js.map +1 -1
- package/dist/src/libp2p.d.ts +7 -3
- package/dist/src/libp2p.d.ts.map +1 -1
- package/dist/src/libp2p.js +35 -35
- package/dist/src/libp2p.js.map +1 -1
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +5 -3
- package/dist/src/nat-manager.js.map +1 -1
- package/dist/src/peer-record-updater.d.ts.map +1 -1
- package/dist/src/peer-routing.d.ts.map +1 -1
- package/dist/src/peer-routing.js +5 -5
- package/dist/src/peer-routing.js.map +1 -1
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +2 -2
- package/dist/src/ping/index.js.map +1 -1
- package/dist/src/pnet/crypto.d.ts +1 -1
- package/dist/src/pnet/crypto.d.ts.map +1 -1
- package/dist/src/pnet/crypto.js +1 -1
- package/dist/src/pnet/crypto.js.map +1 -1
- package/dist/src/pnet/index.js +3 -3
- package/dist/src/pnet/index.js.map +1 -1
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/pubsub/dummy-pubsub.js +9 -9
- package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +4 -4
- package/dist/src/registrar.js.map +1 -1
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +8 -9
- package/dist/src/transport-manager.js.map +1 -1
- package/dist/src/upgrader.d.ts +2 -1
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +38 -33
- package/dist/src/upgrader.js.map +1 -1
- package/dist/typedoc-urls.json +19 -6
- package/package.json +36 -33
- package/src/address-manager/index.ts +62 -35
- package/src/autonat/constants.ts +4 -0
- package/src/autonat/index.ts +567 -0
- package/src/autonat/pb/index.proto +35 -0
- package/src/autonat/pb/index.ts +320 -0
- package/src/circuit/constants.ts +48 -7
- package/src/circuit/index.ts +17 -129
- package/src/circuit/pb/index.proto +57 -32
- package/src/circuit/pb/index.ts +448 -138
- package/src/circuit/server/advert-service.ts +108 -0
- package/src/circuit/server/index.ts +421 -0
- package/src/circuit/server/reservation-store.ts +111 -0
- package/src/circuit/server/reservation-voucher.ts +51 -0
- package/src/circuit/transport/discovery.ts +127 -0
- package/src/circuit/transport/index.ts +325 -0
- package/src/circuit/transport/listener.ts +99 -0
- package/src/circuit/transport/reservation-store.ts +249 -0
- package/src/circuit/utils.ts +108 -0
- package/src/components.ts +22 -21
- package/src/config.ts +21 -25
- package/src/connection/index.ts +10 -10
- package/src/connection-manager/auto-dialler.ts +36 -40
- package/src/connection-manager/dialer/dial-request.ts +13 -6
- package/src/connection-manager/dialer/index.ts +34 -15
- package/src/connection-manager/index.ts +22 -23
- package/src/connection-manager/latency-monitor.ts +9 -9
- package/src/connection-manager/visibility-change-emitter.ts +4 -4
- package/src/content-routing/index.ts +18 -16
- package/src/content-routing/utils.ts +5 -5
- package/src/dht/dht-content-routing.ts +5 -4
- package/src/dht/dht-peer-routing.ts +5 -4
- package/src/dht/dummy-dht.ts +13 -13
- package/src/errors.ts +2 -1
- package/src/fetch/index.ts +13 -13
- package/src/fetch/pb/proto.ts +8 -7
- package/src/get-peer.ts +3 -3
- package/src/identify/index.ts +29 -24
- package/src/identify/pb/message.ts +3 -2
- package/src/index.ts +15 -8
- package/src/insecure/index.ts +2 -1
- package/src/insecure/pb/proto.ts +8 -9
- package/src/libp2p.ts +52 -46
- package/src/nat-manager.ts +11 -9
- package/src/peer-record-updater.ts +4 -4
- package/src/peer-routing.ts +9 -9
- package/src/ping/index.ts +6 -6
- package/src/pnet/crypto.ts +3 -3
- package/src/pnet/index.ts +3 -3
- package/src/pnet/key-generator.ts +1 -1
- package/src/pubsub/dummy-pubsub.ts +9 -9
- package/src/registrar.ts +12 -12
- package/src/transport-manager.ts +17 -18
- package/src/upgrader.ts +43 -42
- package/src/version.ts +1 -1
- package/dist/src/circuit/auto-relay.d.ts +0 -46
- package/dist/src/circuit/auto-relay.d.ts.map +0 -1
- package/dist/src/circuit/auto-relay.js +0 -220
- package/dist/src/circuit/auto-relay.js.map +0 -1
- package/dist/src/circuit/circuit/hop.d.ts +0 -42
- package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/hop.js +0 -142
- package/dist/src/circuit/circuit/hop.js.map +0 -1
- package/dist/src/circuit/circuit/stop.d.ts +0 -24
- package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stop.js +0 -51
- package/dist/src/circuit/circuit/stop.js.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.js +0 -59
- package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
- package/dist/src/circuit/circuit/utils.d.ts +0 -7
- package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
- package/dist/src/circuit/circuit/utils.js +0 -43
- package/dist/src/circuit/circuit/utils.js.map +0 -1
- package/dist/src/circuit/listener.d.ts +0 -9
- package/dist/src/circuit/listener.d.ts.map +0 -1
- package/dist/src/circuit/listener.js +0 -62
- package/dist/src/circuit/listener.js.map +0 -1
- package/dist/src/circuit/multicodec.d.ts +0 -2
- package/dist/src/circuit/multicodec.d.ts.map +0 -1
- package/dist/src/circuit/multicodec.js +0 -2
- package/dist/src/circuit/multicodec.js.map +0 -1
- package/dist/src/circuit/transport.d.ts +0 -51
- package/dist/src/circuit/transport.d.ts.map +0 -1
- package/dist/src/circuit/transport.js +0 -223
- package/dist/src/circuit/transport.js.map +0 -1
- package/dist/src/keychain/cms.d.ts +0 -33
- package/dist/src/keychain/cms.d.ts.map +0 -1
- package/dist/src/keychain/cms.js +0 -129
- package/dist/src/keychain/cms.js.map +0 -1
- package/dist/src/keychain/index.d.ts +0 -151
- package/dist/src/keychain/index.d.ts.map +0 -1
- package/dist/src/keychain/index.js +0 -519
- package/dist/src/keychain/index.js.map +0 -1
- package/dist/src/keychain/util.d.ts +0 -21
- package/dist/src/keychain/util.d.ts.map +0 -1
- package/dist/src/keychain/util.js +0 -79
- package/dist/src/keychain/util.js.map +0 -1
- package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
- package/src/circuit/README.md +0 -111
- package/src/circuit/auto-relay.ts +0 -292
- package/src/circuit/circuit/hop.ts +0 -220
- package/src/circuit/circuit/stop.ts +0 -83
- package/src/circuit/circuit/stream-handler.ts +0 -87
- package/src/circuit/circuit/utils.ts +0 -44
- package/src/circuit/listener.ts +0 -83
- package/src/circuit/multicodec.ts +0 -2
- package/src/circuit/transport.ts +0 -278
- package/src/keychain/README.md +0 -55
- package/src/keychain/cms.ts +0 -150
- package/src/keychain/doc/private-key.png +0 -0
- package/src/keychain/doc/private-key.xml +0 -1
- package/src/keychain/index.ts +0 -629
- 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"}
|