From 6fdd386b87cbf50e3c76d205db3bee7dba35d5ea Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Mon, 20 Jun 2022 17:49:35 +0200 Subject: [PATCH] feat: support base cid encodings --- packages/edge-gateway/package.json | 1 + packages/edge-gateway/src/gateway.js | 2 +- packages/edge-gateway/src/utils/cid.js | 38 +++- packages/edge-gateway/test/index.spec.js | 22 +- pnpm-lock.yaml | 244 ++++++++++++++++++----- 5 files changed, 249 insertions(+), 58 deletions(-) diff --git a/packages/edge-gateway/package.json b/packages/edge-gateway/package.json index 2f866693..bd58c9e1 100644 --- a/packages/edge-gateway/package.json +++ b/packages/edge-gateway/package.json @@ -19,6 +19,7 @@ "mock:cf-ipfs.com": "smoke -p 9083 test/mocks/cf-ipfs.com" }, "dependencies": { + "ipfs-core-utils": "^0.15.0", "itty-router": "^2.4.5", "multiformats": "^9.6.4", "nanoid": "^3.1.30", diff --git a/packages/edge-gateway/src/gateway.js b/packages/edge-gateway/src/gateway.js index 787c89fa..33c42996 100644 --- a/packages/edge-gateway/src/gateway.js +++ b/packages/edge-gateway/src/gateway.js @@ -99,7 +99,7 @@ export async function gatewayGet(request, env, ctx) { export async function gatewayIpfs(request, env, ctx, options = {}) { const startTs = Date.now() const reqUrl = new URL(request.url) - const cid = getCidFromSubdomainUrl(reqUrl) + const cid = await getCidFromSubdomainUrl(reqUrl) const pathname = reqUrl.pathname // Validation layer - root CID diff --git a/packages/edge-gateway/src/utils/cid.js b/packages/edge-gateway/src/utils/cid.js index 77c0a94c..a1817ee5 100644 --- a/packages/edge-gateway/src/utils/cid.js +++ b/packages/edge-gateway/src/utils/cid.js @@ -1,3 +1,5 @@ +import { Multibases } from 'ipfs-core-utils/multibases' +import { bases } from 'multiformats/basics' import { CID } from 'multiformats/cid' import { InvalidUrlError } from '../errors.js' @@ -7,7 +9,7 @@ import { InvalidUrlError } from '../errors.js' * * @param {URL} url */ -export function getCidFromSubdomainUrl(url) { +export async function getCidFromSubdomainUrl(url) { // Replace "ipfs-staging" by "ipfs" if needed const host = url.hostname.replace('ipfs-staging', 'ipfs') const splitHost = host.split('.ipfs.') @@ -16,11 +18,14 @@ export function getCidFromSubdomainUrl(url) { throw new InvalidUrlError(url.hostname) } + let cid try { - return normalizeCid(splitHost[0]) + cid = await normalizeCidV1(splitHost[0]) } catch (err) { throw new InvalidUrlError(`invalid CID: ${splitHost[0]}: ${err.message}`) } + + return cid } /** @@ -32,3 +37,32 @@ export function normalizeCid(cid) { const c = CID.parse(cid) return c.toV1().toString() } + +/** + * Parse CID v1 and return normalized b32 v1 + * + * @param {string} cid + */ +async function normalizeCidV1(cid) { + const baseDecoder = await getMultibaseDecoder(cid) + const c = CID.parse(cid, baseDecoder) + return c.toV1().toString() +} + +/** + * Get multibase to decode CID + * + * @param {string} cid + */ +async function getMultibaseDecoder(cid) { + /** @type {MultibaseCodec[]} */ + const multibaseCodecs = Object.values(bases) + const basicBases = new Multibases({ + bases: multibaseCodecs, + }) + + const multibasePrefix = cid[0] + const base = await basicBases.getBase(multibasePrefix) + + return base.decoder +} diff --git a/packages/edge-gateway/test/index.spec.js b/packages/edge-gateway/test/index.spec.js index 49b89474..04bfe1db 100644 --- a/packages/edge-gateway/test/index.spec.js +++ b/packages/edge-gateway/test/index.spec.js @@ -1,6 +1,9 @@ import test from 'ava' -import { createErrorHtmlContent } from '../src/errors.js' +import { base32 } from 'multiformats/bases/base32' +import { base16 } from 'multiformats/bases/base16' + +import { createErrorHtmlContent } from '../src/errors.js' import { getMiniflare } from './utils.js' test.beforeEach((t) => { @@ -44,3 +47,20 @@ test('Gets content with path', async (t) => { ) t.is(await response.text(), 'Hello gateway.nft.storage resource!') }) + +test.only('Gets content with other base encodings', async (t) => { + const { mf } = t.context + + const cidStr = 'bafkreidyeivj7adnnac6ljvzj2e3rd5xdw3revw4da7mx2ckrstapoupoq' + const decodedB32 = base32.decode(cidStr) + const encodedB16 = base16.encode(decodedB32) + + console.log('encodedB16', encodedB16) + + const response = await mf.dispatchFetch( + // `https://${encodedB16}.ipfs.localhost:8787` + 'https://f0155122078222a9f806d6805e5a6b94e89b88fb71db71256dc183ecbe84a8ca607ba8f74.ipfs.localhost:8787' + ) + await response.waitUntil() + t.is(await response.text(), 'Hello nft.storage! 😎') +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e8db5f8..e56aa0b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,6 +151,7 @@ importers: esbuild: ^0.14.2 execa: ^5.1.1 git-rev-sync: ^3.0.1 + ipfs-core-utils: ^0.15.0 ipfs-http-client: ^55.0.0 ipfs-utils: ^9.0.4 itty-router: ^2.4.5 @@ -170,6 +171,7 @@ importers: toucan-js: ^2.5.0 uint8arrays: ^3.0.0 dependencies: + ipfs-core-utils: 0.15.0 itty-router: 2.6.1 multiformats: 9.6.4 nanoid: 3.3.3 @@ -262,7 +264,6 @@ packages: integrity: sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==, } engines: { node: 4.x || >=6.0.0 } - dev: true /@ampproject/remapping/2.2.0: resolution: @@ -3542,7 +3543,6 @@ packages: } dependencies: multiformats: 9.6.4 - dev: true /@istanbuljs/load-nyc-config/1.1.0: resolution: @@ -3624,6 +3624,40 @@ packages: '@jridgewell/sourcemap-codec': 1.4.11 dev: true + /@libp2p/interfaces/2.0.4: + resolution: + { + integrity: sha512-MfwkTFyHJtvwNxkjOjzkXyIVvKFtEW2Q3IGRJPyPQMrtB6ll0rGMTlyJ3BQS1bcD0YkNhggFm+8XiU2/0LCBhQ==, + } + engines: { node: '>=16.0.0', npm: '>=7.0.0' } + dependencies: + '@multiformats/multiaddr': 10.2.0 + err-code: 3.0.1 + interface-datastore: 6.1.0 + it-pushable: 2.0.2 + it-stream-types: 1.0.4 + multiformats: 9.6.4 + transitivePeerDependencies: + - supports-color + - undici + dev: false + + /@libp2p/logger/1.1.6: + resolution: + { + integrity: sha512-ZKoRUt7cyHlbxHYDZ1Fn3A+ByqGABdmd4z07+1TfVvpEQSpn2IVcV0mt6ff5kUUtGuVeSrqK1/ZDzWqhgg56vg==, + } + engines: { node: '>=16.0.0', npm: '>=7.0.0' } + dependencies: + '@libp2p/interfaces': 2.0.4 + debug: 4.3.4 + interface-datastore: 6.1.0 + multiformats: 9.6.4 + transitivePeerDependencies: + - supports-color + - undici + dev: false + /@magic-sdk/admin/1.4.0: resolution: { @@ -4015,6 +4049,36 @@ packages: - utf-8-validate dev: true + /@multiformats/multiaddr-to-uri/9.0.1: + resolution: + { + integrity: sha512-kSyHZ2lKjoEzHu/TM4ZVwFj4AWV1B9qFBFJjYb/fK1NqrnrNb/M3uhoyckJvP7WZvpDsnEc7fUCpmPipDY6LMw==, + } + dependencies: + '@multiformats/multiaddr': 10.2.0 + transitivePeerDependencies: + - supports-color + - undici + dev: false + + /@multiformats/multiaddr/10.2.0: + resolution: + { + integrity: sha512-njYZidmSOP5qDaZszgDafaPd+AQsm1iOk7ktzmOZ4P5nkuK+YJofnysdSSQjJbLXCS7ft17Y/XcIwulQeTdrQA==, + } + engines: { node: '>=16.0.0', npm: '>=7.0.0' } + dependencies: + dns-over-http-resolver: 2.0.1 + err-code: 3.0.1 + is-ip: 4.0.0 + multiformats: 9.6.4 + uint8arrays: 3.0.0 + varint: 6.0.0 + transitivePeerDependencies: + - supports-color + - undici + dev: false + /@multiformats/murmur3/1.1.1: resolution: { @@ -4297,28 +4361,24 @@ packages: { integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, } - dev: true /@protobufjs/base64/1.1.2: resolution: { integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, } - dev: true /@protobufjs/codegen/2.0.4: resolution: { integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, } - dev: true /@protobufjs/eventemitter/1.1.0: resolution: { integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, } - dev: true /@protobufjs/fetch/1.1.0: resolution: @@ -4328,42 +4388,36 @@ packages: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 - dev: true /@protobufjs/float/1.0.2: resolution: { integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, } - dev: true /@protobufjs/inquire/1.1.0: resolution: { integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, } - dev: true /@protobufjs/path/1.1.2: resolution: { integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, } - dev: true /@protobufjs/pool/1.1.0: resolution: { integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, } - dev: true /@protobufjs/utf8/1.1.0: resolution: { integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, } - dev: true /@rollup/plugin-commonjs/21.1.0_rollup@2.70.2: resolution: @@ -4934,14 +4988,12 @@ packages: { integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==, } - dev: true /@types/minimatch/3.0.5: resolution: { integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, } - dev: true /@types/minimist/1.2.2: resolution: @@ -5695,7 +5747,6 @@ packages: { integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==, } - dev: true /anymatch/3.1.2: resolution: @@ -6174,7 +6225,6 @@ packages: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } - dev: true /base-x/4.0.0: resolution: @@ -6261,7 +6311,6 @@ packages: } dependencies: browser-readablestream-to-it: 1.0.3 - dev: true /blockstore-core/1.0.5: resolution: @@ -6370,7 +6419,6 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /braces/3.0.2: resolution: @@ -6418,7 +6466,6 @@ packages: { integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==, } - dev: true /browser-stdout/1.3.1: resolution: @@ -6493,7 +6540,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /builtin-modules/3.2.0: resolution: @@ -7170,7 +7216,6 @@ packages: /concat-map/0.0.1: resolution: { integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= } - dev: true /concat-stream/1.6.2: resolution: @@ -8004,6 +8049,20 @@ packages: - supports-color dev: true + /dns-over-http-resolver/2.0.1: + resolution: + { + integrity: sha512-2S7WCfi3U49GSwnfGQrK1YPOXuRjtVBUELqvUld9umNOZxph6t9iUBfv56mK52D9a4Urv8M8/CrqOfOvVkWPkg==, + } + dependencies: + debug: 4.3.4 + native-fetch: 4.0.2 + receptacle: 1.3.2 + transitivePeerDependencies: + - supports-color + - undici + dev: false + /dnslink-cloudflare/3.0.0: resolution: { @@ -8196,7 +8255,6 @@ packages: engines: { node: '>=6' } dependencies: encoding: 0.1.13 - dev: true /electron-to-chromium/1.4.127: resolution: @@ -8244,7 +8302,6 @@ packages: } dependencies: iconv-lite: 0.6.3 - dev: true /end-of-stream/1.4.4: resolution: @@ -8290,7 +8347,6 @@ packages: { integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==, } - dev: true /error-ex/1.3.2: resolution: @@ -10016,7 +10072,6 @@ packages: { integrity: sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==, } - dev: true /fast-glob/3.2.11: resolution: @@ -10474,7 +10529,6 @@ packages: { integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==, } - dev: true /get-own-enumerable-property-symbols/3.0.2: resolution: @@ -11093,7 +11147,6 @@ packages: engines: { node: '>=0.10.0' } dependencies: safer-buffer: 2.1.2 - dev: true /idb-keyval/6.1.0: resolution: @@ -11270,7 +11323,6 @@ packages: interface-store: 2.0.2 nanoid: 3.3.3 uint8arrays: 3.0.0 - dev: true /interface-store/1.0.2: resolution: @@ -11284,7 +11336,6 @@ packages: { integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==, } - dev: true /internal-slot/1.0.3: resolution: @@ -11322,6 +11373,14 @@ packages: engines: { node: '>=8' } dev: true + /ip-regex/5.0.0: + resolution: + { + integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: false + /ip/1.1.5: resolution: { integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= } dev: true @@ -11367,6 +11426,22 @@ packages: - supports-color dev: true + /ipfs-core-types/0.11.0: + resolution: + { + integrity: sha512-HwhxvBEPKMNBGsD2PbvncwKynPKcZtEwSuBCEih6/tR7zCkV5YGi5WAj1fXVuDAfRU3Se41xqJ6FKU4KWrP4cw==, + } + dependencies: + '@ipld/dag-pb': 2.1.16 + '@multiformats/multiaddr': 10.2.0 + interface-datastore: 6.1.0 + ipfs-unixfs: 6.0.9 + multiformats: 9.6.4 + transitivePeerDependencies: + - supports-color + - undici + dev: false + /ipfs-core-types/0.8.4: resolution: { @@ -11407,7 +11482,7 @@ packages: debug: 4.3.4 err-code: 3.0.1 ipfs-core-types: 0.8.4 - ipfs-unixfs: 6.0.7 + ipfs-unixfs: 6.0.9 ipfs-utils: 9.0.6 it-all: 1.0.6 it-map: 1.0.6 @@ -11457,6 +11532,37 @@ packages: - supports-color dev: true + /ipfs-core-utils/0.15.0: + resolution: + { + integrity: sha512-/ljV4PIjjWY9lpOnlDwIAMnRR0FudsiAv6ggQ/LxqQKhZmWKBGmcrBfIEPEBLBHX1yWL0yN4wcjg/+zVr6Qb/w==, + } + dependencies: + '@libp2p/logger': 1.1.6 + '@multiformats/multiaddr': 10.2.0 + '@multiformats/multiaddr-to-uri': 9.0.1 + any-signal: 3.0.1 + blob-to-it: 1.0.4 + browser-readablestream-to-it: 1.0.3 + err-code: 3.0.1 + ipfs-core-types: 0.11.0 + ipfs-unixfs: 6.0.9 + ipfs-utils: 9.0.6 + it-all: 1.0.6 + it-map: 1.0.6 + it-peekable: 1.0.3 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiformats: 9.6.4 + nanoid: 3.3.3 + parse-duration: 1.0.2 + timeout-abort-controller: 3.0.0 + uint8arrays: 3.0.0 + transitivePeerDependencies: + - supports-color + - undici + dev: false + /ipfs-http-client/55.0.0: resolution: { @@ -11501,7 +11607,7 @@ packages: err-code: 3.0.1 hamt-sharding: 2.0.1 interface-blockstore: 1.0.2 - ipfs-unixfs: 6.0.7 + ipfs-unixfs: 6.0.9 it-last: 1.0.6 multiformats: 9.6.4 uint8arrays: 3.0.0 @@ -11520,7 +11626,7 @@ packages: err-code: 3.0.1 hamt-sharding: 2.0.1 interface-blockstore: 1.0.2 - ipfs-unixfs: 6.0.7 + ipfs-unixfs: 6.0.9 it-all: 1.0.6 it-batch: 1.0.9 it-first: 1.0.7 @@ -11545,6 +11651,16 @@ packages: protobufjs: 6.11.2 dev: true + /ipfs-unixfs/6.0.9: + resolution: + { + integrity: sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==, + } + engines: { node: '>=16.0.0', npm: '>=7.0.0' } + dependencies: + err-code: 3.0.1 + protobufjs: 6.11.2 + /ipfs-utils/9.0.6: resolution: { @@ -11565,7 +11681,6 @@ packages: node-fetch: /@achingbrain/node-fetch/2.6.7 react-native-fetch-api: 2.0.0 stream-to-it: 0.2.4 - dev: true /irregular-plurals/3.3.0: resolution: @@ -11711,7 +11826,6 @@ packages: { integrity: sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw==, } - dev: true /is-error/2.2.2: resolution: @@ -11811,6 +11925,16 @@ packages: ip-regex: 4.3.0 dev: true + /is-ip/4.0.0: + resolution: + { + integrity: sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + ip-regex: 5.0.0 + dev: false + /is-map/2.0.2: resolution: { @@ -11915,7 +12039,6 @@ packages: integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, } engines: { node: '>=8' } - dev: true /is-plain-object/5.0.0: resolution: @@ -12115,7 +12238,6 @@ packages: integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==, } engines: { node: '>=12' } - dev: true /isstream/0.1.2: resolution: { integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= } @@ -12212,7 +12334,6 @@ packages: { integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==, } - dev: true /it-batch/1.0.9: resolution: @@ -12250,7 +12371,6 @@ packages: dependencies: '@types/minimatch': 3.0.5 minimatch: 3.1.2 - dev: true /it-last/1.0.6: resolution: @@ -12264,7 +12384,6 @@ packages: { integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==, } - dev: true /it-parallel-batch/1.0.10: resolution: @@ -12280,7 +12399,6 @@ packages: { integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==, } - dev: true /it-pipe/1.1.0: resolution: @@ -12289,6 +12407,20 @@ packages: } dev: true + /it-pushable/2.0.2: + resolution: + { + integrity: sha512-f/n6HqXGDbHvuMR/3UN+S6W4y/bS1Pxg6Lb0oVc5dbflxy5f3NKkizKs86B8vzqHnB9hm1YpE0pgcEvI3FKDQw==, + } + dev: false + + /it-stream-types/1.0.4: + resolution: + { + integrity: sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw==, + } + dev: false + /it-take/1.0.2: resolution: { @@ -12308,7 +12440,6 @@ packages: p-defer: 3.0.0 p-fifo: 1.0.0 readable-stream: 3.6.0 - dev: true /itty-router/2.6.1: resolution: @@ -13030,7 +13161,6 @@ packages: { integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==, } - dev: true /loose-envify/1.4.0: resolution: @@ -13241,7 +13371,6 @@ packages: engines: { node: '>=10' } dependencies: is-plain-obj: 2.1.0 - dev: true /merge-stream/2.0.0: resolution: @@ -13462,7 +13591,6 @@ packages: } dependencies: brace-expansion: 1.1.11 - dev: true /minimatch/4.2.1: resolution: @@ -13748,7 +13876,15 @@ packages: node-fetch: '*' dependencies: node-fetch: /@achingbrain/node-fetch/2.6.7 - dev: true + + /native-fetch/4.0.2: + resolution: + { + integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==, + } + peerDependencies: + undici: '*' + dev: false /natural-compare/1.4.0: resolution: { integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= } @@ -14342,7 +14478,6 @@ packages: integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==, } engines: { node: '>=8' } - dev: true /p-event/4.2.0: resolution: @@ -14362,7 +14497,6 @@ packages: dependencies: fast-fifo: 1.1.0 p-defer: 3.0.0 - dev: true /p-filter/3.0.0: resolution: @@ -14649,7 +14783,6 @@ packages: { integrity: sha512-Dg27N6mfok+ow1a2rj/nRjtCfaKrHUZV2SJpEn/s8GaVUSlf4GGRCRP1c13Hj+wfPKVMrFDqLMLITkYKgKxyyg==, } - dev: true /parse-entities/2.0.0: resolution: @@ -15411,7 +15544,6 @@ packages: '@types/long': 4.0.2 '@types/node': 17.0.30 long: 4.0.0 - dev: true /proxy-addr/2.0.7: resolution: @@ -15710,7 +15842,6 @@ packages: } dependencies: p-defer: 3.0.0 - dev: true /react-redux/7.2.8_ef5jwxihqo6n7gxfmzogljlgcm: resolution: @@ -15847,7 +15978,6 @@ packages: } dependencies: ms: 2.1.3 - dev: true /rechoir/0.6.2: resolution: { integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= } @@ -16250,7 +16380,6 @@ packages: { integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==, } - dev: true /retry/0.12.0: resolution: { integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= } @@ -17135,7 +17264,6 @@ packages: } dependencies: get-iterator: 1.0.2 - dev: true /streaming-iterables/6.2.0: resolution: @@ -17796,6 +17924,15 @@ packages: retimer: 3.0.0 dev: true + /timeout-abort-controller/3.0.0: + resolution: + { + integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==, + } + dependencies: + retimer: 3.0.0 + dev: false + /timer2/1.0.0: resolution: { @@ -18437,7 +18574,6 @@ packages: { integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==, } - dev: true /varname/2.0.3: resolution: { integrity: sha1-BejcZPu25ZFw3kSq1N3quKuHto4= }