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,194 @@
|
|
|
1
|
+
import { upnpNat, NatAPI } from '@achingbrain/nat-port-mapper'
|
|
2
|
+
import { logger } from '@libp2p/logger'
|
|
3
|
+
import { Multiaddr } from '@multiformats/multiaddr'
|
|
4
|
+
import { isBrowser } from 'wherearewe'
|
|
5
|
+
import isPrivateIp from 'private-ip'
|
|
6
|
+
import * as pkg from './version.js'
|
|
7
|
+
import errCode from 'err-code'
|
|
8
|
+
import { codes } from './errors.js'
|
|
9
|
+
import { isLoopback } from '@libp2p/utils/multiaddr/is-loopback'
|
|
10
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
11
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
12
|
+
|
|
13
|
+
const log = logger('libp2p:nat')
|
|
14
|
+
const DEFAULT_TTL = 7200
|
|
15
|
+
|
|
16
|
+
function highPort (min = 1024, max = 65535) {
|
|
17
|
+
return Math.floor(Math.random() * (max - min + 1) + min)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface PMPOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Whether to enable PMP as well as UPnP
|
|
23
|
+
*/
|
|
24
|
+
enabled?: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface NatManagerInit {
|
|
28
|
+
/**
|
|
29
|
+
* Whether to enable the NAT manager
|
|
30
|
+
*/
|
|
31
|
+
enabled: boolean
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Pass a value to use instead of auto-detection
|
|
35
|
+
*/
|
|
36
|
+
externalAddress?: string
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Pass a value to use instead of auto-detection
|
|
40
|
+
*/
|
|
41
|
+
localAddress?: string
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A string value to use for the port mapping description on the gateway
|
|
45
|
+
*/
|
|
46
|
+
description?: string
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* How long UPnP port mappings should last for in seconds (minimum 1200)
|
|
50
|
+
*/
|
|
51
|
+
ttl?: number
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Whether to automatically refresh UPnP port mappings when their TTL is reached
|
|
55
|
+
*/
|
|
56
|
+
keepAlive: boolean
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Pass a value to use instead of auto-detection
|
|
60
|
+
*/
|
|
61
|
+
gateway?: string
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class NatManager implements Startable {
|
|
65
|
+
private readonly components: Components
|
|
66
|
+
private readonly enabled: boolean
|
|
67
|
+
private readonly externalAddress?: string
|
|
68
|
+
private readonly localAddress?: string
|
|
69
|
+
private readonly description: string
|
|
70
|
+
private readonly ttl: number
|
|
71
|
+
private readonly keepAlive: boolean
|
|
72
|
+
private readonly gateway?: string
|
|
73
|
+
private started: boolean
|
|
74
|
+
private client?: NatAPI
|
|
75
|
+
|
|
76
|
+
constructor (components: Components, init: NatManagerInit) {
|
|
77
|
+
this.components = components
|
|
78
|
+
|
|
79
|
+
this.started = false
|
|
80
|
+
this.enabled = init.enabled
|
|
81
|
+
this.externalAddress = init.externalAddress
|
|
82
|
+
this.localAddress = init.localAddress
|
|
83
|
+
this.description = init.description ?? `${pkg.name}@${pkg.version} ${this.components.getPeerId().toString()}`
|
|
84
|
+
this.ttl = init.ttl ?? DEFAULT_TTL
|
|
85
|
+
this.keepAlive = init.keepAlive ?? true
|
|
86
|
+
this.gateway = init.gateway
|
|
87
|
+
|
|
88
|
+
if (this.ttl < DEFAULT_TTL) {
|
|
89
|
+
throw errCode(new Error(`NatManager ttl should be at least ${DEFAULT_TTL} seconds`), codes.ERR_INVALID_PARAMETERS)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
isStarted () {
|
|
94
|
+
return this.started
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Starts the NAT manager
|
|
99
|
+
*/
|
|
100
|
+
start () {
|
|
101
|
+
if (isBrowser || !this.enabled || this.started) {
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.started = true
|
|
106
|
+
|
|
107
|
+
// done async to not slow down startup
|
|
108
|
+
this._start().catch((err) => {
|
|
109
|
+
// hole punching errors are non-fatal
|
|
110
|
+
log.error(err)
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async _start () {
|
|
115
|
+
const addrs = this.components.getTransportManager().getAddrs()
|
|
116
|
+
|
|
117
|
+
for (const addr of addrs) {
|
|
118
|
+
// try to open uPnP ports for each thin waist address
|
|
119
|
+
const { family, host, port, transport } = addr.toOptions()
|
|
120
|
+
|
|
121
|
+
if (!addr.isThinWaistAddress() || transport !== 'tcp') {
|
|
122
|
+
// only bare tcp addresses
|
|
123
|
+
// eslint-disable-next-line no-continue
|
|
124
|
+
continue
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (isLoopback(addr)) {
|
|
128
|
+
// eslint-disable-next-line no-continue
|
|
129
|
+
continue
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (family !== 4) {
|
|
133
|
+
// ignore ipv6
|
|
134
|
+
// eslint-disable-next-line no-continue
|
|
135
|
+
continue
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const client = await this._getClient()
|
|
139
|
+
const publicIp = this.externalAddress ?? await client.externalIp()
|
|
140
|
+
|
|
141
|
+
if (isPrivateIp(publicIp)) {
|
|
142
|
+
throw new Error(`${publicIp} is private - please set config.nat.externalIp to an externally routable IP or ensure you are not behind a double NAT`)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const publicPort = highPort()
|
|
146
|
+
|
|
147
|
+
log(`opening uPnP connection from ${publicIp}:${publicPort} to ${host}:${port}`)
|
|
148
|
+
|
|
149
|
+
await client.map({
|
|
150
|
+
publicPort,
|
|
151
|
+
localPort: port,
|
|
152
|
+
localAddress: this.localAddress,
|
|
153
|
+
protocol: transport.toUpperCase() === 'TCP' ? 'TCP' : 'UDP'
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
this.components.getAddressManager().addObservedAddr(Multiaddr.fromNodeAddress({
|
|
157
|
+
family: 4,
|
|
158
|
+
address: publicIp,
|
|
159
|
+
port: publicPort
|
|
160
|
+
}, transport))
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async _getClient () {
|
|
165
|
+
if (this.client != null) {
|
|
166
|
+
return this.client
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
this.client = await upnpNat({
|
|
170
|
+
description: this.description,
|
|
171
|
+
ttl: this.ttl,
|
|
172
|
+
keepAlive: this.keepAlive,
|
|
173
|
+
gateway: this.gateway
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
return this.client
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Stops the NAT manager
|
|
181
|
+
*/
|
|
182
|
+
async stop () {
|
|
183
|
+
if (isBrowser || this.client == null) {
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
await this.client.close()
|
|
189
|
+
this.client = undefined
|
|
190
|
+
} catch (err: any) {
|
|
191
|
+
log.error(err)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { RecordEnvelope, PeerRecord } from '@libp2p/peer-record'
|
|
2
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
3
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
4
|
+
import { logger } from '@libp2p/logger'
|
|
5
|
+
import { protocols } from '@multiformats/multiaddr'
|
|
6
|
+
|
|
7
|
+
const log = logger('libp2p:peer-record-updater')
|
|
8
|
+
|
|
9
|
+
export class PeerRecordUpdater implements Startable {
|
|
10
|
+
private readonly components: Components
|
|
11
|
+
private started: boolean
|
|
12
|
+
|
|
13
|
+
constructor (components: Components) {
|
|
14
|
+
this.components = components
|
|
15
|
+
this.started = false
|
|
16
|
+
this.update = this.update.bind(this)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
isStarted () {
|
|
20
|
+
return this.started
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async start () {
|
|
24
|
+
this.started = true
|
|
25
|
+
this.components.getTransportManager().addEventListener('listener:listening', this.update)
|
|
26
|
+
this.components.getTransportManager().addEventListener('listener:close', this.update)
|
|
27
|
+
this.components.getAddressManager().addEventListener('change:addresses', this.update)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async stop () {
|
|
31
|
+
this.started = false
|
|
32
|
+
this.components.getTransportManager().removeEventListener('listener:listening', this.update)
|
|
33
|
+
this.components.getTransportManager().removeEventListener('listener:close', this.update)
|
|
34
|
+
this.components.getAddressManager().removeEventListener('change:addresses', this.update)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Create (or update if existing) self peer record and store it in the AddressBook.
|
|
39
|
+
*/
|
|
40
|
+
update () {
|
|
41
|
+
Promise.resolve()
|
|
42
|
+
.then(async () => {
|
|
43
|
+
const peerRecord = new PeerRecord({
|
|
44
|
+
peerId: this.components.getPeerId(),
|
|
45
|
+
multiaddrs: this.components.getAddressManager().getAddresses().map(ma => ma.decapsulateCode(protocols('p2p').code))
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const envelope = await RecordEnvelope.seal(peerRecord, this.components.getPeerId())
|
|
49
|
+
await this.components.getPeerStore().addressBook.consumePeerRecord(envelope)
|
|
50
|
+
})
|
|
51
|
+
.catch(err => {
|
|
52
|
+
log.error('Could not update self peer record: %o', err)
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import errCode from 'err-code'
|
|
3
|
+
import { codes, messages } from './errors.js'
|
|
4
|
+
import {
|
|
5
|
+
storeAddresses,
|
|
6
|
+
uniquePeers,
|
|
7
|
+
requirePeers
|
|
8
|
+
} from './content-routing/utils.js'
|
|
9
|
+
import { TimeoutController } from 'timeout-abort-controller'
|
|
10
|
+
import merge from 'it-merge'
|
|
11
|
+
import { pipe } from 'it-pipe'
|
|
12
|
+
import first from 'it-first'
|
|
13
|
+
import drain from 'it-drain'
|
|
14
|
+
import filter from 'it-filter'
|
|
15
|
+
import {
|
|
16
|
+
setDelayedInterval,
|
|
17
|
+
clearDelayedInterval
|
|
18
|
+
// @ts-expect-error module with no types
|
|
19
|
+
} from 'set-delayed-interval'
|
|
20
|
+
// @ts-expect-error setMaxListeners is missing from the node 16 types
|
|
21
|
+
import { setMaxListeners } from 'events'
|
|
22
|
+
import type { PeerId } from '@libp2p/interfaces/peer-id'
|
|
23
|
+
import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
|
|
24
|
+
import type { AbortOptions } from '@libp2p/interfaces'
|
|
25
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
26
|
+
import type { PeerInfo } from '@libp2p/interfaces/peer-info'
|
|
27
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
28
|
+
|
|
29
|
+
const log = logger('libp2p:peer-routing')
|
|
30
|
+
|
|
31
|
+
export interface RefreshManagerInit {
|
|
32
|
+
/**
|
|
33
|
+
* Whether to enable the Refresh manager
|
|
34
|
+
*/
|
|
35
|
+
enabled?: boolean
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Boot delay to start the Refresh Manager (in ms)
|
|
39
|
+
*/
|
|
40
|
+
bootDelay?: number
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Interval between each Refresh Manager run (in ms)
|
|
44
|
+
*/
|
|
45
|
+
interval?: number
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* How long to let each refresh run (in ms)
|
|
49
|
+
*/
|
|
50
|
+
timeout?: number
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface PeerRoutingInit {
|
|
54
|
+
routers: PeerRouting[]
|
|
55
|
+
refreshManager?: RefreshManagerInit
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export class DefaultPeerRouting implements PeerRouting, Startable {
|
|
59
|
+
private readonly components: Components
|
|
60
|
+
private readonly routers: PeerRouting[]
|
|
61
|
+
private readonly refreshManagerInit: RefreshManagerInit
|
|
62
|
+
private timeoutId?: ReturnType<typeof setTimeout>
|
|
63
|
+
private started: boolean
|
|
64
|
+
private abortController?: TimeoutController
|
|
65
|
+
|
|
66
|
+
constructor (components: Components, init: PeerRoutingInit) {
|
|
67
|
+
this.components = components
|
|
68
|
+
this.routers = init.routers
|
|
69
|
+
this.refreshManagerInit = init.refreshManager ?? {}
|
|
70
|
+
this.started = false
|
|
71
|
+
|
|
72
|
+
this._findClosestPeersTask = this._findClosestPeersTask.bind(this)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
isStarted () {
|
|
76
|
+
return this.started
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Start peer routing service.
|
|
81
|
+
*/
|
|
82
|
+
async start () {
|
|
83
|
+
if (this.started || this.routers.length === 0 || this.timeoutId != null || this.refreshManagerInit.enabled === false) {
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.timeoutId = setDelayedInterval(
|
|
88
|
+
this._findClosestPeersTask, this.refreshManagerInit.interval, this.refreshManagerInit.bootDelay
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
this.started = true
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Recurrent task to find closest peers and add their addresses to the Address Book.
|
|
96
|
+
*/
|
|
97
|
+
async _findClosestPeersTask () {
|
|
98
|
+
if (this.abortController != null) {
|
|
99
|
+
// we are already running the query
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
this.abortController = new TimeoutController(this.refreshManagerInit.timeout ?? 10e3)
|
|
105
|
+
|
|
106
|
+
// this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
|
|
107
|
+
// appearing in the console
|
|
108
|
+
try {
|
|
109
|
+
// fails on node < 15.4
|
|
110
|
+
setMaxListeners?.(Infinity, this.abortController.signal)
|
|
111
|
+
} catch {}
|
|
112
|
+
|
|
113
|
+
// nb getClosestPeers adds the addresses to the address book
|
|
114
|
+
await drain(this.getClosestPeers(this.components.getPeerId().toBytes(), { signal: this.abortController.signal }))
|
|
115
|
+
} catch (err: any) {
|
|
116
|
+
log.error(err)
|
|
117
|
+
} finally {
|
|
118
|
+
this.abortController?.clear()
|
|
119
|
+
this.abortController = undefined
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Stop peer routing service.
|
|
125
|
+
*/
|
|
126
|
+
async stop () {
|
|
127
|
+
clearDelayedInterval(this.timeoutId)
|
|
128
|
+
|
|
129
|
+
// abort query if it is in-flight
|
|
130
|
+
this.abortController?.abort()
|
|
131
|
+
|
|
132
|
+
this.started = false
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Iterates over all peer routers in parallel to find the given peer
|
|
137
|
+
*/
|
|
138
|
+
async findPeer (id: PeerId, options?: AbortOptions): Promise<PeerInfo> {
|
|
139
|
+
if (this.routers.length === 0) {
|
|
140
|
+
throw errCode(new Error('No peer routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (id.toString() === this.components.getPeerId().toString()) {
|
|
144
|
+
throw errCode(new Error('Should not try to find self'), codes.ERR_FIND_SELF)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const output = await pipe(
|
|
148
|
+
merge(
|
|
149
|
+
...this.routers.map(router => (async function * () {
|
|
150
|
+
try {
|
|
151
|
+
yield await router.findPeer(id, options)
|
|
152
|
+
} catch (err) {
|
|
153
|
+
log.error(err)
|
|
154
|
+
}
|
|
155
|
+
})())
|
|
156
|
+
),
|
|
157
|
+
(source) => filter(source, Boolean),
|
|
158
|
+
(source) => storeAddresses(source, this.components.getPeerStore()),
|
|
159
|
+
async (source) => await first(source)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
if (output != null) {
|
|
163
|
+
return output
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Attempt to find the closest peers on the network to the given key
|
|
171
|
+
*/
|
|
172
|
+
async * getClosestPeers (key: Uint8Array, options?: AbortOptions): AsyncIterable<PeerInfo> {
|
|
173
|
+
if (this.routers.length === 0) {
|
|
174
|
+
throw errCode(new Error('No peer routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
yield * pipe(
|
|
178
|
+
merge(
|
|
179
|
+
...this.routers.map(router => router.getClosestPeers(key, options))
|
|
180
|
+
),
|
|
181
|
+
(source) => storeAddresses(source, this.components.getPeerStore()),
|
|
182
|
+
(source) => uniquePeers(source),
|
|
183
|
+
(source) => requirePeers(source)
|
|
184
|
+
)
|
|
185
|
+
}
|
|
186
|
+
}
|
package/src/ping/README.md
CHANGED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import errCode from 'err-code'
|
|
3
|
+
import { codes } from '../errors.js'
|
|
4
|
+
import { randomBytes } from '@libp2p/crypto'
|
|
5
|
+
import { pipe } from 'it-pipe'
|
|
6
|
+
import first from 'it-first'
|
|
7
|
+
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
8
|
+
import { PROTOCOL_NAME, PING_LENGTH, PROTOCOL_VERSION } from './constants.js'
|
|
9
|
+
import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
|
|
10
|
+
import type { PeerId } from '@libp2p/interfaces/peer-id'
|
|
11
|
+
import type { Startable } from '@libp2p/interfaces/startable'
|
|
12
|
+
import type { Components } from '@libp2p/interfaces/components'
|
|
13
|
+
|
|
14
|
+
const log = logger('libp2p:ping')
|
|
15
|
+
|
|
16
|
+
export interface PingServiceInit {
|
|
17
|
+
protocolPrefix: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class PingService implements Startable {
|
|
21
|
+
private readonly components: Components
|
|
22
|
+
private readonly protocol: string
|
|
23
|
+
private started: boolean
|
|
24
|
+
|
|
25
|
+
constructor (components: Components, init: PingServiceInit) {
|
|
26
|
+
this.components = components
|
|
27
|
+
this.started = false
|
|
28
|
+
this.protocol = `/${init.protocolPrefix}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async start () {
|
|
32
|
+
await this.components.getRegistrar().handle(this.protocol, this.handleMessage)
|
|
33
|
+
this.started = true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async stop () {
|
|
37
|
+
await this.components.getRegistrar().unhandle(this.protocol)
|
|
38
|
+
this.started = false
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
isStarted () {
|
|
42
|
+
return this.started
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A handler to register with Libp2p to process ping messages
|
|
47
|
+
*/
|
|
48
|
+
handleMessage (data: IncomingStreamData) {
|
|
49
|
+
const { stream } = data
|
|
50
|
+
|
|
51
|
+
void pipe(stream, stream)
|
|
52
|
+
.catch(err => {
|
|
53
|
+
log.error(err)
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Ping a given peer and wait for its response, getting the operation latency.
|
|
59
|
+
*
|
|
60
|
+
* @param {PeerId|Multiaddr} peer
|
|
61
|
+
* @returns {Promise<number>}
|
|
62
|
+
*/
|
|
63
|
+
async ping (peer: PeerId): Promise<number> {
|
|
64
|
+
log('dialing %s to %p', this.protocol, peer)
|
|
65
|
+
|
|
66
|
+
const connection = await this.components.getConnectionManager().openConnection(peer)
|
|
67
|
+
const { stream } = await connection.newStream([this.protocol])
|
|
68
|
+
const start = Date.now()
|
|
69
|
+
const data = randomBytes(PING_LENGTH)
|
|
70
|
+
|
|
71
|
+
const result = await pipe(
|
|
72
|
+
[data],
|
|
73
|
+
stream,
|
|
74
|
+
async (source) => await first(source)
|
|
75
|
+
)
|
|
76
|
+
const end = Date.now()
|
|
77
|
+
|
|
78
|
+
if (result == null || !uint8ArrayEquals(data, result)) {
|
|
79
|
+
throw errCode(new Error('Received wrong ping ack'), codes.ERR_WRONG_PING_ACK)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return end - start
|
|
83
|
+
}
|
|
84
|
+
}
|
package/src/pnet/README.md
CHANGED
|
@@ -20,7 +20,7 @@ js-libp2p-pnet
|
|
|
20
20
|
## Usage
|
|
21
21
|
|
|
22
22
|
```js
|
|
23
|
-
const Protector
|
|
23
|
+
const Protector from 'libp2p-pnet')
|
|
24
24
|
const protector = new Protector(swarmKeyBuffer)
|
|
25
25
|
const privateConnection = protector.protect(myPublicConnection, (err) => { })
|
|
26
26
|
```
|
|
@@ -63,7 +63,7 @@ node -e "require('libp2p/src/pnet').generate(process.stdout)" > swarm.key
|
|
|
63
63
|
#### Programmatically
|
|
64
64
|
|
|
65
65
|
```js
|
|
66
|
-
const writeKey
|
|
66
|
+
const writeKey from 'libp2p/src/pnet').generate
|
|
67
67
|
const swarmKey = new Uint8Array(95)
|
|
68
68
|
writeKey(swarmKey)
|
|
69
69
|
fs.writeFileSync('swarm.key', swarmKey)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { logger } from '@libp2p/logger'
|
|
2
|
+
import * as Errors from './errors.js'
|
|
3
|
+
import xsalsa20 from 'xsalsa20'
|
|
4
|
+
import { KEY_LENGTH } from './key-generator.js'
|
|
5
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
6
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
7
|
+
import type { Source } from 'it-stream-types'
|
|
8
|
+
|
|
9
|
+
const log = logger('libp2p:pnet')
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a stream iterable to encrypt messages in a private network
|
|
13
|
+
*/
|
|
14
|
+
export function createBoxStream (nonce: Uint8Array, psk: Uint8Array) {
|
|
15
|
+
const xor = xsalsa20(nonce, psk)
|
|
16
|
+
|
|
17
|
+
return (source: Source<Uint8Array>) => (async function * () {
|
|
18
|
+
for await (const chunk of source) {
|
|
19
|
+
yield Uint8Array.from(xor.update(chunk.slice()))
|
|
20
|
+
}
|
|
21
|
+
})()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates a stream iterable to decrypt messages in a private network
|
|
26
|
+
*/
|
|
27
|
+
export function createUnboxStream (nonce: Uint8Array, psk: Uint8Array) {
|
|
28
|
+
return (source: Source<Uint8Array>) => (async function * () {
|
|
29
|
+
const xor = xsalsa20(nonce, psk)
|
|
30
|
+
log.trace('Decryption enabled')
|
|
31
|
+
|
|
32
|
+
for await (const chunk of source) {
|
|
33
|
+
yield Uint8Array.from(xor.update(chunk.slice()))
|
|
34
|
+
}
|
|
35
|
+
})()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Decode the version 1 psk from the given Uint8Array
|
|
40
|
+
*/
|
|
41
|
+
export function decodeV1PSK (pskBuffer: Uint8Array) {
|
|
42
|
+
try {
|
|
43
|
+
// This should pull from multibase/multicodec to allow for
|
|
44
|
+
// more encoding flexibility. Ideally we'd consume the codecs
|
|
45
|
+
// from the buffer line by line to evaluate the next line
|
|
46
|
+
// programmatically instead of making assumptions about the
|
|
47
|
+
// encodings of each line.
|
|
48
|
+
const metadata = uint8ArrayToString(pskBuffer).split(/(?:\r\n|\r|\n)/g)
|
|
49
|
+
const pskTag = metadata.shift()
|
|
50
|
+
const codec = metadata.shift()
|
|
51
|
+
const pskString = metadata.shift()
|
|
52
|
+
const psk = uint8ArrayFromString(pskString ?? '', 'base16')
|
|
53
|
+
|
|
54
|
+
if (psk.byteLength !== KEY_LENGTH) {
|
|
55
|
+
throw new Error(Errors.INVALID_PSK)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
tag: pskTag,
|
|
60
|
+
codecName: codec,
|
|
61
|
+
psk: psk
|
|
62
|
+
}
|
|
63
|
+
} catch (err: any) {
|
|
64
|
+
log.error(err)
|
|
65
|
+
throw new Error(Errors.INVALID_PSK)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const INVALID_PEER = 'Not a valid peer connection'
|
|
2
|
+
export const INVALID_PSK = 'Your private shared key is invalid'
|
|
3
|
+
export const NO_LOCAL_ID = 'No local private key provided'
|
|
4
|
+
export const NO_HANDSHAKE_CONNECTION = 'No connection for the handshake provided'
|
|
5
|
+
export const STREAM_ENDED = 'Stream ended prematurely'
|