libp2p 0.36.2 → 0.37.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/LICENSE +3 -21
- package/README.md +13 -10
- package/dist/src/address-manager/index.d.ts +34 -52
- package/dist/src/address-manager/index.d.ts.map +1 -1
- package/dist/src/address-manager/index.js +81 -0
- package/dist/src/address-manager/index.js.map +1 -0
- package/dist/src/circuit/auto-relay.d.ts +24 -85
- package/dist/src/circuit/auto-relay.d.ts.map +1 -1
- package/dist/src/circuit/auto-relay.js +216 -0
- package/dist/src/circuit/auto-relay.js.map +1 -0
- package/dist/src/circuit/circuit/hop.d.ts +26 -53
- package/dist/src/circuit/circuit/hop.d.ts.map +1 -1
- package/dist/src/circuit/circuit/hop.js +138 -0
- package/dist/src/circuit/circuit/hop.js.map +1 -0
- package/dist/src/circuit/circuit/stop.d.ts +18 -10
- package/dist/src/circuit/circuit/stop.d.ts.map +1 -1
- package/dist/src/circuit/circuit/stop.js +49 -0
- package/dist/src/circuit/circuit/stop.js.map +1 -0
- package/dist/src/circuit/circuit/stream-handler.d.ts +19 -38
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
- package/dist/src/circuit/circuit/stream-handler.js +59 -0
- package/dist/src/circuit/circuit/stream-handler.js.map +1 -0
- package/dist/src/circuit/circuit/utils.d.ts +3 -6
- package/dist/src/circuit/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/circuit/utils.js +43 -0
- package/dist/src/circuit/circuit/utils.js.map +1 -0
- package/dist/src/circuit/constants.d.ts +24 -6
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +26 -0
- package/dist/src/circuit/constants.js.map +1 -0
- package/dist/src/circuit/index.d.ts +41 -74
- package/dist/src/circuit/index.d.ts.map +1 -1
- package/dist/src/circuit/index.js +69 -0
- package/dist/src/circuit/index.js.map +1 -0
- package/dist/src/circuit/listener.d.ts +8 -3
- package/dist/src/circuit/listener.d.ts.map +1 -1
- package/dist/src/circuit/listener.js +62 -0
- package/dist/src/circuit/listener.js.map +1 -0
- package/dist/src/circuit/multicodec.d.ts +1 -1
- package/dist/src/circuit/multicodec.d.ts.map +1 -1
- package/dist/src/circuit/multicodec.js +2 -0
- package/dist/src/circuit/multicodec.js.map +1 -0
- package/dist/src/circuit/pb/index.d.ts +52 -0
- package/dist/src/circuit/pb/index.d.ts.map +1 -0
- package/dist/src/circuit/pb/index.js +98 -0
- package/dist/src/circuit/pb/index.js.map +1 -0
- package/dist/src/circuit/transport.d.ts +18 -78
- package/dist/src/circuit/transport.d.ts.map +1 -1
- package/dist/src/circuit/transport.js +192 -0
- package/dist/src/circuit/transport.js.map +1 -0
- package/dist/src/circuit/utils.d.ts +5 -2
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +11 -0
- package/dist/src/circuit/utils.js.map +1 -0
- package/dist/src/config.d.ts +3 -85
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +91 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connection-manager/auto-dialler.d.ts +24 -41
- package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dialler.js +105 -0
- package/dist/src/connection-manager/auto-dialler.js.map +1 -0
- package/dist/src/connection-manager/dialer/auto-dialer.d.ts +16 -0
- package/dist/src/connection-manager/dialer/auto-dialer.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/auto-dialer.js +37 -0
- package/dist/src/connection-manager/dialer/auto-dialer.js.map +1 -0
- package/dist/src/connection-manager/dialer/dial-request.d.ts +27 -0
- package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/dial-request.js +83 -0
- package/dist/src/connection-manager/dialer/dial-request.js.map +1 -0
- package/dist/src/connection-manager/dialer/index.d.ts +104 -0
- package/dist/src/connection-manager/dialer/index.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/index.js +267 -0
- package/dist/src/connection-manager/dialer/index.js.map +1 -0
- package/dist/src/connection-manager/index.d.ts +102 -136
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +333 -0
- package/dist/src/connection-manager/index.js.map +1 -0
- package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
- package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
- package/dist/src/connection-manager/latency-monitor.js +220 -0
- package/dist/src/connection-manager/latency-monitor.js.map +1 -0
- package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
- package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
- package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
- package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
- package/dist/src/constants.d.ts +22 -10
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +27 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/content-routing/index.d.ts +27 -81
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +99 -0
- package/dist/src/content-routing/index.js.map +1 -0
- package/dist/src/content-routing/utils.d.ts +6 -49
- package/dist/src/content-routing/utils.d.ts.map +1 -1
- package/dist/src/content-routing/utils.js +42 -0
- package/dist/src/content-routing/utils.js.map +1 -0
- package/dist/src/dht/dht-content-routing.d.ts +10 -24
- package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.js +32 -0
- package/dist/src/dht/dht-content-routing.js.map +1 -0
- package/dist/src/dht/dht-peer-routing.d.ts +9 -24
- package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-peer-routing.js +26 -0
- package/dist/src/dht/dht-peer-routing.js.map +1 -0
- package/dist/src/dht/dummy-dht.d.ts +20 -0
- package/dist/src/dht/dummy-dht.d.ts.map +1 -0
- package/dist/src/dht/dummy-dht.js +46 -0
- package/dist/src/dht/dummy-dht.js.map +1 -0
- package/dist/src/errors.d.ts +70 -63
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +75 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/fetch/constants.d.ts +1 -1
- package/dist/src/fetch/constants.d.ts.map +1 -1
- package/dist/src/fetch/constants.js +3 -0
- package/dist/src/fetch/constants.js.map +1 -0
- package/dist/src/fetch/index.d.ts +30 -49
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +129 -0
- package/dist/src/fetch/index.js.map +1 -0
- package/dist/src/fetch/pb/proto.d.ts +27 -0
- package/dist/src/fetch/pb/proto.d.ts.map +1 -0
- package/dist/src/fetch/pb/proto.js +50 -0
- package/dist/src/fetch/pb/proto.js.map +1 -0
- package/dist/src/get-peer.d.ts +4 -11
- package/dist/src/get-peer.d.ts.map +1 -1
- package/dist/src/get-peer.js +43 -0
- package/dist/src/get-peer.js.map +1 -0
- package/dist/src/identify/consts.d.ts +9 -9
- package/dist/src/identify/consts.d.ts.map +1 -1
- package/dist/src/identify/consts.js +11 -0
- package/dist/src/identify/consts.js.map +1 -0
- package/dist/src/identify/index.d.ts +42 -96
- package/dist/src/identify/index.d.ts.map +1 -1
- package/dist/src/identify/index.js +322 -0
- package/dist/src/identify/index.js.map +1 -0
- package/dist/src/identify/pb/message.d.ts +16 -0
- package/dist/src/identify/pb/message.d.ts.map +1 -0
- package/dist/src/identify/pb/message.js +24 -0
- package/dist/src/identify/pb/message.js.map +1 -0
- package/dist/src/index.d.ts +150 -496
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/insecure/index.d.ts +9 -0
- package/dist/src/insecure/index.d.ts.map +1 -0
- package/dist/src/insecure/index.js +81 -0
- package/dist/src/insecure/index.js.map +1 -0
- package/dist/src/insecure/pb/proto.d.ts +29 -0
- package/dist/src/insecure/pb/proto.d.ts.map +1 -0
- package/dist/src/insecure/pb/proto.js +53 -0
- package/dist/src/insecure/pb/proto.js.map +1 -0
- package/dist/src/keychain/cms.d.ts +6 -14
- package/dist/src/keychain/cms.d.ts.map +1 -1
- package/dist/src/keychain/cms.js +129 -0
- package/dist/src/keychain/cms.js.map +1 -0
- package/dist/src/keychain/index.d.ts +60 -81
- package/dist/src/keychain/index.d.ts.map +1 -1
- package/dist/src/keychain/index.js +492 -0
- package/dist/src/keychain/index.js.map +1 -0
- package/dist/src/keychain/util.d.ts +3 -6
- package/dist/src/keychain/util.d.ts.map +1 -1
- package/dist/src/keychain/util.js +79 -0
- package/dist/src/keychain/util.js.map +1 -0
- package/dist/src/libp2p.d.ts +80 -0
- package/dist/src/libp2p.d.ts.map +1 -0
- package/dist/src/libp2p.js +397 -0
- package/dist/src/libp2p.js.map +1 -0
- package/dist/src/metrics/index.d.ts +47 -104
- package/dist/src/metrics/index.d.ts.map +1 -1
- package/dist/src/metrics/index.js +231 -0
- package/dist/src/metrics/index.js.map +1 -0
- package/dist/src/metrics/moving-average.d.ts +14 -0
- package/dist/src/metrics/moving-average.d.ts.map +1 -0
- package/dist/src/metrics/moving-average.js +40 -0
- package/dist/src/metrics/moving-average.js.map +1 -0
- package/dist/src/metrics/stats.d.ts +41 -93
- package/dist/src/metrics/stats.d.ts.map +1 -1
- package/dist/src/metrics/stats.js +183 -0
- package/dist/src/metrics/stats.js.map +1 -0
- package/dist/src/nat-manager.d.ts +42 -99
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +114 -0
- package/dist/src/nat-manager.js.map +1 -0
- package/dist/src/peer-record-updater.d.ts +15 -0
- package/dist/src/peer-record-updater.d.ts.map +1 -0
- package/dist/src/peer-record-updater.js +44 -0
- package/dist/src/peer-record-updater.js.map +1 -0
- package/dist/src/peer-routing.d.ts +40 -84
- package/dist/src/peer-routing.d.ts.map +1 -1
- package/dist/src/peer-routing.js +108 -0
- package/dist/src/peer-routing.js.map +1 -0
- package/dist/src/ping/constants.d.ts +4 -4
- package/dist/src/ping/constants.d.ts.map +1 -1
- package/dist/src/ping/constants.js +5 -0
- package/dist/src/ping/constants.js.map +1 -0
- package/dist/src/ping/index.d.ts +17 -31
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +57 -0
- package/dist/src/ping/index.js.map +1 -0
- package/dist/src/pnet/crypto.d.ts +15 -5
- package/dist/src/pnet/crypto.d.ts.map +1 -1
- package/dist/src/pnet/crypto.js +60 -0
- package/dist/src/pnet/crypto.js.map +1 -0
- package/dist/src/pnet/errors.d.ts +5 -5
- package/dist/src/pnet/errors.d.ts.map +1 -1
- package/dist/src/pnet/errors.js +6 -0
- package/dist/src/pnet/errors.js.map +1 -0
- package/dist/src/pnet/index.d.ts +12 -20
- package/dist/src/pnet/index.d.ts.map +1 -1
- package/dist/src/pnet/index.js +67 -0
- package/dist/src/pnet/index.js.map +1 -0
- package/dist/src/pnet/key-generator.d.ts +3 -7
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/pnet/key-generator.js +25 -0
- package/dist/src/pnet/key-generator.js.map +1 -0
- package/dist/src/pubsub/dummy-pubsub.d.ts +17 -0
- package/dist/src/pubsub/dummy-pubsub.d.ts.map +1 -0
- package/dist/src/pubsub/dummy-pubsub.js +37 -0
- package/dist/src/pubsub/dummy-pubsub.js.map +1 -0
- package/dist/src/registrar.d.ts +26 -65
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +144 -0
- package/dist/src/registrar.js.map +1 -0
- package/dist/src/transport-manager.d.ts +36 -82
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +223 -0
- package/dist/src/transport-manager.js.map +1 -0
- package/dist/src/upgrader.d.ts +49 -129
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +402 -0
- package/dist/src/upgrader.js.map +1 -0
- package/dist/src/version.d.ts +3 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +3 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +144 -201
- package/src/address-manager/index.ts +130 -0
- package/src/circuit/README.md +16 -11
- package/src/circuit/auto-relay.ts +286 -0
- package/src/circuit/circuit/hop.ts +211 -0
- package/src/circuit/circuit/stop.ts +78 -0
- package/src/circuit/circuit/stream-handler.ts +86 -0
- package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
- package/src/circuit/constants.ts +31 -0
- package/src/circuit/index.ts +120 -0
- package/src/circuit/listener.ts +82 -0
- package/src/circuit/multicodec.ts +2 -0
- package/src/circuit/{protocol → pb}/index.proto +1 -1
- package/src/circuit/pb/index.ts +117 -0
- package/src/circuit/transport.ts +219 -0
- package/src/circuit/utils.ts +12 -0
- package/src/config.ts +99 -0
- package/src/connection-manager/auto-dialler.ts +154 -0
- package/src/connection-manager/dialer/auto-dialer.ts +59 -0
- package/src/{dialer/dial-request.js → connection-manager/dialer/dial-request.ts} +60 -51
- package/src/connection-manager/dialer/index.ts +382 -0
- package/src/connection-manager/index.ts +508 -0
- package/src/connection-manager/latency-monitor.ts +319 -0
- package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
- package/src/constants.ts +31 -0
- package/src/content-routing/index.ts +144 -0
- package/src/content-routing/utils.ts +54 -0
- package/src/dht/dht-content-routing.ts +43 -0
- package/src/dht/dht-peer-routing.ts +35 -0
- package/src/dht/dummy-dht.ts +60 -0
- package/src/errors.ts +73 -0
- package/src/fetch/README.md +1 -1
- package/src/fetch/constants.ts +3 -0
- package/src/fetch/index.ts +167 -0
- package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
- package/src/fetch/pb/proto.ts +65 -0
- package/src/get-peer.ts +57 -0
- package/src/identify/consts.ts +13 -0
- package/src/identify/index.ts +445 -0
- package/src/identify/{message.proto → pb/message.proto} +0 -0
- package/src/identify/pb/message.ts +37 -0
- package/src/index.ts +220 -0
- package/src/insecure/index.ts +101 -0
- package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
- package/src/insecure/pb/proto.ts +68 -0
- package/src/keychain/{cms.js → cms.ts} +62 -58
- package/src/keychain/index.ts +587 -0
- package/src/keychain/{util.js → util.ts} +7 -17
- package/src/libp2p.ts +538 -0
- package/src/metrics/index.ts +310 -0
- package/src/metrics/moving-average.ts +53 -0
- package/src/metrics/stats.ts +238 -0
- package/src/nat-manager.ts +194 -0
- package/src/peer-record-updater.ts +55 -0
- package/src/peer-routing.ts +186 -0
- package/src/ping/README.md +1 -1
- package/src/ping/constants.ts +5 -0
- package/src/ping/index.ts +84 -0
- package/src/pnet/README.md +2 -2
- package/src/pnet/crypto.ts +67 -0
- package/src/pnet/errors.ts +5 -0
- package/src/pnet/index.ts +97 -0
- package/src/pnet/key-generator.ts +28 -0
- package/src/pubsub/dummy-pubsub.ts +51 -0
- package/src/registrar.ts +189 -0
- package/src/transport-manager.ts +281 -0
- package/src/upgrader.ts +499 -0
- package/src/version.ts +3 -0
- package/dist/index.min.js +0 -55
- package/dist/src/circuit/protocol/index.d.ts +0 -173
- package/dist/src/dialer/dial-request.d.ts +0 -55
- package/dist/src/dialer/dial-request.d.ts.map +0 -1
- package/dist/src/dialer/index.d.ts +0 -182
- package/dist/src/dialer/index.d.ts.map +0 -1
- package/dist/src/fetch/proto.d.ts +0 -134
- package/dist/src/identify/message.d.ts +0 -95
- package/dist/src/insecure/plaintext.d.ts +0 -12
- package/dist/src/insecure/plaintext.d.ts.map +0 -1
- package/dist/src/insecure/proto.d.ts +0 -128
- package/dist/src/metrics/old-peers.d.ts +0 -3
- package/dist/src/metrics/old-peers.d.ts.map +0 -1
- package/dist/src/metrics/tracked-map.d.ts +0 -8
- package/dist/src/metrics/tracked-map.d.ts.map +0 -1
- package/dist/src/peer-store/address-book.d.ts +0 -67
- package/dist/src/peer-store/address-book.d.ts.map +0 -1
- package/dist/src/peer-store/index.d.ts +0 -58
- package/dist/src/peer-store/index.d.ts.map +0 -1
- package/dist/src/peer-store/key-book.d.ts +0 -40
- package/dist/src/peer-store/key-book.d.ts.map +0 -1
- package/dist/src/peer-store/metadata-book.d.ts +0 -58
- package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
- package/dist/src/peer-store/pb/peer.d.ts +0 -222
- package/dist/src/peer-store/proto-book.d.ts +0 -43
- package/dist/src/peer-store/proto-book.d.ts.map +0 -1
- package/dist/src/peer-store/store.d.ts +0 -73
- package/dist/src/peer-store/store.d.ts.map +0 -1
- package/dist/src/peer-store/types.d.ts +0 -202
- package/dist/src/peer-store/types.d.ts.map +0 -1
- package/dist/src/ping/util.d.ts +0 -5
- package/dist/src/ping/util.d.ts.map +0 -1
- package/dist/src/pubsub-adapter.d.ts +0 -22
- package/dist/src/pubsub-adapter.d.ts.map +0 -1
- package/dist/src/record/envelope/envelope.d.ts +0 -77
- package/dist/src/record/envelope/index.d.ts +0 -80
- package/dist/src/record/envelope/index.d.ts.map +0 -1
- package/dist/src/record/peer-record/consts.d.ts +0 -4
- package/dist/src/record/peer-record/consts.d.ts.map +0 -1
- package/dist/src/record/peer-record/index.d.ts +0 -60
- package/dist/src/record/peer-record/index.d.ts.map +0 -1
- package/dist/src/record/peer-record/peer-record.d.ts +0 -133
- package/dist/src/record/utils.d.ts +0 -12
- package/dist/src/record/utils.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -90
- package/dist/src/types.d.ts.map +0 -1
- package/src/address-manager/index.js +0 -96
- package/src/circuit/auto-relay.js +0 -302
- package/src/circuit/circuit/hop.js +0 -205
- package/src/circuit/circuit/stop.js +0 -81
- package/src/circuit/circuit/stream-handler.js +0 -94
- package/src/circuit/constants.js +0 -12
- package/src/circuit/index.js +0 -102
- package/src/circuit/listener.js +0 -75
- package/src/circuit/multicodec.js +0 -5
- package/src/circuit/protocol/index.d.ts +0 -173
- package/src/circuit/protocol/index.js +0 -530
- package/src/circuit/transport.js +0 -229
- package/src/circuit/utils.js +0 -17
- package/src/config.js +0 -114
- package/src/connection-manager/auto-dialler.js +0 -132
- package/src/connection-manager/index.js +0 -374
- package/src/connection-manager/latency-monitor.js +0 -264
- package/src/constants.js +0 -18
- package/src/content-routing/index.js +0 -163
- package/src/content-routing/utils.js +0 -89
- package/src/dht/dht-content-routing.js +0 -44
- package/src/dht/dht-peer-routing.js +0 -51
- package/src/dialer/index.js +0 -376
- package/src/errors.js +0 -66
- package/src/fetch/constants.js +0 -6
- package/src/fetch/index.js +0 -159
- package/src/fetch/proto.d.ts +0 -134
- package/src/fetch/proto.js +0 -333
- package/src/get-peer.js +0 -49
- package/src/identify/consts.js +0 -15
- package/src/identify/index.js +0 -384
- package/src/identify/message.d.ts +0 -95
- package/src/identify/message.js +0 -328
- package/src/index.js +0 -813
- package/src/insecure/plaintext.js +0 -95
- package/src/insecure/proto.d.ts +0 -128
- package/src/insecure/proto.js +0 -371
- package/src/keychain/index.js +0 -561
- package/src/metrics/index.js +0 -290
- package/src/metrics/old-peers.js +0 -16
- package/src/metrics/stats.js +0 -270
- package/src/metrics/tracked-map.js +0 -94
- package/src/nat-manager.js +0 -197
- package/src/peer-routing.js +0 -176
- package/src/peer-store/README.md +0 -145
- package/src/peer-store/address-book.js +0 -382
- package/src/peer-store/index.js +0 -121
- package/src/peer-store/key-book.js +0 -141
- package/src/peer-store/metadata-book.js +0 -250
- package/src/peer-store/pb/peer.d.ts +0 -222
- package/src/peer-store/pb/peer.js +0 -643
- package/src/peer-store/pb/peer.proto +0 -31
- package/src/peer-store/proto-book.js +0 -237
- package/src/peer-store/store.js +0 -263
- package/src/peer-store/types.ts +0 -245
- package/src/ping/constants.js +0 -8
- package/src/ping/index.js +0 -84
- package/src/ping/util.js +0 -18
- package/src/pnet/crypto.js +0 -84
- package/src/pnet/errors.js +0 -7
- package/src/pnet/index.js +0 -86
- package/src/pnet/key-generator.js +0 -33
- package/src/pubsub-adapter.js +0 -61
- package/src/record/README.md +0 -130
- package/src/record/envelope/envelope.d.ts +0 -77
- package/src/record/envelope/envelope.js +0 -243
- package/src/record/envelope/envelope.proto +0 -19
- package/src/record/envelope/index.js +0 -183
- package/src/record/peer-record/consts.js +0 -14
- package/src/record/peer-record/index.js +0 -113
- package/src/record/peer-record/peer-record.d.ts +0 -133
- package/src/record/peer-record/peer-record.js +0 -367
- package/src/record/peer-record/peer-record.proto +0 -18
- package/src/record/utils.js +0 -25
- package/src/registrar.js +0 -127
- package/src/transport-manager.js +0 -269
- package/src/types.ts +0 -98
- package/src/upgrader.js +0 -492
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { CircuitRelay } = require('../protocol')
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @typedef {import('./stream-handler')} StreamHandler
|
|
8
|
-
* @typedef {import('../protocol').ICircuitRelay} ICircuitRelay
|
|
9
|
-
*/
|
|
1
|
+
import { Multiaddr } from '@multiformats/multiaddr'
|
|
2
|
+
import { CircuitRelay } from '../pb/index.js'
|
|
3
|
+
import type { StreamHandler } from './stream-handler.js'
|
|
10
4
|
|
|
11
5
|
/**
|
|
12
6
|
* Write a response
|
|
13
|
-
*
|
|
14
|
-
* @param {StreamHandler} streamHandler
|
|
15
|
-
* @param {import('../protocol').CircuitRelay.Status} status
|
|
16
7
|
*/
|
|
17
|
-
function writeResponse (streamHandler, status) {
|
|
8
|
+
function writeResponse (streamHandler: StreamHandler, status: CircuitRelay.Status) {
|
|
18
9
|
streamHandler.write({
|
|
19
10
|
type: CircuitRelay.Type.STATUS,
|
|
20
11
|
code: status
|
|
@@ -23,18 +14,15 @@ function writeResponse (streamHandler, status) {
|
|
|
23
14
|
|
|
24
15
|
/**
|
|
25
16
|
* Validate incomming HOP/STOP message
|
|
26
|
-
*
|
|
27
|
-
* @param {ICircuitRelay} msg - A CircuitRelay unencoded protobuf message
|
|
28
|
-
* @param {StreamHandler} streamHandler
|
|
29
17
|
*/
|
|
30
|
-
function validateAddrs (msg, streamHandler) {
|
|
18
|
+
export function validateAddrs (msg: CircuitRelay, streamHandler: StreamHandler) {
|
|
31
19
|
try {
|
|
32
|
-
if (msg.dstPeer
|
|
20
|
+
if (msg.dstPeer?.addrs != null) {
|
|
33
21
|
msg.dstPeer.addrs.forEach((addr) => {
|
|
34
22
|
return new Multiaddr(addr)
|
|
35
23
|
})
|
|
36
24
|
}
|
|
37
|
-
} catch (
|
|
25
|
+
} catch (err: any) {
|
|
38
26
|
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
|
39
27
|
? CircuitRelay.Status.HOP_DST_MULTIADDR_INVALID
|
|
40
28
|
: CircuitRelay.Status.STOP_DST_MULTIADDR_INVALID)
|
|
@@ -42,19 +30,15 @@ function validateAddrs (msg, streamHandler) {
|
|
|
42
30
|
}
|
|
43
31
|
|
|
44
32
|
try {
|
|
45
|
-
if (msg.srcPeer
|
|
33
|
+
if (msg.srcPeer?.addrs != null) {
|
|
46
34
|
msg.srcPeer.addrs.forEach((addr) => {
|
|
47
35
|
return new Multiaddr(addr)
|
|
48
36
|
})
|
|
49
37
|
}
|
|
50
|
-
} catch (
|
|
38
|
+
} catch (err: any) {
|
|
51
39
|
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
|
52
40
|
? CircuitRelay.Status.HOP_SRC_MULTIADDR_INVALID
|
|
53
41
|
: CircuitRelay.Status.STOP_SRC_MULTIADDR_INVALID)
|
|
54
42
|
throw err
|
|
55
43
|
}
|
|
56
44
|
}
|
|
57
|
-
|
|
58
|
-
module.exports = {
|
|
59
|
-
validateAddrs
|
|
60
|
-
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const minute = 60 * 1000
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Delay before HOP relay service is advertised on the network
|
|
5
|
+
*/
|
|
6
|
+
export const ADVERTISE_BOOT_DELAY = 15 * minute
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Delay Between HOP relay service advertisements on the network
|
|
10
|
+
*/
|
|
11
|
+
export const ADVERTISE_TTL = 30 * minute
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Multicodec code
|
|
15
|
+
*/
|
|
16
|
+
export const CIRCUIT_PROTO_CODE = 290
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* PeerStore metadaBook key for HOP relay service
|
|
20
|
+
*/
|
|
21
|
+
export const HOP_METADATA_KEY = 'hop_relay'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* PeerStore metadaBook value for HOP relay service
|
|
25
|
+
*/
|
|
26
|
+
export const HOP_METADATA_VALUE = 'true'
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Relay HOP relay service namespace for discovery
|
|
30
|
+
*/
|
|
31
|
+
export const RELAY_RENDEZVOUS_NS = '/libp2p/relay'
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import { codes } from '../errors.js'
|
|
3
|
+
import {
|
|
4
|
+
setDelayedInterval,
|
|
5
|
+
clearDelayedInterval
|
|
6
|
+
// @ts-expect-error set-delayed-interval does not export types
|
|
7
|
+
} from 'set-delayed-interval'
|
|
8
|
+
import { AutoRelay } from './auto-relay.js'
|
|
9
|
+
import { namespaceToCid } from './utils.js'
|
|
10
|
+
import {
|
|
11
|
+
RELAY_RENDEZVOUS_NS
|
|
12
|
+
} from './constants.js'
|
|
13
|
+
import type { AddressSorter } from '@libp2p/interfaces/peer-store'
|
|
14
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
15
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
16
|
+
|
|
17
|
+
const log = logger('libp2p:relay')
|
|
18
|
+
|
|
19
|
+
export interface RelayAdvertiseConfig {
|
|
20
|
+
bootDelay?: number
|
|
21
|
+
enabled?: boolean
|
|
22
|
+
ttl?: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface HopConfig {
|
|
26
|
+
enabled?: boolean
|
|
27
|
+
active?: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AutoRelayConfig {
|
|
31
|
+
enabled?: boolean
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* maximum number of relays to listen
|
|
35
|
+
*/
|
|
36
|
+
maxListeners: number
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface RelayInit {
|
|
40
|
+
addressSorter?: AddressSorter
|
|
41
|
+
maxListeners?: number
|
|
42
|
+
onError?: (error: Error, msg?: string) => void
|
|
43
|
+
hop: HopConfig
|
|
44
|
+
advertise: RelayAdvertiseConfig
|
|
45
|
+
autoRelay: AutoRelayConfig
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export class Relay implements Startable {
|
|
49
|
+
private readonly components: Components
|
|
50
|
+
private readonly init: RelayInit
|
|
51
|
+
// @ts-expect-error this field isn't used anywhere?
|
|
52
|
+
private readonly autoRelay?: AutoRelay
|
|
53
|
+
private timeout?: any
|
|
54
|
+
private started: boolean
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Creates an instance of Relay
|
|
58
|
+
*/
|
|
59
|
+
constructor (components: Components, init: RelayInit) {
|
|
60
|
+
this.components = components
|
|
61
|
+
// Create autoRelay if enabled
|
|
62
|
+
this.autoRelay = init.autoRelay?.enabled !== false
|
|
63
|
+
? new AutoRelay(components, {
|
|
64
|
+
addressSorter: init.addressSorter,
|
|
65
|
+
...init.autoRelay
|
|
66
|
+
})
|
|
67
|
+
: undefined
|
|
68
|
+
|
|
69
|
+
this.started = false
|
|
70
|
+
this.init = init
|
|
71
|
+
this._advertiseService = this._advertiseService.bind(this)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
isStarted () {
|
|
75
|
+
return this.started
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Start Relay service
|
|
80
|
+
*/
|
|
81
|
+
async start () {
|
|
82
|
+
// Advertise service if HOP enabled
|
|
83
|
+
if (this.init.hop.enabled !== false && this.init.advertise.enabled !== false) {
|
|
84
|
+
this.timeout = setDelayedInterval(
|
|
85
|
+
this._advertiseService, this.init.advertise.ttl, this.init.advertise.bootDelay
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this.started = true
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Stop Relay service
|
|
94
|
+
*/
|
|
95
|
+
async stop () {
|
|
96
|
+
if (this.timeout != null) {
|
|
97
|
+
clearDelayedInterval(this.timeout)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.started = false
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Advertise hop relay service in the network.
|
|
105
|
+
*/
|
|
106
|
+
async _advertiseService () {
|
|
107
|
+
try {
|
|
108
|
+
const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
|
|
109
|
+
await this.components.getContentRouting().provide(cid)
|
|
110
|
+
} catch (err: any) {
|
|
111
|
+
if (err.code === codes.ERR_NO_ROUTERS_AVAILABLE) {
|
|
112
|
+
log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err)
|
|
113
|
+
// Stop the advertise
|
|
114
|
+
await this.stop()
|
|
115
|
+
} else {
|
|
116
|
+
log.error(err)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
|
|
2
|
+
import type { ConnectionManager } from '@libp2p/interfaces/connection-manager'
|
|
3
|
+
import type { PeerStore } from '@libp2p/interfaces/peer-store'
|
|
4
|
+
import type { Listener } from '@libp2p/interfaces/transport'
|
|
5
|
+
import { peerIdFromString } from '@libp2p/peer-id'
|
|
6
|
+
import { Multiaddr } from '@multiformats/multiaddr'
|
|
7
|
+
|
|
8
|
+
export interface ListenerOptions {
|
|
9
|
+
peerStore: PeerStore
|
|
10
|
+
connectionManager: ConnectionManager
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function createListener (options: ListenerOptions): Listener {
|
|
14
|
+
const listeningAddrs = new Map()
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Add swarm handler and listen for incoming connections
|
|
18
|
+
*/
|
|
19
|
+
async function listen (addr: Multiaddr): Promise<void> {
|
|
20
|
+
const addrString = addr.toString().split('/p2p-circuit').find(a => a !== '')
|
|
21
|
+
const ma = new Multiaddr(addrString)
|
|
22
|
+
|
|
23
|
+
const relayPeerStr = ma.getPeerId()
|
|
24
|
+
|
|
25
|
+
if (relayPeerStr == null) {
|
|
26
|
+
throw new Error('Could not determine relay peer from multiaddr')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const relayPeerId = peerIdFromString(relayPeerStr)
|
|
30
|
+
|
|
31
|
+
await options.peerStore.addressBook.add(relayPeerId, [ma])
|
|
32
|
+
|
|
33
|
+
const relayConn = await options.connectionManager.openConnection(relayPeerId)
|
|
34
|
+
const relayedAddr = relayConn.remoteAddr.encapsulate('/p2p-circuit')
|
|
35
|
+
|
|
36
|
+
listeningAddrs.set(relayConn.remotePeer.toString(), relayedAddr)
|
|
37
|
+
listener.dispatchEvent(new CustomEvent('listening'))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get fixed up multiaddrs
|
|
42
|
+
*
|
|
43
|
+
* NOTE: This method will grab the peers multiaddrs and expand them such that:
|
|
44
|
+
*
|
|
45
|
+
* a) If it's an existing /p2p-circuit address for a specific relay i.e.
|
|
46
|
+
* `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit` this method will expand the
|
|
47
|
+
* address to `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit/ipfs/QmPeer` where
|
|
48
|
+
* `QmPeer` is this peers id
|
|
49
|
+
* b) If it's not a /p2p-circuit address, it will encapsulate the address as a /p2p-circuit
|
|
50
|
+
* addr, such when dialing over a relay with this address, it will create the circuit using
|
|
51
|
+
* the encapsulated transport address. This is useful when for example, a peer should only
|
|
52
|
+
* be dialed over TCP rather than any other transport
|
|
53
|
+
*
|
|
54
|
+
* @returns {Multiaddr[]}
|
|
55
|
+
*/
|
|
56
|
+
function getAddrs () {
|
|
57
|
+
const addrs = []
|
|
58
|
+
for (const addr of listeningAddrs.values()) {
|
|
59
|
+
addrs.push(addr)
|
|
60
|
+
}
|
|
61
|
+
return addrs
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const listener: Listener = Object.assign(new EventEmitter(), {
|
|
65
|
+
close: async () => await Promise.resolve(),
|
|
66
|
+
listen,
|
|
67
|
+
getAddrs
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Remove listeningAddrs when a peer disconnects
|
|
71
|
+
options.connectionManager.addEventListener('peer:disconnect', (evt) => {
|
|
72
|
+
const { detail: connection } = evt
|
|
73
|
+
const deleted = listeningAddrs.delete(connection.remotePeer.toString())
|
|
74
|
+
|
|
75
|
+
if (deleted) {
|
|
76
|
+
// Announce listen addresses change
|
|
77
|
+
listener.dispatchEvent(new CustomEvent('close'))
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
return listener
|
|
82
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* eslint-disable import/export */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-namespace */
|
|
3
|
+
|
|
4
|
+
import { enumeration, encodeMessage, decodeMessage, message, bytes } from 'protons-runtime'
|
|
5
|
+
import type { Codec } from 'protons-runtime'
|
|
6
|
+
|
|
7
|
+
export interface CircuitRelay {
|
|
8
|
+
type?: CircuitRelay.Type
|
|
9
|
+
srcPeer?: CircuitRelay.Peer
|
|
10
|
+
dstPeer?: CircuitRelay.Peer
|
|
11
|
+
code?: CircuitRelay.Status
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export namespace CircuitRelay {
|
|
15
|
+
export enum Status {
|
|
16
|
+
SUCCESS = 'SUCCESS',
|
|
17
|
+
HOP_SRC_ADDR_TOO_LONG = 'HOP_SRC_ADDR_TOO_LONG',
|
|
18
|
+
HOP_DST_ADDR_TOO_LONG = 'HOP_DST_ADDR_TOO_LONG',
|
|
19
|
+
HOP_SRC_MULTIADDR_INVALID = 'HOP_SRC_MULTIADDR_INVALID',
|
|
20
|
+
HOP_DST_MULTIADDR_INVALID = 'HOP_DST_MULTIADDR_INVALID',
|
|
21
|
+
HOP_NO_CONN_TO_DST = 'HOP_NO_CONN_TO_DST',
|
|
22
|
+
HOP_CANT_DIAL_DST = 'HOP_CANT_DIAL_DST',
|
|
23
|
+
HOP_CANT_OPEN_DST_STREAM = 'HOP_CANT_OPEN_DST_STREAM',
|
|
24
|
+
HOP_CANT_SPEAK_RELAY = 'HOP_CANT_SPEAK_RELAY',
|
|
25
|
+
HOP_CANT_RELAY_TO_SELF = 'HOP_CANT_RELAY_TO_SELF',
|
|
26
|
+
STOP_SRC_ADDR_TOO_LONG = 'STOP_SRC_ADDR_TOO_LONG',
|
|
27
|
+
STOP_DST_ADDR_TOO_LONG = 'STOP_DST_ADDR_TOO_LONG',
|
|
28
|
+
STOP_SRC_MULTIADDR_INVALID = 'STOP_SRC_MULTIADDR_INVALID',
|
|
29
|
+
STOP_DST_MULTIADDR_INVALID = 'STOP_DST_MULTIADDR_INVALID',
|
|
30
|
+
STOP_RELAY_REFUSED = 'STOP_RELAY_REFUSED',
|
|
31
|
+
MALFORMED_MESSAGE = 'MALFORMED_MESSAGE'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
enum __StatusValues {
|
|
35
|
+
SUCCESS = 100,
|
|
36
|
+
HOP_SRC_ADDR_TOO_LONG = 220,
|
|
37
|
+
HOP_DST_ADDR_TOO_LONG = 221,
|
|
38
|
+
HOP_SRC_MULTIADDR_INVALID = 250,
|
|
39
|
+
HOP_DST_MULTIADDR_INVALID = 251,
|
|
40
|
+
HOP_NO_CONN_TO_DST = 260,
|
|
41
|
+
HOP_CANT_DIAL_DST = 261,
|
|
42
|
+
HOP_CANT_OPEN_DST_STREAM = 262,
|
|
43
|
+
HOP_CANT_SPEAK_RELAY = 270,
|
|
44
|
+
HOP_CANT_RELAY_TO_SELF = 280,
|
|
45
|
+
STOP_SRC_ADDR_TOO_LONG = 320,
|
|
46
|
+
STOP_DST_ADDR_TOO_LONG = 321,
|
|
47
|
+
STOP_SRC_MULTIADDR_INVALID = 350,
|
|
48
|
+
STOP_DST_MULTIADDR_INVALID = 351,
|
|
49
|
+
STOP_RELAY_REFUSED = 390,
|
|
50
|
+
MALFORMED_MESSAGE = 400
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export namespace Status {
|
|
54
|
+
export const codec = () => {
|
|
55
|
+
return enumeration<typeof Status>(__StatusValues)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export enum Type {
|
|
60
|
+
HOP = 'HOP',
|
|
61
|
+
STOP = 'STOP',
|
|
62
|
+
STATUS = 'STATUS',
|
|
63
|
+
CAN_HOP = 'CAN_HOP'
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
enum __TypeValues {
|
|
67
|
+
HOP = 1,
|
|
68
|
+
STOP = 2,
|
|
69
|
+
STATUS = 3,
|
|
70
|
+
CAN_HOP = 4
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export namespace Type {
|
|
74
|
+
export const codec = () => {
|
|
75
|
+
return enumeration<typeof Type>(__TypeValues)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface Peer {
|
|
80
|
+
id: Uint8Array
|
|
81
|
+
addrs: Uint8Array[]
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export namespace Peer {
|
|
85
|
+
export const codec = (): Codec<Peer> => {
|
|
86
|
+
return message<Peer>({
|
|
87
|
+
1: { name: 'id', codec: bytes },
|
|
88
|
+
2: { name: 'addrs', codec: bytes, repeats: true }
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const encode = (obj: Peer): Uint8Array => {
|
|
93
|
+
return encodeMessage(obj, Peer.codec())
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const decode = (buf: Uint8Array): Peer => {
|
|
97
|
+
return decodeMessage(buf, Peer.codec())
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const codec = (): Codec<CircuitRelay> => {
|
|
102
|
+
return message<CircuitRelay>({
|
|
103
|
+
1: { name: 'type', codec: CircuitRelay.Type.codec(), optional: true },
|
|
104
|
+
2: { name: 'srcPeer', codec: CircuitRelay.Peer.codec(), optional: true },
|
|
105
|
+
3: { name: 'dstPeer', codec: CircuitRelay.Peer.codec(), optional: true },
|
|
106
|
+
4: { name: 'code', codec: CircuitRelay.Status.codec(), optional: true }
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const encode = (obj: CircuitRelay): Uint8Array => {
|
|
111
|
+
return encodeMessage(obj, CircuitRelay.codec())
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const decode = (buf: Uint8Array): CircuitRelay => {
|
|
115
|
+
return decodeMessage(buf, CircuitRelay.codec())
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import errCode from 'err-code'
|
|
3
|
+
import * as mafmt from '@multiformats/mafmt'
|
|
4
|
+
import { Multiaddr } from '@multiformats/multiaddr'
|
|
5
|
+
import { CircuitRelay as CircuitPB } from './pb/index.js'
|
|
6
|
+
import { codes } from '../errors.js'
|
|
7
|
+
import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
|
|
8
|
+
import { RELAY_CODEC } from './multicodec.js'
|
|
9
|
+
import { createListener } from './listener.js'
|
|
10
|
+
import { handleCanHop, handleHop, hop } from './circuit/hop.js'
|
|
11
|
+
import { handleStop } from './circuit/stop.js'
|
|
12
|
+
import { StreamHandler } from './circuit/stream-handler.js'
|
|
13
|
+
import { symbol } from '@libp2p/interfaces/transport'
|
|
14
|
+
import { peerIdFromString } from '@libp2p/peer-id'
|
|
15
|
+
import { Components, Initializable } from '@libp2p/interfaces/components'
|
|
16
|
+
import type { AbortOptions } from '@libp2p/interfaces'
|
|
17
|
+
import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
|
|
18
|
+
import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interfaces/transport'
|
|
19
|
+
import type { Connection } from '@libp2p/interfaces/connection'
|
|
20
|
+
|
|
21
|
+
const log = logger('libp2p:circuit')
|
|
22
|
+
|
|
23
|
+
export class Circuit implements Transport, Initializable {
|
|
24
|
+
private handler?: ConnectionHandler
|
|
25
|
+
private components: Components = new Components()
|
|
26
|
+
|
|
27
|
+
init (components: Components): void {
|
|
28
|
+
this.components = components
|
|
29
|
+
void this.components.getRegistrar().handle(RELAY_CODEC, (data) => {
|
|
30
|
+
void this._onProtocol(data).catch(err => {
|
|
31
|
+
log.error(err)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
.catch(err => {
|
|
35
|
+
log.error(err)
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
hopEnabled () {
|
|
40
|
+
return true
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
hopActive () {
|
|
44
|
+
return true
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
get [symbol] (): true {
|
|
48
|
+
return true
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get [Symbol.toStringTag] () {
|
|
52
|
+
return 'libp2p/circuit-relay-v1'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async _onProtocol (data: IncomingStreamData) {
|
|
56
|
+
const { connection, stream } = data
|
|
57
|
+
const streamHandler = new StreamHandler({ stream })
|
|
58
|
+
const request = await streamHandler.read()
|
|
59
|
+
|
|
60
|
+
if (request == null) {
|
|
61
|
+
log('request was invalid, could not read from stream')
|
|
62
|
+
streamHandler.write({
|
|
63
|
+
type: CircuitPB.Type.STATUS,
|
|
64
|
+
code: CircuitPB.Status.MALFORMED_MESSAGE
|
|
65
|
+
})
|
|
66
|
+
streamHandler.close()
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let virtualConnection
|
|
71
|
+
|
|
72
|
+
switch (request.type) {
|
|
73
|
+
case CircuitPB.Type.CAN_HOP: {
|
|
74
|
+
log('received CAN_HOP request from %p', connection.remotePeer)
|
|
75
|
+
await handleCanHop({ circuit: this, connection, streamHandler })
|
|
76
|
+
break
|
|
77
|
+
}
|
|
78
|
+
case CircuitPB.Type.HOP: {
|
|
79
|
+
log('received HOP request from %p', connection.remotePeer)
|
|
80
|
+
virtualConnection = await handleHop({
|
|
81
|
+
connection,
|
|
82
|
+
request,
|
|
83
|
+
streamHandler,
|
|
84
|
+
circuit: this,
|
|
85
|
+
connectionManager: this.components.getConnectionManager()
|
|
86
|
+
})
|
|
87
|
+
break
|
|
88
|
+
}
|
|
89
|
+
case CircuitPB.Type.STOP: {
|
|
90
|
+
log('received STOP request from %p', connection.remotePeer)
|
|
91
|
+
virtualConnection = await handleStop({
|
|
92
|
+
connection,
|
|
93
|
+
request,
|
|
94
|
+
streamHandler
|
|
95
|
+
})
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
default: {
|
|
99
|
+
log('Request of type %s not supported', request.type)
|
|
100
|
+
streamHandler.write({
|
|
101
|
+
type: CircuitPB.Type.STATUS,
|
|
102
|
+
code: CircuitPB.Status.MALFORMED_MESSAGE
|
|
103
|
+
})
|
|
104
|
+
streamHandler.close()
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (virtualConnection != null) {
|
|
110
|
+
// @ts-expect-error dst peer will not be undefined
|
|
111
|
+
const remoteAddr = new Multiaddr(request.dstPeer.addrs[0])
|
|
112
|
+
// @ts-expect-error dst peer will not be undefined
|
|
113
|
+
const localAddr = new Multiaddr(request.srcPeer.addrs[0])
|
|
114
|
+
const maConn = streamToMaConnection({
|
|
115
|
+
stream: virtualConnection,
|
|
116
|
+
remoteAddr,
|
|
117
|
+
localAddr
|
|
118
|
+
})
|
|
119
|
+
const type = request.type === CircuitPB.Type.HOP ? 'relay' : 'inbound'
|
|
120
|
+
log('new %s connection %s', type, maConn.remoteAddr)
|
|
121
|
+
|
|
122
|
+
const conn = await this.components.getUpgrader().upgradeInbound(maConn)
|
|
123
|
+
log('%s connection %s upgraded', type, maConn.remoteAddr)
|
|
124
|
+
|
|
125
|
+
if (this.handler != null) {
|
|
126
|
+
this.handler(conn)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Dial a peer over a relay
|
|
133
|
+
*/
|
|
134
|
+
async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
|
|
135
|
+
// Check the multiaddr to see if it contains a relay and a destination peer
|
|
136
|
+
const addrs = ma.toString().split('/p2p-circuit')
|
|
137
|
+
const relayAddr = new Multiaddr(addrs[0])
|
|
138
|
+
const destinationAddr = new Multiaddr(addrs[addrs.length - 1])
|
|
139
|
+
const relayId = relayAddr.getPeerId()
|
|
140
|
+
const destinationId = destinationAddr.getPeerId()
|
|
141
|
+
|
|
142
|
+
if (relayId == null || destinationId == null) {
|
|
143
|
+
const errMsg = 'Circuit relay dial failed as addresses did not have peer id'
|
|
144
|
+
log.error(errMsg)
|
|
145
|
+
throw errCode(new Error(errMsg), codes.ERR_RELAYED_DIAL)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const relayPeer = peerIdFromString(relayId)
|
|
149
|
+
const destinationPeer = peerIdFromString(destinationId)
|
|
150
|
+
|
|
151
|
+
let disconnectOnFailure = false
|
|
152
|
+
const relayConnections = this.components.getConnectionManager().getConnections(relayPeer)
|
|
153
|
+
let relayConnection = relayConnections[0]
|
|
154
|
+
|
|
155
|
+
if (relayConnection == null) {
|
|
156
|
+
await this.components.getPeerStore().addressBook.add(relayPeer, [relayAddr])
|
|
157
|
+
relayConnection = await this.components.getConnectionManager().openConnection(relayPeer, options)
|
|
158
|
+
disconnectOnFailure = true
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
const virtualConnection = await hop({
|
|
163
|
+
connection: relayConnection,
|
|
164
|
+
request: {
|
|
165
|
+
type: CircuitPB.Type.HOP,
|
|
166
|
+
srcPeer: {
|
|
167
|
+
id: this.components.getPeerId().toBytes(),
|
|
168
|
+
addrs: this.components.getAddressManager().getAddresses().map(addr => addr.bytes)
|
|
169
|
+
},
|
|
170
|
+
dstPeer: {
|
|
171
|
+
id: destinationPeer.toBytes(),
|
|
172
|
+
addrs: [new Multiaddr(destinationAddr).bytes]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
const localAddr = relayAddr.encapsulate(`/p2p-circuit/p2p/${this.components.getPeerId().toString()}`)
|
|
178
|
+
const maConn = streamToMaConnection({
|
|
179
|
+
stream: virtualConnection,
|
|
180
|
+
remoteAddr: ma,
|
|
181
|
+
localAddr
|
|
182
|
+
})
|
|
183
|
+
log('new outbound connection %s', maConn.remoteAddr)
|
|
184
|
+
|
|
185
|
+
return await this.components.getUpgrader().upgradeOutbound(maConn)
|
|
186
|
+
} catch (err: any) {
|
|
187
|
+
log.error('Circuit relay dial failed', err)
|
|
188
|
+
disconnectOnFailure && await relayConnection.close()
|
|
189
|
+
throw err
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Create a listener
|
|
195
|
+
*/
|
|
196
|
+
createListener (options: CreateListenerOptions): Listener {
|
|
197
|
+
// Called on successful HOP and STOP requests
|
|
198
|
+
this.handler = options.handler
|
|
199
|
+
|
|
200
|
+
return createListener({
|
|
201
|
+
connectionManager: this.components.getConnectionManager(),
|
|
202
|
+
peerStore: this.components.getPeerStore()
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Filter check for all Multiaddrs that this transport can dial on
|
|
208
|
+
*
|
|
209
|
+
* @param {Multiaddr[]} multiaddrs
|
|
210
|
+
* @returns {Multiaddr[]}
|
|
211
|
+
*/
|
|
212
|
+
filter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
213
|
+
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
|
|
214
|
+
|
|
215
|
+
return multiaddrs.filter((ma) => {
|
|
216
|
+
return mafmt.Circuit.matches(ma)
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid'
|
|
2
|
+
import { sha256 } from 'multiformats/hashes/sha2'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Convert a namespace string into a cid
|
|
6
|
+
*/
|
|
7
|
+
export async function namespaceToCid (namespace: string): Promise<CID> {
|
|
8
|
+
const bytes = new TextEncoder().encode(namespace)
|
|
9
|
+
const hash = await sha256.digest(bytes)
|
|
10
|
+
|
|
11
|
+
return CID.createV0(hash)
|
|
12
|
+
}
|