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
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import { pipe } from 'it-pipe'
|
|
3
|
+
import errCode from 'err-code'
|
|
4
|
+
import { duplexPair } from 'it-pair/duplex'
|
|
5
|
+
import { randomBytes } from '@libp2p/crypto'
|
|
6
|
+
import * as Errors from './errors.js'
|
|
7
|
+
import { codes } from '../errors.js'
|
|
8
|
+
import {
|
|
9
|
+
createBoxStream,
|
|
10
|
+
createUnboxStream,
|
|
11
|
+
decodeV1PSK
|
|
12
|
+
} from './crypto.js'
|
|
13
|
+
import { handshake } from 'it-handshake'
|
|
14
|
+
import { NONCE_LENGTH } from './key-generator.js'
|
|
15
|
+
import type { MultiaddrConnection } from '@libp2p/interfaces/transport'
|
|
16
|
+
import type { ConnectionProtector } from '@libp2p/interfaces/connection'
|
|
17
|
+
|
|
18
|
+
const log = logger('libp2p:pnet')
|
|
19
|
+
|
|
20
|
+
export { generateKey } from './key-generator.js'
|
|
21
|
+
|
|
22
|
+
export interface ProtectorInit {
|
|
23
|
+
enabled?: boolean
|
|
24
|
+
psk: Uint8Array
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class PreSharedKeyConnectionProtector implements ConnectionProtector {
|
|
28
|
+
public tag: string
|
|
29
|
+
private readonly psk: Uint8Array
|
|
30
|
+
private readonly enabled: boolean
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Takes a Private Shared Key (psk) and provides a `protect` method
|
|
34
|
+
* for wrapping existing connections in a private encryption stream.
|
|
35
|
+
*/
|
|
36
|
+
constructor (init: ProtectorInit) {
|
|
37
|
+
this.enabled = init.enabled !== false
|
|
38
|
+
|
|
39
|
+
if (this.enabled) {
|
|
40
|
+
const decodedPSK = decodeV1PSK(init.psk)
|
|
41
|
+
this.psk = decodedPSK.psk
|
|
42
|
+
this.tag = decodedPSK.tag ?? ''
|
|
43
|
+
} else {
|
|
44
|
+
this.psk = new Uint8Array()
|
|
45
|
+
this.tag = ''
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Takes a given Connection and creates a private encryption stream
|
|
51
|
+
* between its two peers from the PSK the Protector instance was
|
|
52
|
+
* created with.
|
|
53
|
+
*/
|
|
54
|
+
async protect (connection: MultiaddrConnection): Promise<MultiaddrConnection> {
|
|
55
|
+
if (!this.enabled) {
|
|
56
|
+
return connection
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (connection == null) {
|
|
60
|
+
throw errCode(new Error(Errors.NO_HANDSHAKE_CONNECTION), codes.ERR_INVALID_PARAMETERS)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Exchange nonces
|
|
64
|
+
log('protecting the connection')
|
|
65
|
+
const localNonce = randomBytes(NONCE_LENGTH)
|
|
66
|
+
|
|
67
|
+
const shake = handshake(connection)
|
|
68
|
+
shake.write(localNonce)
|
|
69
|
+
|
|
70
|
+
const result = await shake.reader.next(NONCE_LENGTH)
|
|
71
|
+
|
|
72
|
+
if (result.value == null) {
|
|
73
|
+
throw errCode(new Error(Errors.STREAM_ENDED), codes.ERR_INVALID_PARAMETERS)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const remoteNonce = result.value.slice()
|
|
77
|
+
shake.rest()
|
|
78
|
+
|
|
79
|
+
// Create the boxing/unboxing pipe
|
|
80
|
+
log('exchanged nonces')
|
|
81
|
+
const [internal, external] = duplexPair<Uint8Array>()
|
|
82
|
+
pipe(
|
|
83
|
+
external,
|
|
84
|
+
// Encrypt all outbound traffic
|
|
85
|
+
createBoxStream(localNonce, this.psk),
|
|
86
|
+
shake.stream,
|
|
87
|
+
// Decrypt all inbound traffic
|
|
88
|
+
createUnboxStream(remoteNonce, this.psk),
|
|
89
|
+
external
|
|
90
|
+
).catch(log.error)
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
...connection,
|
|
94
|
+
...internal
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { randomBytes } from '@libp2p/crypto'
|
|
2
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
3
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generates a PSK that can be used in a libp2p-pnet private network
|
|
7
|
+
*
|
|
8
|
+
* @param {Uint8Array} bytes - An object to write the psk into
|
|
9
|
+
* @returns {void}
|
|
10
|
+
*/
|
|
11
|
+
export function generateKey (bytes: Uint8Array) {
|
|
12
|
+
const psk = uint8ArrayToString(randomBytes(KEY_LENGTH), 'base16')
|
|
13
|
+
const key = uint8ArrayFromString('/key/swarm/psk/1.0.0/\n/base16/\n' + psk)
|
|
14
|
+
|
|
15
|
+
bytes.set(key)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const NONCE_LENGTH = 24
|
|
19
|
+
export const KEY_LENGTH = 32
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
if (require.main === module) {
|
|
23
|
+
// @ts-expect-error
|
|
24
|
+
generate(process.stdout)
|
|
25
|
+
}
|
|
26
|
+
} catch (error: any) {
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { EventEmitter } from '@libp2p/interfaces/events'
|
|
2
|
+
import type { PeerId } from '@libp2p/interfaces/peer-id'
|
|
3
|
+
import type { PublishResult, PubSub, PubSubEvents, StrictNoSign, StrictSign } from '@libp2p/interfaces/pubsub'
|
|
4
|
+
import errCode from 'err-code'
|
|
5
|
+
import { messages, codes } from '../errors.js'
|
|
6
|
+
|
|
7
|
+
export class DummyPubSub extends EventEmitter<PubSubEvents> implements PubSub {
|
|
8
|
+
isStarted (): boolean {
|
|
9
|
+
return false
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
start (): void | Promise<void> {
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
stop (): void | Promise<void> {
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get globalSignaturePolicy (): typeof StrictSign | typeof StrictNoSign {
|
|
21
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get multicodecs (): string[] {
|
|
25
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
getPeers (): PeerId[] {
|
|
29
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
getTopics (): string[] {
|
|
33
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
subscribe (): void {
|
|
37
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
unsubscribe (): void {
|
|
41
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getSubscribers (): PeerId[] {
|
|
45
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async publish (): Promise<PublishResult> {
|
|
49
|
+
throw errCode(new Error(messages.PUBSUB_DISABLED), codes.ERR_PUBSUB_DISABLED)
|
|
50
|
+
}
|
|
51
|
+
}
|
package/src/registrar.ts
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import errCode from 'err-code'
|
|
3
|
+
import { codes } from './errors.js'
|
|
4
|
+
import { isTopology, Topology } from '@libp2p/interfaces/topology'
|
|
5
|
+
import type { Registrar, StreamHandler } from '@libp2p/interfaces/registrar'
|
|
6
|
+
import type { PeerProtocolsChangeData } from '@libp2p/interfaces/peer-store'
|
|
7
|
+
import type { Connection } from '@libp2p/interfaces/connection'
|
|
8
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
9
|
+
|
|
10
|
+
const log = logger('libp2p:registrar')
|
|
11
|
+
|
|
12
|
+
function supportsProtocol (peerProtocols: string[], topologyProtocols: string[]) {
|
|
13
|
+
for (const peerProtocol of peerProtocols) {
|
|
14
|
+
if (topologyProtocols.includes(peerProtocol)) {
|
|
15
|
+
return true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return false
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Responsible for notifying registered protocols of events in the network.
|
|
24
|
+
*/
|
|
25
|
+
export class DefaultRegistrar implements Registrar {
|
|
26
|
+
private readonly topologies: Map<string, { topology: Topology, protocols: string[] }>
|
|
27
|
+
private readonly handlers: Map<string, StreamHandler>
|
|
28
|
+
private readonly components: Components
|
|
29
|
+
|
|
30
|
+
constructor (components: Components) {
|
|
31
|
+
this.topologies = new Map()
|
|
32
|
+
this.handlers = new Map()
|
|
33
|
+
this.components = components
|
|
34
|
+
|
|
35
|
+
this._onDisconnect = this._onDisconnect.bind(this)
|
|
36
|
+
this._onProtocolChange = this._onProtocolChange.bind(this)
|
|
37
|
+
|
|
38
|
+
this.components.getConnectionManager().addEventListener('peer:disconnect', this._onDisconnect)
|
|
39
|
+
|
|
40
|
+
// happens after identify
|
|
41
|
+
this.components.getPeerStore().addEventListener('change:protocols', this._onProtocolChange)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getProtocols () {
|
|
45
|
+
const protocols = new Set<string>()
|
|
46
|
+
|
|
47
|
+
for (const topology of this.topologies.values()) {
|
|
48
|
+
topology.protocols.forEach(protocol => protocols.add(protocol))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
for (const protocol of this.handlers.keys()) {
|
|
52
|
+
protocols.add(protocol)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return Array.from(protocols).sort()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getHandler (protocol: string) {
|
|
59
|
+
const handler = this.handlers.get(protocol)
|
|
60
|
+
|
|
61
|
+
if (handler == null) {
|
|
62
|
+
throw new Error(`No handler registered for protocol ${protocol}`)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return handler
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
getTopologies (protocol: string) {
|
|
69
|
+
const output: Topology[] = []
|
|
70
|
+
|
|
71
|
+
for (const { topology, protocols } of this.topologies.values()) {
|
|
72
|
+
if (protocols.includes(protocol)) {
|
|
73
|
+
output.push(topology)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return output
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Registers the `handler` for each protocol
|
|
82
|
+
*/
|
|
83
|
+
async handle (protocols: string | string[], handler: StreamHandler): Promise<void> {
|
|
84
|
+
const protocolList = Array.isArray(protocols) ? protocols : [protocols]
|
|
85
|
+
|
|
86
|
+
for (const protocol of protocolList) {
|
|
87
|
+
if (this.handlers.has(protocol)) {
|
|
88
|
+
throw errCode(new Error(`Handler already registered for protocol ${protocol}`), codes.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.handlers.set(protocol, handler)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Add new protocols to self protocols in the Protobook
|
|
95
|
+
await this.components.getPeerStore().protoBook.add(this.components.getPeerId(), protocolList)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Removes the handler for each protocol. The protocol
|
|
100
|
+
* will no longer be supported on streams.
|
|
101
|
+
*/
|
|
102
|
+
async unhandle (protocols: string | string[]) {
|
|
103
|
+
const protocolList = Array.isArray(protocols) ? protocols : [protocols]
|
|
104
|
+
|
|
105
|
+
protocolList.forEach(protocol => {
|
|
106
|
+
this.handlers.delete(protocol)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// Remove protocols from self protocols in the Protobook
|
|
110
|
+
await this.components.getPeerStore().protoBook.remove(this.components.getPeerId(), protocolList)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Register handlers for a set of multicodecs given
|
|
115
|
+
*/
|
|
116
|
+
async register (protocols: string | string[], topology: Topology): Promise<string> {
|
|
117
|
+
if (!isTopology(topology)) {
|
|
118
|
+
log.error('topology must be an instance of interfaces/topology')
|
|
119
|
+
throw errCode(new Error('topology must be an instance of interfaces/topology'), codes.ERR_INVALID_PARAMETERS)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Create topology
|
|
123
|
+
const id = `${(Math.random() * 1e9).toString(36)}${Date.now()}`
|
|
124
|
+
|
|
125
|
+
this.topologies.set(id, {
|
|
126
|
+
topology,
|
|
127
|
+
protocols: Array.isArray(protocols) ? protocols : [protocols]
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// Set registrar
|
|
131
|
+
await topology.setRegistrar(this)
|
|
132
|
+
|
|
133
|
+
return id
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Unregister topology
|
|
138
|
+
*/
|
|
139
|
+
unregister (id: string) {
|
|
140
|
+
this.topologies.delete(id)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Remove a disconnected peer from the record
|
|
145
|
+
*/
|
|
146
|
+
_onDisconnect (evt: CustomEvent<Connection>) {
|
|
147
|
+
const connection = evt.detail
|
|
148
|
+
|
|
149
|
+
void this.components.getPeerStore().protoBook.get(connection.remotePeer)
|
|
150
|
+
.then(peerProtocols => {
|
|
151
|
+
for (const { topology, protocols } of this.topologies.values()) {
|
|
152
|
+
if (supportsProtocol(peerProtocols, protocols)) {
|
|
153
|
+
topology.onDisconnect(connection.remotePeer)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
.catch(err => {
|
|
158
|
+
log.error(err)
|
|
159
|
+
})
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Check if a new peer support the multicodecs for this topology
|
|
164
|
+
*/
|
|
165
|
+
_onProtocolChange (evt: CustomEvent<PeerProtocolsChangeData>) {
|
|
166
|
+
const { peerId, protocols, oldProtocols } = evt.detail
|
|
167
|
+
|
|
168
|
+
const removed = oldProtocols.filter(protocol => !protocols.includes(protocol))
|
|
169
|
+
const added = protocols.filter(protocol => !oldProtocols.includes(protocol))
|
|
170
|
+
|
|
171
|
+
for (const { topology, protocols } of this.topologies.values()) {
|
|
172
|
+
if (supportsProtocol(removed, protocols)) {
|
|
173
|
+
topology.onDisconnect(peerId)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
for (const { topology, protocols } of this.topologies.values()) {
|
|
178
|
+
if (supportsProtocol(added, protocols)) {
|
|
179
|
+
const connection = this.components.getConnectionManager().getConnections(peerId)[0]
|
|
180
|
+
|
|
181
|
+
if (connection == null) {
|
|
182
|
+
continue
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
topology.onConnect(peerId, connection)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import pSettle from 'p-settle'
|
|
3
|
+
import { codes } from './errors.js'
|
|
4
|
+
import errCode from 'err-code'
|
|
5
|
+
import type { Listener, Transport, TransportManager, TransportManagerEvents } from '@libp2p/interfaces/transport'
|
|
6
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
7
|
+
import type { Connection } from '@libp2p/interfaces/connection'
|
|
8
|
+
import type { AbortOptions } from '@libp2p/interfaces'
|
|
9
|
+
import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
|
|
10
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
11
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
12
|
+
import { trackedMap } from '@libp2p/tracked-map'
|
|
13
|
+
|
|
14
|
+
const log = logger('libp2p:transports')
|
|
15
|
+
|
|
16
|
+
export interface TransportManagerInit {
|
|
17
|
+
faultTolerance?: FaultTolerance
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class DefaultTransportManager extends EventEmitter<TransportManagerEvents> implements TransportManager, Startable {
|
|
21
|
+
private readonly components: Components
|
|
22
|
+
private readonly transports: Map<string, Transport>
|
|
23
|
+
private readonly listeners: Map<string, Listener[]>
|
|
24
|
+
private readonly faultTolerance: FaultTolerance
|
|
25
|
+
private started: boolean
|
|
26
|
+
|
|
27
|
+
constructor (components: Components, init: TransportManagerInit = {}) {
|
|
28
|
+
super()
|
|
29
|
+
|
|
30
|
+
this.components = components
|
|
31
|
+
this.started = false
|
|
32
|
+
this.transports = new Map<string, Transport>()
|
|
33
|
+
this.listeners = trackedMap({
|
|
34
|
+
component: 'transport-manager',
|
|
35
|
+
metric: 'listeners',
|
|
36
|
+
metrics: this.components.getMetrics()
|
|
37
|
+
})
|
|
38
|
+
this.faultTolerance = init.faultTolerance ?? FaultTolerance.FATAL_ALL
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Adds a `Transport` to the manager
|
|
43
|
+
*/
|
|
44
|
+
add (transport: Transport) {
|
|
45
|
+
const tag = transport[Symbol.toStringTag]
|
|
46
|
+
|
|
47
|
+
if (tag == null) {
|
|
48
|
+
throw errCode(new Error('Transport must have a valid tag'), codes.ERR_INVALID_KEY)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (this.transports.has(tag)) {
|
|
52
|
+
throw errCode(new Error('There is already a transport with this tag'), codes.ERR_DUPLICATE_TRANSPORT)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
log('adding transport %s', tag)
|
|
56
|
+
|
|
57
|
+
this.transports.set(tag, transport)
|
|
58
|
+
|
|
59
|
+
if (!this.listeners.has(tag)) {
|
|
60
|
+
this.listeners.set(tag, [])
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
isStarted () {
|
|
65
|
+
return this.started
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async start () {
|
|
69
|
+
// Listen on the provided transports for the provided addresses
|
|
70
|
+
const addrs = this.components.getAddressManager().getListenAddrs()
|
|
71
|
+
|
|
72
|
+
await this.listen(addrs)
|
|
73
|
+
|
|
74
|
+
this.started = true
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Stops all listeners
|
|
79
|
+
*/
|
|
80
|
+
async stop () {
|
|
81
|
+
const tasks = []
|
|
82
|
+
for (const [key, listeners] of this.listeners) {
|
|
83
|
+
log('closing listeners for %s', key)
|
|
84
|
+
while (listeners.length > 0) {
|
|
85
|
+
const listener = listeners.pop()
|
|
86
|
+
|
|
87
|
+
if (listener == null) {
|
|
88
|
+
continue
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
tasks.push(listener.close())
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
await Promise.all(tasks)
|
|
96
|
+
log('all listeners closed')
|
|
97
|
+
for (const key of this.listeners.keys()) {
|
|
98
|
+
this.listeners.set(key, [])
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
this.started = false
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Dials the given Multiaddr over it's supported transport
|
|
106
|
+
*/
|
|
107
|
+
async dial (ma: Multiaddr, options?: AbortOptions): Promise<Connection> {
|
|
108
|
+
const transport = this.transportForMultiaddr(ma)
|
|
109
|
+
|
|
110
|
+
if (transport == null) {
|
|
111
|
+
throw errCode(new Error(`No transport available for address ${String(ma)}`), codes.ERR_TRANSPORT_UNAVAILABLE)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
return await transport.dial(ma, {
|
|
116
|
+
...options,
|
|
117
|
+
upgrader: this.components.getUpgrader()
|
|
118
|
+
})
|
|
119
|
+
} catch (err: any) {
|
|
120
|
+
if (err.code == null) {
|
|
121
|
+
err.code = codes.ERR_TRANSPORT_DIAL_FAILED
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
throw err
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Returns all Multiaddr's the listeners are using
|
|
130
|
+
*/
|
|
131
|
+
getAddrs (): Multiaddr[] {
|
|
132
|
+
let addrs: Multiaddr[] = []
|
|
133
|
+
for (const listeners of this.listeners.values()) {
|
|
134
|
+
for (const listener of listeners) {
|
|
135
|
+
addrs = [...addrs, ...listener.getAddrs()]
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return addrs
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Returns all the transports instances
|
|
143
|
+
*/
|
|
144
|
+
getTransports () {
|
|
145
|
+
return Array.of(...this.transports.values())
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Finds a transport that matches the given Multiaddr
|
|
150
|
+
*/
|
|
151
|
+
transportForMultiaddr (ma: Multiaddr) {
|
|
152
|
+
for (const transport of this.transports.values()) {
|
|
153
|
+
const addrs = transport.filter([ma])
|
|
154
|
+
|
|
155
|
+
if (addrs.length > 0) {
|
|
156
|
+
return transport
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Starts listeners for each listen Multiaddr
|
|
163
|
+
*/
|
|
164
|
+
async listen (addrs: Multiaddr[]) {
|
|
165
|
+
if (addrs == null || addrs.length === 0) {
|
|
166
|
+
log('no addresses were provided for listening, this node is dial only')
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const couldNotListen = []
|
|
171
|
+
|
|
172
|
+
for (const [key, transport] of this.transports.entries()) {
|
|
173
|
+
const supportedAddrs = transport.filter(addrs)
|
|
174
|
+
const tasks = []
|
|
175
|
+
|
|
176
|
+
// For each supported multiaddr, create a listener
|
|
177
|
+
for (const addr of supportedAddrs) {
|
|
178
|
+
log('creating listener for %s on %s', key, addr)
|
|
179
|
+
const listener = transport.createListener({
|
|
180
|
+
upgrader: this.components.getUpgrader()
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
let listeners = this.listeners.get(key)
|
|
184
|
+
|
|
185
|
+
if (listeners == null) {
|
|
186
|
+
listeners = []
|
|
187
|
+
this.listeners.set(key, listeners)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
listeners.push(listener)
|
|
191
|
+
|
|
192
|
+
// Track listen/close events
|
|
193
|
+
listener.addEventListener('listening', () => {
|
|
194
|
+
this.dispatchEvent(new CustomEvent<Listener>('listener:listening', {
|
|
195
|
+
detail: listener
|
|
196
|
+
}))
|
|
197
|
+
})
|
|
198
|
+
listener.addEventListener('close', () => {
|
|
199
|
+
this.dispatchEvent(new CustomEvent<Listener>('listener:close', {
|
|
200
|
+
detail: listener
|
|
201
|
+
}))
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
// We need to attempt to listen on everything
|
|
205
|
+
tasks.push(listener.listen(addr))
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Keep track of transports we had no addresses for
|
|
209
|
+
if (tasks.length === 0) {
|
|
210
|
+
couldNotListen.push(key)
|
|
211
|
+
continue
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const results = await pSettle(tasks)
|
|
215
|
+
// If we are listening on at least 1 address, succeed.
|
|
216
|
+
// TODO: we should look at adding a retry (`p-retry`) here to better support
|
|
217
|
+
// listening on remote addresses as they may be offline. We could then potentially
|
|
218
|
+
// just wait for any (`p-any`) listener to succeed on each transport before returning
|
|
219
|
+
const isListening = results.find(r => r.isFulfilled)
|
|
220
|
+
if ((isListening == null) && this.faultTolerance !== FaultTolerance.NO_FATAL) {
|
|
221
|
+
throw errCode(new Error(`Transport (${key}) could not listen on any available address`), codes.ERR_NO_VALID_ADDRESSES)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// If no transports were able to listen, throw an error. This likely
|
|
226
|
+
// means we were given addresses we do not have transports for
|
|
227
|
+
if (couldNotListen.length === this.transports.size) {
|
|
228
|
+
const message = `no valid addresses were provided for transports [${couldNotListen.join(', ')}]`
|
|
229
|
+
if (this.faultTolerance === FaultTolerance.FATAL_ALL) {
|
|
230
|
+
throw errCode(new Error(message), codes.ERR_NO_VALID_ADDRESSES)
|
|
231
|
+
}
|
|
232
|
+
log(`libp2p in dial mode only: ${message}`)
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Removes the given transport from the manager.
|
|
238
|
+
* If a transport has any running listeners, they will be closed.
|
|
239
|
+
*/
|
|
240
|
+
async remove (key: string) {
|
|
241
|
+
log('removing %s', key)
|
|
242
|
+
|
|
243
|
+
// Close any running listeners
|
|
244
|
+
for (const listener of this.listeners.get(key) ?? []) {
|
|
245
|
+
await listener.close()
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
this.transports.delete(key)
|
|
249
|
+
this.listeners.delete(key)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Removes all transports from the manager.
|
|
254
|
+
* If any listeners are running, they will be closed.
|
|
255
|
+
*
|
|
256
|
+
* @async
|
|
257
|
+
*/
|
|
258
|
+
async removeAll () {
|
|
259
|
+
const tasks = []
|
|
260
|
+
for (const key of this.transports.keys()) {
|
|
261
|
+
tasks.push(this.remove(key))
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
await Promise.all(tasks)
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Enum Transport Manager Fault Tolerance values
|
|
270
|
+
*/
|
|
271
|
+
export enum FaultTolerance {
|
|
272
|
+
/**
|
|
273
|
+
* should be used for failing in any listen circumstance
|
|
274
|
+
*/
|
|
275
|
+
FATAL_ALL = 0,
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* should be used for not failing when not listening
|
|
279
|
+
*/
|
|
280
|
+
NO_FATAL
|
|
281
|
+
}
|