diff --git a/.cspell.json b/.cspell.json index ad88a31fff..9afbeb31b4 100644 --- a/.cspell.json +++ b/.cspell.json @@ -54,11 +54,14 @@ "multiaddr", "multiaddresses", "multiaddrs", + "multicodec", "multicodecs", + "multiformats", "mplex", "multihashes", "muxed", "muxer", + "muxers", "mvps", "nodekey", "nwaku", @@ -87,6 +90,7 @@ "transpiled", "typedoc", "unencrypted", + "unmarshal", "unmount", "unmounts", "untracked", diff --git a/.eslintrc.json b/.eslintrc.json index 47e4113505..747e539c62 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -14,7 +14,10 @@ ], "globals": { "BigInt": true, "console": true, "WebAssembly": true }, "rules": { - "@typescript-eslint/explicit-function-return-type": ["error"], + "@typescript-eslint/explicit-function-return-type": [ + "error", + { "allowExpressions": true } + ], "@typescript-eslint/explicit-module-boundary-types": "off", "eslint-comments/disable-enable-pair": [ "error", diff --git a/.gitignore b/.gitignore index 643d204d8c..96d4f47e9b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ node_modules src/**.js coverage *.log +/tsconfig.tsbuildinfo +/tsconfig.dev.tsbuildinfo diff --git a/build-scripts/fix-imports.js b/build-scripts/fix-imports.js index 8eaee14d6c..31562e9046 100644 --- a/build-scripts/fix-imports.js +++ b/build-scripts/fix-imports.js @@ -1,9 +1,9 @@ import path from "path"; import fs from "fs"; -const START_PATH = path.join(process.cwd(), "dist/esm"); +const START_PATH = path.join(process.cwd(), "dist/"); const IMPORT_REGEXP = - /^((import|export) [^';]* from "(@[^";]+\/)?([^@";]*\/[^";]*)[^";]*)"/g; + /^((import|export) [^';]* from "(\.[^@";]*\/[^";]*)[^";]*)"/g; const JUST_ADD_AN_EXTENSION = '$1.js"'; const ADD_INDEX_FILE = '$1/index.js"'; const JS_EXT = ".js"; @@ -36,7 +36,7 @@ function fixImportsAtFile(filePath) { } const [_, importPath] = l.split(`"`); - let exists = true; + let exists; let fullPath; if (importPath.startsWith(".")) { fullPath = path.join(filePath, "..", importPath); diff --git a/examples/relay-js/index.html b/examples/relay-js/index.html index 914adf759a..dec722d157 100644 --- a/examples/relay-js/index.html +++ b/examples/relay-js/index.html @@ -13,40 +13,25 @@
-

Messages

- - diff --git a/examples/store-js/index.html b/examples/store-js/index.html index 9a9d724e69..cee9a3367a 100644 --- a/examples/store-js/index.html +++ b/examples/store-js/index.html @@ -12,9 +12,13 @@

Timestamp of latest relay ping

- - diff --git a/examples/web-chat/package-lock.json b/examples/web-chat/package-lock.json index 786dda34e2..35476b27d0 100644 --- a/examples/web-chat/package-lock.json +++ b/examples/web-chat/package-lock.json @@ -14,6 +14,7 @@ "http-browserify": "^1.7.0", "https-browserify": "^1.0.0", "js-waku": "^0.24.0", + "multiaddr": "^10.0.1", "process": "^0.11.10", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/examples/web-chat/package.json b/examples/web-chat/package.json index 1b84652ef5..57b53c487b 100644 --- a/examples/web-chat/package.json +++ b/examples/web-chat/package.json @@ -10,6 +10,7 @@ "http-browserify": "^1.7.0", "https-browserify": "^1.0.0", "js-waku": "^0.24.0", + "multiaddr": "^10.0.1", "process": "^0.11.10", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/examples/web-chat/src/command.ts b/examples/web-chat/src/command.ts index c1e5b98823..cd7b1beb41 100644 --- a/examples/web-chat/src/command.ts +++ b/examples/web-chat/src/command.ts @@ -26,7 +26,7 @@ function info(waku: Waku | undefined): string[] { if (!waku) { return ["Waku node is starting"]; } - return [`PeerId: ${waku.libp2p.peerId.toB58String()}`]; + return [`PeerId: ${waku.libp2p.peerId.toString()}`]; } function connect(peer: string | undefined, waku: Waku | undefined): string[] { @@ -64,7 +64,7 @@ async function peers(waku: Waku | undefined): Promise { peers.push(peer); } Array.from(peers).forEach((peer) => { - response.push(peer.id.toB58String() + ":"); + response.push(peer.id.toString() + ":"); let addresses = " addresses: ["; peer.addresses.forEach(({ multiaddr }) => { addresses += " " + multiaddr.toString() + ","; diff --git a/karma.conf.cjs b/karma.conf.cjs index 2852c6faca..4ae523f08b 100644 --- a/karma.conf.cjs +++ b/karma.conf.cjs @@ -1,5 +1,4 @@ process.env.CHROME_BIN = require("puppeteer").executablePath(); -const webpackConfig = require("./webpack.config.cjs"); const webpack = require("webpack"); module.exports = function (config) { @@ -20,14 +19,34 @@ module.exports = function (config) { }, webpack: { mode: "production", - module: webpackConfig.module, + module: { + rules: [ + { + test: /\.(js|tsx?)$/, + use: "ts-loader", + exclude: /(node_modules)|(node\.spec\.ts)/, + }, + { + test: /node\.spec\.ts$/, + use: "ignore-loader", + }, + ], + }, plugins: [ new webpack.DefinePlugin({ "process.env.CI": process.env.CI || false, }), - ...webpackConfig.plugins, + new webpack.ProvidePlugin({ + process: "process/browser.js", + }), ], - resolve: webpackConfig.resolve, + resolve: { + extensions: [".ts", ".js"], + fallback: { + // Can be removed once https://github.com/libp2p/js-libp2p-pubsub/pull/92 is merged and released + buffer: false, + }, + }, stats: { warnings: false }, }, }); diff --git a/package-lock.json b/package-lock.json index 943d02a50c..62b531128d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,49 +9,50 @@ "version": "0.24.0", "license": "MIT OR Apache-2.0", "dependencies": { - "@chainsafe/libp2p-noise": "^5.0.0", + "@chainsafe/libp2p-gossipsub": "^3.4.0", + "@chainsafe/libp2p-noise": "^7.0.1", "@ethersproject/rlp": "^5.5.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/mplex": "^4.0.1", + "@libp2p/peer-id": "^1.1.10", + "@libp2p/websockets": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", "@noble/secp256k1": "^1.3.4", - "debug": "^4.3.1", - "dns-query": "^0.11.1", + "debug": "^4.3.4", + "dns-query": "^0.11.2", "hi-base32": "^0.5.1", - "it-concat": "^2.0.0", - "it-length-prefixed": "^5.0.2", - "it-pipe": "^1.1.0", + "it-all": "^1.0.6", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", "js-sha3": "^0.8.0", - "libp2p": "^0.36.2", - "libp2p-bootstrap": "^0.14.0", - "libp2p-crypto": "^0.21.2", - "libp2p-gossipsub": "0.13.0", - "libp2p-interfaces": "^4.0.6", - "libp2p-mplex": "^0.10.4", - "libp2p-websockets": "^0.16.1", - "multiaddr": "^10.0.1", - "multiformats": "^9.6.5", - "peer-id": "^0.16.0", + "libp2p": "next", + "p-event": "^5.0.1", "protons-runtime": "^1.0.4", "uint8arrays": "^3.0.0", - "uuid": "^8.3.2", - "varint": "^6.0.0" + "uuid": "^8.3.2" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@libp2p/peer-id-factory": "^1.0.15", "@rollup/plugin-commonjs": "^22.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.3.0", "@size-limit/preset-big-lib": "^7.0.8", "@types/app-root-path": "^1.2.4", "@types/chai": "^4.2.15", + "@types/debug": "^4.1.7", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", - "@types/secp256k1": "^4.0.2", "@types/tail": "^2.0.0", "@types/uuid": "^8.3.0", - "@types/varint": "^6.0.0", "@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/parser": "^5.8.1", "app-root-path": "^3.0.0", - "buffer": "^6.0.3", "chai": "^4.3.4", "cspell": "^5.14.0", "eslint": "^8.6.0", @@ -82,22 +83,82 @@ "protons": "^3.0.4", "puppeteer": "^13.0.1", "rollup": "^2.75.0", - "rollup-plugin-polyfill-node": "^0.9.0", "size-limit": "^7.0.8", - "stream-browserify": "^3.0.0", "tail": "^2.2.0", "terser": "^5.13.1", "ts-loader": "^9.2.6", "ts-node": "^10.4.0", "typedoc": "^0.22.10", "typedoc-plugin-no-inherit": "^1.3.1", - "typescript": "^4.5.5", - "webpack-cli": "^4.10.0" + "typescript": "^4.5.5" }, "engines": { "node": ">=16" } }, + "node_modules/@achingbrain/ip-address": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@achingbrain/ip-address/-/ip-address-8.1.0.tgz", + "integrity": "sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@achingbrain/ip-address/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/@achingbrain/nat-port-mapper": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.7.tgz", + "integrity": "sha512-P8Z8iMZBQCsN7q3XoVoJAX3CGPUTbGTh1XBU8JytCW3hBmSk594l8YvdrtY5NVexVHSwLeiXnDsP4d10NJHaeg==", + "dependencies": { + "@achingbrain/ssdp": "^4.0.1", + "@libp2p/logger": "^2.0.0", + "default-gateway": "^6.0.2", + "err-code": "^3.0.1", + "it-first": "^1.0.7", + "p-defer": "^4.0.0", + "p-timeout": "^5.0.2", + "xml2js": "^0.4.23" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@achingbrain/nat-port-mapper/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@achingbrain/ssdp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.0.1.tgz", + "integrity": "sha512-z/CkfFI0Ksrpo8E+lu2rKahlE1KJHUn8X8ihQj2Jg6CEL+oHYGCNfttOES0+VnV7htuog70c8bYNHYhlmmqxBQ==", + "dependencies": { + "event-iterator": "^2.0.0", + "freeport-promise": "^2.0.0", + "merge-options": "^3.0.4", + "uuid": "^8.3.2", + "xml2js": "^0.4.23" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -549,25 +610,132 @@ "node": ">=6.9.0" } }, - "node_modules/@chainsafe/libp2p-noise": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-5.0.3.tgz", - "integrity": "sha512-IT7q9JaEjv4aU3zO8zeomWyw79rLo8hGcmnyWOE1P/dVIT+jqrF08R3rVXonujBbmi6SSgZbB6NModqW+Oa2jw==", + "node_modules/@chainsafe/libp2p-gossipsub": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-3.4.0.tgz", + "integrity": "sha512-vN73j3t69TXy82Zx3guPB1AZa/8hHyDvgeHrjmegadugs6eywuR+BJTsmD3vd7FAZvD9g6Bdekt1VuE2GG8GOw==", "dependencies": { + "@libp2p/components": "^2.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-pubsub": "^1.0.1", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/peer-record": "^2.0.0", + "@libp2p/pubsub": "^3.0.0", + "@libp2p/topology": "^3.0.0", + "abortable-iterator": "^4.0.2", + "denque": "^1.5.0", + "err-code": "^3.0.1", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "multiformats": "^9.6.4", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + } + }, + "node_modules/@chainsafe/libp2p-gossipsub/node_modules/@libp2p/peer-record": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-2.0.2.tgz", + "integrity": "sha512-JkH9fBpBpGQYqDMJP3+LNtXLyjNCf0fVcBkdjyfPTSwUXTPJ5NxsluJAH+MZkkrJG9YJG22NgrZO5784GSLAaA==", + "dependencies": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@chainsafe/libp2p-gossipsub/node_modules/@libp2p/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-R0r9fkskuTmm5jMrlRXWpTdYJeDYcNQ1KdfSEmoVlCs5AlTeWn31+cdaHQihSEbkpEKtVCExfsZkwa3f7C1l8A==", + "dependencies": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@chainsafe/libp2p-gossipsub/node_modules/@libp2p/utils/node_modules/@libp2p/interface-connection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-1.0.1.tgz", + "integrity": "sha512-4MP+RvqR5xu6EWgrebLo34HWm/X+hGXtzsCKmNfmLN9bpaYhEobzL4Rm3RYi/0ICrgAZmoU8n+x8widiuwERew==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@chainsafe/libp2p-gossipsub/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/@chainsafe/libp2p-noise": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-7.0.1.tgz", + "integrity": "sha512-V5vYb2jKlnd9jwDcxCB48RvzqHcMZsamTAd0eXZgvCujlu5VmbyaWFcuvIwFY3dHTrVcFQKntIg5WDaqmkuhcg==", + "dependencies": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection-encrypter": "^1.0.2", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-collections": "^1.0.0", + "@libp2p/peer-id": "^1.1.8", "@stablelib/chacha20poly1305": "^1.0.1", "@stablelib/hkdf": "^1.0.1", "@stablelib/sha256": "^1.0.1", "@stablelib/x25519": "^1.0.1", - "bl": "^5.0.0", - "debug": "^4.3.1", - "it-buffer": "^0.1.3", - "it-length-prefixed": "^5.0.3", - "it-pair": "^1.0.0", - "it-pb-rpc": "^0.2.0", - "it-pipe": "^1.1.0", - "peer-id": "^0.16.0", - "protobufjs": "^6.11.2", + "it-length-prefixed": "^7.0.1", + "it-pair": "^2.0.2", + "it-pb-stream": "^1.0.2", + "it-pipe": "^2.0.3", + "protons-runtime": "^1.0.3", + "uint8arraylist": "^1.4.0", "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/@cspell/cspell-bundled-dicts": { @@ -870,15 +1038,6 @@ "node": ">=12" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -1127,10 +1286,909 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@libp2p/components": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/components/-/components-2.0.1.tgz", + "integrity": "sha512-3+HgBnu7MbSBcAODtMRxSbdZ54vNB2TGxmPxeNhDBFb+jTw4pUwCeXUcTkSNzsY8cME0MhsEzQ7bwpdXa9xPeQ==", + "dependencies": { + "@libp2p/interface-address-manager": "^1.0.1", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-connection-manager": "^1.0.0", + "@libp2p/interface-content-routing": "^1.0.0", + "@libp2p/interface-dht": "^1.0.0", + "@libp2p/interface-metrics": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-routing": "^1.0.0", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/interface-pubsub": "^1.0.0", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/connection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/connection/-/connection-4.0.0.tgz", + "integrity": "sha512-fBiyKzuFQ4jeKK0fQ2tCHjpRgGO/wPM0W4dHCLnb+LB94Jv9mIlMmKbaDnju8+K1Pd67/Y1/L3OQElHtwYJOsA==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-1.0.0.tgz", + "integrity": "sha512-oV/KaHE8XaJQDH+iDq4Kn4GaVWRsEXJnLXTpN+8hz00tuxxsE3+4g0OYaFCauAYeX1IcGPwMvUhdgujnKzpAbg==", + "dependencies": { + "@libp2p/interface-keys": "^1.0.2", + "@noble/ed25519": "^1.6.0", + "@noble/secp256k1": "^1.5.4", + "err-code": "^3.0.1", + "iso-random-stream": "^2.0.0", + "multiformats": "^9.4.5", + "node-forge": "^1.1.0", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-address-manager": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-address-manager/-/interface-address-manager-1.0.2.tgz", + "integrity": "sha512-YUZzuY3yySXaeYd/LXkEDV/aKp6eJBsropXypwqeP3ErmEvkN06nbShQQAyNvRnloecYVAeLt2IZW2N9ImlRFg==", + "dependencies": { + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-connection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-2.1.1.tgz", + "integrity": "sha512-gjugaMsZvfo3r4tCc/yPifVQsfLogmEmJtW+eXMNiNDna3ZfmwWD9Z+KyEwuVsXKs0C4GESXei2y4SJSCEfkbA==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-connection-encrypter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-encrypter/-/interface-connection-encrypter-1.0.2.tgz", + "integrity": "sha512-Ed5o8eP8H3KMKDgsEaId+R7BdGGFCpjT5Ng2PYtFS+7kECZ+7fYL+nYDMP7h5cf65GJTQNrelGQwyeXQqx8Z9A==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-connection-manager": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-manager/-/interface-connection-manager-1.0.2.tgz", + "integrity": "sha512-92gM7sZhVidD+vsQbc+LbI4MMvxgRjFy9kUrrsOosbtCt0nl68rIeRFKRpfX92/4QY40tL41VXT69ijCUskEwg==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-content-routing": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-content-routing/-/interface-content-routing-1.0.2.tgz", + "integrity": "sha512-Ue1X8XrZ4ymTMQk/GWom/EKfPB5Lu7zy33ohjSix26Da/HbBvkXBdnYGDj485vxSOZGZRqeBhh21nCVjD/yLyg==", + "dependencies": { + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "multiformats": "^9.6.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-dht": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-dht/-/interface-dht-1.0.1.tgz", + "integrity": "sha512-EToxQznHUnD9frWoHwq8DUaOa7RZ2qoo6beb1aWdQrEJsEdUBi62FHh9qrLkrL+E4W3rkl2+WrhSP6/iHxZZwQ==", + "dependencies": { + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "multiformats": "^9.6.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-keys": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interface-keys/-/interface-keys-1.0.3.tgz", + "integrity": "sha512-K8/HlRl/swbVTWuGHNHF28EytszYfUhKgUHfv8CdbMk9ZA/bgO4uU+d9rcrg/Dhw3511U3aRz2bwl2psn6rJfg==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface-metrics/-/interface-metrics-2.0.0.tgz", + "integrity": "sha512-OUMspbgamrPgTQWA9zjyrcVQtXpWegSzPllDVwySBefv14l6AhpgicvVI8s+FPbzdKSj6AanlYDa7V8Ui/14CQ==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-peer-discovery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-discovery/-/interface-peer-discovery-1.0.1.tgz", + "integrity": "sha512-ZqBhpX7fR3ROYQaGYV47YhyTJJzFDzyyEIsQ7NnDuG3KhcQb2PtocnN0sy1Ozm784M0oYveM/HjfuNxxcOwdYg==", + "dependencies": { + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-peer-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-id/-/interface-peer-id-1.0.4.tgz", + "integrity": "sha512-VRnE0MqmS1kN43hyKCEdkhz0gciuDML7hpL3p8zDm0LnveNMLJsR+/VSUaugCi/muOzLaLk26WffKWbMYfnGfA==", + "dependencies": { + "multiformats": "^9.6.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-peer-info": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.2.tgz", + "integrity": "sha512-8dGBj8+6PdBDsMAASxX2sECnWhK7zAnv8iCFgYXY5Z6fbQwA+7iVAea9FdjgyLapdIzDarttPt3Gdou8tXZdGg==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@multiformats/multiaddr": "^10.2.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-peer-routing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-routing/-/interface-peer-routing-1.0.1.tgz", + "integrity": "sha512-MKx2g0mIUI6qNuLv3xApKXR2ZrO9CUTT9ZPL0gvRlhpFCXovEkdWJ1h8KnmkR7tGPxKHt2bsCCJ8gqUaFeNstA==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-peer-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-store/-/interface-peer-store-1.2.0.tgz", + "integrity": "sha512-4244DmDppLf6Av6gALoO7iMPVhBO6Hx3dbkUy7Vb3OfxS//Ix+uDUib2hypIK2Q2rKmn3dfzvDBt0GwlkSMJCg==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interface-record": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-pubsub": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interface-pubsub/-/interface-pubsub-1.0.4.tgz", + "integrity": "sha512-BSkt0h4fbBBHcr3LCF7fTtAoCdQBjKbTGxCa4tIJpI3m5suxC5h6OrLC2rmrexOxR9aZRkr9da4VShRyOfRLag==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "it-pushable": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-pubsub/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/@libp2p/interface-record": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-record/-/interface-record-1.0.2.tgz", + "integrity": "sha512-bYNxKtsUOsNucHeAXCZbAQxFXwR7JvoOmodwEByriMvTWYRbd6d8rm8VHZ/17QgdRFlIwNnpIPuoyyLQ8Wn1rQ==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-registrar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-registrar/-/interface-registrar-2.0.2.tgz", + "integrity": "sha512-HqDQua9J6T9KzrdYA9EhYsI0oc4CeSR1sfi0qdk073/IB3SlP+XtD7RzzVuGeyXjssqZtqf3RwjV7C+zOlHYlw==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-stream-muxer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-stream-muxer/-/interface-stream-muxer-2.0.1.tgz", + "integrity": "sha512-DDh9DT6kgN6Uo/EkydHh0/MqLMuM7eg9AyoUV4X/tt6kWulXr/Xq5i4Ho3PsPGPEz+o+75cgZkzywOIenD0VWA==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interfaces": "^3.0.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interface-transport": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-transport/-/interface-transport-1.0.2.tgz", + "integrity": "sha512-alOdxYfYQp/v2rMGc5V7GSfRUSJc4C38HfqI3CLEfSD9DJ3NFid804MvbOS/v4mP4yWtHyN/tfR5fmH8mmGqPw==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/interfaces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-3.0.3.tgz", + "integrity": "sha512-8IIxw7TKpaYTtVfZN3jePLlm/E/VzqPpqerN+jhA+1s86akRSeyxVBYi3W9SWDSf0oIauHJSDE8KNxLceAfeag==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/logger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-2.0.0.tgz", + "integrity": "sha512-aC1Yz4bni8Cui1tKCL5PzQSlS3BE/hhvyVnEHhcUz+GCo+MpbmyrZSPAb/m1e7bHrDDKkT1f9DSr7vgmS/NkuQ==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.2", + "debug": "^4.3.3", + "interface-datastore": "^6.1.0", + "multiformats": "^9.6.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/mplex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/mplex/-/mplex-4.0.1.tgz", + "integrity": "sha512-LOs5xEPjY10Bq98q1Ipa4/PQ83uj6i/JkvaAZ85/hgiqLrfVYkqs31AF0G35DgvM1eaVjmJoE7f1u4UHKaCEMQ==", + "dependencies": { + "@libp2p/components": "^2.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-stream-muxer": "^2.0.0", + "@libp2p/logger": "^2.0.0", + "@libp2p/tracked-map": "^2.0.0", + "abortable-iterator": "^4.0.2", + "any-signal": "^3.0.0", + "err-code": "^3.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.4.0", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/mplex/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/@libp2p/multistream-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-2.0.2.tgz", + "integrity": "sha512-xW8BVHXw4JDSLFC+/3PxctwkPxPHfEYdq1hiB7F7adVp65ERg+65TEd0RD/knNOj+aMQkrQl0DUsldSTRNTWkw==", + "dependencies": { + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "it-first": "^1.0.6", + "it-handshake": "^4.0.1", + "it-length-prefixed": "^8.0.2", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0", + "uint8arraylist": "^2.0.0", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/multistream-select/node_modules/it-handshake": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-4.0.1.tgz", + "integrity": "sha512-80dJPkxA77iTy172OnTWg5pjiOQ7KO0+o2FGCyJn3Vb/NJQKQiWL7LJY50uT5n8EYzv8SV5dDNF234PwMsQAXw==", + "dependencies": { + "it-map": "^1.0.6", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/multistream-select/node_modules/it-length-prefixed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-8.0.2.tgz", + "integrity": "sha512-qYCGZ6lTaI6lcuTXUrJmVpE6clq63ULrkq1FGTxHrzexjB2cCrS/CZ5HCRDZ5IRPw33tSDUDK91S7X5S64dPyQ==", + "dependencies": { + "err-code": "^3.0.1", + "it-stream-types": "^1.0.4", + "uint8-varint": "^1.0.1", + "uint8arraylist": "^2.0.0", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/multistream-select/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/@libp2p/multistream-select/node_modules/it-reader": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.1.tgz", + "integrity": "sha512-C+YRk3OTufbKSJMNEonfEw+9F38llmwwZvqhkjb0xIgob7l4L3p01Yt43+bHRI8SSppAOgk5AKLqas7ea0UTAw==", + "dependencies": { + "it-stream-types": "^1.0.4", + "uint8arraylist": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/multistream-select/node_modules/uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "dependencies": { + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-collections": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-1.0.3.tgz", + "integrity": "sha512-xrnFlZ2CpYiUQ0fGE0WqfBONiE2rjkjWHXnS6gH7CudlD0JMSftbzI+naBXRunfZal7CNEtHN7+keVX+ingPgA==", + "dependencies": { + "@libp2p/interfaces": "^2.0.0", + "@libp2p/peer-id": "^1.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-collections/node_modules/@libp2p/interfaces": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-2.0.4.tgz", + "integrity": "sha512-MfwkTFyHJtvwNxkjOjzkXyIVvKFtEW2Q3IGRJPyPQMrtB6ll0rGMTlyJ3BQS1bcD0YkNhggFm+8XiU2/0LCBhQ==", + "dependencies": { + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-pushable": "^2.0.1", + "it-stream-types": "^1.0.4", + "multiformats": "^9.6.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-collections/node_modules/it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" + }, + "node_modules/@libp2p/peer-id": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-1.1.14.tgz", + "integrity": "sha512-8Ch/kQGyoDl3m0TYz/uuHRbJ3TRoG7XI9ZTFHd1P21KrpF3YvCeK5PCWDsP7IICc+Q39n0IS9zLVhGySiS7FXQ==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "err-code": "^3.0.1", + "multiformats": "^9.6.3", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-id-factory": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-1.0.16.tgz", + "integrity": "sha512-DWiJX2OnvDGaVN2kg7NcqL2tNAp8LerT2Lj0ImuXuh0Q1wxI8Wt1PbymoRmE5kQiYG6qyu1iAb7Q9BRerf+New==", + "dependencies": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/peer-id": "^1.0.0", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-record": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-3.0.0.tgz", + "integrity": "sha512-JN7Q78G1lg9fRiaghbzN0ZlerkOE646XaMrtUtAmMWsumrs75tTuZHgcYLsoAxiL6WmzJ4I9uCoY+jUl3O7l/Q==", + "dependencies": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^3.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-store": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-3.1.0.tgz", + "integrity": "sha512-GYOK/kTjrDxVW2CIQII60zGgLx4EDG1CLXHOOcsdob8MCw/A23UwKEdIxsw2YAJvQBExDWPZjZvbG1ewPHtrFQ==", + "dependencies": { + "@libp2p/components": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-store": "^1.1.0", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.0", + "@libp2p/peer-record": "^2.0.0", + "@multiformats/multiaddr": "^10.2.0", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "mortice": "^3.0.0", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-store/node_modules/@libp2p/interface-connection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-1.0.1.tgz", + "integrity": "sha512-4MP+RvqR5xu6EWgrebLo34HWm/X+hGXtzsCKmNfmLN9bpaYhEobzL4Rm3RYi/0ICrgAZmoU8n+x8widiuwERew==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-store/node_modules/@libp2p/peer-record": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-2.0.2.tgz", + "integrity": "sha512-JkH9fBpBpGQYqDMJP3+LNtXLyjNCf0fVcBkdjyfPTSwUXTPJ5NxsluJAH+MZkkrJG9YJG22NgrZO5784GSLAaA==", + "dependencies": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/peer-store/node_modules/@libp2p/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-R0r9fkskuTmm5jMrlRXWpTdYJeDYcNQ1KdfSEmoVlCs5AlTeWn31+cdaHQihSEbkpEKtVCExfsZkwa3f7C1l8A==", + "dependencies": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/pubsub": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/pubsub/-/pubsub-3.0.3.tgz", + "integrity": "sha512-DKIkvjjX7/I+no7SAyCiK4lSs/u2FdnSaksvxkD4TocUyKqlXcDO89rYQElSHGN5HaHa59DLaClyQdzuqoLLCg==", + "dependencies": { + "@libp2p/components": "^2.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-pubsub": "^1.0.3", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-collections": "^2.0.0", + "@libp2p/peer-id": "^1.1.0", + "@libp2p/topology": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "iso-random-stream": "^2.0.0", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "multiformats": "^9.6.3", + "p-queue": "^7.2.0", + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/pubsub/node_modules/@libp2p/peer-collections": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-2.0.0.tgz", + "integrity": "sha512-A074sSs0Kv3g/1gaf3ZvMc05sLmho3c3uJtkep4L3cgHokMW0pF+3YovU5KvdgBCB8GEepXiUvYsdPYzehVl7A==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.4", + "@libp2p/peer-id": "^1.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/pubsub/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/@libp2p/topology": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/topology/-/topology-3.0.0.tgz", + "integrity": "sha512-gQMkO1j7D/7A9MfL2mtLxr0StXzjqK0V554w7hk25E66Ly0wp1K7vPEfhE9rExLSaQqe9ir4nijhbA3rNnxZng==", + "dependencies": { + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.2.0", + "err-code": "^3.0.1", + "it-all": "^1.0.6" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/tracked-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/tracked-map/-/tracked-map-2.0.1.tgz", + "integrity": "sha512-T0/m67VAZuEw+AO9U+rlLFkHUqB1w0Dy9Pqw2+f0XL6uplv2xXKSJeU0yUAjiOGsfrJ4pUPPQbgsz2Xr3WNoIQ==", + "dependencies": { + "@libp2p/interface-metrics": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-3.0.0.tgz", + "integrity": "sha512-ik2IjnoO+73/5b3gSfXyMS3+eQAhNpzhzvvqQNOI8gcU6jcLvliStldwt1LKiMe9M3ZUOy6LHeB/3vF1dO9CSA==", + "dependencies": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^2.1.0", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/websockets": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-3.0.1.tgz", + "integrity": "sha512-H9xyxvZ0+0SACIGY6Ppa19K3h567set8tfSnxy/fjzUAJRM6ZwYMROh5N0dMLjyl/vjqTNh5iyJmnO3upddGGA==", + "dependencies": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/utils": "^3.0.0", + "@multiformats/mafmt": "^11.0.2", + "@multiformats/multiaddr": "^10.1.5", + "@multiformats/multiaddr-to-uri": "^9.0.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "it-ws": "^5.0.0", + "p-defer": "^4.0.0", + "p-timeout": "^5.0.2", + "wherearewe": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/websockets/node_modules/it-ws": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/it-ws/-/it-ws-5.0.2.tgz", + "integrity": "sha512-beq/nBWuKm2Ds4nYSfPuZRF0USVZJhsIvuUH3kRE5QdaCzivDK7zyeewDgsNBSPr6hPgF5dyPP5NXcXhUcb9QQ==", + "dependencies": { + "event-iterator": "^2.0.0", + "iso-url": "^1.1.2", + "it-stream-types": "^1.0.2", + "uint8arrays": "^3.0.0", + "ws": "^8.4.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@libp2p/websockets/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@libp2p/websockets/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@multiformats/mafmt": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-11.0.2.tgz", + "integrity": "sha512-KesMM4fSEpMz1kZPzlvdwYNYrq5iH38S5EDKLu5qsGG4NT94UaruTjase9osaDW+CcDfshK9uZUD9lzpXJGreA==", + "dependencies": { + "@multiformats/multiaddr": "^10.1.1" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-10.3.3.tgz", + "integrity": "sha512-+LX9RovG7DJsANb+U6VchV/tApcdJzeafbi5+MPUam90oL91BbEh6ozNZOz4Qf5ZEeilexc12oomatmODJh1/w==", + "dependencies": { + "dns-over-http-resolver": "^2.1.0", + "err-code": "^3.0.1", + "is-ip": "^4.0.0", + "multiformats": "^9.4.5", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@multiformats/multiaddr-to-uri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.1.tgz", + "integrity": "sha512-kSyHZ2lKjoEzHu/TM4ZVwFj4AWV1B9qFBFJjYb/fK1NqrnrNb/M3uhoyckJvP7WZvpDsnEc7fUCpmPipDY6LMw==", + "dependencies": { + "@multiformats/multiaddr": "^10.1.1" + } + }, + "node_modules/@multiformats/multiaddr/node_modules/dns-over-http-resolver": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-2.1.0.tgz", + "integrity": "sha512-eb8RGy6k54JdD7Rjw8g65y1MyA4z3m3IIYh7uazkgZuKIdFn8gYt8dydMm3op+2UshDdk9EexrXcDluKNY/CDg==", + "dependencies": { + "debug": "^4.3.1", + "native-fetch": "^4.0.2", + "receptacle": "^1.3.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@multiformats/multiaddr/node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@multiformats/multiaddr/node_modules/is-ip": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-4.0.0.tgz", + "integrity": "sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw==", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@multiformats/multiaddr/node_modules/native-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", + "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "peerDependencies": { + "undici": "*" + } + }, "node_modules/@noble/ed25519": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.5.1.tgz", - "integrity": "sha512-VX0TyIhKghm/NoTno/k71oCQO55f36yiSwuNOqEHu9BvxQuzel0tsvcsU2KjX/iN6pCkN53Bvfq1+gWNiwXDGQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.6.1.tgz", + "integrity": "sha512-Gptpue6qPmg7p1E5LBO5GDtXw5WMc2DVtUmu4EQequOcoCvum1dT9sY6s9M8aSJWq9YopCN4jmTOAvqMdw3q7w==", "funding": [ { "type": "individual", @@ -1139,9 +2197,15 @@ ] }, "node_modules/@noble/secp256k1": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.3.4.tgz", - "integrity": "sha512-ZVRouDO5mbdCiDg4zCd3ZZABduRtpy4tCnB33Gh9upHe9tRzpiqbRSN1VTjrj/2g8u2c6MBi0YLNnNQpBYOiWg==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -1181,27 +2245,32 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -1210,27 +2279,32 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true }, "node_modules/@rollup/plugin-commonjs": { "version": "22.0.0", @@ -1259,26 +2333,6 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/plugin-json": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", @@ -1601,6 +2655,7 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, "dependencies": { "@types/ms": "*" } @@ -1646,12 +2701,8 @@ "node_modules/@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.2", @@ -1668,12 +2719,14 @@ "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, "node_modules/@types/node": { "version": "17.0.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.6.tgz", - "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==" + "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==", + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -1701,15 +2754,6 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/tail": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@types/tail/-/tail-2.2.1.tgz", @@ -1722,15 +2766,6 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, - "node_modules/@types/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-2jBazyxGl4644tvu3VAez8UA/AtrcEetT9HOeAbqZ/vAcRVL/ZDFQjSS7rkWusU5cyONQVUz+nwwrNZdMva4ow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yauzl": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", @@ -2088,11 +3123,6 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "node_modules/@vascosantos/moving-average": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vascosantos/moving-average/-/moving-average-1.1.0.tgz", - "integrity": "sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w==" - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -2239,42 +3269,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2294,11 +3288,12 @@ "dev": true }, "node_modules/abortable-iterator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-3.0.2.tgz", - "integrity": "sha512-qVP8HFfTpUQI2F+f1tpTriKDIZ4XrmwCrBCrQeRKO7DKWF3kgoT6NXiNDv2krrGcHxPwmI63eGQiec81sEaWIw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-4.0.2.tgz", + "integrity": "sha512-SJGELER5yXr9v3kiL6mT5RZ1qlyJ9hV4nm34+vfsdIM1lp3zENQvpsqKgykpFLgRMUn3lzlizLTpiOASW05/+g==", "dependencies": { - "get-iterator": "^1.0.2" + "get-iterator": "^2.0.0", + "it-stream-types": "^1.0.3" } }, "node_modules/accepts": { @@ -2391,6 +3386,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2403,6 +3399,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2612,22 +3609,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2658,25 +3639,14 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-arraybuffer": { "version": "1.0.1", @@ -2691,6 +3661,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -2715,22 +3686,6 @@ "node": "^4.5.0 || >= 5.9" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2740,16 +3695,6 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -2842,6 +3787,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2894,29 +3840,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -2944,6 +3867,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/byte-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/byte-access/-/byte-access-1.0.1.tgz", + "integrity": "sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw==", + "dependencies": { + "uint8arraylist": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/byte-access/node_modules/uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "dependencies": { + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/bytes-iec": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", @@ -3056,11 +4003,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "node_modules/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", @@ -3152,15 +4094,11 @@ "integrity": "sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA==", "dev": true }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "engines": { "node": ">=6" } @@ -3255,20 +4193,6 @@ "node": ">=8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3306,6 +4230,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3313,15 +4238,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/comment-json": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.1.1.tgz", @@ -3353,7 +4269,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "node_modules/configstore": { "version": "5.0.1", @@ -3432,7 +4349,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "node_modules/cors": { "version": "2.8.5", @@ -3800,17 +4718,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-urls": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", @@ -3826,9 +4733,9 @@ } }, "node_modules/datastore-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.0.tgz", - "integrity": "sha512-FdudjeH+GHjbuU8X1mIKIv8uHAErF6qtjqWFJiVKOdITk6KdiSKis4Hsfu80RWDEFQ9l9s47XIVf5FMKTtoeWA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.3.tgz", + "integrity": "sha512-DmPsUux63daOfCszxLkcp6LjdJ0k/BQNhIMtoAi5mbraYQnEQkFtKORmTu6XmDX6ujbtaBkeuJAiCBNI7MZklw==", "dependencies": { "debug": "^4.1.1", "err-code": "^3.0.1", @@ -3847,6 +4754,11 @@ "npm": ">=7.0.0" } }, + "node_modules/datastore-core/node_modules/it-pipe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-1.1.0.tgz", + "integrity": "sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==" + }, "node_modules/date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -3996,6 +4908,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -4050,20 +4963,10 @@ "node": ">=8" } }, - "node_modules/dns-over-http-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", - "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", - "dependencies": { - "debug": "^4.3.1", - "native-fetch": "^3.0.0", - "receptacle": "^1.3.2" - } - }, "node_modules/dns-query": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/dns-query/-/dns-query-0.11.1.tgz", - "integrity": "sha512-ZdXl7HdLa23JqpAj8EdUg/oO9qwlDvWf2iY/cFCTHF6deJWv/xglgs3WrvTz9/Ig3NGv5lF4FIZjURl2FUvFog==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/dns-query/-/dns-query-0.11.2.tgz", + "integrity": "sha512-zF8qxQpqCB467o4A63DLpQClo77H642JEKMx0Ra9GFww7Rx0234Fo8NoG0LBoSBZxamWkXfLxhzDG19bTBHvXQ==", "dependencies": { "@leichtgewicht/base64-codec": "^1.0.0", "@leichtgewicht/dns-packet": "^6.0.2", @@ -4129,37 +5032,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "node_modules/electron-fetch": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.7.4.tgz", - "integrity": "sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw==", - "dependencies": { - "encoding": "^0.1.13" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/electron-to-chromium": { "version": "1.3.810", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.810.tgz", @@ -4187,14 +5065,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4289,18 +5159,6 @@ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", @@ -4378,14 +5236,6 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "node_modules/es6-promisify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz", - "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5027,7 +5877,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extract-zip": { "version": "2.0.1", @@ -5064,14 +5915,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-check": { "version": "2.23.2", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.23.2.tgz", @@ -5091,7 +5934,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-diff": { "version": "1.2.0", @@ -5123,7 +5967,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5131,12 +5976,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -5337,25 +6176,13 @@ "node": ">=8.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "node_modules/freeport-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", + "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/fromentries": { @@ -5467,9 +6294,9 @@ } }, "node_modules/get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", - "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.0.tgz", + "integrity": "sha512-BDJawD5PU2gZv6Vlp8O28H4GnZcsr3h9gZUvnAP5xXP3WOy/QAoOsyMepSkw21jur+4t5Vppde72ChjhTIzxzg==" }, "node_modules/get-package-type": { "version": "0.1.0", @@ -5519,14 +6346,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/gh-pages": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", @@ -5733,27 +6552,6 @@ "node": ">=4.x" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -5925,20 +6723,6 @@ "node": ">= 6" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -5979,6 +6763,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5990,6 +6775,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -6045,25 +6831,6 @@ "node": ">=4" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6077,6 +6844,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -6131,32 +6899,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip-address": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-8.1.0.tgz", - "integrity": "sha512-Wz91gZKpNKoXtqvY8ScarKYwhXoK4r/b5QuT+uywe/azv0/nUCo7Bh0IRRI7F9DHR06kJNWtzMGLIbXavngbKA==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "1.1.2" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, "node_modules/ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", @@ -6165,25 +6907,12 @@ "node": ">=8" } }, - "node_modules/ipfs-utils": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.5.tgz", - "integrity": "sha512-GXWfsq/nKtwkcTI4+KGc4CU9EFXjtkWaGcFAsnm177kAhA0Fnn8aWNRaF/C0xFraUIl1wTAUTWkaGKigVyfsTw==", - "dependencies": { - "any-signal": "^3.0.0", - "buffer": "^6.0.1", - "electron-fetch": "^1.7.2", - "err-code": "^3.0.1", - "is-electron": "^2.2.0", - "iso-url": "^1.1.5", - "it-glob": "^1.0.1", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "nanoid": "^3.1.20", - "native-fetch": "^3.0.0", - "node-fetch": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "react-native-fetch-api": "^2.0.0", - "stream-to-it": "^0.2.2" + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" } }, "node_modules/is-arrayish": { @@ -6326,9 +7055,9 @@ } }, "node_modules/is-loopback-addr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-1.0.1.tgz", - "integrity": "sha512-DhWU/kqY7X2F6KrrVTu7mHlbd2Pbo4D1YkAzasBMjQs6lJAoefxaA6m6CpSX0K6pjt9D0b9PNFI5zduy/vzOYw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.1.tgz", + "integrity": "sha512-SEsepLbdWFb13B6U0tt6dYcUM0iK/U7XOC43N70Z4Qb88WpNtp+ospyNI9ddpqncs7Z7brAEsVBTQpaqSNntIw==" }, "node_modules/is-module": { "version": "1.0.0", @@ -6386,18 +7115,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -6479,7 +7196,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -6532,9 +7250,9 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/iso-random-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.0.tgz", - "integrity": "sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.2.tgz", + "integrity": "sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==", "dependencies": { "events": "^3.3.0", "readable-stream": "^3.4.0" @@ -6551,15 +7269,6 @@ "node": ">=12" } }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isomorphic-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", @@ -6570,11 +7279,6 @@ "whatwg-fetch": "^3.4.1" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -6703,23 +7407,6 @@ "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" }, - "node_modules/it-buffer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/it-buffer/-/it-buffer-0.1.3.tgz", - "integrity": "sha512-9a2/9SYVwG7bcn3tpRDR4bXbtuMLXnDK48KVC+GXiQg97ZOOdWz2nIITBsOQ19b+gj01Rw8RNwtiLDLI8P8oiQ==", - "dependencies": { - "bl": "^5.0.0", - "buffer": "^6.0.3" - } - }, - "node_modules/it-concat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/it-concat/-/it-concat-2.0.0.tgz", - "integrity": "sha512-jchrEB3fHlUENWkVJRmbFJ1A7gcjJDmwiolQsHhVC14DpUIbX8fgr3SOC7XNE5OoUUQNL6/RaMCPChkPemyQUw==", - "dependencies": { - "bl": "^5.0.0" - } - }, "node_modules/it-drain": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.5.tgz", @@ -6740,33 +7427,40 @@ "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-0.1.1.tgz", "integrity": "sha512-ZLxL651N5w5SL/EIIcrXELgYrrkuEKj/TErG93C4lr6lNZziKsf338ljSG85PjQfu7Frg/1wESl5pLrPSFXI9g==" }, - "node_modules/it-glob": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz", - "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==", + "node_modules/it-handshake": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-3.0.1.tgz", + "integrity": "sha512-Rx9ESanlfnC0aMw2LtLJ9YNlCNgnZU7wOHPzPSZTUAjbdZx54kllGR5ndIuoJqF2EtNIsmTiWEncKTgwHNJSSg==", "dependencies": { - "@types/minimatch": "^3.0.4", - "minimatch": "^3.0.4" + "it-map": "^1.0.6", + "it-pushable": "^2.0.1", + "it-reader": "^5.0.0", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/it-handshake": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-2.0.0.tgz", - "integrity": "sha512-K4q+mz8aLlCK3vTjtgNdHC9c/JbuOATsfogarjMsLcBZC5vYfKbX3Gq3AWcCdjIsIrPqzTlhPKSxl64LJkrt2w==", - "dependencies": { - "it-pushable": "^1.4.0", - "it-reader": "^3.0.0", - "p-defer": "^3.0.0" - } + "node_modules/it-handshake/node_modules/it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" }, "node_modules/it-length-prefixed": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-5.0.3.tgz", - "integrity": "sha512-b+jDHLcnOnPDQN79ronmzF5jeBjdJsy0ce2O6i6X4J5tnaO8Fd146ZA/tMbzaLlKnTpXa0eKtofpYhumXGENeg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-7.0.1.tgz", + "integrity": "sha512-UozKoT0zZPUa0LO9OSq5KaLKPn83U7Vsy/BNAN0TUXfTI/pKrOz6RuyTSOok6NDad12FZsShBGnl9DKlfDT95g==", "dependencies": { - "bl": "^5.0.0", - "buffer": "^6.0.3", + "err-code": "^3.0.1", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.2.0", "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/it-map": { @@ -6783,26 +7477,43 @@ } }, "node_modules/it-pair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-1.0.0.tgz", - "integrity": "sha512-9raOiDu5OAuDOahtMtapKQDrQTxBfzlzrNcB6o7JARHkt+7Bb1dMkW/TpYdAjBJE77KH3e2zGzwpGUP9tXbLww==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-2.0.2.tgz", + "integrity": "sha512-QGgUwGtzE4mI8yPZawL+9wq49SBmhQdjKW+ChKBm4PUwRNdkgSoyPlu280iNyS0JscBG3pvytJ8JNVPSEBQNjg==", "dependencies": { - "get-iterator": "^1.0.2" + "it-stream-types": "^1.0.3", + "p-defer": "^4.0.0" } }, - "node_modules/it-pb-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/it-pb-rpc/-/it-pb-rpc-0.2.0.tgz", - "integrity": "sha512-Rojodsa6yxSTZDqVVF9HXKsISoHtlLNOL0P6b/7oCswiscbjCpt1IB78BxRDHpFL3tg8jFPMNDTP3v6ZjrMf9w==", + "node_modules/it-pb-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/it-pb-stream/-/it-pb-stream-1.0.2.tgz", + "integrity": "sha512-rPZKXtjcHXhvPprMdWjcCjMi4UaYIXZnBmFIJCW0f9rqZkyyjqSORyMpQoaP5+iDP7JaYiRzF4dyi51CSOhnbQ==", "dependencies": { - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.3" + "it-handshake": "^3.0.1", + "it-length-prefixed": "^7.0.0", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.3.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/it-pipe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-1.1.0.tgz", - "integrity": "sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-2.0.3.tgz", + "integrity": "sha512-1bfNC0v8yFDQu5KwZpHZrVO+nxOIEXfrobYtv55NXcsMfGu2SueMOCyCm63khejA+sCU0gLcRFQIfKWlBNNTGw==", + "dependencies": { + "it-merge": "^1.0.4", + "it-pushable": "^2.0.0", + "it-stream-types": "^1.0.3" + } + }, + "node_modules/it-pipe/node_modules/it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" }, "node_modules/it-pushable": { "version": "1.4.2", @@ -6813,11 +7524,12 @@ } }, "node_modules/it-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-3.0.0.tgz", - "integrity": "sha512-NxR40odATeaBmSefn6Xn43DplYvn2KtEKQzn4jrTRuPYXMky5M4e+KQ7aTJh0k0vkytLyeenGO1I1GXlGm4laQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-5.0.1.tgz", + "integrity": "sha512-Vj9TliHgCsIE21oqWDhrE1E5QALZw1n9QiaZg2EiWPFKSvCSm7lGDycy1OYs3LYhgvmTQDKJestlzVSHJ/YsJw==", "dependencies": { - "bl": "^5.0.0" + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.2.0" } }, "node_modules/it-sort": { @@ -6828,35 +7540,16 @@ "it-all": "^1.0.6" } }, + "node_modules/it-stream-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-1.0.4.tgz", + "integrity": "sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw==" + }, "node_modules/it-take": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/it-take/-/it-take-1.0.2.tgz", "integrity": "sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==" }, - "node_modules/it-to-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", - "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", - "dependencies": { - "buffer": "^6.0.3", - "fast-fifo": "^1.0.0", - "get-iterator": "^1.0.2", - "p-defer": "^3.0.0", - "p-fifo": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/it-ws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/it-ws/-/it-ws-4.0.0.tgz", - "integrity": "sha512-XmTzpMkevc6rUboy73r0CCNhciMmL/Yxir9O6FujRwdrjysztqLBQ1Xkr4CpY2m7BVSCObKotaCWJeZ29lOXRA==", - "dependencies": { - "buffer": "^6.0.3", - "event-iterator": "^2.0.0", - "iso-url": "^1.1.2", - "ws": "^7.3.1" - } - }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -7023,15 +7716,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7039,11 +7728,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -7074,20 +7758,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/karma": { "version": "6.3.16", "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", @@ -7226,190 +7896,140 @@ } }, "node_modules/libp2p": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-0.36.2.tgz", - "integrity": "sha512-UpNYBMQVivMu56zoibdGitopv39uBBAybIBOEGWmFy/I2NnTVGUutLPrxo47AuN2kntYgo/TNJfW+PpswUgSaw==", + "version": "0.37.3-05e8e7e", + "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-0.37.3-05e8e7e.tgz", + "integrity": "sha512-0RR5X6Cjkt8odz6MTw/Y5eOgtg8YHLwHZt0uETKiS6MRhebgwl3ytlIuZDjT8WsvKVBqGeDGtXtWSEHvy3SlSw==", "dependencies": { - "@vascosantos/moving-average": "^1.1.0", - "abortable-iterator": "^3.0.0", - "aggregate-error": "^3.1.0", + "@achingbrain/nat-port-mapper": "^1.0.3", + "@libp2p/components": "^2.0.1", + "@libp2p/connection": "^4.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-address-manager": "^1.0.1", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-connection-encrypter": "^1.0.2", + "@libp2p/interface-content-routing": "^1.0.1", + "@libp2p/interface-dht": "^1.0.0", + "@libp2p/interface-metrics": "^2.0.0", + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-routing": "^1.0.0", + "@libp2p/interface-peer-store": "^1.2.0", + "@libp2p/interface-pubsub": "^1.0.3", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interface-stream-muxer": "^2.0.1", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/multistream-select": "^2.0.1", + "@libp2p/peer-collections": "^2.0.0", + "@libp2p/peer-id": "^1.1.10", + "@libp2p/peer-id-factory": "^1.0.9", + "@libp2p/peer-record": "^3.0.0", + "@libp2p/peer-store": "^3.0.0", + "@libp2p/tracked-map": "^2.0.1", + "@libp2p/utils": "^3.0.0", + "@multiformats/mafmt": "^11.0.2", + "@multiformats/multiaddr": "^10.1.8", + "abortable-iterator": "^4.0.2", "any-signal": "^3.0.0", - "bignumber.js": "^9.0.1", - "class-is": "^1.1.0", "datastore-core": "^7.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.0", - "es6-promisify": "^7.0.0", + "err-code": "^3.0.1", "events": "^3.3.0", "hashlru": "^2.3.0", - "interface-datastore": "^6.0.2", - "it-all": "^1.0.4", - "it-buffer": "^0.1.2", - "it-drain": "^1.0.3", - "it-filter": "^1.0.1", - "it-first": "^1.0.4", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-drain": "^1.0.5", + "it-filter": "^1.0.3", + "it-first": "^1.0.6", "it-foreach": "^0.1.1", - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.2", - "it-map": "^1.0.4", - "it-merge": "^1.0.0", - "it-pipe": "^1.1.0", + "it-handshake": "^4.0.0", + "it-length-prefixed": "^7.0.1", + "it-map": "^1.0.6", + "it-merge": "^1.0.3", + "it-pair": "^2.0.2", + "it-pipe": "^2.0.3", "it-sort": "^1.0.1", - "it-take": "^1.0.0", - "libp2p-crypto": "^0.21.2", - "libp2p-interfaces": "^4.0.0", - "libp2p-utils": "^0.4.0", - "mafmt": "^10.0.0", + "it-stream-types": "^1.0.4", "merge-options": "^3.0.4", - "mortice": "^2.0.1", - "multiaddr": "^10.0.0", - "multiformats": "^9.0.0", - "multistream-select": "^3.0.0", + "multiformats": "^9.6.3", "mutable-proxy": "^1.0.0", - "nat-api": "^0.3.1", "node-forge": "^1.2.1", - "p-any": "^3.0.0", "p-fifo": "^1.0.0", - "p-retry": "^4.4.0", - "p-settle": "^4.1.1", - "peer-id": "^0.16.0", - "private-ip": "^2.1.0", - "protobufjs": "^6.10.2", + "p-retry": "^5.0.0", + "p-settle": "^5.0.0", + "private-ip": "^2.3.3", + "protons-runtime": "^1.0.4", "retimer": "^3.0.0", "sanitize-filename": "^1.6.3", "set-delayed-interval": "^1.0.0", - "streaming-iterables": "^6.0.0", "timeout-abort-controller": "^3.0.0", "uint8arrays": "^3.0.0", - "varint": "^6.0.0", "wherearewe": "^1.0.0", "xsalsa20": "^1.1.0" }, "engines": { - "node": ">=15.0.0" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/libp2p-bootstrap": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/libp2p-bootstrap/-/libp2p-bootstrap-0.14.0.tgz", - "integrity": "sha512-j3slZo5nOdA8wVlav8dRZeAXutZ7psz/f10DLoIEX/EFif7uU5oZfIYvjbVGo3ZDl+VQLo2tR0m1lV0westQ3g==", + "node_modules/libp2p/node_modules/@libp2p/peer-collections": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-2.0.0.tgz", + "integrity": "sha512-A074sSs0Kv3g/1gaf3ZvMc05sLmho3c3uJtkep4L3cgHokMW0pF+3YovU5KvdgBCB8GEepXiUvYsdPYzehVl7A==", "dependencies": { - "debug": "^4.3.1", - "mafmt": "^10.0.0", - "multiaddr": "^10.0.0", - "peer-id": "^0.16.0" + "@libp2p/interface-peer-id": "^1.0.4", + "@libp2p/peer-id": "^1.1.0" }, "engines": { - "node": ">=15.0.0" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/libp2p-crypto": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz", - "integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==", + "node_modules/libp2p/node_modules/it-handshake": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-4.0.1.tgz", + "integrity": "sha512-80dJPkxA77iTy172OnTWg5pjiOQ7KO0+o2FGCyJn3Vb/NJQKQiWL7LJY50uT5n8EYzv8SV5dDNF234PwMsQAXw==", + "dependencies": { + "it-map": "^1.0.6", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/libp2p/node_modules/it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "node_modules/libp2p/node_modules/it-reader": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.1.tgz", + "integrity": "sha512-C+YRk3OTufbKSJMNEonfEw+9F38llmwwZvqhkjb0xIgob7l4L3p01Yt43+bHRI8SSppAOgk5AKLqas7ea0UTAw==", + "dependencies": { + "it-stream-types": "^1.0.4", + "uint8arraylist": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/libp2p/node_modules/uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", "dependencies": { - "@noble/ed25519": "^1.5.1", - "@noble/secp256k1": "^1.3.0", - "err-code": "^3.0.1", - "iso-random-stream": "^2.0.0", - "multiformats": "^9.4.5", - "node-forge": "^1.2.1", - "protobufjs": "^6.11.2", "uint8arrays": "^3.0.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/libp2p-gossipsub": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/libp2p-gossipsub/-/libp2p-gossipsub-0.13.0.tgz", - "integrity": "sha512-xy2jRZGmJpjy++Di6f1admtjve8Fx0z5l8NISTQS282egwbRMmTPE6/UeYktb6hNGAgtSTIwXdHjXmMOiTarFA==", - "dependencies": { - "@types/debug": "^4.1.7", - "debug": "^4.3.1", - "denque": "^1.5.0", - "err-code": "^3.0.1", - "it-pipe": "^1.1.0", - "libp2p-interfaces": "^4.0.4", - "peer-id": "^0.16.0", - "protobufjs": "^6.11.2", - "uint8arrays": "^3.0.0" - } - }, - "node_modules/libp2p-interfaces": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/libp2p-interfaces/-/libp2p-interfaces-4.0.6.tgz", - "integrity": "sha512-3KjzNEIWhi+VoOamLvgKKUE/xqwxSw/JYqsBnfMhAWVRvRtosROtVT03wci2XbuuowCYw+/hEX1xKJIR1w5n0A==", - "dependencies": { - "abortable-iterator": "^3.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "it-length-prefixed": "^5.0.2", - "it-pipe": "^1.1.0", - "it-pushable": "^1.4.2", - "libp2p-crypto": "^0.21.0", - "multiaddr": "^10.0.0", - "multiformats": "^9.1.2", - "p-queue": "^6.6.2", - "peer-id": "^0.16.0", - "protobufjs": "^6.10.2", - "uint8arrays": "^3.0.0" - } - }, - "node_modules/libp2p-mplex": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/libp2p-mplex/-/libp2p-mplex-0.10.7.tgz", - "integrity": "sha512-21VV0DZWuOsHgitWy1GZD1M/kki3a/hVoAJ5QC48p01JNSK5W8gxRiZtq7cCGJ/xNpbQxvMlMtS5eq8CFRlysg==", - "dependencies": { - "abortable-iterator": "^3.0.2", - "bl": "^5.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "it-pipe": "^1.1.0", - "it-pushable": "^1.4.1", - "varint": "^6.0.0" - } - }, - "node_modules/libp2p-utils": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/libp2p-utils/-/libp2p-utils-0.4.1.tgz", - "integrity": "sha512-kq/US2unamiyY+YwP47dO1uqpAdcbdYI2Fzi9JIEhjfPBaD1MR/uyQ/YP7ABthl3EaxAjIQYd1TVp85d6QKAtQ==", - "dependencies": { - "abortable-iterator": "^3.0.0", - "debug": "^4.3.0", - "err-code": "^3.0.1", - "ip-address": "^8.0.0", - "is-loopback-addr": "^1.0.0", - "multiaddr": "^10.0.0", - "private-ip": "^2.1.1" - } - }, - "node_modules/libp2p-websockets": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/libp2p-websockets/-/libp2p-websockets-0.16.2.tgz", - "integrity": "sha512-QGfo8jX1Ks16yi8C67CCyMW7k9cfCYiQ0lzKVJBud0fV3ymbMO2L8gzU6iXUUZTHILo8ka26zKhwQ4lmUMI+nA==", - "dependencies": { - "abortable-iterator": "^3.0.0", - "class-is": "^1.1.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "ipfs-utils": "^9.0.1", - "it-ws": "^4.0.0", - "libp2p-utils": "^0.4.0", - "mafmt": "^10.0.0", - "multiaddr": "^10.0.0", - "multiaddr-to-uri": "^8.0.0", - "p-defer": "^3.0.0", - "p-timeout": "^4.1.0" - } - }, - "node_modules/libp2p/node_modules/streaming-iterables": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/streaming-iterables/-/streaming-iterables-6.0.0.tgz", - "integrity": "sha512-GYbJh0ife8PvryWSyFifY1m1uj6zO12d9duuP6xltiOolUz44eKasp5gbFhRbFbLy50ik6hcKn4Pbxl9AkxB+Q==", - "engines": { - "node": ">=10" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/lilconfig": { @@ -7788,7 +8408,33 @@ "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "node_modules/longbits": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/longbits/-/longbits-1.1.0.tgz", + "integrity": "sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ==", + "dependencies": { + "byte-access": "^1.0.1", + "uint8arraylist": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/longbits/node_modules/uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "dependencies": { + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } }, "node_modules/loose-envify": { "version": "1.4.0", @@ -7829,14 +8475,6 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "node_modules/mafmt": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mafmt/-/mafmt-10.0.0.tgz", - "integrity": "sha512-K1bziJOXcnepfztu+2Xy9FLKVLaFMDuspmiyJIYRxnO0WOxFSV7XKSdMxMrVZxcvg1+YjlTIvSGTImUHU2k4Aw==", - "dependencies": { - "multiaddr": "^10.0.0" - } - }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -8058,6 +8696,7 @@ "version": "1.48.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8066,6 +8705,7 @@ "version": "2.1.31", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, "dependencies": { "mime-db": "1.48.0" }, @@ -8094,6 +8734,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8309,14 +8950,29 @@ } }, "node_modules/mortice": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mortice/-/mortice-2.0.1.tgz", - "integrity": "sha512-9gsXmjq+5LZmXDIoyC/crf2i/7CUwDGSBEwSEsr1i/WfKmJ6DVt38B5kg6BE/WF/1/yfGJYiB1Wyiu423iI3nQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.0.tgz", + "integrity": "sha512-g4rgq//2PWn4m52G6TpCSGmtWabJM8LKCZTQY4W7z0foiaQkqw+FG9a6pwIqUcTkCgBQoet8G/24V6adVMpnHw==", "dependencies": { "nanoid": "^3.1.20", - "observable-webworkers": "^1.0.0", - "p-queue": "^6.0.0", - "promise-timeout": "^1.3.0" + "observable-webworkers": "^2.0.1", + "p-queue": "^7.2.0", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/mortice/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ms": { @@ -8324,50 +8980,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multiaddr": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-10.0.1.tgz", - "integrity": "sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==", - "dependencies": { - "dns-over-http-resolver": "^1.2.3", - "err-code": "^3.0.1", - "is-ip": "^3.1.0", - "multiformats": "^9.4.5", - "uint8arrays": "^3.0.0", - "varint": "^6.0.0" - } - }, - "node_modules/multiaddr-to-uri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz", - "integrity": "sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==", - "dependencies": { - "multiaddr": "^10.0.0" - } - }, "node_modules/multiformats": { "version": "9.6.5", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz", "integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw==" }, - "node_modules/multistream-select": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/multistream-select/-/multistream-select-3.0.2.tgz", - "integrity": "sha512-ICGA8DAviZj6Xo1NkaRV3J38M+tFDoWiGtO1ksluyMnskAsdGjAzocg806OzpQPivNGWWboX3CrFT2Tk4UdYXA==", - "dependencies": { - "abortable-iterator": "^3.0.0", - "bl": "^5.0.0", - "debug": "^4.1.1", - "err-code": "^3.0.1", - "it-first": "^1.0.6", - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.0", - "it-pipe": "^1.0.1", - "it-reader": "^3.0.0", - "p-defer": "^3.0.0", - "uint8arrays": "^3.0.0" - } - }, "node_modules/mutable-proxy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mutable-proxy/-/mutable-proxy-1.0.0.tgz", @@ -8397,35 +9014,6 @@ "picocolors": "^1.0.0" } }, - "node_modules/nat-api": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/nat-api/-/nat-api-0.3.1.tgz", - "integrity": "sha512-5cyLugEkXnKSKSvVjKjxxPMLDnkwY3boZLbATWwiGJ4T/3UvIpiQmzb2RqtxxEFcVo/7PwsHPGN0MosopONO8Q==", - "dependencies": { - "async": "^3.2.0", - "debug": "^4.2.0", - "default-gateway": "^6.0.2", - "request": "^2.88.2", - "unordered-array-remove": "^1.0.2", - "xml2js": "^0.1.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/nat-api/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/native-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", - "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", - "peerDependencies": { - "node-fetch": "*" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8466,6 +9054,7 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==", + "dev": true, "engines": { "node": "4.x || >=6.0.0" } @@ -8897,14 +9486,6 @@ "node": ">=6" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8968,9 +9549,13 @@ } }, "node_modules/observable-webworkers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-1.0.0.tgz", - "integrity": "sha512-+cECwCR8IEh8UY5nefQVLO9Cydqpk1izO+o7BABmKjXfJZyEOzBWY3ss5jbOPM6KmEa9aQExvAtTW6tVTOsNAQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-2.0.1.tgz", + "integrity": "sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } }, "node_modules/on-finished": { "version": "2.3.0", @@ -9024,35 +9609,40 @@ "node": ">= 0.8.0" } }, - "node_modules/p-any": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-any/-/p-any-3.0.0.tgz", - "integrity": "sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w==", - "dependencies": { - "p-cancelable": "^2.0.0", - "p-some": "^5.0.0" - }, + "node_modules/p-defer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", + "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dependencies": { + "p-timeout": "^5.0.2" + }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "node_modules/p-event/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-fifo": { @@ -9064,12 +9654,12 @@ "p-defer": "^3.0.0" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/p-fifo/node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/p-limit": { @@ -9133,90 +9723,92 @@ } }, "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.2.0.tgz", + "integrity": "sha512-Kvv7p13M46lTYLQ/PsZdaj/1Vj6u/8oiIJgyQyx4oVkOfHdd7M2EZvXigDvcsSzRwanCzQirV5bJPQFoSQt5MA==", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "eventemitter3": "^4.0.7", + "p-timeout": "^5.0.2" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-queue/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-3.1.0.tgz", + "integrity": "sha512-3sG3UlpisPSaX+o7u2q01hIQmrpkvdl5GSO1ZwL7pfc5kHB2bPF0eFNCfYTrW1/LTUdgmPwBAvmT0Zr8eSmaAQ==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-5.1.1.tgz", + "integrity": "sha512-i69WkEU5ZAL8mrmdmVviWwU+DN+IUF8f4sSJThoJ3z5A7Nn5iuO5ROX3Boye0u+uYQLOSfgFl7SuFZCjlAVbQA==", "dependencies": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.1", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-settle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", - "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-5.1.0.tgz", + "integrity": "sha512-ujR6UFfh09ziOKyC5aaJak5ZclsjlLw57SYtFZg6yllMofyygnaibQRZ4jf6QPWqoOCGUXyb1cxUKELeAyKO7g==", "dependencies": { - "p-limit": "^2.2.2", - "p-reflect": "^2.1.0" + "p-limit": "^4.0.0", + "p-reflect": "^3.1.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-settle/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-some": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-some/-/p-some-5.0.0.tgz", - "integrity": "sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig==", - "dependencies": { - "aggregate-error": "^3.0.0", - "p-cancelable": "^2.0.0" - }, + "node_modules/p-settle/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9226,6 +9818,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", + "dev": true, "engines": { "node": ">=10" } @@ -9234,6 +9827,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -9348,32 +9942,12 @@ "node": "*" } }, - "node_modules/peer-id": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz", - "integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==", - "dependencies": { - "class-is": "^1.1.0", - "libp2p-crypto": "^0.21.0", - "multiformats": "^9.4.5", - "protobufjs": "^6.10.2", - "uint8arrays": "^3.0.0" - }, - "engines": { - "node": ">=15.0.0" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -9564,11 +10138,13 @@ } }, "node_modules/private-ip": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.2.1.tgz", - "integrity": "sha512-jN1WT/br/VNW9xEcwHr6DjtOKxQ5qOIqmh7o+co2TWgq56pZJw99iO3UT1tWdfgsQiyK9FqG4ji3ykwpjFqITA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.3.3.tgz", + "integrity": "sha512-5zyFfekIVUOTVbL92hc8LJOtE/gyGHeREHkJ2yTyByP8Q2YZVoBqLg3EfYLeF0oVvGqtaEX2t2Qovja0/gStXw==", "dependencies": { "ip-regex": "^4.3.0", + "ipaddr.js": "^2.0.1", + "is-ip": "^3.1.0", "netmask": "^2.0.2" } }, @@ -9602,15 +10178,11 @@ "node": ">=0.4.0" } }, - "node_modules/promise-timeout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz", - "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" - }, "node_modules/protobufjs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "dev": true, "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -9671,7 +10243,8 @@ "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, "node_modules/pump": { "version": "3.0.0", @@ -9687,6 +10260,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, "engines": { "node": ">=6" } @@ -9839,14 +10413,6 @@ "node": ">=0.9" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9968,14 +10534,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-native-fetch-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz", - "integrity": "sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw==", - "dependencies": { - "p-defer": "^3.0.0" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10164,18 +10722,6 @@ "ms": "^2.1.1" } }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/redent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", @@ -10237,46 +10783,6 @@ "node": ">=0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10311,18 +10817,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -10416,18 +10910,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.9.0.tgz", - "integrity": "sha512-cVqm7LjgBqtZ77M9hLYayXrLz18nLIVPp3MPqNi2suStrFDg1LsA2cSdMIighr2yeuAQrphu8ymXTAsJNVABow==", - "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^4.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -10463,12 +10945,14 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/sanitize-filename": { "version": "1.6.3", @@ -10554,18 +11038,6 @@ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10818,35 +11290,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -10856,24 +11299,6 @@ "node": ">= 0.6" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-to-it": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", - "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==", - "dependencies": { - "get-iterator": "^1.0.2" - } - }, "node_modules/streamroller": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", @@ -11406,18 +11831,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -11466,7 +11879,7 @@ "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -11600,22 +12013,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11734,6 +12131,32 @@ "node": "*" } }, + "node_modules/uint8-varint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-1.0.2.tgz", + "integrity": "sha512-IubsiyUyX2snBV+XmTa+Q9hjGejhDznwIzXMyl3ZjVWog3h/mDijB8s/s/9ujQpJ2Yskj51hWAvbeS7B7Em61g==", + "dependencies": { + "byte-access": "^1.0.0", + "longbits": "^1.1.0", + "uint8arraylist": "^2.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/uint8-varint/node_modules/uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "dependencies": { + "uint8arrays": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/uint8arraylist": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-1.5.1.tgz", @@ -11803,6 +12226,15 @@ "ieee754": "^1.1.13" } }, + "node_modules/undici": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz", + "integrity": "sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==", + "peer": true, + "engines": { + "node": ">=12.18" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -11824,11 +12256,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unordered-array-remove": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", - "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11842,6 +12269,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -11849,7 +12277,7 @@ "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" }, "node_modules/utf8-bytes": { "version": "0.0.1", @@ -11923,19 +12351,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -12053,72 +12468,6 @@ } } }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -12178,11 +12527,15 @@ } }, "node_modules/wherearewe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.0.tgz", - "integrity": "sha512-oQnRsAfMCqNAC7U4JrBdmFXAhBRLOkPGOfU5+nw9fs2D3g8O6EV7hn7BhpXtt0yno4pxFiRD55rMyt0fsLMqlw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.2.tgz", + "integrity": "sha512-HyLZ7n1Yox+w1qWaFEgP/sMs5D7ka2UXmoVNaY0XzbEHLGljo4ScBchYm6cWRYNO33tmFX3Mgg4BiZkDOjihyw==", "dependencies": { "is-electron": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/which": { @@ -12221,12 +12574,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -12300,26 +12647,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -12339,14 +12666,23 @@ } }, "node_modules/xml2js": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz", - "integrity": "sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dependencies": { - "sax": ">=0.1.1" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": "*" + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" } }, "node_modules/xmlchars": { @@ -12356,9 +12692,9 @@ "dev": true }, "node_modules/xsalsa20": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.1.0.tgz", - "integrity": "sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", + "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" }, "node_modules/y18n": { "version": "5.0.8", @@ -12506,6 +12842,56 @@ } }, "dependencies": { + "@achingbrain/ip-address": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@achingbrain/ip-address/-/ip-address-8.1.0.tgz", + "integrity": "sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, + "@achingbrain/nat-port-mapper": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.7.tgz", + "integrity": "sha512-P8Z8iMZBQCsN7q3XoVoJAX3CGPUTbGTh1XBU8JytCW3hBmSk594l8YvdrtY5NVexVHSwLeiXnDsP4d10NJHaeg==", + "requires": { + "@achingbrain/ssdp": "^4.0.1", + "@libp2p/logger": "^2.0.0", + "default-gateway": "^6.0.2", + "err-code": "^3.0.1", + "it-first": "^1.0.7", + "p-defer": "^4.0.0", + "p-timeout": "^5.0.2", + "xml2js": "^0.4.23" + }, + "dependencies": { + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + } + } + }, + "@achingbrain/ssdp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.0.1.tgz", + "integrity": "sha512-z/CkfFI0Ksrpo8E+lu2rKahlE1KJHUn8X8ihQj2Jg6CEL+oHYGCNfttOES0+VnV7htuog70c8bYNHYhlmmqxBQ==", + "requires": { + "event-iterator": "^2.0.0", + "freeport-promise": "^2.0.0", + "merge-options": "^3.0.4", + "uuid": "^8.3.2", + "xml2js": "^0.4.23" + } + }, "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -12858,24 +13244,119 @@ "to-fast-properties": "^2.0.0" } }, - "@chainsafe/libp2p-noise": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-5.0.3.tgz", - "integrity": "sha512-IT7q9JaEjv4aU3zO8zeomWyw79rLo8hGcmnyWOE1P/dVIT+jqrF08R3rVXonujBbmi6SSgZbB6NModqW+Oa2jw==", + "@chainsafe/libp2p-gossipsub": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-3.4.0.tgz", + "integrity": "sha512-vN73j3t69TXy82Zx3guPB1AZa/8hHyDvgeHrjmegadugs6eywuR+BJTsmD3vd7FAZvD9g6Bdekt1VuE2GG8GOw==", "requires": { + "@libp2p/components": "^2.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-pubsub": "^1.0.1", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/peer-record": "^2.0.0", + "@libp2p/pubsub": "^3.0.0", + "@libp2p/topology": "^3.0.0", + "abortable-iterator": "^4.0.2", + "denque": "^1.5.0", + "err-code": "^3.0.1", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "multiformats": "^9.6.4", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + }, + "dependencies": { + "@libp2p/peer-record": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-2.0.2.tgz", + "integrity": "sha512-JkH9fBpBpGQYqDMJP3+LNtXLyjNCf0fVcBkdjyfPTSwUXTPJ5NxsluJAH+MZkkrJG9YJG22NgrZO5784GSLAaA==", + "requires": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + } + }, + "@libp2p/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-R0r9fkskuTmm5jMrlRXWpTdYJeDYcNQ1KdfSEmoVlCs5AlTeWn31+cdaHQihSEbkpEKtVCExfsZkwa3f7C1l8A==", + "requires": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + }, + "dependencies": { + "@libp2p/interface-connection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-1.0.1.tgz", + "integrity": "sha512-4MP+RvqR5xu6EWgrebLo34HWm/X+hGXtzsCKmNfmLN9bpaYhEobzL4Rm3RYi/0ICrgAZmoU8n+x8widiuwERew==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + } + } + } + }, + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + } + } + }, + "@chainsafe/libp2p-noise": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-7.0.1.tgz", + "integrity": "sha512-V5vYb2jKlnd9jwDcxCB48RvzqHcMZsamTAd0eXZgvCujlu5VmbyaWFcuvIwFY3dHTrVcFQKntIg5WDaqmkuhcg==", + "requires": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection-encrypter": "^1.0.2", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-collections": "^1.0.0", + "@libp2p/peer-id": "^1.1.8", "@stablelib/chacha20poly1305": "^1.0.1", "@stablelib/hkdf": "^1.0.1", "@stablelib/sha256": "^1.0.1", "@stablelib/x25519": "^1.0.1", - "bl": "^5.0.0", - "debug": "^4.3.1", - "it-buffer": "^0.1.3", - "it-length-prefixed": "^5.0.3", - "it-pair": "^1.0.0", - "it-pb-rpc": "^0.2.0", - "it-pipe": "^1.1.0", - "peer-id": "^0.16.0", - "protobufjs": "^6.11.2", + "it-length-prefixed": "^7.0.1", + "it-pair": "^2.0.2", + "it-pb-stream": "^1.0.2", + "it-pipe": "^2.0.3", + "protons-runtime": "^1.0.3", + "uint8arraylist": "^1.4.0", "uint8arrays": "^3.0.0" } }, @@ -13167,12 +13648,6 @@ "@cspotcode/source-map-consumer": "0.8.0" } }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, "@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -13350,15 +13825,708 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "@libp2p/components": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/components/-/components-2.0.1.tgz", + "integrity": "sha512-3+HgBnu7MbSBcAODtMRxSbdZ54vNB2TGxmPxeNhDBFb+jTw4pUwCeXUcTkSNzsY8cME0MhsEzQ7bwpdXa9xPeQ==", + "requires": { + "@libp2p/interface-address-manager": "^1.0.1", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-connection-manager": "^1.0.0", + "@libp2p/interface-content-routing": "^1.0.0", + "@libp2p/interface-dht": "^1.0.0", + "@libp2p/interface-metrics": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-routing": "^1.0.0", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/interface-pubsub": "^1.0.0", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0" + } + }, + "@libp2p/connection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/connection/-/connection-4.0.0.tgz", + "integrity": "sha512-fBiyKzuFQ4jeKK0fQ2tCHjpRgGO/wPM0W4dHCLnb+LB94Jv9mIlMmKbaDnju8+K1Pd67/Y1/L3OQElHtwYJOsA==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1" + } + }, + "@libp2p/crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-1.0.0.tgz", + "integrity": "sha512-oV/KaHE8XaJQDH+iDq4Kn4GaVWRsEXJnLXTpN+8hz00tuxxsE3+4g0OYaFCauAYeX1IcGPwMvUhdgujnKzpAbg==", + "requires": { + "@libp2p/interface-keys": "^1.0.2", + "@noble/ed25519": "^1.6.0", + "@noble/secp256k1": "^1.5.4", + "err-code": "^3.0.1", + "iso-random-stream": "^2.0.0", + "multiformats": "^9.4.5", + "node-forge": "^1.1.0", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + } + }, + "@libp2p/interface-address-manager": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-address-manager/-/interface-address-manager-1.0.2.tgz", + "integrity": "sha512-YUZzuY3yySXaeYd/LXkEDV/aKp6eJBsropXypwqeP3ErmEvkN06nbShQQAyNvRnloecYVAeLt2IZW2N9ImlRFg==", + "requires": { + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0" + } + }, + "@libp2p/interface-connection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-2.1.1.tgz", + "integrity": "sha512-gjugaMsZvfo3r4tCc/yPifVQsfLogmEmJtW+eXMNiNDna3ZfmwWD9Z+KyEwuVsXKs0C4GESXei2y4SJSCEfkbA==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/interface-connection-encrypter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-encrypter/-/interface-connection-encrypter-1.0.2.tgz", + "integrity": "sha512-Ed5o8eP8H3KMKDgsEaId+R7BdGGFCpjT5Ng2PYtFS+7kECZ+7fYL+nYDMP7h5cf65GJTQNrelGQwyeXQqx8Z9A==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/interface-connection-manager": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-manager/-/interface-connection-manager-1.0.2.tgz", + "integrity": "sha512-92gM7sZhVidD+vsQbc+LbI4MMvxgRjFy9kUrrsOosbtCt0nl68rIeRFKRpfX92/4QY40tL41VXT69ijCUskEwg==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + } + }, + "@libp2p/interface-content-routing": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-content-routing/-/interface-content-routing-1.0.2.tgz", + "integrity": "sha512-Ue1X8XrZ4ymTMQk/GWom/EKfPB5Lu7zy33ohjSix26Da/HbBvkXBdnYGDj485vxSOZGZRqeBhh21nCVjD/yLyg==", + "requires": { + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "multiformats": "^9.6.3" + } + }, + "@libp2p/interface-dht": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-dht/-/interface-dht-1.0.1.tgz", + "integrity": "sha512-EToxQznHUnD9frWoHwq8DUaOa7RZ2qoo6beb1aWdQrEJsEdUBi62FHh9qrLkrL+E4W3rkl2+WrhSP6/iHxZZwQ==", + "requires": { + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "multiformats": "^9.6.3" + } + }, + "@libp2p/interface-keys": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interface-keys/-/interface-keys-1.0.3.tgz", + "integrity": "sha512-K8/HlRl/swbVTWuGHNHF28EytszYfUhKgUHfv8CdbMk9ZA/bgO4uU+d9rcrg/Dhw3511U3aRz2bwl2psn6rJfg==" + }, + "@libp2p/interface-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface-metrics/-/interface-metrics-2.0.0.tgz", + "integrity": "sha512-OUMspbgamrPgTQWA9zjyrcVQtXpWegSzPllDVwySBefv14l6AhpgicvVI8s+FPbzdKSj6AanlYDa7V8Ui/14CQ==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/interface-peer-discovery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-discovery/-/interface-peer-discovery-1.0.1.tgz", + "integrity": "sha512-ZqBhpX7fR3ROYQaGYV47YhyTJJzFDzyyEIsQ7NnDuG3KhcQb2PtocnN0sy1Ozm784M0oYveM/HjfuNxxcOwdYg==", + "requires": { + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + } + }, + "@libp2p/interface-peer-id": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-id/-/interface-peer-id-1.0.4.tgz", + "integrity": "sha512-VRnE0MqmS1kN43hyKCEdkhz0gciuDML7hpL3p8zDm0LnveNMLJsR+/VSUaugCi/muOzLaLk26WffKWbMYfnGfA==", + "requires": { + "multiformats": "^9.6.3" + } + }, + "@libp2p/interface-peer-info": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.2.tgz", + "integrity": "sha512-8dGBj8+6PdBDsMAASxX2sECnWhK7zAnv8iCFgYXY5Z6fbQwA+7iVAea9FdjgyLapdIzDarttPt3Gdou8tXZdGg==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@multiformats/multiaddr": "^10.2.0" + } + }, + "@libp2p/interface-peer-routing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-routing/-/interface-peer-routing-1.0.1.tgz", + "integrity": "sha512-MKx2g0mIUI6qNuLv3xApKXR2ZrO9CUTT9ZPL0gvRlhpFCXovEkdWJ1h8KnmkR7tGPxKHt2bsCCJ8gqUaFeNstA==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interfaces": "^3.0.0" + } + }, + "@libp2p/interface-peer-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-store/-/interface-peer-store-1.2.0.tgz", + "integrity": "sha512-4244DmDppLf6Av6gALoO7iMPVhBO6Hx3dbkUy7Vb3OfxS//Ix+uDUib2hypIK2Q2rKmn3dfzvDBt0GwlkSMJCg==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interface-peer-info": "^1.0.0", + "@libp2p/interface-record": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0" + } + }, + "@libp2p/interface-pubsub": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interface-pubsub/-/interface-pubsub-1.0.4.tgz", + "integrity": "sha512-BSkt0h4fbBBHcr3LCF7fTtAoCdQBjKbTGxCa4tIJpI3m5suxC5h6OrLC2rmrexOxR9aZRkr9da4VShRyOfRLag==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "it-pushable": "^3.0.0" + }, + "dependencies": { + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + } + } + }, + "@libp2p/interface-record": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-record/-/interface-record-1.0.2.tgz", + "integrity": "sha512-bYNxKtsUOsNucHeAXCZbAQxFXwR7JvoOmodwEByriMvTWYRbd6d8rm8VHZ/17QgdRFlIwNnpIPuoyyLQ8Wn1rQ==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0" + } + }, + "@libp2p/interface-registrar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-registrar/-/interface-registrar-2.0.2.tgz", + "integrity": "sha512-HqDQua9J6T9KzrdYA9EhYsI0oc4CeSR1sfi0qdk073/IB3SlP+XtD7RzzVuGeyXjssqZtqf3RwjV7C+zOlHYlw==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.0" + } + }, + "@libp2p/interface-stream-muxer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-stream-muxer/-/interface-stream-muxer-2.0.1.tgz", + "integrity": "sha512-DDh9DT6kgN6Uo/EkydHh0/MqLMuM7eg9AyoUV4X/tt6kWulXr/Xq5i4Ho3PsPGPEz+o+75cgZkzywOIenD0VWA==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interfaces": "^3.0.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/interface-transport": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-transport/-/interface-transport-1.0.2.tgz", + "integrity": "sha512-alOdxYfYQp/v2rMGc5V7GSfRUSJc4C38HfqI3CLEfSD9DJ3NFid804MvbOS/v4mP4yWtHyN/tfR5fmH8mmGqPw==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/interfaces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-3.0.3.tgz", + "integrity": "sha512-8IIxw7TKpaYTtVfZN3jePLlm/E/VzqPpqerN+jhA+1s86akRSeyxVBYi3W9SWDSf0oIauHJSDE8KNxLceAfeag==" + }, + "@libp2p/logger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-2.0.0.tgz", + "integrity": "sha512-aC1Yz4bni8Cui1tKCL5PzQSlS3BE/hhvyVnEHhcUz+GCo+MpbmyrZSPAb/m1e7bHrDDKkT1f9DSr7vgmS/NkuQ==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.2", + "debug": "^4.3.3", + "interface-datastore": "^6.1.0", + "multiformats": "^9.6.3" + } + }, + "@libp2p/mplex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/mplex/-/mplex-4.0.1.tgz", + "integrity": "sha512-LOs5xEPjY10Bq98q1Ipa4/PQ83uj6i/JkvaAZ85/hgiqLrfVYkqs31AF0G35DgvM1eaVjmJoE7f1u4UHKaCEMQ==", + "requires": { + "@libp2p/components": "^2.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-stream-muxer": "^2.0.0", + "@libp2p/logger": "^2.0.0", + "@libp2p/tracked-map": "^2.0.0", + "abortable-iterator": "^4.0.2", + "any-signal": "^3.0.0", + "err-code": "^3.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.4.0", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "dependencies": { + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + } + } + }, + "@libp2p/multistream-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-2.0.2.tgz", + "integrity": "sha512-xW8BVHXw4JDSLFC+/3PxctwkPxPHfEYdq1hiB7F7adVp65ERg+65TEd0RD/knNOj+aMQkrQl0DUsldSTRNTWkw==", + "requires": { + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "it-first": "^1.0.6", + "it-handshake": "^4.0.1", + "it-length-prefixed": "^8.0.2", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0", + "uint8arraylist": "^2.0.0", + "uint8arrays": "^3.0.0" + }, + "dependencies": { + "it-handshake": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-4.0.1.tgz", + "integrity": "sha512-80dJPkxA77iTy172OnTWg5pjiOQ7KO0+o2FGCyJn3Vb/NJQKQiWL7LJY50uT5n8EYzv8SV5dDNF234PwMsQAXw==", + "requires": { + "it-map": "^1.0.6", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + } + }, + "it-length-prefixed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-8.0.2.tgz", + "integrity": "sha512-qYCGZ6lTaI6lcuTXUrJmVpE6clq63ULrkq1FGTxHrzexjB2cCrS/CZ5HCRDZ5IRPw33tSDUDK91S7X5S64dPyQ==", + "requires": { + "err-code": "^3.0.1", + "it-stream-types": "^1.0.4", + "uint8-varint": "^1.0.1", + "uint8arraylist": "^2.0.0", + "uint8arrays": "^3.0.0" + } + }, + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "it-reader": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.1.tgz", + "integrity": "sha512-C+YRk3OTufbKSJMNEonfEw+9F38llmwwZvqhkjb0xIgob7l4L3p01Yt43+bHRI8SSppAOgk5AKLqas7ea0UTAw==", + "requires": { + "it-stream-types": "^1.0.4", + "uint8arraylist": "^2.0.0" + } + }, + "uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "requires": { + "uint8arrays": "^3.0.0" + } + } + } + }, + "@libp2p/peer-collections": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-1.0.3.tgz", + "integrity": "sha512-xrnFlZ2CpYiUQ0fGE0WqfBONiE2rjkjWHXnS6gH7CudlD0JMSftbzI+naBXRunfZal7CNEtHN7+keVX+ingPgA==", + "requires": { + "@libp2p/interfaces": "^2.0.0", + "@libp2p/peer-id": "^1.1.0" + }, + "dependencies": { + "@libp2p/interfaces": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-2.0.4.tgz", + "integrity": "sha512-MfwkTFyHJtvwNxkjOjzkXyIVvKFtEW2Q3IGRJPyPQMrtB6ll0rGMTlyJ3BQS1bcD0YkNhggFm+8XiU2/0LCBhQ==", + "requires": { + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-pushable": "^2.0.1", + "it-stream-types": "^1.0.4", + "multiformats": "^9.6.3" + } + }, + "it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" + } + } + }, + "@libp2p/peer-id": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-1.1.14.tgz", + "integrity": "sha512-8Ch/kQGyoDl3m0TYz/uuHRbJ3TRoG7XI9ZTFHd1P21KrpF3YvCeK5PCWDsP7IICc+Q39n0IS9zLVhGySiS7FXQ==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "err-code": "^3.0.1", + "multiformats": "^9.6.3", + "uint8arrays": "^3.0.0" + } + }, + "@libp2p/peer-id-factory": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-1.0.16.tgz", + "integrity": "sha512-DWiJX2OnvDGaVN2kg7NcqL2tNAp8LerT2Lj0ImuXuh0Q1wxI8Wt1PbymoRmE5kQiYG6qyu1iAb7Q9BRerf+New==", + "requires": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-keys": "^1.0.2", + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/peer-id": "^1.0.0", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + } + }, + "@libp2p/peer-record": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-3.0.0.tgz", + "integrity": "sha512-JN7Q78G1lg9fRiaghbzN0ZlerkOE646XaMrtUtAmMWsumrs75tTuZHgcYLsoAxiL6WmzJ4I9uCoY+jUl3O7l/Q==", + "requires": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^3.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + } + }, + "@libp2p/peer-store": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-3.1.0.tgz", + "integrity": "sha512-GYOK/kTjrDxVW2CIQII60zGgLx4EDG1CLXHOOcsdob8MCw/A23UwKEdIxsw2YAJvQBExDWPZjZvbG1ewPHtrFQ==", + "requires": { + "@libp2p/components": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-store": "^1.1.0", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.0", + "@libp2p/peer-record": "^2.0.0", + "@multiformats/multiaddr": "^10.2.0", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "mortice": "^3.0.0", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0" + }, + "dependencies": { + "@libp2p/interface-connection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-1.0.1.tgz", + "integrity": "sha512-4MP+RvqR5xu6EWgrebLo34HWm/X+hGXtzsCKmNfmLN9bpaYhEobzL4Rm3RYi/0ICrgAZmoU8n+x8widiuwERew==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.0", + "@libp2p/interfaces": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "it-stream-types": "^1.0.4" + } + }, + "@libp2p/peer-record": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-2.0.2.tgz", + "integrity": "sha512-JkH9fBpBpGQYqDMJP3+LNtXLyjNCf0fVcBkdjyfPTSwUXTPJ5NxsluJAH+MZkkrJG9YJG22NgrZO5784GSLAaA==", + "requires": { + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-record": "^1.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-id": "^1.1.13", + "@libp2p/utils": "^2.0.0", + "@multiformats/multiaddr": "^10.1.5", + "err-code": "^3.0.1", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-filter": "^1.0.3", + "it-foreach": "^0.1.1", + "it-map": "^1.0.6", + "it-pipe": "^2.0.3", + "multiformats": "^9.6.3", + "protons-runtime": "^1.0.4", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + } + }, + "@libp2p/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-R0r9fkskuTmm5jMrlRXWpTdYJeDYcNQ1KdfSEmoVlCs5AlTeWn31+cdaHQihSEbkpEKtVCExfsZkwa3f7C1l8A==", + "requires": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + } + } + } + }, + "@libp2p/pubsub": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/pubsub/-/pubsub-3.0.3.tgz", + "integrity": "sha512-DKIkvjjX7/I+no7SAyCiK4lSs/u2FdnSaksvxkD4TocUyKqlXcDO89rYQElSHGN5HaHa59DLaClyQdzuqoLLCg==", + "requires": { + "@libp2p/components": "^2.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-pubsub": "^1.0.3", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/peer-collections": "^2.0.0", + "@libp2p/peer-id": "^1.1.0", + "@libp2p/topology": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "iso-random-stream": "^2.0.0", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", + "it-pushable": "^3.0.0", + "multiformats": "^9.6.3", + "p-queue": "^7.2.0", + "uint8arrays": "^3.0.0" + }, + "dependencies": { + "@libp2p/peer-collections": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-2.0.0.tgz", + "integrity": "sha512-A074sSs0Kv3g/1gaf3ZvMc05sLmho3c3uJtkep4L3cgHokMW0pF+3YovU5KvdgBCB8GEepXiUvYsdPYzehVl7A==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.4", + "@libp2p/peer-id": "^1.1.0" + } + }, + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + } + } + }, + "@libp2p/topology": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/topology/-/topology-3.0.0.tgz", + "integrity": "sha512-gQMkO1j7D/7A9MfL2mtLxr0StXzjqK0V554w7hk25E66Ly0wp1K7vPEfhE9rExLSaQqe9ir4nijhbA3rNnxZng==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.2.0", + "err-code": "^3.0.1", + "it-all": "^1.0.6" + } + }, + "@libp2p/tracked-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/tracked-map/-/tracked-map-2.0.1.tgz", + "integrity": "sha512-T0/m67VAZuEw+AO9U+rlLFkHUqB1w0Dy9Pqw2+f0XL6uplv2xXKSJeU0yUAjiOGsfrJ4pUPPQbgsz2Xr3WNoIQ==", + "requires": { + "@libp2p/interface-metrics": "^2.0.0" + } + }, + "@libp2p/utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-3.0.0.tgz", + "integrity": "sha512-ik2IjnoO+73/5b3gSfXyMS3+eQAhNpzhzvvqQNOI8gcU6jcLvliStldwt1LKiMe9M3ZUOy6LHeB/3vF1dO9CSA==", + "requires": { + "@achingbrain/ip-address": "^8.1.0", + "@libp2p/interface-connection": "^2.1.0", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/logger": "^2.0.0", + "@multiformats/multiaddr": "^10.1.1", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "is-loopback-addr": "^2.0.1", + "it-stream-types": "^1.0.4", + "private-ip": "^2.1.1" + } + }, + "@libp2p/websockets": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-3.0.1.tgz", + "integrity": "sha512-H9xyxvZ0+0SACIGY6Ppa19K3h567set8tfSnxy/fjzUAJRM6ZwYMROh5N0dMLjyl/vjqTNh5iyJmnO3upddGGA==", + "requires": { + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.1", + "@libp2p/logger": "^2.0.0", + "@libp2p/utils": "^3.0.0", + "@multiformats/mafmt": "^11.0.2", + "@multiformats/multiaddr": "^10.1.5", + "@multiformats/multiaddr-to-uri": "^9.0.0", + "abortable-iterator": "^4.0.2", + "err-code": "^3.0.1", + "it-ws": "^5.0.0", + "p-defer": "^4.0.0", + "p-timeout": "^5.0.2", + "wherearewe": "^1.0.0" + }, + "dependencies": { + "it-ws": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/it-ws/-/it-ws-5.0.2.tgz", + "integrity": "sha512-beq/nBWuKm2Ds4nYSfPuZRF0USVZJhsIvuUH3kRE5QdaCzivDK7zyeewDgsNBSPr6hPgF5dyPP5NXcXhUcb9QQ==", + "requires": { + "event-iterator": "^2.0.0", + "iso-url": "^1.1.2", + "it-stream-types": "^1.0.2", + "uint8arrays": "^3.0.0", + "ws": "^8.4.0" + } + }, + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} + } + } + }, + "@multiformats/mafmt": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-11.0.2.tgz", + "integrity": "sha512-KesMM4fSEpMz1kZPzlvdwYNYrq5iH38S5EDKLu5qsGG4NT94UaruTjase9osaDW+CcDfshK9uZUD9lzpXJGreA==", + "requires": { + "@multiformats/multiaddr": "^10.1.1" + } + }, + "@multiformats/multiaddr": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-10.3.3.tgz", + "integrity": "sha512-+LX9RovG7DJsANb+U6VchV/tApcdJzeafbi5+MPUam90oL91BbEh6ozNZOz4Qf5ZEeilexc12oomatmODJh1/w==", + "requires": { + "dns-over-http-resolver": "^2.1.0", + "err-code": "^3.0.1", + "is-ip": "^4.0.0", + "multiformats": "^9.4.5", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "dependencies": { + "dns-over-http-resolver": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-2.1.0.tgz", + "integrity": "sha512-eb8RGy6k54JdD7Rjw8g65y1MyA4z3m3IIYh7uazkgZuKIdFn8gYt8dydMm3op+2UshDdk9EexrXcDluKNY/CDg==", + "requires": { + "debug": "^4.3.1", + "native-fetch": "^4.0.2", + "receptacle": "^1.3.2" + } + }, + "ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==" + }, + "is-ip": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-4.0.0.tgz", + "integrity": "sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw==", + "requires": { + "ip-regex": "^5.0.0" + } + }, + "native-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", + "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "requires": {} + } + } + }, + "@multiformats/multiaddr-to-uri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.1.tgz", + "integrity": "sha512-kSyHZ2lKjoEzHu/TM4ZVwFj4AWV1B9qFBFJjYb/fK1NqrnrNb/M3uhoyckJvP7WZvpDsnEc7fUCpmPipDY6LMw==", + "requires": { + "@multiformats/multiaddr": "^10.1.1" + } + }, "@noble/ed25519": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.5.1.tgz", - "integrity": "sha512-VX0TyIhKghm/NoTno/k71oCQO55f36yiSwuNOqEHu9BvxQuzel0tsvcsU2KjX/iN6pCkN53Bvfq1+gWNiwXDGQ==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.6.1.tgz", + "integrity": "sha512-Gptpue6qPmg7p1E5LBO5GDtXw5WMc2DVtUmu4EQequOcoCvum1dT9sY6s9M8aSJWq9YopCN4jmTOAvqMdw3q7w==" }, "@noble/secp256k1": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.3.4.tgz", - "integrity": "sha512-ZVRouDO5mbdCiDg4zCd3ZZABduRtpy4tCnB33Gh9upHe9tRzpiqbRSN1VTjrj/2g8u2c6MBi0YLNnNQpBYOiWg==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -13389,27 +14557,32 @@ "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true }, "@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true }, "@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true }, "@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true }, "@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true, "requires": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -13418,27 +14591,32 @@ "@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true }, "@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true }, "@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true }, "@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true }, "@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true }, "@rollup/plugin-commonjs": { "version": "22.0.0", @@ -13463,25 +14641,6 @@ } } }, - "@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, "@rollup/plugin-json": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", @@ -13764,6 +14923,7 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, "requires": { "@types/ms": "*" } @@ -13809,12 +14969,8 @@ "@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true }, "@types/minimist": { "version": "1.2.2", @@ -13831,12 +14987,14 @@ "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, "@types/node": { "version": "17.0.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.6.tgz", - "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==" + "integrity": "sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", @@ -13864,15 +15022,6 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/tail": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@types/tail/-/tail-2.2.1.tgz", @@ -13885,15 +15034,6 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, - "@types/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-2jBazyxGl4644tvu3VAez8UA/AtrcEetT9HOeAbqZ/vAcRVL/ZDFQjSS7rkWusU5cyONQVUz+nwwrNZdMva4ow==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/yauzl": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", @@ -14102,11 +15242,6 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "@vascosantos/moving-average": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vascosantos/moving-average/-/moving-average-1.1.0.tgz", - "integrity": "sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w==" - }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -14253,29 +15388,6 @@ "@xtuc/long": "4.2.2" } }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -14295,11 +15407,12 @@ "dev": true }, "abortable-iterator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-3.0.2.tgz", - "integrity": "sha512-qVP8HFfTpUQI2F+f1tpTriKDIZ4XrmwCrBCrQeRKO7DKWF3kgoT6NXiNDv2krrGcHxPwmI63eGQiec81sEaWIw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-4.0.2.tgz", + "integrity": "sha512-SJGELER5yXr9v3kiL6mT5RZ1qlyJ9hV4nm34+vfsdIM1lp3zENQvpsqKgykpFLgRMUn3lzlizLTpiOASW05/+g==", "requires": { - "get-iterator": "^1.0.2" + "get-iterator": "^2.0.0", + "it-stream-types": "^1.0.3" } }, "accepts": { @@ -14368,6 +15481,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -14377,6 +15491,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14528,19 +15643,6 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -14565,22 +15667,14 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-arraybuffer": { "version": "1.0.1", @@ -14591,7 +15685,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "base64id": { "version": "2.0.0", @@ -14599,35 +15694,12 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -14707,6 +15779,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14746,15 +15819,6 @@ "node-releases": "^1.1.73" } }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -14773,6 +15837,24 @@ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, + "byte-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/byte-access/-/byte-access-1.0.1.tgz", + "integrity": "sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw==", + "requires": { + "uint8arraylist": "^2.0.0" + }, + "dependencies": { + "uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "requires": { + "uint8arrays": "^3.0.0" + } + } + } + }, "bytes-iec": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", @@ -14850,11 +15932,6 @@ "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", @@ -14920,15 +15997,11 @@ "integrity": "sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA==", "dev": true }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true }, "clear-module": { "version": "4.1.2", @@ -15000,17 +16073,6 @@ } } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -15042,16 +16104,11 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, "comment-json": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.1.1.tgz", @@ -15080,7 +16137,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "configstore": { "version": "5.0.1", @@ -15149,7 +16207,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cors": { "version": "2.8.5", @@ -15431,14 +16490,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "data-urls": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", @@ -15451,9 +16502,9 @@ } }, "datastore-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.0.tgz", - "integrity": "sha512-FdudjeH+GHjbuU8X1mIKIv8uHAErF6qtjqWFJiVKOdITk6KdiSKis4Hsfu80RWDEFQ9l9s47XIVf5FMKTtoeWA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-7.0.3.tgz", + "integrity": "sha512-DmPsUux63daOfCszxLkcp6LjdJ0k/BQNhIMtoAi5mbraYQnEQkFtKORmTu6XmDX6ujbtaBkeuJAiCBNI7MZklw==", "requires": { "debug": "^4.1.1", "err-code": "^3.0.1", @@ -15466,6 +16517,13 @@ "it-pushable": "^1.4.2", "it-take": "^1.0.1", "uint8arrays": "^3.0.0" + }, + "dependencies": { + "it-pipe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-1.1.0.tgz", + "integrity": "sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==" + } } }, "date-format": { @@ -15579,7 +16637,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "denque": { "version": "1.5.0", @@ -15619,20 +16678,10 @@ "path-type": "^4.0.0" } }, - "dns-over-http-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", - "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", - "requires": { - "debug": "^4.3.1", - "native-fetch": "^3.0.0", - "receptacle": "^1.3.2" - } - }, "dns-query": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/dns-query/-/dns-query-0.11.1.tgz", - "integrity": "sha512-ZdXl7HdLa23JqpAj8EdUg/oO9qwlDvWf2iY/cFCTHF6deJWv/xglgs3WrvTz9/Ig3NGv5lF4FIZjURl2FUvFog==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/dns-query/-/dns-query-0.11.2.tgz", + "integrity": "sha512-zF8qxQpqCB467o4A63DLpQClo77H642JEKMx0Ra9GFww7Rx0234Fo8NoG0LBoSBZxamWkXfLxhzDG19bTBHvXQ==", "requires": { "@leichtgewicht/base64-codec": "^1.0.0", "@leichtgewicht/dns-packet": "^6.0.2", @@ -15686,36 +16735,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - } - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron-fetch": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.7.4.tgz", - "integrity": "sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw==", - "requires": { - "encoding": "^0.1.13" - } - }, "electron-to-chromium": { "version": "1.3.810", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.810.tgz", @@ -15740,14 +16765,6 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -15818,12 +16835,6 @@ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, "err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", @@ -15889,11 +16900,6 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "es6-promisify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz", - "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==" - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -16370,7 +17376,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extract-zip": { "version": "2.0.1", @@ -16395,11 +17402,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-check": { "version": "2.23.2", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.23.2.tgz", @@ -16412,7 +17414,8 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-diff": { "version": "1.2.0", @@ -16441,7 +17444,8 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -16449,12 +17453,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -16604,20 +17602,10 @@ "signal-exit": "^3.0.2" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "freeport-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", + "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==" }, "fromentries": { "version": "1.3.2", @@ -16692,9 +17680,9 @@ } }, "get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", - "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.0.tgz", + "integrity": "sha512-BDJawD5PU2gZv6Vlp8O28H4GnZcsr3h9gZUvnAP5xXP3WOy/QAoOsyMepSkw21jur+4t5Vppde72ChjhTIzxzg==" }, "get-package-type": { "version": "0.1.0", @@ -16723,14 +17711,6 @@ "get-intrinsic": "^1.1.1" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "gh-pages": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", @@ -16889,20 +17869,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -17028,16 +17994,6 @@ "debug": "4" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -17063,6 +18019,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -17070,7 +18027,8 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "4.0.6", @@ -17102,16 +18060,6 @@ } } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -17121,7 +18069,8 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -17170,53 +18119,15 @@ "side-channel": "^1.0.4" } }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip-address": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-8.1.0.tgz", - "integrity": "sha512-Wz91gZKpNKoXtqvY8ScarKYwhXoK4r/b5QuT+uywe/azv0/nUCo7Bh0IRRI7F9DHR06kJNWtzMGLIbXavngbKA==", - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "1.1.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - } - } - }, "ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" }, - "ipfs-utils": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.5.tgz", - "integrity": "sha512-GXWfsq/nKtwkcTI4+KGc4CU9EFXjtkWaGcFAsnm177kAhA0Fnn8aWNRaF/C0xFraUIl1wTAUTWkaGKigVyfsTw==", - "requires": { - "any-signal": "^3.0.0", - "buffer": "^6.0.1", - "electron-fetch": "^1.7.2", - "err-code": "^3.0.1", - "is-electron": "^2.2.0", - "iso-url": "^1.1.5", - "it-glob": "^1.0.1", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "nanoid": "^3.1.20", - "native-fetch": "^3.0.0", - "node-fetch": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "react-native-fetch-api": "^2.0.0", - "stream-to-it": "^0.2.2" - } + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-arrayish": { "version": "0.2.1", @@ -17313,9 +18224,9 @@ } }, "is-loopback-addr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-1.0.1.tgz", - "integrity": "sha512-DhWU/kqY7X2F6KrrVTu7mHlbd2Pbo4D1YkAzasBMjQs6lJAoefxaA6m6CpSX0K6pjt9D0b9PNFI5zduy/vzOYw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.1.tgz", + "integrity": "sha512-SEsepLbdWFb13B6U0tt6dYcUM0iK/U7XOC43N70Z4Qb88WpNtp+ospyNI9ddpqncs7Z7brAEsVBTQpaqSNntIw==" }, "is-module": { "version": "1.0.0", @@ -17352,15 +18263,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -17418,7 +18320,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-unicode-supported": { "version": "0.1.0", @@ -17453,9 +18356,9 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "iso-random-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.0.tgz", - "integrity": "sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.2.tgz", + "integrity": "sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==", "requires": { "events": "^3.3.0", "readable-stream": "^3.4.0" @@ -17466,12 +18369,6 @@ "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.1.5.tgz", "integrity": "sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ==" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, "isomorphic-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", @@ -17482,11 +18379,6 @@ "whatwg-fetch": "^3.4.1" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -17590,23 +18482,6 @@ "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" }, - "it-buffer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/it-buffer/-/it-buffer-0.1.3.tgz", - "integrity": "sha512-9a2/9SYVwG7bcn3tpRDR4bXbtuMLXnDK48KVC+GXiQg97ZOOdWz2nIITBsOQ19b+gj01Rw8RNwtiLDLI8P8oiQ==", - "requires": { - "bl": "^5.0.0", - "buffer": "^6.0.3" - } - }, - "it-concat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/it-concat/-/it-concat-2.0.0.tgz", - "integrity": "sha512-jchrEB3fHlUENWkVJRmbFJ1A7gcjJDmwiolQsHhVC14DpUIbX8fgr3SOC7XNE5OoUUQNL6/RaMCPChkPemyQUw==", - "requires": { - "bl": "^5.0.0" - } - }, "it-drain": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.5.tgz", @@ -17627,32 +18502,33 @@ "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-0.1.1.tgz", "integrity": "sha512-ZLxL651N5w5SL/EIIcrXELgYrrkuEKj/TErG93C4lr6lNZziKsf338ljSG85PjQfu7Frg/1wESl5pLrPSFXI9g==" }, - "it-glob": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz", - "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==", - "requires": { - "@types/minimatch": "^3.0.4", - "minimatch": "^3.0.4" - } - }, "it-handshake": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-2.0.0.tgz", - "integrity": "sha512-K4q+mz8aLlCK3vTjtgNdHC9c/JbuOATsfogarjMsLcBZC5vYfKbX3Gq3AWcCdjIsIrPqzTlhPKSxl64LJkrt2w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-3.0.1.tgz", + "integrity": "sha512-Rx9ESanlfnC0aMw2LtLJ9YNlCNgnZU7wOHPzPSZTUAjbdZx54kllGR5ndIuoJqF2EtNIsmTiWEncKTgwHNJSSg==", "requires": { - "it-pushable": "^1.4.0", - "it-reader": "^3.0.0", - "p-defer": "^3.0.0" + "it-map": "^1.0.6", + "it-pushable": "^2.0.1", + "it-reader": "^5.0.0", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + }, + "dependencies": { + "it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" + } } }, "it-length-prefixed": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-5.0.3.tgz", - "integrity": "sha512-b+jDHLcnOnPDQN79ronmzF5jeBjdJsy0ce2O6i6X4J5tnaO8Fd146ZA/tMbzaLlKnTpXa0eKtofpYhumXGENeg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-7.0.1.tgz", + "integrity": "sha512-UozKoT0zZPUa0LO9OSq5KaLKPn83U7Vsy/BNAN0TUXfTI/pKrOz6RuyTSOok6NDad12FZsShBGnl9DKlfDT95g==", "requires": { - "bl": "^5.0.0", - "buffer": "^6.0.3", + "err-code": "^3.0.1", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.2.0", "varint": "^6.0.0" } }, @@ -17670,26 +18546,41 @@ } }, "it-pair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-1.0.0.tgz", - "integrity": "sha512-9raOiDu5OAuDOahtMtapKQDrQTxBfzlzrNcB6o7JARHkt+7Bb1dMkW/TpYdAjBJE77KH3e2zGzwpGUP9tXbLww==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-2.0.2.tgz", + "integrity": "sha512-QGgUwGtzE4mI8yPZawL+9wq49SBmhQdjKW+ChKBm4PUwRNdkgSoyPlu280iNyS0JscBG3pvytJ8JNVPSEBQNjg==", "requires": { - "get-iterator": "^1.0.2" + "it-stream-types": "^1.0.3", + "p-defer": "^4.0.0" } }, - "it-pb-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/it-pb-rpc/-/it-pb-rpc-0.2.0.tgz", - "integrity": "sha512-Rojodsa6yxSTZDqVVF9HXKsISoHtlLNOL0P6b/7oCswiscbjCpt1IB78BxRDHpFL3tg8jFPMNDTP3v6ZjrMf9w==", + "it-pb-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/it-pb-stream/-/it-pb-stream-1.0.2.tgz", + "integrity": "sha512-rPZKXtjcHXhvPprMdWjcCjMi4UaYIXZnBmFIJCW0f9rqZkyyjqSORyMpQoaP5+iDP7JaYiRzF4dyi51CSOhnbQ==", "requires": { - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.3" + "it-handshake": "^3.0.1", + "it-length-prefixed": "^7.0.0", + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.3.0" } }, "it-pipe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-1.1.0.tgz", - "integrity": "sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-2.0.3.tgz", + "integrity": "sha512-1bfNC0v8yFDQu5KwZpHZrVO+nxOIEXfrobYtv55NXcsMfGu2SueMOCyCm63khejA+sCU0gLcRFQIfKWlBNNTGw==", + "requires": { + "it-merge": "^1.0.4", + "it-pushable": "^2.0.0", + "it-stream-types": "^1.0.3" + }, + "dependencies": { + "it-pushable": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-2.0.2.tgz", + "integrity": "sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==" + } + } }, "it-pushable": { "version": "1.4.2", @@ -17700,11 +18591,12 @@ } }, "it-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-3.0.0.tgz", - "integrity": "sha512-NxR40odATeaBmSefn6Xn43DplYvn2KtEKQzn4jrTRuPYXMky5M4e+KQ7aTJh0k0vkytLyeenGO1I1GXlGm4laQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-5.0.1.tgz", + "integrity": "sha512-Vj9TliHgCsIE21oqWDhrE1E5QALZw1n9QiaZg2EiWPFKSvCSm7lGDycy1OYs3LYhgvmTQDKJestlzVSHJ/YsJw==", "requires": { - "bl": "^5.0.0" + "it-stream-types": "^1.0.4", + "uint8arraylist": "^1.2.0" } }, "it-sort": { @@ -17715,35 +18607,16 @@ "it-all": "^1.0.6" } }, + "it-stream-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-1.0.4.tgz", + "integrity": "sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw==" + }, "it-take": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/it-take/-/it-take-1.0.2.tgz", "integrity": "sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==" }, - "it-to-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", - "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", - "requires": { - "buffer": "^6.0.3", - "fast-fifo": "^1.0.0", - "get-iterator": "^1.0.2", - "p-defer": "^3.0.0", - "p-fifo": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "it-ws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/it-ws/-/it-ws-4.0.0.tgz", - "integrity": "sha512-XmTzpMkevc6rUboy73r0CCNhciMmL/Yxir9O6FujRwdrjysztqLBQ1Xkr4CpY2m7BVSCObKotaCWJeZ29lOXRA==", - "requires": { - "buffer": "^6.0.3", - "event-iterator": "^2.0.0", - "iso-url": "^1.1.2", - "ws": "^7.3.1" - } - }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -17867,15 +18740,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -17883,11 +18752,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -17910,17 +18774,6 @@ "universalify": "^2.0.0" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "karma": { "version": "6.3.16", "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", @@ -18038,182 +18891,124 @@ } }, "libp2p": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-0.36.2.tgz", - "integrity": "sha512-UpNYBMQVivMu56zoibdGitopv39uBBAybIBOEGWmFy/I2NnTVGUutLPrxo47AuN2kntYgo/TNJfW+PpswUgSaw==", + "version": "0.37.3-05e8e7e", + "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-0.37.3-05e8e7e.tgz", + "integrity": "sha512-0RR5X6Cjkt8odz6MTw/Y5eOgtg8YHLwHZt0uETKiS6MRhebgwl3ytlIuZDjT8WsvKVBqGeDGtXtWSEHvy3SlSw==", "requires": { - "@vascosantos/moving-average": "^1.1.0", - "abortable-iterator": "^3.0.0", - "aggregate-error": "^3.1.0", + "@achingbrain/nat-port-mapper": "^1.0.3", + "@libp2p/components": "^2.0.1", + "@libp2p/connection": "^4.0.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-address-manager": "^1.0.1", + "@libp2p/interface-connection": "^2.0.0", + "@libp2p/interface-connection-encrypter": "^1.0.2", + "@libp2p/interface-content-routing": "^1.0.1", + "@libp2p/interface-dht": "^1.0.0", + "@libp2p/interface-metrics": "^2.0.0", + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-routing": "^1.0.0", + "@libp2p/interface-peer-store": "^1.2.0", + "@libp2p/interface-pubsub": "^1.0.3", + "@libp2p/interface-registrar": "^2.0.0", + "@libp2p/interface-stream-muxer": "^2.0.1", + "@libp2p/interface-transport": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/logger": "^2.0.0", + "@libp2p/multistream-select": "^2.0.1", + "@libp2p/peer-collections": "^2.0.0", + "@libp2p/peer-id": "^1.1.10", + "@libp2p/peer-id-factory": "^1.0.9", + "@libp2p/peer-record": "^3.0.0", + "@libp2p/peer-store": "^3.0.0", + "@libp2p/tracked-map": "^2.0.1", + "@libp2p/utils": "^3.0.0", + "@multiformats/mafmt": "^11.0.2", + "@multiformats/multiaddr": "^10.1.8", + "abortable-iterator": "^4.0.2", "any-signal": "^3.0.0", - "bignumber.js": "^9.0.1", - "class-is": "^1.1.0", "datastore-core": "^7.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.0", - "es6-promisify": "^7.0.0", + "err-code": "^3.0.1", "events": "^3.3.0", "hashlru": "^2.3.0", - "interface-datastore": "^6.0.2", - "it-all": "^1.0.4", - "it-buffer": "^0.1.2", - "it-drain": "^1.0.3", - "it-filter": "^1.0.1", - "it-first": "^1.0.4", + "interface-datastore": "^6.1.0", + "it-all": "^1.0.6", + "it-drain": "^1.0.5", + "it-filter": "^1.0.3", + "it-first": "^1.0.6", "it-foreach": "^0.1.1", - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.2", - "it-map": "^1.0.4", - "it-merge": "^1.0.0", - "it-pipe": "^1.1.0", + "it-handshake": "^4.0.0", + "it-length-prefixed": "^7.0.1", + "it-map": "^1.0.6", + "it-merge": "^1.0.3", + "it-pair": "^2.0.2", + "it-pipe": "^2.0.3", "it-sort": "^1.0.1", - "it-take": "^1.0.0", - "libp2p-crypto": "^0.21.2", - "libp2p-interfaces": "^4.0.0", - "libp2p-utils": "^0.4.0", - "mafmt": "^10.0.0", + "it-stream-types": "^1.0.4", "merge-options": "^3.0.4", - "mortice": "^2.0.1", - "multiaddr": "^10.0.0", - "multiformats": "^9.0.0", - "multistream-select": "^3.0.0", + "multiformats": "^9.6.3", "mutable-proxy": "^1.0.0", - "nat-api": "^0.3.1", "node-forge": "^1.2.1", - "p-any": "^3.0.0", "p-fifo": "^1.0.0", - "p-retry": "^4.4.0", - "p-settle": "^4.1.1", - "peer-id": "^0.16.0", - "private-ip": "^2.1.0", - "protobufjs": "^6.10.2", + "p-retry": "^5.0.0", + "p-settle": "^5.0.0", + "private-ip": "^2.3.3", + "protons-runtime": "^1.0.4", "retimer": "^3.0.0", "sanitize-filename": "^1.6.3", "set-delayed-interval": "^1.0.0", - "streaming-iterables": "^6.0.0", "timeout-abort-controller": "^3.0.0", "uint8arrays": "^3.0.0", - "varint": "^6.0.0", "wherearewe": "^1.0.0", "xsalsa20": "^1.1.0" }, "dependencies": { - "streaming-iterables": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/streaming-iterables/-/streaming-iterables-6.0.0.tgz", - "integrity": "sha512-GYbJh0ife8PvryWSyFifY1m1uj6zO12d9duuP6xltiOolUz44eKasp5gbFhRbFbLy50ik6hcKn4Pbxl9AkxB+Q==" + "@libp2p/peer-collections": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-2.0.0.tgz", + "integrity": "sha512-A074sSs0Kv3g/1gaf3ZvMc05sLmho3c3uJtkep4L3cgHokMW0pF+3YovU5KvdgBCB8GEepXiUvYsdPYzehVl7A==", + "requires": { + "@libp2p/interface-peer-id": "^1.0.4", + "@libp2p/peer-id": "^1.1.0" + } + }, + "it-handshake": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-4.0.1.tgz", + "integrity": "sha512-80dJPkxA77iTy172OnTWg5pjiOQ7KO0+o2FGCyJn3Vb/NJQKQiWL7LJY50uT5n8EYzv8SV5dDNF234PwMsQAXw==", + "requires": { + "it-map": "^1.0.6", + "it-pushable": "^3.0.0", + "it-reader": "^6.0.1", + "it-stream-types": "^1.0.4", + "p-defer": "^4.0.0" + } + }, + "it-pushable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.0.0.tgz", + "integrity": "sha512-Lpo9Q6wghDDoX8RyA2vIkpNckd5E0EY7RzIKwgiTPakrTmwDw7tKMx6DDJ1ZXrunYnHdKHnKSHYJL3Csya5U2w==" + }, + "it-reader": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.1.tgz", + "integrity": "sha512-C+YRk3OTufbKSJMNEonfEw+9F38llmwwZvqhkjb0xIgob7l4L3p01Yt43+bHRI8SSppAOgk5AKLqas7ea0UTAw==", + "requires": { + "it-stream-types": "^1.0.4", + "uint8arraylist": "^2.0.0" + } + }, + "uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "requires": { + "uint8arrays": "^3.0.0" + } } } }, - "libp2p-bootstrap": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/libp2p-bootstrap/-/libp2p-bootstrap-0.14.0.tgz", - "integrity": "sha512-j3slZo5nOdA8wVlav8dRZeAXutZ7psz/f10DLoIEX/EFif7uU5oZfIYvjbVGo3ZDl+VQLo2tR0m1lV0westQ3g==", - "requires": { - "debug": "^4.3.1", - "mafmt": "^10.0.0", - "multiaddr": "^10.0.0", - "peer-id": "^0.16.0" - } - }, - "libp2p-crypto": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz", - "integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==", - "requires": { - "@noble/ed25519": "^1.5.1", - "@noble/secp256k1": "^1.3.0", - "err-code": "^3.0.1", - "iso-random-stream": "^2.0.0", - "multiformats": "^9.4.5", - "node-forge": "^1.2.1", - "protobufjs": "^6.11.2", - "uint8arrays": "^3.0.0" - } - }, - "libp2p-gossipsub": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/libp2p-gossipsub/-/libp2p-gossipsub-0.13.0.tgz", - "integrity": "sha512-xy2jRZGmJpjy++Di6f1admtjve8Fx0z5l8NISTQS282egwbRMmTPE6/UeYktb6hNGAgtSTIwXdHjXmMOiTarFA==", - "requires": { - "@types/debug": "^4.1.7", - "debug": "^4.3.1", - "denque": "^1.5.0", - "err-code": "^3.0.1", - "it-pipe": "^1.1.0", - "libp2p-interfaces": "^4.0.4", - "peer-id": "^0.16.0", - "protobufjs": "^6.11.2", - "uint8arrays": "^3.0.0" - } - }, - "libp2p-interfaces": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/libp2p-interfaces/-/libp2p-interfaces-4.0.6.tgz", - "integrity": "sha512-3KjzNEIWhi+VoOamLvgKKUE/xqwxSw/JYqsBnfMhAWVRvRtosROtVT03wci2XbuuowCYw+/hEX1xKJIR1w5n0A==", - "requires": { - "abortable-iterator": "^3.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "it-length-prefixed": "^5.0.2", - "it-pipe": "^1.1.0", - "it-pushable": "^1.4.2", - "libp2p-crypto": "^0.21.0", - "multiaddr": "^10.0.0", - "multiformats": "^9.1.2", - "p-queue": "^6.6.2", - "peer-id": "^0.16.0", - "protobufjs": "^6.10.2", - "uint8arrays": "^3.0.0" - } - }, - "libp2p-mplex": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/libp2p-mplex/-/libp2p-mplex-0.10.7.tgz", - "integrity": "sha512-21VV0DZWuOsHgitWy1GZD1M/kki3a/hVoAJ5QC48p01JNSK5W8gxRiZtq7cCGJ/xNpbQxvMlMtS5eq8CFRlysg==", - "requires": { - "abortable-iterator": "^3.0.2", - "bl": "^5.0.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "it-pipe": "^1.1.0", - "it-pushable": "^1.4.1", - "varint": "^6.0.0" - } - }, - "libp2p-utils": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/libp2p-utils/-/libp2p-utils-0.4.1.tgz", - "integrity": "sha512-kq/US2unamiyY+YwP47dO1uqpAdcbdYI2Fzi9JIEhjfPBaD1MR/uyQ/YP7ABthl3EaxAjIQYd1TVp85d6QKAtQ==", - "requires": { - "abortable-iterator": "^3.0.0", - "debug": "^4.3.0", - "err-code": "^3.0.1", - "ip-address": "^8.0.0", - "is-loopback-addr": "^1.0.0", - "multiaddr": "^10.0.0", - "private-ip": "^2.1.1" - } - }, - "libp2p-websockets": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/libp2p-websockets/-/libp2p-websockets-0.16.2.tgz", - "integrity": "sha512-QGfo8jX1Ks16yi8C67CCyMW7k9cfCYiQ0lzKVJBud0fV3ymbMO2L8gzU6iXUUZTHILo8ka26zKhwQ4lmUMI+nA==", - "requires": { - "abortable-iterator": "^3.0.0", - "class-is": "^1.1.0", - "debug": "^4.3.1", - "err-code": "^3.0.1", - "ipfs-utils": "^9.0.1", - "it-ws": "^4.0.0", - "libp2p-utils": "^0.4.0", - "mafmt": "^10.0.0", - "multiaddr": "^10.0.0", - "multiaddr-to-uri": "^8.0.0", - "p-defer": "^3.0.0", - "p-timeout": "^4.1.0" - } - }, "lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -18494,7 +19289,27 @@ "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "longbits": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/longbits/-/longbits-1.1.0.tgz", + "integrity": "sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ==", + "requires": { + "byte-access": "^1.0.1", + "uint8arraylist": "^2.0.0" + }, + "dependencies": { + "uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "requires": { + "uint8arrays": "^3.0.0" + } + } + } }, "loose-envify": { "version": "1.4.0", @@ -18529,14 +19344,6 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "mafmt": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mafmt/-/mafmt-10.0.0.tgz", - "integrity": "sha512-K1bziJOXcnepfztu+2Xy9FLKVLaFMDuspmiyJIYRxnO0WOxFSV7XKSdMxMrVZxcvg1+YjlTIvSGTImUHU2k4Aw==", - "requires": { - "multiaddr": "^10.0.0" - } - }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -18692,12 +19499,14 @@ "mime-db": { "version": "1.48.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true }, "mime-types": { "version": "2.1.31", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, "requires": { "mime-db": "1.48.0" } @@ -18717,6 +19526,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -18877,14 +19687,21 @@ } }, "mortice": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mortice/-/mortice-2.0.1.tgz", - "integrity": "sha512-9gsXmjq+5LZmXDIoyC/crf2i/7CUwDGSBEwSEsr1i/WfKmJ6DVt38B5kg6BE/WF/1/yfGJYiB1Wyiu423iI3nQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.0.tgz", + "integrity": "sha512-g4rgq//2PWn4m52G6TpCSGmtWabJM8LKCZTQY4W7z0foiaQkqw+FG9a6pwIqUcTkCgBQoet8G/24V6adVMpnHw==", "requires": { "nanoid": "^3.1.20", - "observable-webworkers": "^1.0.0", - "p-queue": "^6.0.0", - "promise-timeout": "^1.3.0" + "observable-webworkers": "^2.0.1", + "p-queue": "^7.2.0", + "p-timeout": "^5.0.2" + }, + "dependencies": { + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + } } }, "ms": { @@ -18892,50 +19709,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "multiaddr": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-10.0.1.tgz", - "integrity": "sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==", - "requires": { - "dns-over-http-resolver": "^1.2.3", - "err-code": "^3.0.1", - "is-ip": "^3.1.0", - "multiformats": "^9.4.5", - "uint8arrays": "^3.0.0", - "varint": "^6.0.0" - } - }, - "multiaddr-to-uri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz", - "integrity": "sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==", - "requires": { - "multiaddr": "^10.0.0" - } - }, "multiformats": { "version": "9.6.5", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz", "integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw==" }, - "multistream-select": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/multistream-select/-/multistream-select-3.0.2.tgz", - "integrity": "sha512-ICGA8DAviZj6Xo1NkaRV3J38M+tFDoWiGtO1ksluyMnskAsdGjAzocg806OzpQPivNGWWboX3CrFT2Tk4UdYXA==", - "requires": { - "abortable-iterator": "^3.0.0", - "bl": "^5.0.0", - "debug": "^4.1.1", - "err-code": "^3.0.1", - "it-first": "^1.0.6", - "it-handshake": "^2.0.0", - "it-length-prefixed": "^5.0.0", - "it-pipe": "^1.0.1", - "it-reader": "^3.0.0", - "p-defer": "^3.0.0", - "uint8arrays": "^3.0.0" - } - }, "mutable-proxy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mutable-proxy/-/mutable-proxy-1.0.0.tgz", @@ -18955,32 +19733,6 @@ "picocolors": "^1.0.0" } }, - "nat-api": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/nat-api/-/nat-api-0.3.1.tgz", - "integrity": "sha512-5cyLugEkXnKSKSvVjKjxxPMLDnkwY3boZLbATWwiGJ4T/3UvIpiQmzb2RqtxxEFcVo/7PwsHPGN0MosopONO8Q==", - "requires": { - "async": "^3.2.0", - "debug": "^4.2.0", - "default-gateway": "^6.0.2", - "request": "^2.88.2", - "unordered-array-remove": "^1.0.2", - "xml2js": "^0.1.0" - }, - "dependencies": { - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - } - } - }, - "native-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", - "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", - "requires": {} - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -19013,7 +19765,8 @@ "node-fetch": { "version": "npm:@achingbrain/node-fetch@2.6.7", "resolved": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==" + "integrity": "sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==", + "dev": true }, "node-forge": { "version": "1.3.1", @@ -19353,11 +20106,6 @@ } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -19400,9 +20148,9 @@ } }, "observable-webworkers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-1.0.0.tgz", - "integrity": "sha512-+cECwCR8IEh8UY5nefQVLO9Cydqpk1izO+o7BABmKjXfJZyEOzBWY3ss5jbOPM6KmEa9aQExvAtTW6tVTOsNAQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-2.0.1.tgz", + "integrity": "sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==" }, "on-finished": { "version": "2.3.0", @@ -19444,24 +20192,25 @@ "word-wrap": "^1.2.3" } }, - "p-any": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-any/-/p-any-3.0.0.tgz", - "integrity": "sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w==", - "requires": { - "p-cancelable": "^2.0.0", - "p-some": "^5.0.0" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, "p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", + "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==" + }, + "p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "requires": { + "p-timeout": "^5.0.2" + }, + "dependencies": { + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + } + } }, "p-fifo": { "version": "1.0.0", @@ -19470,13 +20219,15 @@ "requires": { "fast-fifo": "^1.0.0", "p-defer": "^3.0.0" + }, + "dependencies": { + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" + } } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -19522,75 +20273,70 @@ } }, "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.2.0.tgz", + "integrity": "sha512-Kvv7p13M46lTYLQ/PsZdaj/1Vj6u/8oiIJgyQyx4oVkOfHdd7M2EZvXigDvcsSzRwanCzQirV5bJPQFoSQt5MA==", "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "eventemitter3": "^4.0.7", + "p-timeout": "^5.0.2" }, "dependencies": { "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" } } }, "p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-3.1.0.tgz", + "integrity": "sha512-3sG3UlpisPSaX+o7u2q01hIQmrpkvdl5GSO1ZwL7pfc5kHB2bPF0eFNCfYTrW1/LTUdgmPwBAvmT0Zr8eSmaAQ==" }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-5.1.1.tgz", + "integrity": "sha512-i69WkEU5ZAL8mrmdmVviWwU+DN+IUF8f4sSJThoJ3z5A7Nn5iuO5ROX3Boye0u+uYQLOSfgFl7SuFZCjlAVbQA==", "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.1", "retry": "^0.13.1" } }, "p-settle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", - "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-5.1.0.tgz", + "integrity": "sha512-ujR6UFfh09ziOKyC5aaJak5ZclsjlLw57SYtFZg6yllMofyygnaibQRZ4jf6QPWqoOCGUXyb1cxUKELeAyKO7g==", "requires": { - "p-limit": "^2.2.2", - "p-reflect": "^2.1.0" + "p-limit": "^4.0.0", + "p-reflect": "^3.1.0" }, "dependencies": { "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" } } }, - "p-some": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-some/-/p-some-5.0.0.tgz", - "integrity": "sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig==", - "requires": { - "aggregate-error": "^3.0.0", - "p-cancelable": "^2.0.0" - } - }, "p-timeout": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", - "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==" + "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", + "dev": true }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "package-hash": { "version": "4.0.0", @@ -19672,29 +20418,12 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "peer-id": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz", - "integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==", - "requires": { - "class-is": "^1.1.0", - "libp2p-crypto": "^0.21.0", - "multiformats": "^9.4.5", - "protobufjs": "^6.10.2", - "uint8arrays": "^3.0.0" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -19832,11 +20561,13 @@ } }, "private-ip": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.2.1.tgz", - "integrity": "sha512-jN1WT/br/VNW9xEcwHr6DjtOKxQ5qOIqmh7o+co2TWgq56pZJw99iO3UT1tWdfgsQiyK9FqG4ji3ykwpjFqITA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-2.3.3.tgz", + "integrity": "sha512-5zyFfekIVUOTVbL92hc8LJOtE/gyGHeREHkJ2yTyByP8Q2YZVoBqLg3EfYLeF0oVvGqtaEX2t2Qovja0/gStXw==", "requires": { "ip-regex": "^4.3.0", + "ipaddr.js": "^2.0.1", + "is-ip": "^3.1.0", "netmask": "^2.0.2" } }, @@ -19861,15 +20592,11 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise-timeout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz", - "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" - }, "protobufjs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "dev": true, "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -19914,7 +20641,8 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, "pump": { "version": "3.0.0", @@ -19929,7 +20657,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "puppeteer": { "version": "13.5.1", @@ -20025,11 +20754,6 @@ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -20115,14 +20839,6 @@ "object-assign": "^4.1.1" } }, - "react-native-fetch-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz", - "integrity": "sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw==", - "requires": { - "p-defer": "^3.0.0" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -20258,15 +20974,6 @@ "ms": "^2.1.1" } }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, "redent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", @@ -20306,40 +21013,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -20368,15 +21041,6 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -20442,15 +21106,6 @@ "fsevents": "~2.3.2" } }, - "rollup-plugin-polyfill-node": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.9.0.tgz", - "integrity": "sha512-cVqm7LjgBqtZ77M9hLYayXrLz18nLIVPp3MPqNi2suStrFDg1LsA2cSdMIighr2yeuAQrphu8ymXTAsJNVABow==", - "dev": true, - "requires": { - "@rollup/plugin-inject": "^4.0.0" - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -20472,12 +21127,14 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sanitize-filename": { "version": "1.6.3", @@ -20547,15 +21204,6 @@ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -20763,53 +21411,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "stream-to-it": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", - "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==", - "requires": { - "get-iterator": "^1.0.2" - } - }, "streamroller": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", @@ -21196,15 +21803,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -21240,7 +21838,7 @@ "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "requires": { "utf8-byte-length": "^1.0.1" } @@ -21337,19 +21935,6 @@ } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -21422,6 +22007,26 @@ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, + "uint8-varint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-1.0.2.tgz", + "integrity": "sha512-IubsiyUyX2snBV+XmTa+Q9hjGejhDznwIzXMyl3ZjVWog3h/mDijB8s/s/9ujQpJ2Yskj51hWAvbeS7B7Em61g==", + "requires": { + "byte-access": "^1.0.0", + "longbits": "^1.1.0", + "uint8arraylist": "^2.0.0" + }, + "dependencies": { + "uint8arraylist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.0.0.tgz", + "integrity": "sha512-OOx2TiInuBOlvDDhS0um83DWVTvgvazvo96xkMVBV3RbDI5HPxdqudzsIKMzh2lklP52diJ/tVhAhlxHS2f0jA==", + "requires": { + "uint8arrays": "^3.0.0" + } + } + } + }, "uint8arraylist": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-1.5.1.tgz", @@ -21472,6 +22077,12 @@ } } }, + "undici": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz", + "integrity": "sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==", + "peer": true + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -21487,11 +22098,6 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "unordered-array-remove": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", - "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -21502,6 +22108,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -21509,7 +22116,7 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" }, "utf8-bytes": { "version": "0.0.1", @@ -21574,16 +22181,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -21683,44 +22280,6 @@ } } }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -21759,9 +22318,9 @@ } }, "wherearewe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.0.tgz", - "integrity": "sha512-oQnRsAfMCqNAC7U4JrBdmFXAhBRLOkPGOfU5+nw9fs2D3g8O6EV7hn7BhpXtt0yno4pxFiRD55rMyt0fsLMqlw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-1.0.2.tgz", + "integrity": "sha512-HyLZ7n1Yox+w1qWaFEgP/sMs5D7ka2UXmoVNaY0XzbEHLGljo4ScBchYm6cWRYNO33tmFX3Mgg4BiZkDOjihyw==", "requires": { "is-electron": "^2.2.0" } @@ -21793,12 +22352,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -21859,12 +22412,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", - "requires": {} - }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -21878,13 +22425,19 @@ "dev": true }, "xml2js": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz", - "integrity": "sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { - "sax": ">=0.1.1" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" } }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -21892,9 +22445,9 @@ "dev": true }, "xsalsa20": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.1.0.tgz", - "integrity": "sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", + "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 88dc178657..bae626ec1e 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,12 @@ "name": "js-waku", "version": "0.24.0", "description": "TypeScript implementation of the Waku v2 protocol", - "types": "./dist/esm/index.d.ts", - "main": "./dist/cjs/index.cjs", - "module": "./dist/esm/index.js", + "types": "./dist/index.d.ts", + "module": "./dist/index.js", "exports": { ".": { - "types": "./dist/esm/index.d.ts", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.cjs" + "types": "./dist/index.d.ts", + "import": "./dist/index.js" } }, "type": "module", @@ -25,11 +23,10 @@ ], "scripts": { "prepare": "husky install", - "build": "rimraf ./dist; run-s build:**", + "build": "run-s build:**", "build:esm": "tsc && node build-scripts/fix-imports.js", - "build:cjs": "rollup --config rollup.cjs.config.js -- dist/esm/index.js", - "build:umd": "webpack --config webpack.umd.config.cjs", - "build:umd:min": "terser --ecma 6 --compress --mangle -o dist/umd/index.min.js -- dist/umd/index.js && gzip -9 -c dist/umd/index.min.js > dist/umd/index.min.js.gz", + "build:bundle": "rollup --config rollup.config.js -- dist/index.js", + "build:bundle:min": "terser --ecma 11 --compress --mangle -o dist/bundle.min.js -- dist/bundle.js && gzip -9 -c dist/bundle.min.js > dist/bundle.min.js.gz", "size": "npm run build && size-limit", "fix": "run-s fix:*", "fix:prettier": "prettier \"src/**/*.ts\" \"./*.json\" \"*.*js\" \".github/**/*.yml\" --write", @@ -66,49 +63,50 @@ "node": ">=16" }, "dependencies": { - "@chainsafe/libp2p-noise": "^5.0.0", + "@chainsafe/libp2p-gossipsub": "^3.4.0", + "@chainsafe/libp2p-noise": "^7.0.1", "@ethersproject/rlp": "^5.5.0", + "@libp2p/crypto": "^1.0.0", + "@libp2p/interface-peer-discovery": "^1.0.0", + "@libp2p/interface-peer-id": "^1.0.2", + "@libp2p/interface-peer-info": "^1.0.1", + "@libp2p/interface-peer-store": "^1.0.0", + "@libp2p/interfaces": "^3.0.2", + "@libp2p/mplex": "^4.0.1", + "@libp2p/peer-id": "^1.1.10", + "@libp2p/websockets": "^3.0.0", + "@multiformats/multiaddr": "^10.2.0", "@noble/secp256k1": "^1.3.4", - "debug": "^4.3.1", - "dns-query": "^0.11.1", + "debug": "^4.3.4", + "dns-query": "^0.11.2", "hi-base32": "^0.5.1", - "it-concat": "^2.0.0", - "it-length-prefixed": "^5.0.2", - "it-pipe": "^1.1.0", + "it-all": "^1.0.6", + "it-length-prefixed": "^7.0.1", + "it-pipe": "^2.0.3", "js-sha3": "^0.8.0", - "libp2p": "^0.36.2", - "libp2p-bootstrap": "^0.14.0", - "libp2p-crypto": "^0.21.2", - "libp2p-gossipsub": "0.13.0", - "libp2p-interfaces": "^4.0.6", - "libp2p-mplex": "^0.10.4", - "libp2p-websockets": "^0.16.1", - "multiaddr": "^10.0.1", - "multiformats": "^9.6.5", - "peer-id": "^0.16.0", + "libp2p": "next", + "p-event": "^5.0.1", "protons-runtime": "^1.0.4", "uint8arrays": "^3.0.0", - "uuid": "^8.3.2", - "varint": "^6.0.0" + "uuid": "^8.3.2" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@libp2p/peer-id-factory": "^1.0.15", "@rollup/plugin-commonjs": "^22.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.3.0", "@size-limit/preset-big-lib": "^7.0.8", "@types/app-root-path": "^1.2.4", "@types/chai": "^4.2.15", + "@types/debug": "^4.1.7", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", - "@types/secp256k1": "^4.0.2", "@types/tail": "^2.0.0", "@types/uuid": "^8.3.0", - "@types/varint": "^6.0.0", "@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/parser": "^5.8.1", "app-root-path": "^3.0.0", - "buffer": "^6.0.3", "chai": "^4.3.4", "cspell": "^5.14.0", "eslint": "^8.6.0", @@ -139,22 +137,17 @@ "protons": "^3.0.4", "puppeteer": "^13.0.1", "rollup": "^2.75.0", - "rollup-plugin-polyfill-node": "^0.9.0", "size-limit": "^7.0.8", - "stream-browserify": "^3.0.0", "tail": "^2.2.0", "terser": "^5.13.1", "ts-loader": "^9.2.6", "ts-node": "^10.4.0", "typedoc": "^0.22.10", "typedoc-plugin-no-inherit": "^1.3.1", - "typescript": "^4.5.5", - "webpack-cli": "^4.10.0" + "typescript": "^4.5.5" }, "files": [ - "dist/esm", - "dist/cjs", - "dist/umd", + "dist", "src/*.ts", "src/lib/**/*.ts", "src/proto/**/*.ts", @@ -172,9 +165,39 @@ }, "size-limit": [ { - "path": "dist/umd/index.js", - "import": "{ Waku }", - "config": "./webpack.umd.config.cjs" + "name": "Waku core", + "path": "dist/bundle.min.js", + "import": "{ Waku }" + }, + { + "name": "Waku default setup", + "path": "dist/bundle.min.js", + "import": "{ createWaku, waitForRemotePeer }" + }, + { + "name": "Asymmetric, symmetric encryption and signature", + "path": "dist/bundle.min.js", + "import": "{ waku_message }" + }, + { + "name": "DNS discovery", + "path": "dist/bundle.min.js", + "import": "{ discovery }" + }, + { + "name": "Privacy preserving protocols", + "path": "dist/bundle.min.js", + "import": "{ WakuRelay }" + }, + { + "name": "Light protocols", + "path": "dist/bundle.min.js", + "import": "{ WakuLightPush, WakuFilter }" + }, + { + "name": "History retrieval protocols", + "path": "dist/bundle.min.js", + "import": "{ WakuStore }" } ], "lint-staged": { diff --git a/rollup.cjs.config.js b/rollup.cjs.config.js deleted file mode 100644 index 7c8f189ab3..0000000000 --- a/rollup.cjs.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import { nodeResolve } from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; -import json from "@rollup/plugin-json"; -import nodePolyfills from "rollup-plugin-polyfill-node"; - -export default { - output: { - file: "dist/cjs/index.cjs", - format: "cjs", - name: "waku", - }, - plugins: [ - commonjs(), - json(), - nodePolyfills(), - nodeResolve({ - browser: true, - preferBuiltins: false, - }), - ], -}; diff --git a/rollup.config.js b/rollup.config.js index 90f804398f..f9b1282164 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,18 +1,16 @@ import { nodeResolve } from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; import json from "@rollup/plugin-json"; -import nodePolyfills from "rollup-plugin-polyfill-node"; export default { output: { - file: "dist/umd/index.js", - format: "umd", + file: "dist/bundle.js", + format: "esm", name: "waku", }, plugins: [ commonjs(), json(), - nodePolyfills(), nodeResolve({ browser: true, preferBuiltins: false, diff --git a/src/index.ts b/src/index.ts index 5788df3c26..58d36d02a7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,12 +13,19 @@ export * as enr from "./lib/enr"; export * as utils from "./lib/utils"; +export { waitForRemotePeer } from "./lib/wait_for_remote_peer"; + +export * as proto_message from "./proto/message"; + export * as waku from "./lib/waku"; -export { Waku, Protocols } from "./lib/waku"; +export { createWaku, Waku, Protocols } from "./lib/waku"; export * as waku_message from "./lib/waku_message"; export { WakuMessage } from "./lib/waku_message"; +export * as waku_filter from "./lib/waku_filter"; +export { WakuFilter } from "./lib/waku_filter"; + export * as waku_light_push from "./lib/waku_light_push"; export { WakuLightPush, diff --git a/src/lib/discovery/bootstrap.ts b/src/lib/discovery/bootstrap.ts index 15eae9aeb9..6bec0ac5f6 100644 --- a/src/lib/discovery/bootstrap.ts +++ b/src/lib/discovery/bootstrap.ts @@ -1,11 +1,19 @@ +import type { + PeerDiscovery, + PeerDiscoveryEvents, +} from "@libp2p/interface-peer-discovery"; +import { symbol } from "@libp2p/interface-peer-discovery"; +import type { PeerInfo } from "@libp2p/interface-peer-info"; +import { CustomEvent, EventEmitter } from "@libp2p/interfaces/events"; +import { peerIdFromString } from "@libp2p/peer-id"; +import { Multiaddr } from "@multiformats/multiaddr"; import debug from "debug"; -import { Multiaddr } from "multiaddr"; import { DnsNodeDiscovery, NodeCapabilityCount } from "./dns"; import { getPredefinedBootstrapNodes } from "./predefined"; import { getPseudoRandomSubset } from "./random_subset"; -const dbg = debug("waku:discovery:bootstrap"); +const log = debug("waku:discovery:bootstrap"); /** * Setup discovery method used to bootstrap. @@ -35,8 +43,14 @@ export interface BootstrapOptions { peers?: string[] | Multiaddr[]; /** * Getter that retrieve multiaddrs of peers to connect to. + * will be called once. */ getPeers?: () => Promise; + /** + * The interval between emitting addresses in milliseconds. + * Used if [[peers]] is passed or a sync function is passed for [[getPeers]] + */ + interval?: number; /** * An EIP-1459 ENR Tree URL. For example: * "enrtree://AOFTICU2XWDULNLZGRMQS4RIZPAZEHYMV4FYHAPW563HNRAOERP7C@test.nodes.vac.dev" @@ -56,23 +70,51 @@ export interface BootstrapOptions { * * @throws if an invalid combination of options is passed, see [[BootstrapOptions]] for details. */ -export class Bootstrap { - public static DefaultMaxPeers = 1; +export class Bootstrap + extends EventEmitter + implements PeerDiscovery +{ + static DefaultMaxPeers = 1; - public readonly getBootstrapPeers: (() => Promise) | undefined; + private readonly asyncGetBootstrapPeers: + | (() => Promise) + | undefined; + private peers: PeerInfo[]; + private timer?: ReturnType; + private readonly interval: number; - constructor(opts: BootstrapOptions) { + constructor(opts?: BootstrapOptions) { + super(); + opts = opts ?? {}; + + const methods = [ + !!opts.default, + !!opts.peers, + !!opts.getPeers, + !!opts.enrUrl, + ].filter((x) => x); + if (methods.length > 1) { + throw new Error( + "Bootstrap does not support several discovery methods (yet)" + ); + } + + this.interval = opts.interval ?? 10000; + opts.default = + opts.default ?? (!opts.peers && !opts.getPeers && !opts.enrUrl); const maxPeers = opts.maxPeers ?? Bootstrap.DefaultMaxPeers; + this.peers = []; if (opts.default) { - dbg("Use hosted list of peers."); + log("Use hosted list of peers."); - this.getBootstrapPeers = (): Promise => { - return Promise.resolve( - getPredefinedBootstrapNodes(undefined, maxPeers) - ); - }; - } else if (opts.peers !== undefined && opts.peers.length > 0) { + this.peers = multiaddrsToPeerInfo( + getPredefinedBootstrapNodes(undefined, maxPeers) + ); + return; + } + + if (!!opts.peers && opts.peers.length > 0) { const allPeers: Multiaddr[] = opts.peers.map( (node: string | Multiaddr) => { if (typeof node === "string") { @@ -82,41 +124,121 @@ export class Bootstrap { } } ); - const peers = getPseudoRandomSubset(allPeers, maxPeers); - dbg( - "Use provided list of peers (reduced to maxPeers)", - allPeers.map((ma) => ma.toString()) + this.peers = multiaddrsToPeerInfo( + getPseudoRandomSubset(allPeers, maxPeers) ); - this.getBootstrapPeers = (): Promise => - Promise.resolve(peers); - } else if (typeof opts.getPeers === "function") { - dbg("Bootstrap: Use provided getPeers function."); + log( + "Use provided list of peers (reduced to maxPeers)", + this.peers.map((ma) => ma.toString()) + ); + return; + } + + if (typeof opts.getPeers === "function") { + log("Bootstrap: Use provided getPeers function."); const getPeers = opts.getPeers; - this.getBootstrapPeers = async (): Promise => { + this.asyncGetBootstrapPeers = async () => { const allPeers = await getPeers(); return getPseudoRandomSubset( allPeers, maxPeers ).map((node) => new Multiaddr(node)); }; - } else if (opts.enrUrl) { + return; + } + + if (opts.enrUrl) { const wantedNodeCapabilityCount = opts.wantedNodeCapabilityCount; if (!wantedNodeCapabilityCount) throw "`wantedNodeCapabilityCount` must be defined when using `enrUrl`"; const enrUrl = opts.enrUrl; - dbg("Use provided EIP-1459 ENR Tree URL."); + log("Use provided EIP-1459 ENR Tree URL."); const dns = DnsNodeDiscovery.dnsOverHttp(); - this.getBootstrapPeers = async (): Promise => { + this.asyncGetBootstrapPeers = async () => { const enrs = await dns.getPeers([enrUrl], wantedNodeCapabilityCount); - dbg(`Found ${enrs.length} peers`); + log(`Found ${enrs.length} peers`); return enrs.map((enr) => enr.getFullMultiaddrs()).flat(); }; - } else { - dbg("No bootstrap method specified, no peer will be returned"); - this.getBootstrapPeers = undefined; + + return; } } + + /** + * Start discovery process + */ + start(): void { + if (this.asyncGetBootstrapPeers) { + // TODO: This should emit the peer as they are discovered instead of having + // to wait for the full DNS discovery process to be done first. + // TODO: PeerInfo should be returned by discovery + this.asyncGetBootstrapPeers().then((peers) => { + this.peers = multiaddrsToPeerInfo(peers); + this._startTimer(); + }); + } else { + this._startTimer(); + } + } + + private _startTimer(): void { + if (this.peers) { + log("Starting bootstrap node discovery"); + if (this.timer != null) { + return; + } + + this.timer = setInterval(() => this._returnPeers(), this.interval); + + this._returnPeers(); + } + } + + _returnPeers(): void { + if (this.timer == null) { + return; + } + + this.peers.forEach((peerData) => { + this.dispatchEvent( + new CustomEvent("peer", { detail: peerData }) + ); + }); + } + + /** + * Stop emitting events + */ + stop(): void { + if (this.timer != null) { + clearInterval(this.timer); + } + + this.timer = undefined; + } + + get [symbol](): true { + return true; + } + + get [Symbol.toStringTag](): string { + return "@waku/bootstrap"; + } +} + +function multiaddrsToPeerInfo(mas: Multiaddr[]): PeerInfo[] { + return mas + .map((ma) => { + const peerIdStr = ma.getPeerId(); + const protocols: string[] = []; + return { + id: peerIdStr ? peerIdFromString(peerIdStr) : null, + multiaddrs: [ma.decapsulateCode(421)], + protocols, + }; + }) + .filter((peerInfo): peerInfo is PeerInfo => peerInfo.id !== null); } diff --git a/src/lib/discovery/dns.spec.ts b/src/lib/discovery/dns.spec.ts index 2db676f514..93c28cf10b 100644 --- a/src/lib/discovery/dns.spec.ts +++ b/src/lib/discovery/dns.spec.ts @@ -171,7 +171,7 @@ describe("DNS Node Discovery w/ capabilities", () => { }); expect(peers.length).to.eq(1); - expect(peers[0].peerId?.toB58String()).to.eq( + expect(peers[0].peerId?.toString()).to.eq( "16Uiu2HAmPsYLvfKafxgRsb6tioYyGnSvGXS2iuMigptHrqHPNPzx" ); }); @@ -186,7 +186,7 @@ describe("DNS Node Discovery w/ capabilities", () => { }); expect(peers.length).to.eq(1); - expect(peers[0].peerId?.toB58String()).to.eq( + expect(peers[0].peerId?.toString()).to.eq( "16Uiu2HAm2HyS6brcCspSbszG9i36re2bWBVjMe3tMdnFp1Hua34F" ); }); @@ -200,7 +200,7 @@ describe("DNS Node Discovery w/ capabilities", () => { }); expect(peers.length).to.eq(1); - expect(peers[0].peerId?.toB58String()).to.eq( + expect(peers[0].peerId?.toString()).to.eq( "16Uiu2HAkv3La3ECgQpdYeEJfrX36EWdhkUDv4C9wvXM8TFZ9dNgd" ); }); @@ -220,7 +220,7 @@ describe("DNS Node Discovery w/ capabilities", () => { }); expect(peers.length).to.eq(2); - const peerIds = peers.map((p) => p.peerId?.toB58String()); + const peerIds = peers.map((p) => p.peerId?.toString()); expect(peerIds).to.contain( "16Uiu2HAm2HyS6brcCspSbszG9i36re2bWBVjMe3tMdnFp1Hua34F" ); @@ -246,7 +246,7 @@ describe("DNS Node Discovery w/ capabilities", () => { }); expect(peers.length).to.eq(3); - const peerIds = peers.map((p) => p.peerId?.toB58String()); + const peerIds = peers.map((p) => p.peerId?.toString()); expect(peerIds).to.contain( "16Uiu2HAm2HyS6brcCspSbszG9i36re2bWBVjMe3tMdnFp1Hua34F" ); diff --git a/src/lib/discovery/fetch_nodes.spec.ts b/src/lib/discovery/fetch_nodes.spec.ts index c6040332a9..b973a98c11 100644 --- a/src/lib/discovery/fetch_nodes.spec.ts +++ b/src/lib/discovery/fetch_nodes.spec.ts @@ -1,13 +1,13 @@ +import { createSecp256k1PeerId } from "@libp2p/peer-id-factory"; +import { Multiaddr } from "@multiformats/multiaddr"; import { expect } from "chai"; -import { Multiaddr } from "multiaddr"; -import PeerId from "peer-id"; import { ENR, Waku2 } from "../enr"; import fetchNodesUntilCapabilitiesFulfilled from "./fetch_nodes"; async function createEnr(waku2: Waku2): Promise { - const peerId = await PeerId.create({ keyType: "secp256k1" }); + const peerId = await createSecp256k1PeerId(); const enr = await ENR.createFromPeerId(peerId); enr.setLocationMultiaddr(new Multiaddr("/ip4/18.223.219.100/udp/9000")); enr.multiaddrs = [ @@ -42,7 +42,7 @@ describe("Fetch nodes until capabilities are fulfilled", function () { ); expect(res.length).to.eq(1); - expect(res[0].peerId!.toB58String()).to.eq(relayNode.peerId?.toB58String()); + expect(res[0].peerId!.toString()).to.eq(relayNode.peerId?.toString()); }); it("1 Store, 2 fetches", async function () { @@ -65,7 +65,7 @@ describe("Fetch nodes until capabilities are fulfilled", function () { ); expect(res.length).to.eq(1); - expect(res[0].peerId!.toB58String()).to.eq(storeNode.peerId?.toB58String()); + expect(res[0].peerId!.toString()).to.eq(storeNode.peerId?.toString()); }); it("1 Store, 2 relays, 2 fetches", async function () { @@ -94,15 +94,9 @@ describe("Fetch nodes until capabilities are fulfilled", function () { ); expect(res.length).to.eq(3); - expect(res[0].peerId!.toB58String()).to.eq( - relayNode1.peerId?.toB58String() - ); - expect(res[1].peerId!.toB58String()).to.eq( - relayNode2.peerId?.toB58String() - ); - expect(res[2].peerId!.toB58String()).to.eq( - relayStoreNode.peerId?.toB58String() - ); + expect(res[0].peerId!.toString()).to.eq(relayNode1.peerId?.toString()); + expect(res[1].peerId!.toString()).to.eq(relayNode2.peerId?.toString()); + expect(res[2].peerId!.toString()).to.eq(relayStoreNode.peerId?.toString()); }); it("1 Relay, 1 Filter, gives up", async function () { @@ -117,6 +111,6 @@ describe("Fetch nodes until capabilities are fulfilled", function () { ); expect(res.length).to.eq(1); - expect(res[0].peerId!.toB58String()).to.eq(relayNode.peerId?.toB58String()); + expect(res[0].peerId!.toString()).to.eq(relayNode.peerId?.toString()); }); }); diff --git a/src/lib/discovery/index.spec.ts b/src/lib/discovery/index.spec.ts index f68126a033..c0eb090932 100644 --- a/src/lib/discovery/index.spec.ts +++ b/src/lib/discovery/index.spec.ts @@ -1,6 +1,5 @@ import { expect } from "chai"; -import { fleets } from "./predefined"; import { getPseudoRandomSubset } from "./random_subset"; describe("Discovery", () => { @@ -34,23 +33,3 @@ describe("Discovery", () => { expect(res.length).to.eq(2); }); }); - -describe("Discovery [live data]", function () { - before(function () { - if (process.env.CI) { - this.skip(); - } - }); - - it("Check pre-defined nodes against hosted JSON [live data]", async function () { - const res = await fetch("https://fleets.status.im/"); - const nodes = await res.json(); - - expect(fleets.fleets["wakuv2.prod"]["waku-websocket"]).to.deep.eq( - nodes.fleets["wakuv2.prod"]["waku-websocket"] - ); - expect(fleets.fleets["wakuv2.test"]["waku-websocket"]).to.deep.eq( - nodes.fleets["wakuv2.test"]["waku-websocket"] - ); - }); -}); diff --git a/src/lib/discovery/predefined.ts b/src/lib/discovery/predefined.ts index 1e90db8f96..04b662f59d 100644 --- a/src/lib/discovery/predefined.ts +++ b/src/lib/discovery/predefined.ts @@ -1,4 +1,4 @@ -import { Multiaddr } from "multiaddr"; +import { Multiaddr } from "@multiformats/multiaddr"; import { getPseudoRandomSubset } from "./random_subset"; diff --git a/src/lib/discovery/random_subset.ts b/src/lib/discovery/random_subset.ts index be038946a4..20d0ca83ce 100644 --- a/src/lib/discovery/random_subset.ts +++ b/src/lib/discovery/random_subset.ts @@ -1,12 +1,30 @@ -import { shuffle } from "libp2p-gossipsub/src/utils/index"; - +/** + * Return pseudo random subset of the input. + */ export function getPseudoRandomSubset( values: T[], wantedNumber: number ): T[] { - if (values.length <= wantedNumber) { + if (values.length <= wantedNumber || values.length <= 1) { return values; } return shuffle(values).slice(0, wantedNumber); } + +function shuffle(arr: T[]): T[] { + if (arr.length <= 1) { + return arr; + } + const randInt = (): number => { + return Math.floor(Math.random() * Math.floor(arr.length)); + }; + + for (let i = 0; i < arr.length; i++) { + const j = randInt(); + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + return arr; +} diff --git a/src/lib/enr/enr.node.spec.ts b/src/lib/enr/enr.node.spec.ts index b918fa22da..81c45c1c24 100644 --- a/src/lib/enr/enr.node.spec.ts +++ b/src/lib/enr/enr.node.spec.ts @@ -1,7 +1,8 @@ import { expect } from "chai"; import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../../test_utils"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { ENR } from "./enr"; @@ -25,18 +26,19 @@ describe("ENR Interop: nwaku", function () { }); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); const nwakuInfo = await nwaku.info(); const nimPeerId = await nwaku.getPeerId(); expect(nwakuInfo.enrUri).to.not.be.undefined; const dec = await ENR.decodeTxt(nwakuInfo.enrUri ?? ""); - expect(dec.peerId?.toB58String()).to.eq(nimPeerId.toB58String()); + expect(dec.peerId?.toString()).to.eq(nimPeerId.toString()); expect(dec.waku2).to.deep.eq({ relay: true, store: false, @@ -56,18 +58,19 @@ describe("ENR Interop: nwaku", function () { }); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); const nwakuInfo = await nwaku.info(); const nimPeerId = await nwaku.getPeerId(); expect(nwakuInfo.enrUri).to.not.be.undefined; const dec = await ENR.decodeTxt(nwakuInfo.enrUri ?? ""); - expect(dec.peerId?.toB58String()).to.eq(nimPeerId.toB58String()); + expect(dec.peerId?.toString()).to.eq(nimPeerId.toString()); expect(dec.waku2).to.deep.eq({ relay: true, store: true, @@ -87,18 +90,19 @@ describe("ENR Interop: nwaku", function () { }); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); const nwakuInfo = await nwaku.info(); const nimPeerId = await nwaku.getPeerId(); expect(nwakuInfo.enrUri).to.not.be.undefined; const dec = await ENR.decodeTxt(nwakuInfo.enrUri ?? ""); - expect(dec.peerId?.toB58String()).to.eq(nimPeerId.toB58String()); + expect(dec.peerId?.toString()).to.eq(nimPeerId.toString()); expect(dec.waku2).to.deep.eq({ relay: true, store: true, diff --git a/src/lib/enr/enr.spec.ts b/src/lib/enr/enr.spec.ts index c4ec51b474..4fb08b2cdb 100644 --- a/src/lib/enr/enr.spec.ts +++ b/src/lib/enr/enr.spec.ts @@ -1,6 +1,6 @@ +import { createSecp256k1PeerId } from "@libp2p/peer-id-factory"; +import { Multiaddr } from "@multiformats/multiaddr"; import { assert, expect } from "chai"; -import { Multiaddr } from "multiaddr"; -import PeerId from "peer-id"; import { getPublicKey } from "../crypto"; import { bytesToHex, hexToBytes, utf8ToBytes } from "../utils"; @@ -13,9 +13,9 @@ import { Waku2 } from "./waku2_codec"; describe("ENR", function () { describe("Txt codec", () => { it("should encodeTxt and decodeTxt", async () => { - const peerId = await PeerId.create({ keyType: "secp256k1" }); + const peerId = await createSecp256k1PeerId(); const enr = await ENR.createFromPeerId(peerId); - const keypair = createKeypairFromPeerId(peerId); + const keypair = await createKeypairFromPeerId(peerId); enr.setLocationMultiaddr(new Multiaddr("/ip4/18.223.219.100/udp/9000")); enr.multiaddrs = [ new Multiaddr( @@ -102,16 +102,16 @@ describe("ENR", function () { expect(enr.ip).to.not.be.undefined; expect(enr.ip).to.be.equal("134.209.139.210"); expect(enr.publicKey).to.not.be.undefined; - expect(enr.peerId?.toB58String()).to.be.equal( + expect(enr.peerId?.toString()).to.be.equal( "16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ" ); }); it("should throw error - no id", async () => { try { - const peerId = await PeerId.create({ keyType: "secp256k1" }); + const peerId = await createSecp256k1PeerId(); const enr = await ENR.createFromPeerId(peerId); - const keypair = createKeypairFromPeerId(peerId); + const keypair = await createKeypairFromPeerId(peerId); enr.setLocationMultiaddr(new Multiaddr("/ip4/18.223.219.100/udp/9000")); enr.set("id", new Uint8Array([0])); @@ -307,7 +307,7 @@ describe("ENR", function () { let enr: ENR; before(async function () { - peerId = await PeerId.create({ keyType: "secp256k1" }); + peerId = await createSecp256k1PeerId(); enr = await ENR.createFromPeerId(peerId); enr.ip = ip4; enr.ip6 = ip6; @@ -387,9 +387,9 @@ describe("ENR", function () { let keypair: IKeypair; beforeEach(async function () { - peerId = await PeerId.create({ keyType: "secp256k1" }); + peerId = await createSecp256k1PeerId(); enr = await ENR.createFromPeerId(peerId); - keypair = createKeypairFromPeerId(peerId); + keypair = await createKeypairFromPeerId(peerId); waku2Protocols = { relay: false, store: false, diff --git a/src/lib/enr/enr.ts b/src/lib/enr/enr.ts index 519c4dbcd3..47c88f5ce8 100644 --- a/src/lib/enr/enr.ts +++ b/src/lib/enr/enr.ts @@ -1,13 +1,13 @@ import * as RLP from "@ethersproject/rlp"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import { Multiaddr } from "@multiformats/multiaddr"; +import { + convertToBytes, + convertToString, +} from "@multiformats/multiaddr/convert"; import debug from "debug"; -import { Multiaddr, protocols } from "multiaddr"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: No types available -import muConvert from "multiaddr/src/convert"; -import PeerId from "peer-id"; import { fromString } from "uint8arrays/from-string"; import { toString } from "uint8arrays/to-string"; -import { encode as varintEncode } from "varint"; import { compressPublicKey, keccak256, verifySignature } from "../crypto"; import { bytesToHex, bytesToUtf8, hexToBytes, utf8ToBytes } from "../utils"; @@ -20,6 +20,7 @@ import { IKeypair, KeypairType, } from "./keypair"; +import { multiaddrFromFields } from "./multiaddr_from_fields"; import { decodeMultiaddrs, encodeMultiaddrs } from "./multiaddrs_codec"; import { ENRKey, ENRValue, NodeId, SequenceNumber } from "./types"; import * as v4 from "./v4"; @@ -77,11 +78,11 @@ export class ENR extends Map { }); } - static createFromPeerId( + static async createFromPeerId( peerId: PeerId, kvs: Record = {} ): Promise { - const keypair = createKeypairFromPeerId(peerId); + const keypair = await createKeypairFromPeerId(peerId); switch (keypair.type) { case KeypairType.secp256k1: return ENR.createV4(keypair.publicKey, kvs); @@ -190,7 +191,7 @@ export class ENR extends Map { get ip(): string | undefined { const raw = this.get("ip"); if (raw) { - return muConvert.toString(protocols.names.ip4.code, raw) as string; + return convertToString("ip4", raw) as string; } else { return undefined; } @@ -198,7 +199,7 @@ export class ENR extends Map { set ip(ip: string | undefined) { if (ip) { - this.set("ip", muConvert.toBytes(protocols.names.ip4.code, ip)); + this.set("ip", convertToBytes("ip4", ip)); } else { this.delete("ip"); } @@ -207,7 +208,7 @@ export class ENR extends Map { get tcp(): number | undefined { const raw = this.get("tcp"); if (raw) { - return Number(muConvert.toString(protocols.names.tcp.code, raw)); + return Number(convertToString("tcp", raw)); } else { return undefined; } @@ -217,14 +218,14 @@ export class ENR extends Map { if (port === undefined) { this.delete("tcp"); } else { - this.set("tcp", muConvert.toBytes(protocols.names.tcp.code, port)); + this.set("tcp", convertToBytes("tcp", port.toString(10))); } } get udp(): number | undefined { const raw = this.get("udp"); if (raw) { - return Number(muConvert.toString(protocols.names.udp.code, raw)); + return Number(convertToString("udp", raw)); } else { return undefined; } @@ -234,14 +235,14 @@ export class ENR extends Map { if (port === undefined) { this.delete("udp"); } else { - this.set("udp", muConvert.toBytes(protocols.names.udp.code, port)); + this.set("udp", convertToBytes("udp", port.toString(10))); } } get ip6(): string | undefined { const raw = this.get("ip6"); if (raw) { - return muConvert.toString(protocols.names.ip6.code, raw) as string; + return convertToString("ip6", raw) as string; } else { return undefined; } @@ -249,7 +250,7 @@ export class ENR extends Map { set ip6(ip: string | undefined) { if (ip) { - this.set("ip6", muConvert.toBytes(protocols.names.ip6.code, ip)); + this.set("ip6", convertToBytes("ip6", ip)); } else { this.delete("ip6"); } @@ -258,7 +259,7 @@ export class ENR extends Map { get tcp6(): number | undefined { const raw = this.get("tcp6"); if (raw) { - return Number(muConvert.toString(protocols.names.tcp.code, raw)); + return Number(convertToString("tcp", raw)); } else { return undefined; } @@ -268,14 +269,14 @@ export class ENR extends Map { if (port === undefined) { this.delete("tcp6"); } else { - this.set("tcp6", muConvert.toBytes(protocols.names.tcp.code, port)); + this.set("tcp6", convertToBytes("tcp", port.toString(10))); } } get udp6(): number | undefined { const raw = this.get("udp6"); if (raw) { - return Number(muConvert.toString(protocols.names.udp.code, raw)); + return Number(convertToString("udp", raw)); } else { return undefined; } @@ -285,7 +286,7 @@ export class ENR extends Map { if (port === undefined) { this.delete("udp6"); } else { - this.set("udp6", muConvert.toBytes(protocols.names.udp.code, port)); + this.set("udp6", convertToBytes("udp", port.toString(10))); } } @@ -346,7 +347,7 @@ export class ENR extends Map { const isIpv6 = protocol.endsWith("6"); const ipVal = this.get(isIpv6 ? "ip6" : "ip"); if (!ipVal) { - return undefined; + return; } const isUdp = protocol.startsWith("udp"); @@ -359,29 +360,19 @@ export class ENR extends Map { protoName = "tcp"; protoVal = isIpv6 ? this.get("tcp6") : this.get("tcp"); } else { - return undefined; + return; } + if (!protoVal) { - return undefined; + return; } - // Create raw multiaddr buffer - // multiaddr length is: - // 1 byte for the ip protocol (ip4 or ip6) - // N bytes for the ip address - // 1 or 2 bytes for the protocol as buffer (tcp or udp) - // 2 bytes for the port - const ipMa = protocols.names[isIpv6 ? "ip6" : "ip4"]; - const ipByteLen = ipMa.size / 8; - const protoMa = protocols.names[protoName]; - const protoBuf = varintEncode(protoMa.code); - const maBuf = new Uint8Array(3 + ipByteLen + protoBuf.length); - maBuf[0] = ipMa.code; - maBuf.set(ipVal, 1); - maBuf.set(protoBuf, 1 + ipByteLen); - maBuf.set(protoVal, 1 + ipByteLen + protoBuf.length); - - return new Multiaddr(maBuf); + return multiaddrFromFields( + isIpv6 ? "ip6" : "ip4", + protoName, + ipVal, + protoVal + ); } setLocationMultiaddr(multiaddr: Multiaddr): void { @@ -422,9 +413,7 @@ export class ENR extends Map { if (this.peerId) { const locationMultiaddr = this.getLocationMultiaddr(protocol); if (locationMultiaddr) { - return locationMultiaddr.encapsulate( - `/p2p/${this.peerId.toB58String()}` - ); + return locationMultiaddr.encapsulate(`/p2p/${this.peerId.toString()}`); } } return; @@ -437,7 +426,7 @@ export class ENR extends Map { if (this.peerId && this.multiaddrs) { const peerId = this.peerId; return this.multiaddrs.map((ma) => { - return ma.encapsulate(`/p2p/${peerId.toB58String()}`); + return ma.encapsulate(`/p2p/${peerId.toString()}`); }); } return []; diff --git a/src/lib/enr/keypair/index.spec.ts b/src/lib/enr/keypair/index.spec.ts deleted file mode 100644 index a18c2a9661..0000000000 --- a/src/lib/enr/keypair/index.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { expect } from "chai"; -import { keys } from "libp2p-crypto"; -import PeerId from "peer-id"; - -import { createPeerIdFromKeypair, generateKeypair, KeypairType } from "./index"; - -const { supportedKeys } = keys; - -describe("createPeerIdFromKeypair", function () { - it("should properly create a PeerId from a secp256k1 keypair with private key", async function () { - const keypair = await generateKeypair(KeypairType.secp256k1); - const privKey = new supportedKeys.secp256k1.Secp256k1PrivateKey( - keypair.privateKey, - keypair.publicKey - ); - - const expectedPeerId = await PeerId.createFromPrivKey(privKey.bytes); - const actualPeerId = await createPeerIdFromKeypair(keypair); - - expect(actualPeerId).to.be.deep.equal(expectedPeerId); - }); - - it("should properly create a PeerId from a secp256k1 keypair without private key", async function () { - const keypair = await generateKeypair(KeypairType.secp256k1); - delete (keypair as any)._privateKey; - const pubKey = new supportedKeys.secp256k1.Secp256k1PublicKey( - keypair.publicKey - ); - - const expectedPeerId = await PeerId.createFromPubKey(pubKey.bytes); - const actualPeerId = await createPeerIdFromKeypair(keypair); - - expect(actualPeerId).to.be.deep.equal(expectedPeerId); - }); -}); diff --git a/src/lib/enr/keypair/index.ts b/src/lib/enr/keypair/index.ts index 8dc60ad9a6..71be1d62ab 100644 --- a/src/lib/enr/keypair/index.ts +++ b/src/lib/enr/keypair/index.ts @@ -1,16 +1,16 @@ -import { keys } from "libp2p-crypto"; -import { identity } from "multiformats/hashes/identity"; -import PeerId from "peer-id"; +import { unmarshalPrivateKey, unmarshalPublicKey } from "@libp2p/crypto/keys"; +import { supportedKeys } from "@libp2p/crypto/keys"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import { peerIdFromKeys } from "@libp2p/peer-id"; import { Secp256k1Keypair } from "./secp256k1"; import { IKeypair, KeypairType } from "./types"; -const { keysPBM, supportedKeys } = keys; - export const ERR_TYPE_NOT_IMPLEMENTED = "Keypair type not implemented"; export * from "./types"; export * from "./secp256k1"; +// TODO: Check if @libp2p/crypto methods can be used instead. export async function generateKeypair(type: KeypairType): Promise { switch (type) { case KeypairType.secp256k1: @@ -38,31 +38,49 @@ export async function createPeerIdFromKeypair( ): Promise { switch (keypair.type) { case KeypairType.secp256k1: { - // manually create a peer id to avoid expensive ops - const privKey = keypair.hasPrivateKey() - ? new supportedKeys.secp256k1.Secp256k1PrivateKey( - keypair.privateKey, - keypair.publicKey - ) - : undefined; - - const pubKey = new supportedKeys.secp256k1.Secp256k1PublicKey( + const publicKey = new supportedKeys.secp256k1.Secp256k1PublicKey( keypair.publicKey ); - const id = await identity.digest(pubKey.bytes); - return new PeerId(id.bytes, privKey, pubKey); + + const privateKey = keypair.hasPrivateKey() + ? new supportedKeys.secp256k1.Secp256k1PrivateKey(keypair.privateKey) + : undefined; + + return peerIdFromKeys(publicKey.bytes, privateKey?.bytes); } default: throw new Error(ERR_TYPE_NOT_IMPLEMENTED); } } -export function createKeypairFromPeerId(peerId: PeerId): IKeypair { - // pub/private key bytes from peer-id are encoded in protobuf format - const pub = keysPBM.PublicKey.decode(peerId.pubKey.bytes); +export async function createKeypairFromPeerId( + peerId: PeerId +): Promise { + let keypairType; + switch (peerId.type) { + case "RSA": + keypairType = KeypairType.rsa; + break; + case "Ed25519": + keypairType = KeypairType.ed25519; + break; + case "secp256k1": + keypairType = KeypairType.secp256k1; + break; + default: + throw new Error("Unsupported peer id type"); + } + + const publicKey = peerId.publicKey + ? unmarshalPublicKey(peerId.publicKey) + : undefined; + const privateKey = peerId.privateKey + ? await unmarshalPrivateKey(peerId.privateKey) + : undefined; + return createKeypair( - pub.Type as KeypairType, - peerId.privKey ? peerId.privKey.marshal() : undefined, - pub.Data + keypairType, + privateKey?.marshal(), + publicKey?.marshal() ); } diff --git a/src/lib/enr/multiaddr_from_fields.spec.ts b/src/lib/enr/multiaddr_from_fields.spec.ts new file mode 100644 index 0000000000..51250e2d3c --- /dev/null +++ b/src/lib/enr/multiaddr_from_fields.spec.ts @@ -0,0 +1,24 @@ +import { convertToBytes } from "@multiformats/multiaddr/convert"; +import { expect } from "chai"; + +import { multiaddrFromFields } from "./multiaddr_from_fields"; + +describe("Multiaddr from fields", () => { + it("tcp ip4 address", function () { + const ipBytes = convertToBytes("ip4", "1.2.3.4"); + const portBytes = convertToBytes("tcp", "3333"); + + const ma = multiaddrFromFields("ip4", "tcp", ipBytes, portBytes); + + expect(ma.toString()).to.eq("/ip4/1.2.3.4/tcp/3333"); + }); + + it("udp ip6 address", function () { + const ipBytes = convertToBytes("ip6", "2345:425:2ca1::5673:23b5"); + const portBytes = convertToBytes("udp", "1111"); + + const ma = multiaddrFromFields("ip6", "udp", ipBytes, portBytes); + + expect(ma.toString()).to.eq("/ip6/2345:425:2ca1::5673:23b5/udp/1111"); + }); +}); diff --git a/src/lib/enr/multiaddr_from_fields.ts b/src/lib/enr/multiaddr_from_fields.ts new file mode 100644 index 0000000000..f12bee403e --- /dev/null +++ b/src/lib/enr/multiaddr_from_fields.ts @@ -0,0 +1,21 @@ +import { Multiaddr } from "@multiformats/multiaddr"; +import { convertToString } from "@multiformats/multiaddr/convert"; + +export function multiaddrFromFields( + ipFamily: string, + protocol: string, + ipBytes: Uint8Array, + protocolBytes: Uint8Array +): Multiaddr { + let ma = new Multiaddr( + "/" + ipFamily + "/" + convertToString(ipFamily, ipBytes) + ); + + ma = ma.encapsulate( + new Multiaddr( + "/" + protocol + "/" + convertToString(protocol, protocolBytes) + ) + ); + + return ma; +} diff --git a/src/lib/enr/multiaddrs_codec.spec.ts b/src/lib/enr/multiaddrs_codec.spec.ts index 443047122b..16cdad56f9 100644 --- a/src/lib/enr/multiaddrs_codec.spec.ts +++ b/src/lib/enr/multiaddrs_codec.spec.ts @@ -1,5 +1,5 @@ +import { Multiaddr } from "@multiformats/multiaddr"; import { expect } from "chai"; -import { Multiaddr } from "multiaddr"; import { decodeMultiaddrs, encodeMultiaddrs } from "./multiaddrs_codec"; diff --git a/src/lib/enr/multiaddrs_codec.ts b/src/lib/enr/multiaddrs_codec.ts index c4e44a7047..c23df779ca 100644 --- a/src/lib/enr/multiaddrs_codec.ts +++ b/src/lib/enr/multiaddrs_codec.ts @@ -1,4 +1,4 @@ -import { Multiaddr } from "multiaddr"; +import { Multiaddr } from "@multiformats/multiaddr"; import { MULTIADDR_LENGTH_SIZE } from "./constants"; diff --git a/src/lib/select_peer.ts b/src/lib/select_peer.ts index bf6f764308..13bde3627a 100644 --- a/src/lib/select_peer.ts +++ b/src/lib/select_peer.ts @@ -1,18 +1,13 @@ -import Libp2p from "libp2p"; -import { Peer } from "libp2p/src/peer-store"; +import { Peer } from "@libp2p/interface-peer-store"; +import { Libp2p } from "libp2p"; /** * Returns a pseudo-random peer that supports the given protocol. * Useful for protocols such as store and light push */ export async function selectRandomPeer( - peersIter: AsyncIterable + peers: Peer[] ): Promise { - const peers = []; - for await (const peer of peersIter) { - peers.push(peer); - } - if (peers.length === 0) return; const index = Math.round(Math.random() * (peers.length - 1)); @@ -22,21 +17,18 @@ export async function selectRandomPeer( /** * Returns the list of peers that supports the given protocol. */ -export async function* getPeersForProtocol( +export async function getPeersForProtocol( libp2p: Libp2p, protocols: string[] -): AsyncIterable { - for await (const peer of libp2p.peerStore.getPeers()) { - let peerFound = false; +): Promise { + const peers: Peer[] = []; + await libp2p.peerStore.forEach((peer) => { for (let i = 0; i < protocols.length; i++) { if (peer.protocols.includes(protocols[i])) { - peerFound = true; + peers.push(peer); break; } } - if (!peerFound) { - continue; - } - yield peer; - } + }); + return peers; } diff --git a/src/lib/wait_for_remote_peer.node.spec.ts b/src/lib/wait_for_remote_peer.node.spec.ts new file mode 100644 index 0000000000..92c1ea489a --- /dev/null +++ b/src/lib/wait_for_remote_peer.node.spec.ts @@ -0,0 +1,200 @@ +import { expect } from "chai"; + +import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../test_utils"; +import { delay } from "../test_utils/delay"; + +import { waitForRemotePeer } from "./wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "./waku"; + +describe("Wait for remote peer", function () { + let waku: Waku; + let nwaku: Nwaku | undefined; + + afterEach(async function () { + if (nwaku) { + nwaku.stop(); + nwaku = undefined; + } + !!waku && waku.stop().catch((e) => console.log("Waku failed to stop", e)); + }); + + it("Relay - dialed first", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + relay: true, + store: false, + filter: false, + lightpush: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + await waku.dial(multiAddrWithId); + await delay(1000); + await waitForRemotePeer(waku, [Protocols.Relay]); + const peers = waku.relay.getMeshPeers(); + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers).to.includes(nimPeerId); + }); + + it("Relay - dialed after", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + relay: true, + store: false, + filter: false, + lightpush: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + + const waitPromise = waitForRemotePeer(waku, [Protocols.Relay]); + await delay(1000); + await waku.dial(multiAddrWithId); + await waitPromise; + + const peers = waku.relay.getMeshPeers(); + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers).includes(nimPeerId); + }); + + it("Relay - times out", function (done) { + this.timeout(5000); + createWaku({ + staticNoiseKey: NOISE_KEY_1, + }) + .then((waku) => waku.start().then(() => waku)) + .then((waku) => { + waitForRemotePeer(waku, [Protocols.Relay], 200).then( + () => { + throw "Promise expected to reject on time out"; + }, + (reason) => { + expect(reason).to.eq("Timed out waiting for a remote peer."); + done(); + } + ); + }); + }); + + it("Store - dialed first", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + store: true, + relay: false, + lightpush: false, + filter: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + await waku.dial(multiAddrWithId); + await delay(1000); + await waitForRemotePeer(waku, [Protocols.Store]); + + const peers = (await waku.store.peers()).map((peer) => peer.id.toString()); + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers.includes(nimPeerId as string)).to.be.true; + }); + + it("Store - dialed after - with timeout", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + store: true, + relay: false, + lightpush: false, + filter: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + const waitPromise = waitForRemotePeer(waku, [Protocols.Store], 2000); + await delay(1000); + await waku.dial(multiAddrWithId); + await waitPromise; + + const peers = (await waku.store.peers()).map((peer) => peer.id.toString()); + + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers.includes(nimPeerId as string)).to.be.true; + }); + + it("LightPush", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + lightpush: true, + filter: false, + relay: false, + store: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + await waku.dial(multiAddrWithId); + await waitForRemotePeer(waku, [Protocols.LightPush]); + + const peers = (await waku.lightPush.peers()).map((peer) => + peer.id.toString() + ); + + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers.includes(nimPeerId as string)).to.be.true; + }); + + it("Filter", async function () { + this.timeout(20_000); + nwaku = new Nwaku(makeLogFileName(this)); + await nwaku.start({ + filter: true, + lightpush: false, + relay: false, + store: false, + }); + const multiAddrWithId = await nwaku.getMultiaddrWithId(); + + waku = await createWaku({ + staticNoiseKey: NOISE_KEY_1, + }); + await waku.start(); + await waku.dial(multiAddrWithId); + await waitForRemotePeer(waku, [Protocols.Filter]); + + const peers = (await waku.filter.peers()).map((peer) => peer.id.toString()); + + const nimPeerId = multiAddrWithId.getPeerId(); + + expect(nimPeerId).to.not.be.undefined; + expect(peers.includes(nimPeerId as string)).to.be.true; + }); +}); diff --git a/src/lib/wait_for_remote_peer.ts b/src/lib/wait_for_remote_peer.ts new file mode 100644 index 0000000000..87cd439d96 --- /dev/null +++ b/src/lib/wait_for_remote_peer.ts @@ -0,0 +1,131 @@ +import type { GossipSub } from "@chainsafe/libp2p-gossipsub"; +import { Peer, PeerProtocolsChangeData } from "@libp2p/interface-peer-store"; +import debug from "debug"; +import type { Libp2p } from "libp2p"; +import { pEvent } from "p-event"; + +import { StoreCodecs } from "./constants"; +import { Protocols, Waku } from "./waku"; +import { FilterCodec } from "./waku_filter"; +import { LightPushCodec } from "./waku_light_push"; + +const log = debug("waku:wait-for-remote-peer"); + +interface WakuProtocol { + libp2p: Libp2p; + peers: () => Promise; +} + +interface WakuGossipSubProtocol extends GossipSub { + getMeshPeers: () => string[]; +} + +/** + * Wait for a remote peer to be ready given the passed protocols. + * Useful when using the [[CreateOptions.bootstrap]] with [[createWaku]]. + * + * If the passed protocols is a GossipSub protocol, then it resolves only once + * a peer is in a mesh, to help ensure that other peers will send and receive + * message to us. + * + * @param waku The Waku Node + * @param protocols The protocols that need to be enabled by remote peers. + * @param timeoutMs A timeout value in milliseconds.. + * + * @returns A promise that **resolves** if all desired protocols are fulfilled by + * remote nodes, **rejects** if the timeoutMs is reached. + * + * @default Remote peer must have Waku Relay enabled and no time out is applied. + */ +export async function waitForRemotePeer( + waku: Waku, + protocols?: Protocols[], + timeoutMs?: number +): Promise { + protocols = protocols ?? [Protocols.Relay]; + + if (!waku.isStarted()) return Promise.reject("Waku node is not started"); + + const promises = []; + + if (protocols.includes(Protocols.Relay)) { + promises.push(waitForGossipSubPeerInMesh(waku.relay)); + } + + if (protocols.includes(Protocols.Store)) { + promises.push(waitForConnectedPeer(waku.store, Object.values(StoreCodecs))); + } + + if (protocols.includes(Protocols.LightPush)) { + promises.push(waitForConnectedPeer(waku.lightPush, [LightPushCodec])); + } + + if (protocols.includes(Protocols.Filter)) { + promises.push(waitForConnectedPeer(waku.filter, [FilterCodec])); + } + + if (timeoutMs) { + await rejectOnTimeout( + Promise.all(promises), + timeoutMs, + "Timed out waiting for a remote peer." + ); + } else { + await Promise.all(promises); + } +} + +/** + * Wait for a peer with the given protocol to be connected. + */ +async function waitForConnectedPeer( + waku: WakuProtocol, + codecs: string[] +): Promise { + const peers = await waku.peers(); + + if (peers.length) { + log(`${codecs} peer found: `, peers[0].id.toString()); + return; + } + + await new Promise((resolve) => { + const cb = (evt: CustomEvent): void => { + for (const codec of codecs) { + if (evt.detail.protocols.includes(codec)) { + log("Resolving for", codec, evt.detail.protocols); + waku.libp2p.peerStore.removeEventListener("change:protocols", cb); + resolve(); + break; + } + } + }; + waku.libp2p.peerStore.addEventListener("change:protocols", cb); + }); +} + +/** + * Wait for a peer with the given protocol to be connected and in the gossipsub + * mesh. + */ +async function waitForGossipSubPeerInMesh( + waku: WakuGossipSubProtocol +): Promise { + let peers = waku.getMeshPeers(); + + while (peers.length == 0) { + await pEvent(waku, "gossipsub:heartbeat"); + peers = waku.getMeshPeers(); + } +} + +const awaitTimeout = (ms: number, rejectReason: string): Promise => + new Promise((_resolve, reject) => setTimeout(() => reject(rejectReason), ms)); + +async function rejectOnTimeout( + promise: Promise, + timeoutMs: number, + rejectReason: string +): Promise { + await Promise.race([promise, awaitTimeout(timeoutMs, rejectReason)]); +} diff --git a/src/lib/waku.node.spec.ts b/src/lib/waku.node.spec.ts index 134235dc0e..b27c5c8f37 100644 --- a/src/lib/waku.node.spec.ts +++ b/src/lib/waku.node.spec.ts @@ -1,5 +1,5 @@ +import type { PeerId } from "@libp2p/interface-peer-id"; import { expect } from "chai"; -import PeerId from "peer-id"; import { makeLogFileName, @@ -7,10 +7,10 @@ import { NOISE_KEY_2, Nwaku, } from "../test_utils/"; -import { delay } from "../test_utils/delay"; import { generateSymmetricKey } from "./crypto"; -import { Protocols, Waku } from "./waku"; +import { waitForRemotePeer } from "./wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "./waku"; import { WakuMessage } from "./waku_message"; const TestContentTopic = "/test/1/waku/utf8"; @@ -31,11 +31,12 @@ describe("Waku Dial [node only]", function () { await nwaku.start(); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); const nimPeerId = await nwaku.getPeerId(); expect(await waku.libp2p.peerStore.has(nimPeerId)).to.be.true; @@ -57,19 +58,22 @@ describe("Waku Dial [node only]", function () { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start(); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, bootstrap: { peers: [multiAddrWithId] }, }); + await waku.start(); const connectedPeerID: PeerId = await new Promise((resolve) => { - waku.libp2p.connectionManager.on("peer:connect", (connection) => { - resolve(connection.remotePeer); - }); + waku.libp2p.connectionManager.addEventListener( + "peer:connect", + (evt) => { + resolve(evt.detail.remotePeer); + } + ); }); - expect(connectedPeerID.toB58String()).to.eq(multiAddrWithId.getPeerId()); + expect(connectedPeerID.toString()).to.eq(multiAddrWithId.getPeerId()); }); it("Passing a function", async function () { @@ -78,7 +82,7 @@ describe("Waku Dial [node only]", function () { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start(); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, bootstrap: { getPeers: async () => { @@ -86,15 +90,19 @@ describe("Waku Dial [node only]", function () { }, }, }); + await waku.start(); const connectedPeerID: PeerId = await new Promise((resolve) => { - waku.libp2p.connectionManager.on("peer:connect", (connection) => { - resolve(connection.remotePeer); - }); + waku.libp2p.connectionManager.addEventListener( + "peer:connect", + (evt) => { + resolve(evt.detail.remotePeer); + } + ); }); const multiAddrWithId = await nwaku.getMultiaddrWithId(); - expect(connectedPeerID.toB58String()).to.eq(multiAddrWithId.getPeerId()); + expect(connectedPeerID.toString()).to.eq(multiAddrWithId.getPeerId()); }); }); }); @@ -111,18 +119,23 @@ describe("Decryption Keys", () => { beforeEach(async function () { this.timeout(5000); [waku1, waku2] = await Promise.all([ - Waku.create({ staticNoiseKey: NOISE_KEY_1 }), - Waku.create({ + createWaku({ staticNoiseKey: NOISE_KEY_1 }).then((waku) => + waku.start().then(() => waku) + ), + createWaku({ staticNoiseKey: NOISE_KEY_2, libp2p: { addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] } }, - }), + }).then((waku) => waku.start().then(() => waku)), ]); - waku1.addPeerToAddressBook(waku2.libp2p.peerId, waku2.libp2p.multiaddrs); + waku1.addPeerToAddressBook( + waku2.libp2p.peerId, + waku2.libp2p.getMultiaddrs() + ); await Promise.all([ - waku1.waitForRemotePeer([Protocols.Relay]), - waku2.waitForRemotePeer([Protocols.Relay]), + waitForRemotePeer(waku1, [Protocols.Relay]), + waitForRemotePeer(waku2, [Protocols.Relay]), ]); }); @@ -163,169 +176,3 @@ describe("Decryption Keys", () => { expect(receivedMsg.timestamp?.valueOf()).to.eq(messageTimestamp.valueOf()); }); }); - -describe("Wait for remote peer / get peers", function () { - let waku: Waku; - let nwaku: Nwaku | undefined; - - afterEach(async function () { - if (nwaku) { - nwaku.stop(); - nwaku = undefined; - } - !!waku && waku.stop().catch((e) => console.log("Waku failed to stop", e)); - }); - - it("Relay - dialed first", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start(); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - await waku.dial(multiAddrWithId); - await delay(1000); - await waku.waitForRemotePeer([Protocols.Relay]); - const peers = waku.relay.getPeers(); - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.has(nimPeerId as string)).to.be.true; - }); - - it("Relay - dialed after", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start(); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - - const waitPromise = waku.waitForRemotePeer([Protocols.Relay]); - await delay(1000); - await waku.dial(multiAddrWithId); - await waitPromise; - - const peers = waku.relay.getPeers(); - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.has(nimPeerId as string)).to.be.true; - }); - - it("Relay - times out", function (done) { - this.timeout(5000); - Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }).then((waku) => { - waku.waitForRemotePeer([Protocols.Relay], 200).then( - () => { - throw "Promise expected to reject on time out"; - }, - (reason) => { - expect(reason).to.eq("Timed out waiting for a remote peer."); - done(); - } - ); - }); - }); - - it("Store - dialed first", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start({ persistMessages: true }); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - await waku.dial(multiAddrWithId); - await delay(1000); - await waku.waitForRemotePeer([Protocols.Store]); - - const peers = []; - for await (const peer of waku.store.peers) { - peers.push(peer.id.toB58String()); - } - - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.includes(nimPeerId as string)).to.be.true; - }); - - it("Store - dialed after - with timeout", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start({ persistMessages: true }); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - const waitPromise = waku.waitForRemotePeer([Protocols.Store], 2000); - await delay(1000); - await waku.dial(multiAddrWithId); - await waitPromise; - - const peers = []; - for await (const peer of waku.store.peers) { - peers.push(peer.id.toB58String()); - } - - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.includes(nimPeerId as string)).to.be.true; - }); - - it("LightPush", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start({ lightpush: true }); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.LightPush]); - - const peers = []; - for await (const peer of waku.lightPush.peers) { - peers.push(peer.id.toB58String()); - } - - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.includes(nimPeerId as string)).to.be.true; - }); - - it("Filter", async function () { - this.timeout(20_000); - nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start({ filter: true }); - const multiAddrWithId = await nwaku.getMultiaddrWithId(); - - waku = await Waku.create({ - staticNoiseKey: NOISE_KEY_1, - }); - await waku.dial(multiAddrWithId); - await waku.waitForRemotePeer([Protocols.Filter]); - - const peers = []; - for await (const peer of waku.filter.peers) { - peers.push(peer.id.toB58String()); - } - - const nimPeerId = multiAddrWithId.getPeerId(); - - expect(nimPeerId).to.not.be.undefined; - expect(peers.includes(nimPeerId as string)).to.be.true; - }); -}); diff --git a/src/lib/waku.spec.ts b/src/lib/waku.spec.ts index e72bb9db66..21d181a4ee 100644 --- a/src/lib/waku.spec.ts +++ b/src/lib/waku.spec.ts @@ -1,7 +1,7 @@ +import type { PeerId } from "@libp2p/interface-peer-id"; import { expect } from "chai"; -import PeerId from "peer-id"; -import { Waku } from "./waku"; +import { createWaku, Waku } from "./waku"; describe("Waku Dial", function () { describe("Bootstrap [live data]", function () { @@ -22,14 +22,18 @@ describe("Waku Dial", function () { // This dependence must be removed once DNS discovery is implemented this.timeout(20_000); - waku = await Waku.create({ + waku = await createWaku({ bootstrap: { default: true }, }); + await waku.start(); const connectedPeerID: PeerId = await new Promise((resolve) => { - waku.libp2p.connectionManager.on("peer:connect", (connection) => { - resolve(connection.remotePeer); - }); + waku.libp2p.connectionManager.addEventListener( + "peer:connect", + (evt) => { + resolve(evt.detail.remotePeer); + } + ); }); expect(connectedPeerID).to.not.be.undefined; diff --git a/src/lib/waku.ts b/src/lib/waku.ts index fd1e09493e..a23cc6dddb 100644 --- a/src/lib/waku.ts +++ b/src/lib/waku.ts @@ -1,20 +1,13 @@ import { Noise } from "@chainsafe/libp2p-noise"; +import type { Stream } from "@libp2p/interface-connection"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import { Mplex } from "@libp2p/mplex"; +import { peerIdFromString } from "@libp2p/peer-id"; +import { WebSockets } from "@libp2p/websockets"; +import { all as filterAll } from "@libp2p/websockets/filters"; +import { Multiaddr, multiaddr } from "@multiformats/multiaddr"; import debug from "debug"; -import Libp2p, { Connection, Libp2pModules, Libp2pOptions } from "libp2p"; -import Libp2pBootstrap from "libp2p-bootstrap"; -import { MuxedStream } from "libp2p-interfaces/dist/src/stream-muxer/types"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: No types available -import Mplex from "libp2p-mplex"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: No types available -import Websockets from "libp2p-websockets"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: No types available -import filters from "libp2p-websockets/src/filters"; -import PingService from "libp2p/src/ping"; -import { Multiaddr, multiaddr } from "multiaddr"; -import PeerId from "peer-id"; +import { createLibp2p, Libp2p, Libp2pOptions } from "libp2p"; import { Bootstrap, BootstrapOptions } from "./discovery"; import { FilterCodec, WakuFilter } from "./waku_filter"; @@ -24,12 +17,10 @@ import { WakuRelay } from "./waku_relay"; import { RelayCodecs, RelayPingContentTopic } from "./waku_relay/constants"; import { StoreCodecs, WakuStore } from "./waku_store"; -const websocketsTransportKey = Websockets.prototype[Symbol.toStringTag]; - export const DefaultPingKeepAliveValueSecs = 0; export const DefaultRelayKeepAliveValueSecs = 5 * 60; -const dbg = debug("waku:waku"); +const log = debug("waku:waku"); export enum Protocols { Relay = "relay", @@ -74,9 +65,7 @@ export interface CreateOptions { * allowing its omission and letting Waku set good defaults. * Notes that some values are overridden by {@link Waku} to ensure it implements the Waku protocol. */ - libp2p?: Omit & { - modules?: Partial; - }; + libp2p?: Partial; /** * Byte array used as key for the noise protocol used for connection encryption * by [`Libp2p.create`](https://github.com/libp2p/js-libp2p/blob/master/doc/API.md#create) @@ -95,6 +84,32 @@ export interface CreateOptions { decryptionKeys?: Array; } +export async function createWaku(options?: CreateOptions): Promise { + const peerDiscovery = []; + if (options?.bootstrap) { + peerDiscovery.push(new Bootstrap(options?.bootstrap)); + } + + const libp2pOpts = Object.assign( + { + transports: [new WebSockets({ filter: filterAll })], + streamMuxers: [new Mplex()], + pubsub: new WakuRelay(options), + connectionEncryption: [new Noise()], + peerDiscovery: peerDiscovery, + }, + options?.libp2p ?? {} + ); + + const libp2p = await createLibp2p(libp2pOpts); + + const wakuStore = new WakuStore(libp2p, options); + const wakuLightPush = new WakuLightPush(libp2p, options); + const wakuFilter = new WakuFilter(libp2p, options); + + return new Waku(options ?? {}, libp2p, wakuStore, wakuLightPush, wakuFilter); +} + export class Waku { public libp2p: Libp2p; public relay: WakuRelay; @@ -109,7 +124,7 @@ export class Waku { [peer: string]: ReturnType; }; - private constructor( + constructor( options: CreateOptions, libp2p: Libp2p, store: WakuStore, @@ -129,8 +144,8 @@ export class Waku { const relayKeepAlive = options.relayKeepAlive || DefaultRelayKeepAliveValueSecs; - libp2p.connectionManager.on("peer:connect", (connection: Connection) => { - this.startKeepAlive(connection.remotePeer, pingKeepAlive, relayKeepAlive); + libp2p.connectionManager.addEventListener("peer:connect", (evt) => { + this.startKeepAlive(evt.detail.remotePeer, pingKeepAlive, relayKeepAlive); }); /** @@ -144,8 +159,8 @@ export class Waku { * >this event will **only** be triggered when the last connection is closed. * @see https://github.com/libp2p/js-libp2p/blob/bad9e8c0ff58d60a78314077720c82ae331cc55b/doc/API.md?plain=1#L2100 */ - libp2p.connectionManager.on("peer:disconnect", (connection: Connection) => { - this.stopKeepAlive(connection.remotePeer); + libp2p.connectionManager.addEventListener("peer:disconnect", (evt) => { + this.stopKeepAlive(evt.detail.remotePeer); }); options?.decryptionKeys?.forEach((key) => { @@ -153,97 +168,6 @@ export class Waku { }); } - /** - * Create and start new waku node. - */ - static async create(options?: CreateOptions): Promise { - // Get an object in case options or libp2p are undefined - const libp2pOpts = Object.assign({}, options?.libp2p); - - // Default for Websocket filter is `all`: - // Returns all TCP and DNS based addresses, both with ws or wss. - libp2pOpts.config = Object.assign( - { - transport: { - [websocketsTransportKey]: { - filter: filters.all, - }, - }, - }, - options?.libp2p?.config - ); - - // Pass pubsub topic to relay - if (options?.pubSubTopic) { - libp2pOpts.config.pubsub = Object.assign( - { pubSubTopic: options.pubSubTopic }, - libp2pOpts.config.pubsub - ); - } - - libp2pOpts.modules = Object.assign({}, options?.libp2p?.modules); - - // Default transport for libp2p is Websockets - libp2pOpts.modules = Object.assign( - { - transport: [Websockets], - }, - options?.libp2p?.modules - ); - - // streamMuxer, connection encryption and pubsub are overridden - // as those are the only ones currently supported by Waku nodes. - libp2pOpts.modules = Object.assign(libp2pOpts.modules, { - streamMuxer: [Mplex], - connEncryption: [new Noise(options?.staticNoiseKey)], - pubsub: WakuRelay, - }); - - if (options?.bootstrap) { - const bootstrap = new Bootstrap(options?.bootstrap); - - if (bootstrap.getBootstrapPeers !== undefined) { - try { - const list = await bootstrap.getBootstrapPeers(); - - // Note: this overrides any other peer discover - libp2pOpts.modules = Object.assign(libp2pOpts.modules, { - peerDiscovery: [Libp2pBootstrap], - }); - - libp2pOpts.config.peerDiscovery = { - [Libp2pBootstrap.tag]: { - list, - enabled: true, - }, - }; - } catch (e) { - dbg("Failed to retrieve bootstrap nodes", e); - } - } - } - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore: modules property is correctly set thanks to voodoo - const libp2p = await Libp2p.create(libp2pOpts); - - const wakuStore = new WakuStore(libp2p, { - pubSubTopic: options?.pubSubTopic, - }); - const wakuLightPush = new WakuLightPush(libp2p); - const wakuFilter = new WakuFilter(libp2p); - - await libp2p.start(); - - return new Waku( - options ? options : {}, - libp2p, - wakuStore, - wakuLightPush, - wakuFilter - ); - } - /** * Dials to the provided peer. * @@ -251,12 +175,9 @@ export class Waku { * @param protocols Waku protocols we expect from the peer; Default to Relay */ async dial( - peer: PeerId | Multiaddr | string, + peer: PeerId | Multiaddr, protocols?: Protocols[] - ): Promise<{ - stream: MuxedStream; - protocol: string; - }> { + ): Promise { const _protocols = protocols ?? [Protocols.Relay]; const codecs: string[] = []; @@ -287,7 +208,7 @@ export class Waku { ): void { let peer; if (typeof peerId === "string") { - peer = PeerId.createFromB58String(peerId); + peer = peerIdFromString(peerId); } else { peer = peerId; } @@ -301,11 +222,19 @@ export class Waku { this.libp2p.peerStore.addressBook.set(peer, addresses); } + async start(): Promise { + await this.libp2p.start(); + } + async stop(): Promise { this.stopAllKeepAlives(); await this.libp2p.stop(); } + isStarted(): boolean { + return this.libp2p.isStarted(); + } + /** * Register a decryption key to attempt decryption of messages received via * [[WakuRelay]] and [[WakuStore]]. This can either be a private key for @@ -340,90 +269,13 @@ export class Waku { * @throws if libp2p is not listening on localhost. */ getLocalMultiaddrWithID(): string { - const localMultiaddr = this.libp2p.multiaddrs.find((addr) => - addr.toString().match(/127\.0\.0\.1/) - ); + const localMultiaddr = this.libp2p + .getMultiaddrs() + .find((addr) => addr.toString().match(/127\.0\.0\.1/)); if (!localMultiaddr || localMultiaddr.toString() === "") { throw "Not listening on localhost"; } - return localMultiaddr + "/p2p/" + this.libp2p.peerId.toB58String(); - } - - /** - * Wait for a remote peer to be ready given the passed protocols. - * Useful when using the [[CreateOptions.bootstrap]] with [[Waku.create]]. - * - * @param protocols The protocols that need to be enabled by remote peers. - * @param timeoutMs A timeout value in milliseconds.. - * - * @returns A promise that **resolves** if all desired protocols are fulfilled by - * remote nodes, **rejects** if the timeoutMs is reached. - * - * @default Remote peer must have Waku Relay enabled and no time out is applied. - */ - async waitForRemotePeer( - protocols?: Protocols[], - timeoutMs?: number - ): Promise { - protocols = protocols ?? [Protocols.Relay]; - - const promises: Promise[] = []; - - if (protocols.includes(Protocols.Relay)) { - const peers = this.relay.getPeers(); - - if (peers.size == 0) { - // No peer yet available, wait for a subscription - const promise = new Promise((resolve) => { - this.libp2p.pubsub.once("pubsub:subscription-change", () => { - // Remote peer subscribed to topic, now wait for a heartbeat - // so that the mesh is updated and the remote peer added to it - this.libp2p.pubsub.once("gossipsub:heartbeat", resolve); - }); - }); - promises.push(promise); - } - } - - if (protocols.includes(Protocols.Store)) { - const storePromise = (async (): Promise => { - for await (const peer of this.store.peers) { - dbg("Store peer found", peer.id.toB58String()); - break; - } - })(); - promises.push(storePromise); - } - - if (protocols.includes(Protocols.LightPush)) { - const lightPushPromise = (async (): Promise => { - for await (const peer of this.lightPush.peers) { - dbg("Light Push peer found", peer.id.toB58String()); - break; - } - })(); - promises.push(lightPushPromise); - } - - if (protocols.includes(Protocols.Filter)) { - const filterPromise = (async (): Promise => { - for await (const peer of this.filter.peers) { - dbg("Filter peer found", peer.id.toB58String()); - break; - } - })(); - promises.push(filterPromise); - } - - if (timeoutMs) { - await rejectOnTimeout( - Promise.all(promises), - timeoutMs, - "Timed out waiting for a remote peer." - ); - } else { - await Promise.all(promises); - } + return localMultiaddr + "/p2p/" + this.libp2p.peerId.toString(); } private startKeepAlive( @@ -434,13 +286,12 @@ export class Waku { // Just in case a timer already exist for this peer this.stopKeepAlive(peerId); - const peerIdStr = peerId.toB58String(); + const peerIdStr = peerId.toString(); if (pingPeriodSecs !== 0) { - const pingService = new PingService(this.libp2p); this.pingKeepAliveTimers[peerIdStr] = setInterval(() => { - pingService.ping(peerId).catch((e) => { - dbg(`Ping failed (${peerIdStr})`, e); + this.libp2p.ping(peerId).catch((e) => { + log(`Ping failed (${peerIdStr})`, e); }); }, pingPeriodSecs * 1000); } @@ -455,7 +306,7 @@ export class Waku { } private stopKeepAlive(peerId: PeerId): void { - const peerIdStr = peerId.toB58String(); + const peerIdStr = peerId.toString(); if (this.pingKeepAliveTimers[peerIdStr]) { clearInterval(this.pingKeepAliveTimers[peerIdStr]); @@ -480,13 +331,3 @@ export class Waku { this.relayKeepAliveTimers = {}; } } - -const awaitTimeout = (ms: number, rejectReason: string): Promise => - new Promise((_resolve, reject) => setTimeout(() => reject(rejectReason), ms)); - -const rejectOnTimeout = ( - promise: Promise, - timeoutMs: number, - rejectReason: string -): Promise => - Promise.race([promise, awaitTimeout(timeoutMs, rejectReason)]); diff --git a/src/lib/waku_filter/index.node.spec.ts b/src/lib/waku_filter/index.node.spec.ts index a9dc05e3dc..05054e31f3 100644 --- a/src/lib/waku_filter/index.node.spec.ts +++ b/src/lib/waku_filter/index.node.spec.ts @@ -3,7 +3,8 @@ import debug from "debug"; import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../../test_utils"; import { delay } from "../../test_utils/delay"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { WakuMessage } from "../waku_message"; const log = debug("waku:test"); @@ -22,13 +23,14 @@ describe("Waku Filter", () => { beforeEach(async function () { this.timeout(10000); nwaku = new Nwaku(makeLogFileName(this)); - await nwaku.start({ filter: true }); - waku = await Waku.create({ + await nwaku.start({ filter: true, lightpush: true }); + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, libp2p: { addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] } }, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Filter, Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Filter, Protocols.LightPush]); }); it("creates a subscription", async function () { @@ -47,7 +49,7 @@ describe("Waku Filter", () => { messageText, TestContentTopic ); - await waku.relay.send(message); + await waku.lightPush.push(message); while (messageCount === 0) { await delay(250); } @@ -63,10 +65,10 @@ describe("Waku Filter", () => { expect(msg.contentTopic).to.eq(TestContentTopic); }; await waku.filter.subscribe(callback, [TestContentTopic]); - await waku.relay.send( + await waku.lightPush.push( await WakuMessage.fromUtf8String("Filtering works!", TestContentTopic) ); - await waku.relay.send( + await waku.lightPush.push( await WakuMessage.fromUtf8String( "Filtering still works!", TestContentTopic @@ -86,7 +88,7 @@ describe("Waku Filter", () => { const unsubscribe = await waku.filter.subscribe(callback, [ TestContentTopic, ]); - await waku.relay.send( + await waku.lightPush.push( await WakuMessage.fromUtf8String( "This should be received", TestContentTopic @@ -94,7 +96,7 @@ describe("Waku Filter", () => { ); await delay(100); await unsubscribe(); - await waku.relay.send( + await waku.lightPush.push( await WakuMessage.fromUtf8String( "This should not be received", TestContentTopic diff --git a/src/lib/waku_filter/index.ts b/src/lib/waku_filter/index.ts index a2f12933d5..122ae7f511 100644 --- a/src/lib/waku_filter/index.ts +++ b/src/lib/waku_filter/index.ts @@ -1,8 +1,12 @@ +import type { Stream } from "@libp2p/interface-connection"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import type { Peer } from "@libp2p/interface-peer-store"; +import type { IncomingStreamData } from "@libp2p/interface-registrar"; import debug from "debug"; -import lp from "it-length-prefixed"; +import all from "it-all"; +import * as lp from "it-length-prefixed"; import { pipe } from "it-pipe"; -import Libp2p, { MuxedStream } from "libp2p"; -import { Peer, PeerId } from "libp2p/src/peer-store"; +import type { Libp2p } from "libp2p"; import { WakuMessage as WakuMessageProto } from "../../proto/message"; import { DefaultPubSubTopic } from "../constants"; @@ -11,12 +15,25 @@ import { hexToBytes } from "../utils"; import { DecryptionMethod, WakuMessage } from "../waku_message"; import { ContentFilter, FilterRPC } from "./filter_rpc"; +export { ContentFilter }; export const FilterCodec = "/vac/waku/filter/2.0.0-beta1"; const log = debug("waku:filter"); -type FilterSubscriptionOpts = { +export interface CreateOptions { + /** + * The PubSub Topic to use. Defaults to {@link DefaultPubSubTopic}. + * + * The usage of the default pubsub topic is recommended. + * See [Waku v2 Topic Usage Recommendations](https://rfc.vac.dev/spec/23/) for details. + * + * @default {@link DefaultPubSubTopic} + */ + pubSubTopic?: string; +} + +export type FilterSubscriptionOpts = { /** * The Pubsub topic for the subscription */ @@ -27,9 +44,9 @@ type FilterSubscriptionOpts = { peerId?: PeerId; }; -type FilterCallback = (msg: WakuMessage) => void | Promise; +export type FilterCallback = (msg: WakuMessage) => void | Promise; -type UnsubscribeFunction = () => Promise; +export type UnsubscribeFunction = () => Promise; /** * Implements client side of the [Waku v2 Filter protocol](https://rfc.vac.dev/spec/12/). @@ -39,16 +56,20 @@ type UnsubscribeFunction = () => Promise; * - https://github.com/status-im/nwaku/issues/948 */ export class WakuFilter { + pubSubTopic: string; private subscriptions: Map; public decryptionKeys: Map< Uint8Array, { method?: DecryptionMethod; contentTopics?: string[] } >; - constructor(public libp2p: Libp2p) { + constructor(public libp2p: Libp2p, options?: CreateOptions) { this.subscriptions = new Map(); this.decryptionKeys = new Map(); - this.libp2p.handle(FilterCodec, this.onRequest.bind(this)); + this.pubSubTopic = options?.pubSubTopic ?? DefaultPubSubTopic; + this.libp2p + .handle(FilterCodec, this.onRequest.bind(this)) + .catch((e) => log("Failed to register filter protocol", e)); } /** @@ -62,7 +83,7 @@ export class WakuFilter { contentTopics: string[], opts?: FilterSubscriptionOpts ): Promise { - const topic = opts?.pubsubTopic || DefaultPubSubTopic; + const topic = opts?.pubsubTopic ?? this.pubSubTopic; const contentFilters = contentTopics.map((contentTopic) => ({ contentTopic, })); @@ -83,11 +104,19 @@ export class WakuFilter { const stream = await this.newStream(peer); try { - await pipe([request.encode()], lp.encode(), stream); + const res = await pipe( + [request.encode()], + lp.encode(), + stream, + lp.decode(), + async (source) => await all(source) + ); + + log("response", res); } catch (e) { log( "Error subscribing to peer ", - peer.id.toB58String(), + peer.id.toString(), "for content topics", contentTopics, ": ", @@ -104,20 +133,23 @@ export class WakuFilter { }; } - private async onRequest({ stream }: Libp2p.HandlerProps): Promise { + private onRequest(streamData: IncomingStreamData): void { log("Receiving message push"); try { - await pipe( - stream.source, - lp.decode(), - async (source: AsyncIterable) => { - for await (const bytes of source) { - const res = FilterRPC.decode(bytes.slice()); - if (res.requestId && res.push?.messages?.length) { - await this.pushMessages(res.requestId, res.push.messages); - } + pipe(streamData.stream, lp.decode(), async (source) => { + for await (const bytes of source) { + const res = FilterRPC.decode(bytes.slice()); + if (res.requestId && res.push?.messages?.length) { + await this.pushMessages(res.requestId, res.push.messages); } } + }).then( + () => { + log("Receiving pipe closed."); + }, + (e) => { + log("Error with receiving pipe", e); + } ); } catch (e) { log("Error decoding message", e); @@ -184,14 +216,15 @@ export class WakuFilter { } } - private async newStream(peer: Peer): Promise { - const connection = this.libp2p.connectionManager.get(peer.id); - if (!connection) { + // Should be able to remove any at next libp2p release >0.37.3 + private async newStream(peer: Peer): Promise { + const connections = this.libp2p.connectionManager.getConnections(peer.id); + if (!connections) { throw new Error("Failed to get a connection to the peer"); } - const { stream } = await connection.newStream(FilterCodec); - return stream; + // TODO: Appropriate connection selection + return connections[0].newStream(FilterCodec); } private async getPeer(peerId?: PeerId): Promise { @@ -200,11 +233,11 @@ export class WakuFilter { peer = await this.libp2p.peerStore.get(peerId); if (!peer) { throw new Error( - `Failed to retrieve connection details for provided peer in peer store: ${peerId.toB58String()}` + `Failed to retrieve connection details for provided peer in peer store: ${peerId.toString()}` ); } } else { - peer = await this.randomPeer; + peer = await this.randomPeer(); if (!peer) { throw new Error( "Failed to find known peer that registers waku filter protocol" @@ -238,11 +271,11 @@ export class WakuFilter { this.decryptionKeys.delete(hexToBytes(key)); } - get peers(): AsyncIterable { + async peers(): Promise { return getPeersForProtocol(this.libp2p, [FilterCodec]); } - get randomPeer(): Promise { - return selectRandomPeer(this.peers); + async randomPeer(): Promise { + return selectRandomPeer(await this.peers()); } } diff --git a/src/lib/waku_light_push/index.node.spec.ts b/src/lib/waku_light_push/index.node.spec.ts index 8bbd0be156..1ea42c49a5 100644 --- a/src/lib/waku_light_push/index.node.spec.ts +++ b/src/lib/waku_light_push/index.node.spec.ts @@ -3,7 +3,8 @@ import debug from "debug"; import { makeLogFileName, NOISE_KEY_1, Nwaku } from "../../test_utils"; import { delay } from "../../test_utils/delay"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { WakuMessage } from "../waku_message"; const dbg = debug("waku:test:lightpush"); @@ -25,11 +26,12 @@ describe("Waku Light Push [node only]", () => { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start({ lightpush: true }); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.LightPush]); + await waitForRemotePeer(waku, [Protocols.LightPush]); const messageText = "Light Push works!"; const message = await WakuMessage.fromUtf8String( @@ -60,12 +62,13 @@ describe("Waku Light Push [node only]", () => { nwaku = new Nwaku(makeLogFileName(this)); await nwaku.start({ lightpush: true, topics: customPubSubTopic }); - waku = await Waku.create({ + waku = await createWaku({ pubSubTopic: customPubSubTopic, staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.LightPush]); + await waitForRemotePeer(waku, [Protocols.LightPush]); const nimPeerId = await nwaku.getPeerId(); @@ -87,7 +90,7 @@ describe("Waku Light Push [node only]", () => { dbg("Waiting for message to show in nwaku"); while (msgs.length === 0) { await delay(200); - msgs = await nwaku.messages(); + msgs = await nwaku.messages(customPubSubTopic); } expect(msgs[0].contentTopic).to.equal(message.contentTopic); diff --git a/src/lib/waku_light_push/index.ts b/src/lib/waku_light_push/index.ts index dd2c0cce14..b4fdf4fe35 100644 --- a/src/lib/waku_light_push/index.ts +++ b/src/lib/waku_light_push/index.ts @@ -1,9 +1,10 @@ -import concat from "it-concat"; -import lp from "it-length-prefixed"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import type { Peer } from "@libp2p/interface-peer-store"; +import all from "it-all"; +import * as lp from "it-length-prefixed"; import { pipe } from "it-pipe"; -import Libp2p from "libp2p"; -import { Peer } from "libp2p/src/peer-store"; -import PeerId from "peer-id"; +import { Libp2p } from "libp2p"; +import { concat } from "uint8arrays/concat"; import { PushResponse } from "../../proto/light_push"; import { DefaultPubSubTopic } from "../constants"; @@ -39,11 +40,7 @@ export class WakuLightPush { pubSubTopic: string; constructor(public libp2p: Libp2p, options?: CreateOptions) { - if (options?.pubSubTopic) { - this.pubSubTopic = options.pubSubTopic; - } else { - this.pubSubTopic = DefaultPubSubTopic; - } + this.pubSubTopic = options?.pubSubTopic ?? DefaultPubSubTopic; } async push( @@ -55,16 +52,17 @@ export class WakuLightPush { peer = await this.libp2p.peerStore.get(opts.peerId); if (!peer) throw "Peer is unknown"; } else { - peer = await this.randomPeer; + peer = await this.randomPeer(); } if (!peer) throw "No peer available"; if (!peer.protocols.includes(LightPushCodec)) throw "Peer does not register waku light push protocol"; - const connection = this.libp2p.connectionManager.get(peer.id); - if (!connection) throw "Failed to get a connection to the peer"; + const connections = this.libp2p.connectionManager.getConnections(peer.id); + if (!connections) throw "Failed to get a connection to the peer"; - const { stream } = await connection.newStream(LightPushCodec); + // TODO: Appropriate connection management + const stream = await connections[0].newStream(LightPushCodec); try { const pubSubTopic = opts?.pubSubTopic ? opts.pubSubTopic @@ -75,10 +73,11 @@ export class WakuLightPush { lp.encode(), stream, lp.decode(), - concat + async (source) => await all(source) ); try { - const response = PushRPC.decode(res.slice()).response; + const bytes = concat(res); + const response = PushRPC.decode(bytes).response; if (!response) { console.log("No response in PushRPC"); @@ -97,9 +96,10 @@ export class WakuLightPush { /** * Returns known peers from the address book (`libp2p.peerStore`) that support - * light push protocol. Waku may or may not be currently connected to these peers. + * light push protocol. Waku may or may not be currently connected to these + * peers. */ - get peers(): AsyncIterable { + async peers(): Promise { return getPeersForProtocol(this.libp2p, [LightPushCodec]); } @@ -108,7 +108,7 @@ export class WakuLightPush { * book (`libp2p.peerStore`). Waku may or may not be currently connected to * this peer. */ - get randomPeer(): Promise { - return selectRandomPeer(this.peers); + async randomPeer(): Promise { + return selectRandomPeer(await this.peers()); } } diff --git a/src/lib/waku_message/index.node.spec.ts b/src/lib/waku_message/index.node.spec.ts index e3e0283924..e26843b505 100644 --- a/src/lib/waku_message/index.node.spec.ts +++ b/src/lib/waku_message/index.node.spec.ts @@ -14,7 +14,8 @@ import { getPublicKey, } from "../crypto"; import { bytesToHex, bytesToUtf8, hexToBytes, utf8ToBytes } from "../utils"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { DecryptionMethod, WakuMessage } from "./index"; @@ -29,9 +30,10 @@ describe("Waku Message [node only]", function () { beforeEach(async function () { this.timeout(30_000); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); nwaku = new Nwaku(makeLogFileName(this)); dbg("Starting nwaku node"); @@ -40,7 +42,7 @@ describe("Waku Message [node only]", function () { dbg("Dialing to nwaku node"); await waku.dial(await nwaku.getMultiaddrWithId()); dbg("Wait for remote peer"); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); dbg("Remote peer ready"); // As this test uses the nwaku RPC API, we somehow often face // Race conditions where the nwaku node does not have the js-waku diff --git a/src/lib/waku_relay/get_relay_peers.ts b/src/lib/waku_relay/get_relay_peers.ts deleted file mode 100644 index df03553dab..0000000000 --- a/src/lib/waku_relay/get_relay_peers.ts +++ /dev/null @@ -1,48 +0,0 @@ -import Gossipsub from "libp2p-gossipsub"; -import { shuffle } from "libp2p-gossipsub/src/utils"; - -import { RelayCodecs } from "./constants"; - -/** - * Given a topic, returns up to count peers subscribed to that topic - * that pass an optional filter function - * - * @param {Gossipsub} router - * @param {String} topic - * @param {Number} count - * @param {Function} [filter] a function to filter acceptable peers - * @returns {Set} - * - */ -export function getRelayPeers( - router: Gossipsub, - topic: string, - count: number, - filter: (id: string) => boolean = (): boolean => true -): Set { - const peersInTopic = router.topics.get(topic); - if (!peersInTopic) { - return new Set(); - } - - // Adds all peers using our protocol - // that also pass the filter function - let peers: string[] = []; - peersInTopic.forEach((id: string) => { - const peerStreams = router.peers.get(id); - if (!peerStreams) { - return; - } - if (RelayCodecs.includes(peerStreams.protocol) && filter(id)) { - peers.push(id); - } - }); - - // Pseudo-randomly shuffles peers - peers = shuffle(peers); - if (count > 0 && peers.length > count) { - peers = peers.slice(0, count); - } - - return new Set(peers); -} diff --git a/src/lib/waku_relay/index.node.spec.ts b/src/lib/waku_relay/index.node.spec.ts index 764de39cb2..1670c1f9cb 100644 --- a/src/lib/waku_relay/index.node.spec.ts +++ b/src/lib/waku_relay/index.node.spec.ts @@ -1,3 +1,4 @@ +import { PeerId } from "@libp2p/interface-peer-id"; import { expect } from "chai"; import debug from "debug"; @@ -5,6 +6,7 @@ import { makeLogFileName, NOISE_KEY_1, NOISE_KEY_2, + NOISE_KEY_3, Nwaku, } from "../../test_utils"; import { delay } from "../../test_utils/delay"; @@ -14,7 +16,8 @@ import { generateSymmetricKey, getPublicKey, } from "../crypto"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { DecryptionMethod, WakuMessage } from "../waku_message"; const log = debug("waku:test"); @@ -38,19 +41,24 @@ describe("Waku Relay [node only]", () => { log("Starting JS Waku instances"); [waku1, waku2] = await Promise.all([ - Waku.create({ staticNoiseKey: NOISE_KEY_1 }), - Waku.create({ + createWaku({ staticNoiseKey: NOISE_KEY_1 }).then((waku) => + waku.start().then(() => waku) + ), + createWaku({ staticNoiseKey: NOISE_KEY_2, libp2p: { addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] } }, - }), + }).then((waku) => waku.start().then(() => waku)), ]); log("Instances started, adding waku2 to waku1's address book"); - waku1.addPeerToAddressBook(waku2.libp2p.peerId, waku2.libp2p.multiaddrs); + waku1.addPeerToAddressBook( + waku2.libp2p.peerId, + waku2.libp2p.getMultiaddrs() + ); log("Wait for mutual pubsub subscription"); await Promise.all([ - waku1.waitForRemotePeer([Protocols.Relay]), - waku2.waitForRemotePeer([Protocols.Relay]), + waitForRemotePeer(waku1, [Protocols.Relay]), + waitForRemotePeer(waku2, [Protocols.Relay]), ]); log("before each hook done"); }); @@ -64,18 +72,20 @@ describe("Waku Relay [node only]", () => { it("Subscribe", async function () { log("Getting subscribers"); - const subscribers1 = - waku1.libp2p.pubsub.getSubscribers(DefaultPubSubTopic); - const subscribers2 = - waku2.libp2p.pubsub.getSubscribers(DefaultPubSubTopic); + const subscribers1 = waku1.libp2p.pubsub + .getSubscribers(DefaultPubSubTopic) + .map((p) => p.toString()); + const subscribers2 = waku2.libp2p.pubsub + .getSubscribers(DefaultPubSubTopic) + .map((p) => p.toString()); log("Asserting mutual subscription"); - expect(subscribers1).to.contain(waku2.libp2p.peerId.toB58String()); - expect(subscribers2).to.contain(waku1.libp2p.peerId.toB58String()); + expect(subscribers1).to.contain(waku2.libp2p.peerId.toString()); + expect(subscribers2).to.contain(waku1.libp2p.peerId.toString()); }); it("Register correct protocols", async function () { - const protocols = Array.from(waku1.libp2p.upgrader.protocols.keys()); + const protocols = waku1.libp2p.registrar.getProtocols(); expect(protocols).to.contain("/vac/waku/relay/2.0.0"); expect(protocols.findIndex((value) => value.match(/sub/))).to.eq(-1); @@ -247,34 +257,52 @@ describe("Waku Relay [node only]", () => { }); describe("Custom pubsub topic", () => { + let waku1: Waku; + let waku2: Waku; + let waku3: Waku; + afterEach(async function () { + !!waku1 && + waku1.stop().catch((e) => console.log("Waku failed to stop", e)); + !!waku2 && + waku2.stop().catch((e) => console.log("Waku failed to stop", e)); + !!waku3 && + waku3.stop().catch((e) => console.log("Waku failed to stop", e)); + }); + it("Publish", async function () { this.timeout(10000); const pubSubTopic = "/some/pubsub/topic"; // 1 and 2 uses a custom pubsub - const [waku1, waku2, waku3] = await Promise.all([ - Waku.create({ + // 3 uses the default pubsub + [waku1, waku2, waku3] = await Promise.all([ + createWaku({ pubSubTopic: pubSubTopic, staticNoiseKey: NOISE_KEY_1, - }), - Waku.create({ + }).then((waku) => waku.start().then(() => waku)), + createWaku({ pubSubTopic: pubSubTopic, staticNoiseKey: NOISE_KEY_2, libp2p: { addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] } }, - }), - Waku.create({ - staticNoiseKey: NOISE_KEY_2, - }), + }).then((waku) => waku.start().then(() => waku)), + createWaku({ + staticNoiseKey: NOISE_KEY_3, + }).then((waku) => waku.start().then(() => waku)), ]); - waku1.addPeerToAddressBook(waku2.libp2p.peerId, waku2.libp2p.multiaddrs); - waku3.addPeerToAddressBook(waku2.libp2p.peerId, waku2.libp2p.multiaddrs); + waku1.addPeerToAddressBook( + waku2.libp2p.peerId, + waku2.libp2p.getMultiaddrs() + ); + waku3.addPeerToAddressBook( + waku2.libp2p.peerId, + waku2.libp2p.getMultiaddrs() + ); await Promise.all([ - waku1.waitForRemotePeer([Protocols.Relay]), - waku2.waitForRemotePeer([Protocols.Relay]), - // No subscription change expected for Waku 3 + waitForRemotePeer(waku1, [Protocols.Relay]), + waitForRemotePeer(waku2, [Protocols.Relay]), ]); const messageText = "Communicating using a custom pubsub topic"; @@ -313,15 +341,16 @@ describe("Waku Relay [node only]", () => { beforeEach(async function () { this.timeout(30_000); - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); nwaku = new Nwaku(this.test?.ctx?.currentTest?.title + ""); await nwaku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Relay]); + await waitForRemotePeer(waku, [Protocols.Relay]); }); afterEach(async function () { @@ -330,7 +359,7 @@ describe("Waku Relay [node only]", () => { }); it("nwaku subscribes", async function () { - let subscribers: string[] = []; + let subscribers: PeerId[] = []; while (subscribers.length === 0) { await delay(200); @@ -338,7 +367,9 @@ describe("Waku Relay [node only]", () => { } const nimPeerId = await nwaku.getPeerId(); - expect(subscribers).to.contain(nimPeerId.toB58String()); + expect(subscribers.map((p) => p.toString())).to.contain( + nimPeerId.toString() + ); }); it("Publishes to nwaku", async function () { @@ -405,12 +436,12 @@ describe("Waku Relay [node only]", () => { it("Js publishes, other Js receives", async function () { this.timeout(60_000); [waku1, waku2] = await Promise.all([ - Waku.create({ + createWaku({ staticNoiseKey: NOISE_KEY_1, - }), - Waku.create({ + }).then((waku) => waku.start().then(() => waku)), + createWaku({ staticNoiseKey: NOISE_KEY_2, - }), + }).then((waku) => waku.start().then(() => waku)), ]); nwaku = new Nwaku(makeLogFileName(this)); @@ -424,8 +455,8 @@ describe("Waku Relay [node only]", () => { // Wait for identify protocol to finish await Promise.all([ - waku1.waitForRemotePeer([Protocols.Relay]), - waku2.waitForRemotePeer([Protocols.Relay]), + waitForRemotePeer(waku1, [Protocols.Relay]), + waitForRemotePeer(waku2, [Protocols.Relay]), ]); await delay(2000); diff --git a/src/lib/waku_relay/index.ts b/src/lib/waku_relay/index.ts index 1011088903..5d2bd454d3 100644 --- a/src/lib/waku_relay/index.ts +++ b/src/lib/waku_relay/index.ts @@ -1,17 +1,14 @@ -import debug from "debug"; -import Libp2p from "libp2p"; -import Gossipsub from "libp2p-gossipsub"; -import { AddrInfo, MessageIdFunction } from "libp2p-gossipsub/src/interfaces"; -import { MessageCache } from "libp2p-gossipsub/src/message-cache"; -import { RPC } from "libp2p-gossipsub/src/message/rpc"; import { - PeerScoreParams, - PeerScoreThresholds, -} from "libp2p-gossipsub/src/score"; -import { createGossipRpc, shuffle } from "libp2p-gossipsub/src/utils"; -import { InMessage } from "libp2p-interfaces/src/pubsub"; -import { SignaturePolicy } from "libp2p-interfaces/src/pubsub/signature-policy"; -import PeerId from "peer-id"; + GossipSub, + GossipsubMessage, + GossipsubOpts, +} from "@chainsafe/libp2p-gossipsub"; +import { + PeerIdStr, + TopicStr, +} from "@chainsafe/libp2p-gossipsub/dist/src/types"; +import { SignaturePolicy } from "@chainsafe/libp2p-gossipsub/types"; +import debug from "debug"; import { DefaultPubSubTopic } from "../constants"; import { hexToBytes } from "../utils"; @@ -19,35 +16,9 @@ import { CreateOptions } from "../waku"; import { DecryptionMethod, WakuMessage } from "../waku_message"; import * as constants from "./constants"; -import { getRelayPeers } from "./get_relay_peers"; -import { RelayHeartbeat } from "./relay_heartbeat"; const dbg = debug("waku:relay"); -/** - * See constructor libp2p-gossipsub [API](https://github.com/ChainSafe/js-libp2p-gossipsub#api). - */ -export interface GossipOptions { - emitSelf: boolean; - gossipIncoming: boolean; - fallbackToFloodsub: boolean; - floodPublish: boolean; - doPX: boolean; - msgIdFn: MessageIdFunction; - messageCache: MessageCache; - // This option is always overridden - // globalSignaturePolicy: string; - scoreParams: Partial; - scoreThresholds: Partial; - directPeers: AddrInfo[]; - D: number; - Dlo: number; - Dhi: number; - Dscore: number; - Dout: number; - Dlazy: number; -} - /** * Implements the [Waku v2 Relay protocol]{@link https://rfc.vac.dev/spec/11/}. * Must be passed as a `pubsub` module to a {Libp2p} instance. @@ -55,9 +26,9 @@ export interface GossipOptions { * @implements {require('libp2p-interfaces/src/pubsub')} * @noInheritDoc */ -export class WakuRelay extends Gossipsub { - heartbeat: RelayHeartbeat; +export class WakuRelay extends GossipSub { pubSubTopic: string; + public static multicodec: string = constants.RelayCodecs[0]; public decryptionKeys: Map< Uint8Array, @@ -72,27 +43,19 @@ export class WakuRelay extends Gossipsub { [contentTopic: string]: Set<(message: WakuMessage) => void>; }; - constructor( - libp2p: Libp2p, - options?: Partial - ) { - super( - libp2p, - Object.assign(options ?? {}, { - // Ensure that no signature is included nor expected in the messages. - globalSignaturePolicy: SignaturePolicy.StrictNoSign, - }) - ); + constructor(options?: Partial) { + options = Object.assign(options ?? {}, { + // Ensure that no signature is included nor expected in the messages. + globalSignaturePolicy: SignaturePolicy.StrictNoSign, + fallbackToFloodsub: false, + }); + super(options); + this.multicodecs = constants.RelayCodecs; - this.heartbeat = new RelayHeartbeat(this); this.observers = {}; this.decryptionKeys = new Map(); - const multicodecs = constants.RelayCodecs; - - Object.assign(this, { multicodecs }); - - this.pubSubTopic = options?.pubSubTopic || DefaultPubSubTopic; + this.pubSubTopic = options?.pubSubTopic ?? DefaultPubSubTopic; options?.decryptionKeys?.forEach((key) => { this.addDecryptionKey(key); @@ -119,7 +82,7 @@ export class WakuRelay extends Gossipsub { */ public async send(message: WakuMessage): Promise { const msg = message.encode(); - await super.publish(this.pubSubTopic, msg); + await this.publish(this.pubSubTopic, msg); } /** @@ -195,338 +158,58 @@ export class WakuRelay extends Gossipsub { } } - /** - * Return the relay peers we are connected to, and we would publish a message to - */ - getPeers(): Set { - return getRelayPeers(this, this.pubSubTopic, this._options.D, (id) => { - // Filter peers we would not publish to - return ( - this.score.score(id) >= this._options.scoreThresholds.publishThreshold - ); - }); - } - /** * Subscribe to a pubsub topic and start emitting Waku messages to observers. * * @override */ subscribe(pubSubTopic: string): void { - this.on(pubSubTopic, (event) => { - const decryptionKeys = Array.from(this.decryptionKeys).map( - ([key, { method, contentTopics }]) => { - return { - key, - method, - contentTopics, - }; - } - ); - - dbg(`Message received on ${pubSubTopic}`); - WakuMessage.decode(event.data, decryptionKeys) - .then((wakuMsg) => { - if (!wakuMsg) { - dbg("Failed to decode Waku Message"); - return; - } - - if (this.observers[""]) { - this.observers[""].forEach((callbackFn) => { - callbackFn(wakuMsg); - }); - } - if (wakuMsg.contentTopic) { - if (this.observers[wakuMsg.contentTopic]) { - this.observers[wakuMsg.contentTopic].forEach((callbackFn) => { - callbackFn(wakuMsg); - }); + this.addEventListener( + "gossipsub:message", + (event: CustomEvent) => { + if (event.detail.msg.topic === pubSubTopic) { + const decryptionKeys = Array.from(this.decryptionKeys).map( + ([key, { method, contentTopics }]) => { + return { + key, + method, + contentTopics, + }; } - } - }) - .catch((e) => { - dbg("Failed to decode Waku Message", e); - }); - }); + ); + + dbg(`Message received on ${pubSubTopic}`); + WakuMessage.decode(event.detail.msg.data, decryptionKeys) + .then((wakuMsg) => { + if (!wakuMsg) { + dbg("Failed to decode Waku Message"); + return; + } + + if (this.observers[""]) { + this.observers[""].forEach((callbackFn) => { + callbackFn(wakuMsg); + }); + } + if (wakuMsg.contentTopic) { + if (this.observers[wakuMsg.contentTopic]) { + this.observers[wakuMsg.contentTopic].forEach((callbackFn) => { + callbackFn(wakuMsg); + }); + } + } + }) + .catch((e) => { + dbg("Failed to decode Waku Message", e); + }); + } + } + ); super.subscribe(pubSubTopic); } - /** - * Join pubsub topic. - * This is present to override the behavior of Gossipsub and should not - * be used by API Consumers - * - * @internal - * @param {string} topic - * @returns {void} - * @override - */ - join(topic: string): void { - if (!this.started) { - throw new Error("WakuRelayPubSub has not started"); - } - - const fanoutPeers = this.fanout.get(topic); - if (fanoutPeers) { - // these peers have a score above the publish threshold, which may be negative - // so drop the ones with a negative score - fanoutPeers.forEach((id) => { - if (this.score.score(id) < 0) { - fanoutPeers.delete(id); - } - }); - if (fanoutPeers.size < this._options.D) { - // we need more peers; eager, as this would get fixed in the next heartbeat - getRelayPeers( - this, - topic, - this._options.D - fanoutPeers.size, - (id: string): boolean => { - // filter our current peers, direct peers, and peers with negative scores - return ( - !fanoutPeers.has(id) && - !this.direct.has(id) && - this.score.score(id) >= 0 - ); - } - ).forEach((id) => fanoutPeers.add(id)); - } - this.mesh.set(topic, fanoutPeers); - this.fanout.delete(topic); - this.lastpub.delete(topic); - } else { - const peers = getRelayPeers( - this, - topic, - this._options.D, - (id: string): boolean => { - // filter direct peers and peers with negative score - return !this.direct.has(id) && this.score.score(id) >= 0; - } - ); - this.mesh.set(topic, peers); - } - this.mesh.get(topic)?.forEach((id) => { - this.log("JOIN: Add mesh link to %s in %s", id, topic); - this._sendGraft(id, topic); - }); - } - - /** - * Publish messages. - * This is present to override the behavior of Gossipsub and should not - * be used by API Consumers - * - * @ignore - * @override - * @param {InMessage} msg - * @returns {void} - */ - async _publish(msg: InMessage): Promise { - const msgIdStr = await this.getCanonicalMsgIdStr(msg); - if (msg.receivedFrom !== this.peerId.toB58String()) { - this.score.deliverMessage(msg, msgIdStr); - this.gossipTracer.deliverMessage(msgIdStr); - } - - // put in seen cache - this.seenCache.put(msgIdStr); - - this.messageCache.put(msg, msgIdStr); - - const toSend = new Set(); - msg.topicIDs.forEach((topic) => { - const peersInTopic = this.topics.get(topic); - if (!peersInTopic) { - return; - } - - // direct peers - this.direct.forEach((id) => { - toSend.add(id); - }); - - let meshPeers = this.mesh.get(topic); - if (!meshPeers || !meshPeers.size) { - // We are not in the mesh for topic, use fanout peers - meshPeers = this.fanout.get(topic); - if (!meshPeers) { - // If we are not in the fanout, then pick peers in topic above the publishThreshold - const peers = getRelayPeers(this, topic, this._options.D, (id) => { - return ( - this.score.score(id) >= - this._options.scoreThresholds.publishThreshold - ); - }); - - if (peers.size > 0) { - meshPeers = peers; - this.fanout.set(topic, peers); - } else { - meshPeers = new Set(); - } - } - // Store the latest publishing time - this.lastpub.set(topic, this._now()); - } - - meshPeers?.forEach((peer) => { - toSend.add(peer); - }); - }); - // Publish messages to peers - const rpc = createGossipRpc([Gossipsub.utils.normalizeOutRpcMessage(msg)]); - dbg(`Relay message to ${toSend.size} peers`); - toSend.forEach((id) => { - if (id === msg.from) { - return; - } - dbg("Relay message to", id); - this._sendRpc(id, rpc); - }); - } - - /** - * Emits gossip to peers in a particular topic. - * - * This is present to override the behavior of Gossipsub and should not - * be used by API Consumers - * - * @ignore - * @override - * @param {string} topic - * @param {Set} exclude peers to exclude - * @returns {void} - */ - _emitGossip(topic: string, exclude: Set): void { - const messageIDs = this.messageCache.getGossipIDs(topic); - if (!messageIDs.length) { - return; - } - - // shuffle to emit in random order - shuffle(messageIDs); - - // if we are emitting more than GossipsubMaxIHaveLength ids, truncate the list - if (messageIDs.length > constants.RelayMaxIHaveLength) { - // we do the truncation (with shuffling) per peer below - this.log( - "too many messages for gossip; will truncate IHAVE list (%d messages)", - messageIDs.length - ); - } - - // Send gossip to GossipFactor peers above threshold with a minimum of D_lazy - // First we collect the peers above gossipThreshold that are not in the exclude set - // and then randomly select from that set - // We also exclude direct peers, as there is no reason to emit gossip to them - const peersToGossip: string[] = []; - const topicPeers = this.topics.get(topic); - if (!topicPeers) { - // no topic peers, no gossip - return; - } - topicPeers.forEach((id) => { - const peerStreams = this.peers.get(id); - if (!peerStreams) { - return; - } - if ( - !exclude.has(id) && - !this.direct.has(id) && - constants.RelayCodecs.includes(peerStreams.protocol) && - this.score.score(id) >= this._options.scoreThresholds.gossipThreshold - ) { - peersToGossip.push(id); - } - }); - - let target = this._options.Dlazy; - const factor = constants.RelayGossipFactor * peersToGossip.length; - if (factor > target) { - target = factor; - } - if (target > peersToGossip.length) { - target = peersToGossip.length; - } else { - shuffle(peersToGossip); - } - // Emit the IHAVE gossip to the selected peers up to the target - peersToGossip.slice(0, target).forEach((id) => { - let peerMessageIDs = messageIDs; - if (messageIDs.length > constants.RelayMaxIHaveLength) { - // shuffle and slice message IDs per peer so that we emit a different set for each peer - // we have enough redundancy in the system that this will significantly increase the message - // coverage when we do truncate - peerMessageIDs = shuffle(peerMessageIDs.slice()).slice( - 0, - constants.RelayMaxIHaveLength - ); - } - this._pushGossip(id, { - topicID: topic, - messageIDs: peerMessageIDs, - }); - }); - } - - /** - * Make a PRUNE control message for a peer in a topic. - * This is present to override the behavior of Gossipsub and should not - * be used by API Consumers - * - * @ignore - * @override - * @param {string} id - * @param {string} topic - * @param {boolean} doPX - * @returns {Promise} - */ - async _makePrune( - id: string, - topic: string, - doPX: boolean - ): Promise { - // backoff is measured in seconds - // RelayPruneBackoff is measured in milliseconds - const backoff = constants.RelayPruneBackoff / 1000; - if (!doPX) { - return { - topicID: topic, - peers: [], - backoff: backoff, - }; - } - - // select peers for Peer eXchange - const peers = getRelayPeers( - this, - topic, - constants.RelayPrunePeers, - (xid: string): boolean => { - return xid !== id && this.score.score(xid) >= 0; - } - ); - const px = await Promise.all( - Array.from(peers).map(async (p) => { - // see if we have a signed record to send back; if we don't, just send - // the peer ID and let the pruned peer find them in the DHT -- we can't trust - // unsigned address records through PX anyways - // Finding signed records in the DHT is not supported at the time of writing in js-libp2p - const peerId = PeerId.createFromB58String(p); - return { - peerID: peerId.toBytes(), - signedPeerRecord: - await this._libp2p.peerStore.addressBook.getRawEnvelope(peerId), - }; - }) - ); - return { - topicID: topic, - peers: px, - backoff: backoff, - }; + getMeshPeers(topic?: TopicStr): PeerIdStr[] { + return super.getMeshPeers(topic ?? this.pubSubTopic); } } diff --git a/src/lib/waku_relay/relay_heartbeat.ts b/src/lib/waku_relay/relay_heartbeat.ts deleted file mode 100644 index b3340add06..0000000000 --- a/src/lib/waku_relay/relay_heartbeat.ts +++ /dev/null @@ -1,379 +0,0 @@ -/** - * @hidden - * @module - */ - -import Gossipsub from "libp2p-gossipsub"; -import { Heartbeat } from "libp2p-gossipsub/src/heartbeat"; -import { shuffle } from "libp2p-gossipsub/src/utils"; - -import * as constants from "./constants"; -import { getRelayPeers } from "./get_relay_peers"; - -export class RelayHeartbeat extends Heartbeat { - /** - * @param {Object} gossipsub - * @constructor - */ - constructor(gossipsub: Gossipsub) { - super(gossipsub); - } - - start(): void { - if (this._heartbeatTimer) { - return; - } - - const heartbeat = this._heartbeat.bind(this); - - const timeout = setTimeout(() => { - heartbeat(); - this._heartbeatTimer?.runPeriodically( - heartbeat, - constants.RelayHeartbeatInterval - ); - }, constants.RelayHeartbeatInitialDelay); - - this._heartbeatTimer = { - _intervalId: undefined, - runPeriodically: (fn, period): void => { - // this._heartbeatTimer cannot be null, it is being assigned. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this._heartbeatTimer!._intervalId = setInterval(fn, period); - }, - cancel: (): void => { - clearTimeout(timeout); - clearInterval(this._heartbeatTimer?._intervalId as NodeJS.Timeout); - }, - }; - } - - /** - * Unmounts the gossipsub protocol and shuts down every connection - * @override - * @returns {void} - */ - stop(): void { - if (!this._heartbeatTimer) { - return; - } - - this._heartbeatTimer.cancel(); - this._heartbeatTimer = null; - } - - /** - * Maintains the mesh and fanout maps in gossipsub. - * - * @returns {void} - */ - _heartbeat(): void { - const { D, Dlo, Dhi, Dscore, Dout } = this.gossipsub._options; - this.gossipsub.heartbeatTicks++; - - // cache scores through the heartbeat - const scores = new Map(); - const getScore = (id: string): number => { - let s = scores.get(id); - if (s === undefined) { - s = this.gossipsub.score.score(id); - scores.set(id, s); - } - return s; - }; - - // peer id => topic[] - const toGraft = new Map(); - // peer id => topic[] - const toPrune = new Map(); - // peer id => don't px - const noPX = new Map(); - - // clean up expired backoffs - this.gossipsub._clearBackoff(); - - // clean up peerhave/iasked counters - this.gossipsub.peerhave.clear(); - this.gossipsub.iasked.clear(); - - // apply IWANT request penalties - this.gossipsub._applyIwantPenalties(); - - // ensure direct peers are connected - this.gossipsub._directConnect(); - - // maintain the mesh for topics we have joined - this.gossipsub.mesh.forEach((peers, topic) => { - // prune/graft helper functions (defined per topic) - const prunePeer = (id: string): void => { - this.gossipsub.log( - "HEARTBEAT: Remove mesh link to %s in %s", - id, - topic - ); - // update peer score - this.gossipsub.score.prune(id, topic); - // add prune backoff record - this.gossipsub._addBackoff(id, topic); - // remove peer from mesh - peers.delete(id); - // add to toPrune - const topics = toPrune.get(id); - if (!topics) { - toPrune.set(id, [topic]); - } else { - topics.push(topic); - } - }; - const graftPeer = (id: string): void => { - this.gossipsub.log("HEARTBEAT: Add mesh link to %s in %s", id, topic); - // update peer score - this.gossipsub.score.graft(id, topic); - // add peer to mesh - peers.add(id); - // add to toGraft - const topics = toGraft.get(id); - if (!topics) { - toGraft.set(id, [topic]); - } else { - topics.push(topic); - } - }; - - // drop all peers with negative score, without PX - peers.forEach((id) => { - const score = getScore(id); - if (score < 0) { - this.gossipsub.log( - "HEARTBEAT: Prune peer %s with negative score: score=%d, topic=%s", - id, - score, - topic - ); - prunePeer(id); - noPX.set(id, true); - } - }); - - // do we have enough peers? - if (peers.size < Dlo) { - const backoff = this.gossipsub.backoff.get(topic); - const ineed = D - peers.size; - const peersSet = getRelayPeers( - this.gossipsub, - topic, - ineed, - (id: string) => { - // filter out mesh peers, direct peers, peers we are backing off, peers with negative score - return ( - !peers.has(id) && - !this.gossipsub.direct.has(id) && - (!backoff || !backoff.has(id)) && - getScore(id) >= 0 - ); - } - ); - - peersSet.forEach(graftPeer); - } - - // do we have to many peers? - if (peers.size > Dhi) { - let peersArray = Array.from(peers); - // sort by score - peersArray.sort((a, b) => getScore(b) - getScore(a)); - // We keep the first D_score peers by score and the remaining up to D randomly - // under the constraint that we keep D_out peers in the mesh (if we have that many) - peersArray = peersArray - .slice(0, Dscore) - .concat(shuffle(peersArray.slice(Dscore))); - - // count the outbound peers we are keeping - let outbound = 0; - peersArray.slice(0, D).forEach((p) => { - if (this.gossipsub.outbound.get(p)) { - outbound++; - } - }); - - // if it's less than D_out, bubble up some outbound peers from the random selection - if (outbound < Dout) { - const rotate = (i: number): void => { - // rotate the peersArray to the right and put the ith peer in the front - const p = peersArray[i]; - for (let j = i; j > 0; j--) { - peersArray[j] = peersArray[j - 1]; - } - peersArray[0] = p; - }; - - // first bubble up all outbound peers already in the selection to the front - if (outbound > 0) { - let ihave = outbound; - for (let i = 1; i < D && ihave > 0; i++) { - if (this.gossipsub.outbound.get(peersArray[i])) { - rotate(i); - ihave--; - } - } - } - - // now bubble up enough outbound peers outside the selection to the front - let ineed = D - outbound; - for (let i = D; i < peersArray.length && ineed > 0; i++) { - if (this.gossipsub.outbound.get(peersArray[i])) { - rotate(i); - ineed--; - } - } - } - - // prune the excess peers - peersArray.slice(D).forEach(prunePeer); - } - - // do we have enough outbound peers? - if (peers.size >= Dlo) { - // count the outbound peers we have - let outbound = 0; - peers.forEach((p) => { - if (this.gossipsub.outbound.get(p)) { - outbound++; - } - }); - - // if it's less than D_out, select some peers with outbound connections and graft them - if (outbound < Dout) { - const ineed = Dout - outbound; - const backoff = this.gossipsub.backoff.get(topic); - getRelayPeers(this.gossipsub, topic, ineed, (id: string): boolean => { - // filter our current mesh peers, direct peers, peers we are backing off, peers with negative score - return ( - !peers.has(id) && - !this.gossipsub.direct.has(id) && - (!backoff || !backoff.has(id)) && - getScore(id) >= 0 - ); - }).forEach(graftPeer); - } - } - - // should we try to improve the mesh with opportunistic grafting? - if ( - this.gossipsub.heartbeatTicks % - constants.RelayOpportunisticGraftTicks === - 0 && - peers.size > 1 - ) { - // Opportunistic grafting works as follows: we check the median score of peers in the - // mesh; if this score is below the opportunisticGraftThreshold, we select a few peers at - // random with score over the median. - // The intention is to (slowly) improve an under performing mesh by introducing good - // scoring peers that may have been gossiping at us. This allows us to get out of sticky - // situations where we are stuck with poor peers and also recover from churn of good peers. - - // now compute the median peer score in the mesh - const peersList = Array.from(peers).sort( - (a, b) => getScore(a) - getScore(b) - ); - const medianIndex = Math.floor(peers.size / 2); - const medianScore = getScore(peersList[medianIndex]); - - // if the median score is below the threshold, select a better peer (if any) and GRAFT - if ( - medianScore < - this.gossipsub._options.scoreThresholds.opportunisticGraftThreshold - ) { - const backoff = this.gossipsub.backoff.get(topic); - const peersToGraft = getRelayPeers( - this.gossipsub, - topic, - constants.RelayOpportunisticGraftPeers, - (id: string): boolean => { - // filter out current mesh peers, direct peers, peers we are backing off, peers below or at threshold - return ( - peers.has(id) && - !this.gossipsub.direct.has(id) && - (!backoff || !backoff.has(id)) && - getScore(id) > medianScore - ); - } - ); - peersToGraft.forEach((id: string) => { - this.gossipsub.log( - "HEARTBEAT: Opportunistically graft peer %s on topic %s", - id, - topic - ); - graftPeer(id); - }); - } - } - - // 2nd arg are mesh peers excluded from gossip. We have already pushed - // messages to them, so its redundant to gossip IHAVEs. - this.gossipsub._emitGossip(topic, peers); - }); - - // expire fanout for topics we haven't published to in a while - const now = this.gossipsub._now(); - this.gossipsub.lastpub.forEach((lastpub, topic) => { - if (lastpub + constants.RelayFanoutTTL < now) { - this.gossipsub.fanout.delete(topic); - this.gossipsub.lastpub.delete(topic); - } - }); - - // maintain our fanout for topics we are publishing but we have not joined - this.gossipsub.fanout.forEach((fanoutPeers, topic) => { - // checks whether our peers are still in the topic and have a score above the publish threshold - const topicPeers = this.gossipsub.topics.get(topic); - fanoutPeers.forEach((id) => { - if ( - !topicPeers?.has(id) || - getScore(id) < - this.gossipsub._options.scoreThresholds.publishThreshold - ) { - fanoutPeers.delete(id); - } - }); - - // do we need more peers? - if (fanoutPeers.size < D) { - const ineed = D - fanoutPeers.size; - const peersSet = getRelayPeers( - this.gossipsub, - topic, - ineed, - (id: string): boolean => { - // filter out existing fanout peers, direct peers, and peers with score above the publish threshold - return ( - !fanoutPeers.has(id) && - !this.gossipsub.direct.has(id) && - getScore(id) >= - this.gossipsub._options.scoreThresholds.publishThreshold - ); - } - ); - peersSet.forEach((id: string) => { - fanoutPeers.add(id); - }); - } - - // 2nd arg are fanout peers excluded from gossip. - // We have already pushed messages to them, so its redundant to gossip IHAVEs - this.gossipsub._emitGossip(topic, fanoutPeers); - }); - - // send coalesced GRAFT/PRUNE messages (will piggyback gossip) - this.gossipsub._sendGraftPrune(toGraft, toPrune, noPX); - - // flush pending gossip that wasn't piggybacked above - this.gossipsub._flush(); - - // advance the message history window - this.gossipsub.messageCache.shift(); - - this.gossipsub.emit("gossipsub:heartbeat"); - } -} diff --git a/src/lib/waku_store/index.node.spec.ts b/src/lib/waku_store/index.node.spec.ts index 76669dd68f..e814819865 100644 --- a/src/lib/waku_store/index.node.spec.ts +++ b/src/lib/waku_store/index.node.spec.ts @@ -12,7 +12,8 @@ import { generateSymmetricKey, getPublicKey, } from "../crypto"; -import { Protocols, Waku } from "../waku"; +import { waitForRemotePeer } from "../wait_for_remote_peer"; +import { createWaku, Protocols, Waku } from "../waku"; import { DecryptionMethod, WakuMessage } from "../waku_message"; import { PageDirection } from "./history_rpc"; @@ -46,11 +47,12 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); const messages = await waku.store.queryHistory([]); expect(messages?.length).eq(2); @@ -78,11 +80,12 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); let messages: WakuMessage[] = []; @@ -117,11 +120,12 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); let messages: WakuMessage[] = []; const desiredMsgs = 14; @@ -153,11 +157,12 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); const messages = await waku.store.queryHistory([], { pageDirection: PageDirection.FORWARD, @@ -191,12 +196,13 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ pubSubTopic: customPubSubTopic, staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); const nimPeerId = await nwaku.getPeerId(); @@ -259,12 +265,12 @@ describe("Waku Store", () => { dbg("Messages have been encrypted"); const [waku1, waku2, nimWakuMultiaddr] = await Promise.all([ - Waku.create({ + createWaku({ staticNoiseKey: NOISE_KEY_1, - }), - Waku.create({ + }).then((waku) => waku.start().then(() => waku)), + createWaku({ staticNoiseKey: NOISE_KEY_2, - }), + }).then((waku) => waku.start().then(() => waku)), nwaku.getMultiaddrWithId(), ]); @@ -277,7 +283,7 @@ describe("Waku Store", () => { dbg("Waku nodes connected to nwaku"); - await waku1.waitForRemotePeer([Protocols.LightPush]); + await waitForRemotePeer(waku1, [Protocols.LightPush]); dbg("Sending messages using light push"); await Promise.all([ @@ -287,7 +293,7 @@ describe("Waku Store", () => { waku1.lightPush.push(clearMessage), ]); - await waku2.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku2, [Protocols.Store]); waku2.store.addDecryptionKey(symKey); @@ -363,12 +369,12 @@ describe("Waku Store", () => { dbg("Messages have been encrypted"); const [waku1, waku2, nimWakuMultiaddr] = await Promise.all([ - Waku.create({ + createWaku({ staticNoiseKey: NOISE_KEY_1, - }), - Waku.create({ + }).then((waku) => waku.start().then(() => waku)), + createWaku({ staticNoiseKey: NOISE_KEY_2, - }), + }).then((waku) => waku.start().then(() => waku)), nwaku.getMultiaddrWithId(), ]); @@ -381,7 +387,7 @@ describe("Waku Store", () => { dbg("Waku nodes connected to nwaku"); - await waku1.waitForRemotePeer([Protocols.LightPush]); + await waitForRemotePeer(waku1, [Protocols.LightPush]); dbg("Sending messages using light push"); await Promise.all([ @@ -391,7 +397,7 @@ describe("Waku Store", () => { waku1.lightPush.push(clearMessage), ]); - await waku2.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku2, [Protocols.Store]); waku2.addDecryptionKey(symKey, { contentTopics: [encryptedSymmetricContentTopic], @@ -450,11 +456,12 @@ describe("Waku Store", () => { ).to.be.true; } - waku = await Waku.create({ + waku = await createWaku({ staticNoiseKey: NOISE_KEY_1, }); + await waku.start(); await waku.dial(await nwaku.getMultiaddrWithId()); - await waku.waitForRemotePeer([Protocols.Store]); + await waitForRemotePeer(waku, [Protocols.Store]); const nwakuPeerId = await nwaku.getPeerId(); diff --git a/src/lib/waku_store/index.ts b/src/lib/waku_store/index.ts index 3cad6bb492..2d09c4c911 100644 --- a/src/lib/waku_store/index.ts +++ b/src/lib/waku_store/index.ts @@ -1,10 +1,11 @@ +import type { PeerId } from "@libp2p/interface-peer-id"; +import { Peer } from "@libp2p/interface-peer-store"; import debug from "debug"; -import concat from "it-concat"; -import lp from "it-length-prefixed"; +import all from "it-all"; +import * as lp from "it-length-prefixed"; import { pipe } from "it-pipe"; -import Libp2p from "libp2p"; -import { Peer } from "libp2p/src/peer-store"; -import PeerId from "peer-id"; +import { Libp2p } from "libp2p"; +import { concat } from "uint8arrays/concat"; import * as protoV2Beta4 from "../../proto/store_v2beta4"; import { HistoryResponse } from "../../proto/store_v2beta4"; @@ -105,11 +106,7 @@ export class WakuStore { >; constructor(public libp2p: Libp2p, options?: CreateOptions) { - if (options?.pubSubTopic) { - this.pubSubTopic = options.pubSubTopic; - } else { - this.pubSubTopic = DefaultPubSubTopic; - } + this.pubSubTopic = options?.pubSubTopic ?? DefaultPubSubTopic; this.decryptionKeys = new Map(); } @@ -146,7 +143,7 @@ export class WakuStore { ); dbg("Querying history with the following options", { - peerId: options?.peerId?.toB58String(), + peerId: options?.peerId?.toString(), ...options, }); @@ -154,9 +151,9 @@ export class WakuStore { if (opts.peerId) { peer = await this.libp2p.peerStore.get(opts.peerId); if (!peer) - throw `Failed to retrieve connection details for provided peer in peer store: ${opts.peerId.toB58String()}`; + throw `Failed to retrieve connection details for provided peer in peer store: ${opts.peerId.toString()}`; } else { - peer = await this.randomPeer; + peer = await this.randomPeer(); if (!peer) throw "Failed to find known peer that registers waku store protocol"; } @@ -170,11 +167,12 @@ export class WakuStore { } dbg(`Use store codec ${storeCodec}`); if (!storeCodec) - throw `Peer does not register waku store protocol: ${peer.id.toB58String()}`; + throw `Peer does not register waku store protocol: ${peer.id.toString()}`; Object.assign(opts, { storeCodec }); - const connection = this.libp2p.connectionManager.get(peer.id); - if (!connection) throw "Failed to get a connection to the peer"; + const connections = this.libp2p.connectionManager.getConnections(peer.id); + if (!connections || !connections.length) + throw "Failed to get a connection to the peer"; const decryptionKeys = Array.from(this.decryptionKeys).map( ([key, { method, contentTopics }]) => { @@ -201,19 +199,21 @@ export class WakuStore { const messages: WakuMessage[] = []; let cursor = undefined; while (true) { - const { stream } = await connection.newStream(storeCodec); + // TODO: Some connection selection logic? + const stream = await connections[0].newStream(storeCodec); const queryOpts = Object.assign(opts, { cursor }); const historyRpcQuery = HistoryRPC.createQuery(queryOpts); - dbg("Querying store peer", connection.remoteAddr.toString()); + dbg("Querying store peer", connections[0].remoteAddr.toString()); const res = await pipe( [historyRpcQuery.encode()], lp.encode(), stream, lp.decode(), - concat + async (source) => await all(source) ); - const reply = historyRpcQuery.decode(res.slice()); + const bytes = concat(res); + const reply = historyRpcQuery.decode(bytes); if (!reply.response) { throw "History response misses response field"; @@ -301,7 +301,7 @@ export class WakuStore { * Returns known peers from the address book (`libp2p.peerStore`) that support * store protocol. Waku may or may not be currently connected to these peers. */ - get peers(): AsyncIterable { + async peers(): Promise { const codecs = []; for (const codec of Object.values(StoreCodecs)) { codecs.push(codec); @@ -315,7 +315,7 @@ export class WakuStore { * book (`libp2p.peerStore`). Waku may or may not be currently connected to * this peer. */ - get randomPeer(): Promise { - return selectRandomPeer(this.peers); + async randomPeer(): Promise { + return selectRandomPeer(await this.peers()); } } diff --git a/src/test_utils/constants.ts b/src/test_utils/constants.ts index ca2bd3b523..82dc1e01fd 100644 --- a/src/test_utils/constants.ts +++ b/src/test_utils/constants.ts @@ -24,3 +24,13 @@ export const NOISE_KEY_2 = new Uint8Array( return b; })() ); + +export const NOISE_KEY_3 = new Uint8Array( + ((): number[] => { + const b = []; + for (let i = 0; i < 32; i++) { + b.push(3); + } + return b; + })() +); diff --git a/src/test_utils/nwaku.ts b/src/test_utils/nwaku.ts index 89365fe8c7..7b6c7acc35 100644 --- a/src/test_utils/nwaku.ts +++ b/src/test_utils/nwaku.ts @@ -5,10 +5,11 @@ import { ChildProcess, spawn } from "child_process"; +import type { PeerId } from "@libp2p/interface-peer-id"; +import { peerIdFromString } from "@libp2p/peer-id"; +import { Multiaddr, multiaddr } from "@multiformats/multiaddr"; import appRoot from "app-root-path"; import debug from "debug"; -import { Multiaddr, multiaddr } from "multiaddr"; -import PeerId from "peer-id"; import portfinder from "portfinder"; import { DefaultPubSubTopic } from "../lib/constants"; @@ -216,7 +217,7 @@ export class Nwaku { ]); } - async messages(): Promise { + async messages(pubsubTopic?: string): Promise { this.checkProcess(); const isDefined = (msg: WakuMessage | undefined): msg is WakuMessage => { @@ -225,7 +226,7 @@ export class Nwaku { const protoMsgs = await this.rpcCall( "get_waku_v2_relay_v1_messages", - [DefaultPubSubTopic] + [pubsubTopic ?? DefaultPubSubTopic] ); const msgs = await Promise.all( @@ -343,7 +344,7 @@ export class Nwaku { if (!this.multiaddrWithId) throw "Nwaku did not return a ws multiaddr"; const peerIdStr = this.multiaddrWithId.getPeerId(); if (!peerIdStr) throw "Nwaku multiaddr does not contain peerId"; - this.peerId = PeerId.createFromB58String(peerIdStr); + this.peerId = peerIdFromString(peerIdStr); return { peerId: this.peerId, multiaddrWithId: this.multiaddrWithId }; } diff --git a/tsconfig.json b/tsconfig.json index f0913da833..b958d4581f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "incremental": true, "target": "es2020", - "outDir": "dist/esm", + "outDir": "dist/", "rootDir": "src", "moduleResolution": "node", "module": "es2020", diff --git a/webpack.config.cjs b/webpack.config.cjs deleted file mode 100644 index 62b1cac614..0000000000 --- a/webpack.config.cjs +++ /dev/null @@ -1,50 +0,0 @@ -const webpack = require("webpack"); -const path = require("path"); - -module.exports = { - mode: "development", - entry: { - "js-waku": "./src/index.ts", - }, - devtool: "inline-source-map", - module: { - rules: [ - { - test: /\.(js|tsx?)$/, - use: "ts-loader", - exclude: /(node_modules)|(node\.spec\.ts)/, - }, - { - test: /node\.spec\.ts$/, - use: "ignore-loader", - }, - ], - }, - plugins: [ - new webpack.ProvidePlugin({ - process: "process/browser.js", - Buffer: ["buffer", "Buffer"], - }), - ], - resolve: { - extensions: [".ts", ".js"], - fallback: { - buffer: require.resolve("buffer/"), - crypto: false, - stream: require.resolve("stream-browserify"), - }, - }, - output: { - filename: "[name].js", - path: path.resolve(__dirname, "build/umd"), - library: "jswaku", - libraryTarget: "umd", - globalObject: "this", - }, - optimization: { - splitChunks: { - name: "vendors", - chunks: "all", - }, - }, -}; diff --git a/webpack.umd.config.cjs b/webpack.umd.config.cjs deleted file mode 100644 index 1fa2c884e7..0000000000 --- a/webpack.umd.config.cjs +++ /dev/null @@ -1,40 +0,0 @@ -const webpack = require("webpack"); -const path = require("path"); - -module.exports = { - mode: "production", - entry: { - "js-waku": "./src/index.ts", - }, - devtool: "inline-source-map", - module: { - rules: [ - { - test: /\.ts$/, - use: "ts-loader", - exclude: /node_modules/, - }, - ], - }, - plugins: [ - new webpack.ProvidePlugin({ - process: "process/browser.js", - Buffer: ["buffer", "Buffer"], - }), - ], - resolve: { - extensions: [".ts", ".js"], - fallback: { - buffer: require.resolve("buffer/"), - crypto: false, - stream: require.resolve("stream-browserify"), - }, - }, - output: { - filename: "index.js", - path: path.resolve(__dirname, "dist/umd"), - library: "waku", - libraryTarget: "umd", - globalObject: "this", - }, -};