libp2p 0.36.0 → 0.36.2-199395d
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 +33 -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 +215 -0
- package/dist/src/circuit/auto-relay.js.map +1 -0
- package/dist/src/circuit/circuit/hop.d.ts +25 -52
- 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 +16 -8
- 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 +16 -35
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
- package/dist/src/circuit/circuit/stream-handler.js +60 -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 +54 -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/{protocol → pb}/index.d.ts +0 -0
- package/{src/circuit/protocol → dist/src/circuit/pb}/index.js +7 -9
- 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 +190 -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 +93 -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/index.d.ts +79 -144
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +295 -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 +26 -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/dialer/auto-dialer.d.ts +14 -0
- package/dist/src/dialer/auto-dialer.d.ts.map +1 -0
- package/dist/src/dialer/auto-dialer.js +24 -0
- package/dist/src/dialer/auto-dialer.js.map +1 -0
- package/dist/src/dialer/dial-request.d.ts +18 -46
- package/dist/src/dialer/dial-request.d.ts.map +1 -1
- package/dist/src/dialer/dial-request.js +83 -0
- package/dist/src/dialer/dial-request.js.map +1 -0
- package/dist/src/dialer/index.d.ts +41 -148
- package/dist/src/dialer/index.d.ts.map +1 -1
- package/dist/src/dialer/index.js +281 -0
- package/dist/src/dialer/index.js.map +1 -0
- package/dist/src/errors.d.ts +68 -63
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +73 -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 +130 -0
- package/dist/src/fetch/index.js.map +1 -0
- package/dist/src/fetch/{proto.d.ts → pb/proto.d.ts} +0 -0
- package/{src/fetch → dist/src/fetch/pb}/proto.js +7 -9
- 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 +40 -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/{src/identify → dist/src/identify/pb}/message.d.ts +20 -5
- package/{src/identify → dist/src/identify/pb}/message.js +83 -42
- package/dist/src/index.d.ts +157 -583
- 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 +78 -0
- package/dist/src/insecure/index.js.map +1 -0
- package/dist/src/insecure/{proto.d.ts → pb/proto.d.ts} +7 -1
- package/{src/insecure → dist/src/insecure/pb}/proto.js +39 -22
- 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 +62 -82
- package/dist/src/keychain/index.d.ts.map +1 -1
- package/dist/src/keychain/index.js +493 -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 +75 -0
- package/dist/src/libp2p.d.ts.map +1 -0
- package/dist/src/libp2p.js +368 -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 +45 -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 +39 -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 +26 -33
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +56 -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 +11 -20
- package/dist/src/pnet/index.d.ts.map +1 -1
- package/dist/src/pnet/index.js +66 -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/registrar.d.ts +27 -65
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +159 -0
- package/dist/src/registrar.js.map +1 -0
- package/dist/src/transport-manager.d.ts +34 -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 +145 -197
- package/src/address-manager/index.ts +129 -0
- package/src/circuit/README.md +16 -11
- package/src/circuit/auto-relay.ts +284 -0
- package/src/circuit/circuit/hop.ts +211 -0
- package/src/circuit/circuit/stop.ts +78 -0
- package/src/circuit/circuit/stream-handler.ts +87 -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.js → listener.ts} +21 -27
- package/src/circuit/multicodec.ts +2 -0
- package/src/circuit/{protocol → pb}/index.d.ts +0 -0
- package/src/circuit/pb/index.js +528 -0
- package/src/circuit/{protocol → pb}/index.proto +0 -0
- package/src/circuit/transport.ts +216 -0
- package/src/circuit/utils.ts +12 -0
- package/src/config.ts +101 -0
- package/src/connection-manager/auto-dialler.ts +154 -0
- package/src/connection-manager/index.ts +422 -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 +143 -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/dialer/auto-dialer.ts +40 -0
- package/src/dialer/{dial-request.js → dial-request.ts} +60 -51
- package/src/dialer/index.ts +374 -0
- package/src/errors.ts +71 -0
- package/src/fetch/README.md +1 -1
- package/src/fetch/constants.ts +3 -0
- package/src/fetch/{index.js → index.ts} +79 -70
- package/src/fetch/{proto.d.ts → pb/proto.d.ts} +0 -0
- package/src/fetch/pb/proto.js +331 -0
- package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
- package/src/get-peer.ts +57 -0
- package/src/identify/consts.ts +13 -0
- package/src/identify/index.ts +445 -0
- package/{dist/src/identify → src/identify/pb}/message.d.ts +20 -5
- package/src/identify/pb/message.js +369 -0
- package/src/identify/{message.proto → pb/message.proto} +0 -0
- package/src/index.ts +234 -0
- package/src/insecure/index.ts +97 -0
- package/src/insecure/{proto.d.ts → pb/proto.d.ts} +7 -1
- package/src/insecure/pb/proto.js +388 -0
- package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
- package/src/keychain/{cms.js → cms.ts} +62 -58
- package/src/keychain/index.ts +588 -0
- package/src/keychain/{util.js → util.ts} +7 -17
- package/src/libp2p.ts +501 -0
- package/src/metrics/index.ts +310 -0
- package/src/metrics/moving-average.ts +53 -0
- package/src/metrics/stats.ts +243 -0
- package/src/nat-manager.ts +194 -0
- package/src/peer-record-updater.ts +55 -0
- package/src/peer-routing.ts +185 -0
- package/src/ping/README.md +1 -1
- package/src/ping/constants.ts +5 -0
- package/src/ping/index.ts +83 -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 +95 -0
- package/src/pnet/key-generator.ts +28 -0
- package/src/registrar.ts +205 -0
- package/src/transport-manager.ts +279 -0
- package/src/upgrader.ts +499 -0
- package/src/version.ts +3 -0
- package/dist/index.min.js +0 -55
- package/dist/src/insecure/plaintext.d.ts +0 -12
- package/dist/src/insecure/plaintext.d.ts.map +0 -1
- 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/multicodec.js +0 -5
- 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 -363
- 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/get-peer.js +0 -49
- package/src/identify/consts.js +0 -15
- package/src/identify/index.js +0 -384
- package/src/index.js +0 -811
- package/src/insecure/plaintext.js +0 -95
- 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 -85
- 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,264 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
'use strict'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* This code is based on `latency-monitor` (https://github.com/mlucool/latency-monitor) by `mlucool` (https://github.com/mlucool), available under Apache License 2.0 (https://github.com/mlucool/latency-monitor/blob/master/LICENSE)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { EventEmitter } = require('events')
|
|
9
|
-
const VisibilityChangeEmitter = require('./visibility-change-emitter')
|
|
10
|
-
const debug = require('debug')('latency-monitor:LatencyMonitor')
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @typedef {Object} SummaryObject
|
|
14
|
-
* @property {number} events How many events were called
|
|
15
|
-
* @property {number} minMS What was the min time for a cb to be called
|
|
16
|
-
* @property {number} maxMS What was the max time for a cb to be called
|
|
17
|
-
* @property {number} avgMs What was the average time for a cb to be called
|
|
18
|
-
* @property {number} lengthMs How long this interval was in ms
|
|
19
|
-
*
|
|
20
|
-
* @typedef {Object} LatencyMonitorOptions
|
|
21
|
-
* @property {number} [latencyCheckIntervalMs=500] - How often to add a latency check event (ms)
|
|
22
|
-
* @property {number} [dataEmitIntervalMs=5000] - How often to summarize latency check events. null or 0 disables event firing
|
|
23
|
-
* @property {Function} [asyncTestFn] - What cb-style async function to use
|
|
24
|
-
* @property {number} [latencyRandomPercentage=5] - What percent (+/-) of latencyCheckIntervalMs should we randomly use? This helps avoid alignment to other events.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* A class to monitor latency of any async function which works in a browser or node. This works by periodically calling
|
|
29
|
-
* the asyncTestFn and timing how long it takes the callback to be called. It can also periodically emit stats about this.
|
|
30
|
-
* This can be disabled and stats can be pulled via setting dataEmitIntervalMs = 0.
|
|
31
|
-
*
|
|
32
|
-
* @extends {EventEmitter}
|
|
33
|
-
*
|
|
34
|
-
* The default implementation is an event loop latency monitor. This works by firing periodic events into the event loop
|
|
35
|
-
* and timing how long it takes to get back.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* const monitor = new LatencyMonitor();
|
|
39
|
-
* monitor.on('data', (summary) => console.log('Event Loop Latency: %O', summary));
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* const monitor = new LatencyMonitor({latencyCheckIntervalMs: 1000, dataEmitIntervalMs: 60000, asyncTestFn:ping});
|
|
43
|
-
* monitor.on('data', (summary) => console.log('Ping Pong Latency: %O', summary));
|
|
44
|
-
*/
|
|
45
|
-
class LatencyMonitor extends EventEmitter {
|
|
46
|
-
/**
|
|
47
|
-
* @class
|
|
48
|
-
* @param {LatencyMonitorOptions} [options]
|
|
49
|
-
*/
|
|
50
|
-
constructor ({ latencyCheckIntervalMs, dataEmitIntervalMs, asyncTestFn, latencyRandomPercentage } = {}) {
|
|
51
|
-
super()
|
|
52
|
-
const that = this
|
|
53
|
-
|
|
54
|
-
// 0 isn't valid here, so its ok to use ||
|
|
55
|
-
that.latencyCheckIntervalMs = latencyCheckIntervalMs || 500 // 0.5s
|
|
56
|
-
that.latencyRandomPercentage = latencyRandomPercentage || 10
|
|
57
|
-
that._latecyCheckMultiply = 2 * (that.latencyRandomPercentage / 100.0) * that.latencyCheckIntervalMs
|
|
58
|
-
that._latecyCheckSubtract = that._latecyCheckMultiply / 2
|
|
59
|
-
|
|
60
|
-
that.dataEmitIntervalMs = (dataEmitIntervalMs === null || dataEmitIntervalMs === 0)
|
|
61
|
-
? undefined
|
|
62
|
-
: dataEmitIntervalMs || 5 * 1000 // 5s
|
|
63
|
-
debug('latencyCheckIntervalMs: %s dataEmitIntervalMs: %s',
|
|
64
|
-
that.latencyCheckIntervalMs, that.dataEmitIntervalMs)
|
|
65
|
-
if (that.dataEmitIntervalMs) {
|
|
66
|
-
debug('Expecting ~%s events per summary', that.latencyCheckIntervalMs / that.dataEmitIntervalMs)
|
|
67
|
-
} else {
|
|
68
|
-
debug('Not emitting summaries')
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
that.asyncTestFn = asyncTestFn // If there is no asyncFn, we measure latency
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
start () {
|
|
75
|
-
// If process: use high resolution timer
|
|
76
|
-
if (globalThis.process && globalThis.process.hrtime) { // eslint-disable-line no-undef
|
|
77
|
-
debug('Using process.hrtime for timing')
|
|
78
|
-
this.now = globalThis.process.hrtime // eslint-disable-line no-undef
|
|
79
|
-
this.getDeltaMS = (startTime) => {
|
|
80
|
-
const hrtime = this.now(startTime)
|
|
81
|
-
return (hrtime[0] * 1000) + (hrtime[1] / 1000000)
|
|
82
|
-
}
|
|
83
|
-
// Let's try for a timer that only monotonically increases
|
|
84
|
-
} else if (typeof window !== 'undefined' && window.performance && window.performance.now) {
|
|
85
|
-
debug('Using performance.now for timing')
|
|
86
|
-
this.now = window.performance.now.bind(window.performance)
|
|
87
|
-
this.getDeltaMS = (startTime) => Math.round(this.now() - startTime)
|
|
88
|
-
} else {
|
|
89
|
-
debug('Using Date.now for timing')
|
|
90
|
-
this.now = Date.now
|
|
91
|
-
this.getDeltaMS = (startTime) => this.now() - startTime
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
this._latencyData = this._initLatencyData()
|
|
95
|
-
|
|
96
|
-
// We check for isBrowser because of browsers set max rates of timeouts when a page is hidden,
|
|
97
|
-
// so we fall back to another library
|
|
98
|
-
// See: http://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs
|
|
99
|
-
if (isBrowser()) {
|
|
100
|
-
this._visibilityChangeEmitter = new VisibilityChangeEmitter()
|
|
101
|
-
|
|
102
|
-
this._visibilityChangeEmitter.on('visibilityChange', (pageInFocus) => {
|
|
103
|
-
if (pageInFocus) {
|
|
104
|
-
this._startTimers()
|
|
105
|
-
} else {
|
|
106
|
-
this._emitSummary()
|
|
107
|
-
this._stopTimers()
|
|
108
|
-
}
|
|
109
|
-
})
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (!this._visibilityChangeEmitter || this._visibilityChangeEmitter.isVisible()) {
|
|
113
|
-
this._startTimers()
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
stop () {
|
|
118
|
-
this._stopTimers()
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Start internal timers
|
|
123
|
-
*
|
|
124
|
-
* @private
|
|
125
|
-
*/
|
|
126
|
-
_startTimers () {
|
|
127
|
-
// Timer already started, ignore this
|
|
128
|
-
if (this._checkLatencyID) {
|
|
129
|
-
return
|
|
130
|
-
}
|
|
131
|
-
this._checkLatency()
|
|
132
|
-
if (this.dataEmitIntervalMs) {
|
|
133
|
-
this._emitIntervalID = setInterval(() => this._emitSummary(), this.dataEmitIntervalMs)
|
|
134
|
-
if (typeof this._emitIntervalID.unref === 'function') {
|
|
135
|
-
this._emitIntervalID.unref() // Doesn't block exit
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Stop internal timers
|
|
142
|
-
*
|
|
143
|
-
* @private
|
|
144
|
-
*/
|
|
145
|
-
_stopTimers () {
|
|
146
|
-
if (this._checkLatencyID) {
|
|
147
|
-
clearTimeout(this._checkLatencyID)
|
|
148
|
-
this._checkLatencyID = undefined
|
|
149
|
-
}
|
|
150
|
-
if (this._emitIntervalID) {
|
|
151
|
-
clearInterval(this._emitIntervalID)
|
|
152
|
-
this._emitIntervalID = undefined
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Emit summary only if there were events. It might not have any events if it was forced via a page hidden/show
|
|
158
|
-
*
|
|
159
|
-
* @private
|
|
160
|
-
*/
|
|
161
|
-
_emitSummary () {
|
|
162
|
-
const summary = this.getSummary()
|
|
163
|
-
if (summary.events > 0) {
|
|
164
|
-
this.emit('data', summary)
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Calling this function will end the collection period. If a timing event was already fired and somewhere in the queue,
|
|
170
|
-
* it will not count for this time period
|
|
171
|
-
*
|
|
172
|
-
* @returns {SummaryObject}
|
|
173
|
-
*/
|
|
174
|
-
getSummary () {
|
|
175
|
-
// We might want to adjust for the number of expected events
|
|
176
|
-
// Example: first 1 event it comes back, then such a long blocker that the next emit check comes
|
|
177
|
-
// Then this fires - looks like no latency!!
|
|
178
|
-
const latency = {
|
|
179
|
-
events: this._latencyData.events,
|
|
180
|
-
minMs: this._latencyData.minMs,
|
|
181
|
-
maxMs: this._latencyData.maxMs,
|
|
182
|
-
avgMs: this._latencyData.events
|
|
183
|
-
? this._latencyData.totalMs / this._latencyData.events
|
|
184
|
-
: Number.POSITIVE_INFINITY,
|
|
185
|
-
lengthMs: this.getDeltaMS(this._latencyData.startTime)
|
|
186
|
-
}
|
|
187
|
-
this._latencyData = this._initLatencyData() // Clear
|
|
188
|
-
|
|
189
|
-
debug('Summary: %O', latency)
|
|
190
|
-
return latency
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Randomly calls an async fn every roughly latencyCheckIntervalMs (plus some randomness). If no async fn is found,
|
|
195
|
-
* it will simply report on event loop latency.
|
|
196
|
-
*
|
|
197
|
-
* @private
|
|
198
|
-
*/
|
|
199
|
-
_checkLatency () {
|
|
200
|
-
const that = this
|
|
201
|
-
// Randomness is needed to avoid alignment by accident to regular things in the event loop
|
|
202
|
-
const randomness = (Math.random() * that._latecyCheckMultiply) - that._latecyCheckSubtract
|
|
203
|
-
|
|
204
|
-
// We use this to ensure that in case some overlap somehow, we don't take the wrong startTime/offset
|
|
205
|
-
const localData = {
|
|
206
|
-
deltaOffset: Math.ceil(that.latencyCheckIntervalMs + randomness),
|
|
207
|
-
startTime: that.now()
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const cb = () => {
|
|
211
|
-
// We are already stopped, ignore this datapoint
|
|
212
|
-
if (!this._checkLatencyID) {
|
|
213
|
-
return
|
|
214
|
-
}
|
|
215
|
-
const deltaMS = that.getDeltaMS(localData.startTime) - localData.deltaOffset
|
|
216
|
-
that._checkLatency() // Start again ASAP
|
|
217
|
-
|
|
218
|
-
// Add the data point. If this gets complex, refactor it
|
|
219
|
-
that._latencyData.events++
|
|
220
|
-
that._latencyData.minMs = Math.min(that._latencyData.minMs, deltaMS)
|
|
221
|
-
that._latencyData.maxMs = Math.max(that._latencyData.maxMs, deltaMS)
|
|
222
|
-
that._latencyData.totalMs += deltaMS
|
|
223
|
-
debug('MS: %s Data: %O', deltaMS, that._latencyData)
|
|
224
|
-
}
|
|
225
|
-
debug('localData: %O', localData)
|
|
226
|
-
|
|
227
|
-
this._checkLatencyID = setTimeout(() => {
|
|
228
|
-
// This gets rid of including event loop
|
|
229
|
-
if (that.asyncTestFn) {
|
|
230
|
-
// Clear timing related things
|
|
231
|
-
localData.deltaOffset = 0
|
|
232
|
-
localData.startTime = that.now()
|
|
233
|
-
that.asyncTestFn(cb)
|
|
234
|
-
} else {
|
|
235
|
-
// setTimeout is not more accurate than 1ms, so this will ensure positive numbers. Add 1 to emitted data to remove.
|
|
236
|
-
// This is not the best, but for now it'll be just fine. This isn't meant to be sub ms accurate.
|
|
237
|
-
localData.deltaOffset -= 1
|
|
238
|
-
// If there is no function to test, we mean check latency which is a special case that is really cb => cb()
|
|
239
|
-
// We avoid that for the few extra function all overheads. Also, we want to keep the timers different
|
|
240
|
-
cb()
|
|
241
|
-
}
|
|
242
|
-
}, localData.deltaOffset)
|
|
243
|
-
|
|
244
|
-
if (typeof this._checkLatencyID.unref === 'function') {
|
|
245
|
-
this._checkLatencyID.unref() // Doesn't block exit
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
_initLatencyData () {
|
|
250
|
-
return {
|
|
251
|
-
startTime: this.now(),
|
|
252
|
-
minMs: Number.POSITIVE_INFINITY,
|
|
253
|
-
maxMs: Number.NEGATIVE_INFINITY,
|
|
254
|
-
events: 0,
|
|
255
|
-
totalMs: 0
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function isBrowser () {
|
|
261
|
-
return typeof window !== 'undefined'
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
module.exports = LatencyMonitor
|
package/src/constants.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
module.exports = {
|
|
4
|
-
DIAL_TIMEOUT: 30e3, // How long in ms a dial attempt is allowed to take
|
|
5
|
-
MAX_PARALLEL_DIALS: 100, // Maximum allowed concurrent dials
|
|
6
|
-
MAX_PER_PEER_DIALS: 4, // Allowed parallel dials per DialRequest
|
|
7
|
-
MAX_ADDRS_TO_DIAL: 25, // Maximum number of allowed addresses to attempt to dial
|
|
8
|
-
METRICS: {
|
|
9
|
-
computeThrottleMaxQueueSize: 1000,
|
|
10
|
-
computeThrottleTimeout: 2000,
|
|
11
|
-
movingAverageIntervals: [
|
|
12
|
-
60 * 1000, // 1 minute
|
|
13
|
-
5 * 60 * 1000, // 5 minutes
|
|
14
|
-
15 * 60 * 1000 // 15 minutes
|
|
15
|
-
],
|
|
16
|
-
maxOldPeersRetention: 50
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const errCode = require('err-code')
|
|
4
|
-
const { messages, codes } = require('../errors')
|
|
5
|
-
const {
|
|
6
|
-
storeAddresses,
|
|
7
|
-
uniquePeers,
|
|
8
|
-
requirePeers,
|
|
9
|
-
maybeLimitSource
|
|
10
|
-
} = require('./utils')
|
|
11
|
-
const drain = require('it-drain')
|
|
12
|
-
const merge = require('it-merge')
|
|
13
|
-
const { pipe } = require('it-pipe')
|
|
14
|
-
const { DHTContentRouting } = require('../dht/dht-content-routing')
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @typedef {import('peer-id')} PeerId
|
|
18
|
-
* @typedef {import('multiaddr').Multiaddr} Multiaddr
|
|
19
|
-
* @typedef {import('multiformats/cid').CID} CID
|
|
20
|
-
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRoutingModule
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @typedef {Object} GetData
|
|
25
|
-
* @property {PeerId} from
|
|
26
|
-
* @property {Uint8Array} val
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
class ContentRouting {
|
|
30
|
-
/**
|
|
31
|
-
* @class
|
|
32
|
-
* @param {import('..')} libp2p
|
|
33
|
-
*/
|
|
34
|
-
constructor (libp2p) {
|
|
35
|
-
this.libp2p = libp2p
|
|
36
|
-
/** @type {ContentRoutingModule[]} */
|
|
37
|
-
this.routers = libp2p._modules.contentRouting || []
|
|
38
|
-
this.dht = libp2p._dht
|
|
39
|
-
|
|
40
|
-
// If we have the dht, add it to the available content routers
|
|
41
|
-
if (this.dht && libp2p._config.dht.enabled) {
|
|
42
|
-
this.routers.push(new DHTContentRouting(this.dht))
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Iterates over all content routers in parallel to find providers of the given key.
|
|
48
|
-
*
|
|
49
|
-
* @param {CID} key - The CID key of the content to find
|
|
50
|
-
* @param {object} [options]
|
|
51
|
-
* @param {number} [options.timeout] - How long the query should run
|
|
52
|
-
* @param {number} [options.maxNumProviders] - maximum number of providers to find
|
|
53
|
-
* @returns {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>}
|
|
54
|
-
*/
|
|
55
|
-
async * findProviders (key, options = {}) {
|
|
56
|
-
if (!this.routers.length) {
|
|
57
|
-
throw errCode(new Error('No content this.routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
yield * pipe(
|
|
61
|
-
merge(
|
|
62
|
-
...this.routers.map(router => router.findProviders(key, options))
|
|
63
|
-
),
|
|
64
|
-
(source) => storeAddresses(source, this.libp2p.peerStore),
|
|
65
|
-
(source) => uniquePeers(source),
|
|
66
|
-
(source) => maybeLimitSource(source, options.maxNumProviders),
|
|
67
|
-
(source) => requirePeers(source)
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Iterates over all content routers in parallel to notify it is
|
|
73
|
-
* a provider of the given key.
|
|
74
|
-
*
|
|
75
|
-
* @param {CID} key - The CID key of the content to find
|
|
76
|
-
* @returns {Promise<void>}
|
|
77
|
-
*/
|
|
78
|
-
async provide (key) {
|
|
79
|
-
if (!this.routers.length) {
|
|
80
|
-
throw errCode(new Error('No content routers available'), codes.ERR_NO_ROUTERS_AVAILABLE)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
await Promise.all(this.routers.map((router) => router.provide(key)))
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Store the given key/value pair in the DHT.
|
|
88
|
-
*
|
|
89
|
-
* @param {Uint8Array} key
|
|
90
|
-
* @param {Uint8Array} value
|
|
91
|
-
* @param {Object} [options] - put options
|
|
92
|
-
* @param {number} [options.minPeers] - minimum number of peers required to successfully put
|
|
93
|
-
* @returns {Promise<void>}
|
|
94
|
-
*/
|
|
95
|
-
async put (key, value, options) {
|
|
96
|
-
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
|
97
|
-
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
await drain(this.dht.put(key, value, options))
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Get the value to the given key.
|
|
105
|
-
* Times out after 1 minute by default.
|
|
106
|
-
*
|
|
107
|
-
* @param {Uint8Array} key
|
|
108
|
-
* @param {Object} [options] - get options
|
|
109
|
-
* @param {number} [options.timeout] - optional timeout (default: 60000)
|
|
110
|
-
* @returns {Promise<GetData>}
|
|
111
|
-
*/
|
|
112
|
-
async get (key, options) {
|
|
113
|
-
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
|
114
|
-
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
for await (const event of this.dht.get(key, options)) {
|
|
118
|
-
if (event.name === 'VALUE') {
|
|
119
|
-
return { from: event.peerId, val: event.value }
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Get the `n` values to the given key without sorting.
|
|
128
|
-
*
|
|
129
|
-
* @param {Uint8Array} key
|
|
130
|
-
* @param {number} nVals
|
|
131
|
-
* @param {Object} [options] - get options
|
|
132
|
-
* @param {number} [options.timeout] - optional timeout (default: 60000)
|
|
133
|
-
*/
|
|
134
|
-
async * getMany (key, nVals, options) { // eslint-disable-line require-await
|
|
135
|
-
if (!this.libp2p.isStarted() || !this.dht.isStarted) {
|
|
136
|
-
throw errCode(new Error(messages.NOT_STARTED_YET), codes.DHT_NOT_STARTED)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!nVals) {
|
|
140
|
-
return
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
let gotValues = 0
|
|
144
|
-
|
|
145
|
-
for await (const event of this.dht.get(key, options)) {
|
|
146
|
-
if (event.name === 'VALUE') {
|
|
147
|
-
yield { from: event.peerId, val: event.value }
|
|
148
|
-
|
|
149
|
-
gotValues++
|
|
150
|
-
|
|
151
|
-
if (gotValues === nVals) {
|
|
152
|
-
break
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (gotValues === 0) {
|
|
158
|
-
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
module.exports = ContentRouting
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const errCode = require('err-code')
|
|
4
|
-
const filter = require('it-filter')
|
|
5
|
-
const map = require('it-map')
|
|
6
|
-
const take = require('it-take')
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @typedef {import('peer-id')} PeerId
|
|
10
|
-
* @typedef {import('multiaddr').Multiaddr} Multiaddr
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Store the multiaddrs from every peer in the passed peer store
|
|
15
|
-
*
|
|
16
|
-
* @param {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>} source
|
|
17
|
-
* @param {import('../peer-store/types').PeerStore} peerStore
|
|
18
|
-
*/
|
|
19
|
-
async function * storeAddresses (source, peerStore) {
|
|
20
|
-
yield * map(source, async (peer) => {
|
|
21
|
-
// ensure we have the addresses for a given peer
|
|
22
|
-
await peerStore.addressBook.add(peer.id, peer.multiaddrs)
|
|
23
|
-
|
|
24
|
-
return peer
|
|
25
|
-
})
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Filter peers by unique peer id
|
|
30
|
-
*
|
|
31
|
-
* @param {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>} source
|
|
32
|
-
*/
|
|
33
|
-
function uniquePeers (source) {
|
|
34
|
-
/** @type Set<string> */
|
|
35
|
-
const seen = new Set()
|
|
36
|
-
|
|
37
|
-
return filter(source, (peer) => {
|
|
38
|
-
// dedupe by peer id
|
|
39
|
-
if (seen.has(peer.id.toString())) {
|
|
40
|
-
return false
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
seen.add(peer.id.toString())
|
|
44
|
-
|
|
45
|
-
return true
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Require at least `min` peers to be yielded from `source`
|
|
51
|
-
*
|
|
52
|
-
* @param {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>} source
|
|
53
|
-
* @param {number} min
|
|
54
|
-
*/
|
|
55
|
-
async function * requirePeers (source, min = 1) {
|
|
56
|
-
let seen = 0
|
|
57
|
-
|
|
58
|
-
for await (const peer of source) {
|
|
59
|
-
seen++
|
|
60
|
-
|
|
61
|
-
yield peer
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (seen < min) {
|
|
65
|
-
throw errCode(new Error('not found'), 'NOT_FOUND')
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* If `max` is passed, only take that number of peers from the source
|
|
71
|
-
* otherwise take all the peers
|
|
72
|
-
*
|
|
73
|
-
* @param {AsyncIterable<{ id: PeerId, multiaddrs: Multiaddr[] }>} source
|
|
74
|
-
* @param {number} [max]
|
|
75
|
-
*/
|
|
76
|
-
function maybeLimitSource (source, max) {
|
|
77
|
-
if (max) {
|
|
78
|
-
return take(source, max)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return source
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
module.exports = {
|
|
85
|
-
storeAddresses,
|
|
86
|
-
uniquePeers,
|
|
87
|
-
requirePeers,
|
|
88
|
-
maybeLimitSource
|
|
89
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const drain = require('it-drain')
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @typedef {import('peer-id')} PeerId
|
|
7
|
-
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRoutingModule
|
|
8
|
-
* @typedef {import('multiformats/cid').CID} CID
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Wrapper class to convert events into returned values
|
|
13
|
-
*
|
|
14
|
-
* @implements {ContentRoutingModule}
|
|
15
|
-
*/
|
|
16
|
-
class DHTContentRouting {
|
|
17
|
-
/**
|
|
18
|
-
* @param {import('libp2p-kad-dht').DHT} dht
|
|
19
|
-
*/
|
|
20
|
-
constructor (dht) {
|
|
21
|
-
this._dht = dht
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @param {CID} cid
|
|
26
|
-
*/
|
|
27
|
-
async provide (cid) {
|
|
28
|
-
await drain(this._dht.provide(cid))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @param {CID} cid
|
|
33
|
-
* @param {*} options
|
|
34
|
-
*/
|
|
35
|
-
async * findProviders (cid, options) {
|
|
36
|
-
for await (const event of this._dht.findProviders(cid, options)) {
|
|
37
|
-
if (event.name === 'PROVIDER') {
|
|
38
|
-
yield * event.providers
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
module.exports = { DHTContentRouting }
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const errCode = require('err-code')
|
|
4
|
-
const { messages, codes } = require('../errors')
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @typedef {import('peer-id')} PeerId
|
|
8
|
-
* @typedef {import('libp2p-interfaces/src/peer-routing/types').PeerRouting} PeerRoutingModule
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Wrapper class to convert events into returned values
|
|
13
|
-
*
|
|
14
|
-
* @implements {PeerRoutingModule}
|
|
15
|
-
*/
|
|
16
|
-
class DHTPeerRouting {
|
|
17
|
-
/**
|
|
18
|
-
* @param {import('libp2p-kad-dht').DHT} dht
|
|
19
|
-
*/
|
|
20
|
-
constructor (dht) {
|
|
21
|
-
this._dht = dht
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @param {PeerId} peerId
|
|
26
|
-
* @param {any} options
|
|
27
|
-
*/
|
|
28
|
-
async findPeer (peerId, options = {}) {
|
|
29
|
-
for await (const event of this._dht.findPeer(peerId, options)) {
|
|
30
|
-
if (event.name === 'FINAL_PEER') {
|
|
31
|
-
return event.peer
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
throw errCode(new Error(messages.NOT_FOUND), codes.ERR_NOT_FOUND)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @param {Uint8Array} key
|
|
40
|
-
* @param {any} options
|
|
41
|
-
*/
|
|
42
|
-
async * getClosestPeers (key, options = {}) {
|
|
43
|
-
for await (const event of this._dht.getClosestPeers(key, options)) {
|
|
44
|
-
if (event.name === 'PEER_RESPONSE') {
|
|
45
|
-
yield * event.closer
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports = { DHTPeerRouting }
|