From 3d3bb708d9b6b39e09329400ffe92204f664e846 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Thu, 9 May 2024 13:04:54 +0100 Subject: [PATCH 1/4] feat: support byte range for raw block requests --- package-lock.json | 37 ++++++++++++ package.json | 2 + src/bindings.d.ts | 14 ++++- src/handlers/block.js | 96 ++++++++++++++++++++++++++++---- src/handlers/car.js | 22 ++++---- src/handlers/unixfs-dir.js | 16 ++++-- src/handlers/unixfs-file.js | 12 +++- src/handlers/unixfs.js | 8 +-- src/middleware.js | 23 +++++--- src/util/range.js | 34 +++++++++++ test/handlers/block.spec.js | 57 ++++++++++++++++++- test/handlers/car.spec.js | 8 +-- test/handlers/unixfs-dir.spec.js | 2 +- test/helpers.js | 23 +++++++- 14 files changed, 303 insertions(+), 51 deletions(-) create mode 100644 src/util/range.js diff --git a/package-lock.json b/package-lock.json index b5b14fe..1733227 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "4.1.0", "license": "Apache-2.0 OR MIT", "dependencies": { + "@httpland/range-parser": "^1.2.0", "@ipld/car": "^5.2.6", "@web3-storage/handlebars": "^1.0.0", "bytes": "^3.1.2", @@ -17,6 +18,7 @@ "magic-bytes.js": "^1.8.0", "mrmime": "^1.0.1", "multiformats": "^13.0.1", + "multipart-byte-range": "^2.0.1", "timeout-abort-controller": "^3.0.0", "uint8arrays": "^5.0.1" }, @@ -376,6 +378,15 @@ "resolved": "https://registry.npmjs.org/@handlebars/parser/-/parser-1.1.0.tgz", "integrity": "sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A==" }, + "node_modules/@httpland/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@httpland/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-8hOuBe2Jyatrmj060orVaRwU5lh5NPzqk5w8L4hraztr3fqurSY4seILUzt8nxYlwp33skVADoEi95LMuo8WQw==", + "dependencies": { + "@miyauci/isx": "1.1.1", + "@miyauci/prelude": "1.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -2354,6 +2365,16 @@ "uint8arrays": "^5.0.0" } }, + "node_modules/@miyauci/isx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@miyauci/isx/-/isx-1.1.1.tgz", + "integrity": "sha512-I675QDyEPVM8Ya/Yfr908YxhFMyoht6xysqKmEmkuohheyTs1ZO6mzm6tI/ddKfGNDymatwqiMtqfXjLI0seWg==" + }, + "node_modules/@miyauci/prelude": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@miyauci/prelude/-/prelude-1.0.0.tgz", + "integrity": "sha512-jHT170+byyB9G/RWFZ+UgZCVcFAB9+hjnPnK8LZJUbhIgbz3SQXyEmuQIO00mi2FLmCWgHN3rVRFEEcx11woEg==" + }, "node_modules/@multiformats/blake2": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-2.0.2.tgz", @@ -3109,6 +3130,14 @@ "npm": ">=7.0.0" } }, + "node_modules/byteranges": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/byteranges/-/byteranges-1.1.0.tgz", + "integrity": "sha512-c1bjg97QZleneWOirBABMvzz4qsxb9KoIFYKilQxMovb5N5MwLHnDuVt7k98Q/kL42hI1HcgG67q7yszFZJuqA==", + "engines": { + "node": ">=14" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6126,6 +6155,14 @@ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" }, + "node_modules/multipart-byte-range": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/multipart-byte-range/-/multipart-byte-range-2.0.1.tgz", + "integrity": "sha512-WhtupMhoBKS9YzDszVBpeGqwJTBjdqTgXneqo0tJyUwlTn2h7Pbtr+mdaVV554dLU68jICgefaQfqcPkl62m3Q==", + "dependencies": { + "byteranges": "^1.1.0" + } + }, "node_modules/murmurhash3js-revisited": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", diff --git a/package.json b/package.json index 3c9a3c2..7550af4 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "author": "Alan Shaw", "license": "Apache-2.0 OR MIT", "dependencies": { + "@httpland/range-parser": "^1.2.0", "@ipld/car": "^5.2.6", "@web3-storage/handlebars": "^1.0.0", "bytes": "^3.1.2", @@ -73,6 +74,7 @@ "magic-bytes.js": "^1.8.0", "mrmime": "^1.0.1", "multiformats": "^13.0.1", + "multipart-byte-range": "^2.0.1", "timeout-abort-controller": "^3.0.0", "uint8arrays": "^5.0.1" }, diff --git a/src/bindings.d.ts b/src/bindings.d.ts index 207f60d..3ac3f24 100644 --- a/src/bindings.d.ts +++ b/src/bindings.d.ts @@ -1,6 +1,6 @@ import type { CID } from 'multiformats/cid' import type { UnixFSEntry } from 'ipfs-unixfs-exporter' -import type { IDagula } from 'dagula' +import type { BlockService, DagService, UnixfsService } from 'dagula' import type { TimeoutController } from 'timeout-abort-controller' export {} @@ -23,8 +23,16 @@ export interface TimeoutControllerContext extends Context { timeoutController: TimeoutController } -export interface DagulaContext extends Context { - dagula: IDagula +export interface BlockContext extends Context { + blocks: BlockService +} + +export interface DagContext extends Context { + dag: DagService +} + +export interface UnixfsContext extends Context { + unixfs: UnixfsService } export interface UnixfsEntryContext extends Context { diff --git a/src/handlers/block.js b/src/handlers/block.js index 2b969d3..9c67467 100644 --- a/src/handlers/block.js +++ b/src/handlers/block.js @@ -1,20 +1,26 @@ /* eslint-env browser */ +import { MultipartByteRange } from 'multipart-byte-range' +import { decodeRangeHeader, resolveRange } from '../util/range.js' +import { HttpError } from '../util/errors.js' /** - * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').DagulaContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} BlockHandlerContext + * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').BlockContext & import('../bindings.js').UnixfsContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} BlockHandlerContext */ /** @type {import('../bindings.js').Handler} */ export async function handleBlock (request, env, ctx) { - const { dataCid, path, timeoutController: controller, dagula } = ctx + const { dataCid, path, timeoutController: controller, blocks, unixfs, searchParams } = ctx if (!dataCid) throw new Error('missing IPFS path') if (path == null) throw new Error('missing URL path') - if (!dagula) throw new Error('missing dagula instance') + if (!blocks) throw new Error('missing block service') + if (!unixfs) throw new Error('missing unixfs service') + if (!searchParams) throw new Error('missing search params') /** @type {import('multiformats').CID} */ let cid if (path && path !== '/') { - const entry = await dagula.getUnixfs(`${dataCid}${path}`, { signal: controller?.signal }) + // TODO: resolve path before calling handler + const entry = await unixfs.getUnixfs(`${dataCid}${path}`, { signal: controller?.signal }) cid = entry.cid } else { cid = dataCid @@ -25,8 +31,30 @@ export async function handleBlock (request, env, ctx) { return new Response(null, { status: 304 }) } - const block = await dagula.getBlock(cid, { signal: controller?.signal }) - const { searchParams } = new URL(request.url) + if (request.method === 'HEAD') { + const stat = await blocks.statBlock(cid, { signal: controller?.signal }) + return new Response(undefined, { + headers: { + 'Accept-Ranges': 'bytes', + 'Content-Length': stat.size.toString(), + Etag: etag, + Vary: 'Accept, Range' + } + }) + } + if (request.method !== 'GET') { + throw new HttpError('method not allowed', { status: 405 }) + } + + /** @type {import('multipart-byte-range').Range[]} */ + let ranges = [] + if (request.headers.has('range')) { + try { + ranges = decodeRangeHeader(request.headers.get('range') ?? '') + } catch (err) { + throw new HttpError('invalid range', { cause: err, status: 400 }) + } + } const name = searchParams.get('filename') || `${cid}.bin` const utf8Name = encodeURIComponent(name) @@ -34,14 +62,62 @@ export async function handleBlock (request, env, ctx) { const asciiName = encodeURIComponent(name.replace(/[^\x00-\x7F]/g, '_')) const headers = { - 'Content-Type': 'application/vnd.ipld.raw', 'X-Content-Type-Options': 'nosniff', Etag: etag, 'Cache-Control': 'public, max-age=29030400, immutable', - 'Content-Length': block.bytes.length.toString(), 'Content-Disposition': `attachment; filename="${asciiName}"; filename*=UTF-8''${utf8Name}`, - Vary: 'Accept' + Vary: 'Accept, Range' + } + + if (ranges.length > 1) { + return handleMultipartRange(blocks, cid, ranges, { signal: controller?.signal, headers }) + } else if (ranges.length === 1) { + return handleRange(blocks, cid, ranges[0], { signal: controller?.signal, headers }) + } + + // no range is effectively Range: bytes=0- + return handleRange(blocks, cid, [0], { signal: controller?.signal, headers }) +} + +/** + * @param {import('dagula').BlockService} blocks + * @param {import('multiformats').UnknownLink} cid + * @param {import('dagula').Range} range + * @param {{ signal?: AbortSignal, headers?: Record }} [options] + */ +const handleRange = async (blocks, cid, range, options) => { + const stat = await blocks.statBlock(cid, { signal: options?.signal }) + const [first, last] = resolveRange(range, stat.size) + const contentRange = `bytes ${first}-${last}/${stat.size}` + const contentLength = last - first + 1 + + const headers = { + ...options?.headers, + 'Content-Type': 'application/vnd.ipld.raw', + 'Content-Range': contentRange, + 'Content-Length': String(contentLength) } - return new Response(block.bytes, { headers }) + const status = stat.size === contentLength ? 200 : 206 + const content = await blocks.streamBlock(cid, { range, signal: options?.signal }) + return new Response(content, { status, headers }) +} + +/** + * @param {import('dagula').BlockService} blocks + * @param {import('multiformats').UnknownLink} cid + * @param {import('dagula').Range[]} ranges + * @param {{ signal?: AbortSignal, headers?: Record }} [options] + */ +const handleMultipartRange = async (blocks, cid, ranges, options) => { + const stat = await blocks.statBlock(cid, { signal: options?.signal }) + + /** @param {import('dagula').AbsoluteRange} range */ + const getBytes = range => blocks.streamBlock(cid, { signal: options?.signal, range }) + + const source = new MultipartByteRange(ranges, getBytes, { + totalSize: stat.size, + contentType: 'application/vnd.ipld.raw' + }) + return new Response(source, { status: 206, headers: { ...options?.headers, ...source.headers } }) } diff --git a/src/handlers/car.js b/src/handlers/car.js index 86ded37..b0bb880 100644 --- a/src/handlers/car.js +++ b/src/handlers/car.js @@ -4,7 +4,7 @@ import { toReadableStream } from '../util/streams.js' import { HttpError } from '../util/errors.js' /** - * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').DagulaContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} CarHandlerContext + * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').DagContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} CarHandlerContext * @typedef {import('multiformats').CID} CID * @typedef {{ version: 1|2, order: import('dagula').BlockOrder, dups: boolean }} CarParams */ @@ -14,10 +14,14 @@ const DefaultCarParams = { version: 1, order: 'unk', dups: true } /** @type {import('../bindings.js').Handler} */ export async function handleCar (request, env, ctx) { - const { dataCid, path, timeoutController: controller, dagula, searchParams } = ctx + const { dataCid, path, timeoutController: controller, dag, searchParams } = ctx if (!dataCid) throw new Error('missing IPFS path') if (path == null) throw new Error('missing URL path') - if (!dagula) throw new Error('missing dagula instance') + if (!dag) throw new Error('missing DAG service') + + if (request.method !== 'GET') { + throw new HttpError('method not allowed', { status: 405 }) + } const dagScope = getDagScope(searchParams) const entityBytes = getEntityBytes(searchParams) @@ -40,7 +44,7 @@ export async function handleCar (request, env, ctx) { const { writer, out } = CarWriter.create(dataCid) ;(async () => { try { - for await (const block of dagula.getPath(`${dataCid}${path}`, { dagScope, entityBytes, order, signal: controller?.signal })) { + for await (const block of dag.getPath(`${dataCid}${path}`, { dagScope, entityBytes, order, signal: controller?.signal })) { await writer.put(block) } } catch (/** @type {any} */ err) { @@ -83,7 +87,7 @@ function getDagScope (searchParams) { /** * @param {URLSearchParams} searchParams - * @returns {import('dagula').ByteRange|undefined} + * @returns {import('dagula').Range|undefined} */ function getEntityBytes (searchParams) { const value = searchParams.get('entity-bytes') @@ -97,17 +101,15 @@ function getEntityBytes (searchParams) { if (isNaN(from)) { throw new HttpError(`invalid entity-bytes: ${value}`, { status: 400 }) } - /** @type {number|'*'} */ + /** @type {number|undefined} */ let to - if (parts[1] === '*') { - to = parts[1] - } else { + if (parts[1] !== '*') { to = parseInt(parts[1]) if (isNaN(to)) { throw new HttpError(`invalid entity-bytes: ${value}`, { status: 400 }) } } - return { from, to } + return to ? [from, to] : [from] } /** diff --git a/src/handlers/unixfs-dir.js b/src/handlers/unixfs-dir.js index 6e50ac8..1cad09d 100644 --- a/src/handlers/unixfs-dir.js +++ b/src/handlers/unixfs-dir.js @@ -5,9 +5,10 @@ import bytes from 'bytes' import './templates/bundle.cjs' import { toReadableStream } from '../util/streams.js' import { handleUnixfsFile } from './unixfs-file.js' +import { HttpError } from '../util/errors.js' /** - * @typedef {import('../bindings.js').UnixfsEntryContext & import('../bindings.js').IpfsUrlContext & import('../bindings.js').DagulaContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} UnixfsDirectoryHandlerContext + * @typedef {import('../bindings.js').UnixfsEntryContext & import('../bindings.js').IpfsUrlContext & import('../bindings.js').UnixfsContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} UnixfsDirectoryHandlerContext */ /** @@ -44,15 +45,15 @@ const knownIcons = Object.fromEntries([ /** @type {import('../bindings.js').Handler} */ export async function handleUnixfsDir (request, env, ctx) { - const { unixfsEntry: entry, timeoutController: controller, dagula, dataCid, path } = ctx - if (!entry) throw new Error('missing unixfs entry') - if (!entry.type.includes('directory')) throw new Error('non unixfs directory entry') - if (!dagula) throw new Error('missing dagula instance') + const { unixfsEntry: entry, timeoutController: controller, unixfs, dataCid, path } = ctx + if (!entry) throw new Error('missing UnixFS entry') + if (!entry.type.includes('directory')) throw new Error('non UnixFS directory entry') + if (!unixfs) throw new Error('missing UnixFS service') // serve index.html if directory contains one try { const indexPath = `${dataCid}${path}${path.endsWith('/') ? '' : '/'}index.html` - const fileEntry = await dagula.getUnixfs(indexPath, { signal: controller?.signal }) + const fileEntry = await unixfs.getUnixfs(indexPath, { signal: controller?.signal }) ctx.unixfsEntry = fileEntry return handleUnixfsFile(request, env, ctx) } catch (/** @type {any} */ err) { @@ -67,6 +68,9 @@ export async function handleUnixfsDir (request, env, ctx) { if (request.method === 'HEAD') { return new Response(null, { headers }) } + if (request.method !== 'GET') { + throw new HttpError('method not allowed', { status: 405 }) + } const isSubdomain = new URL(request.url).hostname.includes('.ipfs.') /** @param {string} p CID path like "[/optional/path]" */ diff --git a/src/handlers/unixfs-file.js b/src/handlers/unixfs-file.js index 1b9b467..a64fe58 100644 --- a/src/handlers/unixfs-file.js +++ b/src/handlers/unixfs-file.js @@ -1,6 +1,7 @@ /* eslint-env browser */ import { toReadableStream } from '../util/streams.js' import { detectContentType } from '../util/mime.js' +import { HttpError } from '../util/errors.js' /** * @typedef {import('../bindings.js').UnixfsEntryContext} UnixfsFileHandlerContext @@ -9,9 +10,9 @@ import { detectContentType } from '../util/mime.js' /** @type {import('../bindings.js').Handler} */ export async function handleUnixfsFile (request, env, ctx) { const { unixfsEntry: entry } = ctx - if (!entry) throw new Error('missing unixfs entry') + if (!entry) throw new Error('missing UnixFS entry') if (entry.type !== 'file' && entry.type !== 'raw' && entry.type !== 'identity') { - throw new Error('non unixfs file entry') + throw new Error('non UnixFS file entry') } const etag = `"${entry.cid}"` @@ -26,6 +27,13 @@ export async function handleUnixfsFile (request, env, ctx) { 'Content-Length': entry.size.toString() } + if (request.method === 'HEAD') { + return new Response(null, { headers }) + } + if (request.method !== 'GET') { + throw new HttpError('method not allowed', { status: 405 }) + } + console.log('unixfs root', entry.cid.toString()) const contentIterator = entry.content()[Symbol.asyncIterator]() const { done, value: firstChunk } = await contentIterator.next() diff --git a/src/handlers/unixfs.js b/src/handlers/unixfs.js index e7037d4..d18ef87 100644 --- a/src/handlers/unixfs.js +++ b/src/handlers/unixfs.js @@ -4,17 +4,17 @@ import { handleUnixfsFile } from './unixfs-file.js' import { HttpError } from '../util/errors.js' /** - * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').DagulaContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} UnixfsHandlerContext + * @typedef {import('../bindings.js').IpfsUrlContext & import('../bindings.js').UnixfsContext & { timeoutController?: import('../bindings.js').TimeoutControllerContext['timeoutController'] }} UnixfsHandlerContext */ /** @type {import('../bindings.js').Handler} */ export async function handleUnixfs (request, env, ctx) { - const { dataCid, path, timeoutController: controller, dagula } = ctx + const { dataCid, path, timeoutController: controller, unixfs } = ctx if (!dataCid) throw new Error('missing data CID') if (path == null) throw new Error('missing URL pathname') - if (!dagula) throw new Error('missing dagula instance') + if (!unixfs) throw new Error('missing UnixFS context') - const entry = await dagula.getUnixfs(`${dataCid}${path}`, { signal: controller?.signal }) + const entry = await unixfs.getUnixfs(`${dataCid}${path}`, { signal: controller?.signal }) if (!['file', 'raw', 'directory', 'hamt-directory', 'identity'].includes(entry.type)) { throw new HttpError('unsupported entry type', { status: 501 }) diff --git a/src/middleware.js b/src/middleware.js index 56da684..0e31ad4 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -92,18 +92,27 @@ export function withErrorHandler (handler) { } /** - * Validates the request uses a HTTP GET method. - * @type {import('./bindings.js').Middleware} + * Validates the request uses a specific HTTP method(s). + * @param {...string} method Allowed HTTP method(s). + * @returns {import('./bindings.js').Middleware} */ -export function withHttpGet (handler) { - return (request, env, ctx) => { - if (request.method !== 'GET') { - throw Object.assign(new Error('method not allowed'), { status: 405 }) +export function createWithHttpMethod (...method) { + return (handler) => { + return (request, env, ctx) => { + if (!method.includes(request.method)) { + throw new HttpError('method not allowed', { status: 405 }) + } + return handler(request, env, ctx) } - return handler(request, env, ctx) } } +/** + * Validates the request uses a HTTP GET method. + * @type {import('./bindings.js').Middleware} + */ +export const withHttpGet = createWithHttpMethod('GET') + /** * Extracts the data CID, the path and search params from the URL. * @type {import('./bindings.js').Middleware} diff --git a/src/util/range.js b/src/util/range.js new file mode 100644 index 0000000..df9e2f7 --- /dev/null +++ b/src/util/range.js @@ -0,0 +1,34 @@ +import { parseRange } from '@httpland/range-parser' + +/** + * @param {string} [str] + * @returns {import('dagula').Range[]} + */ +export const decodeRangeHeader = (str) => { + if (!str) throw new Error('missing Range header value') + /** @type {import('dagula').Range[]} */ + const ranges = [] + for (const r of parseRange(str).rangeSet) { + if (typeof r === 'string') { + // "other" - ignore + } else if ('firstPos' in r) { + ranges.push(r.lastPos != null ? [r.firstPos, r.lastPos] : [r.firstPos]) + } else { + ranges.push([-r.suffixLength]) + } + } + return ranges +} + +/** + * Resolve a range to an absolute range. + * + * @param {import('dagula').Range} range + * @param {number} totalSize + * @returns {import('dagula').AbsoluteRange} + */ +export const resolveRange = (range, totalSize) => { + const last = range[1] == null ? (totalSize - 1) : range[1] + const first = range[1] == null && range[0] < 0 ? totalSize + range[0] : range[0] + return [first, last] +} diff --git a/test/handlers/block.spec.js b/test/handlers/block.spec.js index 9786ae4..dff7f4d 100644 --- a/test/handlers/block.spec.js +++ b/test/handlers/block.spec.js @@ -2,7 +2,7 @@ import { describe, it } from 'node:test' import assert from 'node:assert' import { Dagula } from 'dagula' -import { equals, fromString } from 'uint8arrays' +import { fromString, toString } from 'uint8arrays' import { encode } from 'multiformats/block' import * as raw from 'multiformats/codecs/raw' import { sha256 as hasher } from 'multiformats/hashes/sha2' @@ -17,10 +17,61 @@ describe('block handler', () => { const block = await encode({ value: fromString('test'), codec: raw, hasher }) const blockstore = mockBlockstore([block]) const dagula = new Dagula(blockstore) - const ctx = { waitUntil, dagula, dataCid: block.cid, path, searchParams } + const ctx = { waitUntil, unixfs: dagula, blocks: dagula, dataCid: block.cid, path, searchParams } const env = { DEBUG: 'true' } const req = new Request('http://localhost/ipfs/bafy') const res = await handleBlock(req, env, ctx) - assert(equals(new Uint8Array(await res.arrayBuffer()), block.bytes)) + assert.equal(await res.text(), toString(block.bytes)) + }) + + it('serves block absolute byte range', async () => { + const waitUntil = mockWaitUntil() + const path = '' + const searchParams = new URLSearchParams() + const block = await encode({ value: fromString('testtest'), codec: raw, hasher }) + const blockstore = mockBlockstore([block]) + const dagula = new Dagula(blockstore) + const ctx = { waitUntil, unixfs: dagula, blocks: dagula, dataCid: block.cid, path, searchParams } + const env = { DEBUG: 'true' } + const range = [3, 4] // "tt" + const req = new Request('http://localhost/ipfs/bafy', { + headers: { Range: `bytes=${range[0]}-${range[1]}` } + }) + const res = await handleBlock(req, env, ctx) + assert.equal(await res.text(), toString(block.bytes.slice(range[0], range[1] + 1))) + }) + + it('serves block positive suffix byte range', async () => { + const waitUntil = mockWaitUntil() + const path = '' + const searchParams = new URLSearchParams() + const block = await encode({ value: fromString('testtest'), codec: raw, hasher }) + const blockstore = mockBlockstore([block]) + const dagula = new Dagula(blockstore) + const ctx = { waitUntil, unixfs: dagula, blocks: dagula, dataCid: block.cid, path, searchParams } + const env = { DEBUG: 'true' } + const range = [4] // "test" + const req = new Request('http://localhost/ipfs/bafy', { + headers: { Range: `bytes=${range[0]}-` } + }) + const res = await handleBlock(req, env, ctx) + assert.equal(await res.text(), toString(block.bytes.slice(range[0]))) + }) + + it('serves block negative suffix byte range', async () => { + const waitUntil = mockWaitUntil() + const path = '' + const searchParams = new URLSearchParams() + const block = await encode({ value: fromString('testtest'), codec: raw, hasher }) + const blockstore = mockBlockstore([block]) + const dagula = new Dagula(blockstore) + const ctx = { waitUntil, unixfs: dagula, blocks: dagula, dataCid: block.cid, path, searchParams } + const env = { DEBUG: 'true' } + const range = [-2] // "st" + const req = new Request('http://localhost/ipfs/bafy', { + headers: { Range: `bytes=${range[0]}` } + }) + const res = await handleBlock(req, env, ctx) + assert.equal(await res.text(), toString(block.bytes.slice(range[0]))) }) }) diff --git a/test/handlers/car.spec.js b/test/handlers/car.spec.js index c42ffb2..410feb4 100644 --- a/test/handlers/car.spec.js +++ b/test/handlers/car.spec.js @@ -20,7 +20,7 @@ describe('CAR handler', () => { const rootBlock = await encode({ value: { leaf: leafBlock.cid }, codec: cbor, hasher }) const blockstore = mockBlockstore([leafBlock, rootBlock]) const dagula = new Dagula(blockstore) - const ctx = { waitUntil, dagula, dataCid: rootBlock.cid, path, searchParams } + const ctx = { waitUntil, dag: dagula, dataCid: rootBlock.cid, path, searchParams } const env = { DEBUG: 'true' } const req = new Request(`http://localhost/ipfs/${rootBlock.cid}`) const res = await handleCar(req, env, ctx) @@ -40,7 +40,7 @@ describe('CAR handler', () => { const dagula = new Dagula(blockstore) const url = new URL(`http://localhost/ipfs/${rootBlock.cid}/leaf0?dag-scope=block`) const path = url.pathname.replace(`/ipfs/${rootBlock.cid}`, '') - const ctx = { waitUntil, dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } + const ctx = { waitUntil, dag: dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } const env = { DEBUG: 'true' } const req = new Request(url) const res = await handleCar(req, env, ctx) @@ -64,7 +64,7 @@ describe('CAR handler', () => { const dagula = new Dagula(blockstore) const url = new URL(`http://localhost/ipfs/${rootBlock.cid}`) const path = url.pathname.replace(`/ipfs/${rootBlock.cid}`, '') - const ctx = { waitUntil, dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } + const ctx = { waitUntil, dag: dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } const env = { DEBUG: 'true' } const req = new Request(url, { headers: { @@ -104,7 +104,7 @@ describe('CAR handler', () => { const dagula = new Dagula(blockstore) const url = new URL(`http://localhost/ipfs/${rootBlock.cid}`) const path = url.pathname.replace(`/ipfs/${rootBlock.cid}`, '') - const ctx = { waitUntil, dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } + const ctx = { waitUntil, dag: dagula, dataCid: rootBlock.cid, path, searchParams: url.searchParams } const env = { DEBUG: 'true' } const req = new Request(url, { headers: { diff --git a/test/handlers/unixfs-dir.spec.js b/test/handlers/unixfs-dir.spec.js index 92bf5ba..e375301 100644 --- a/test/handlers/unixfs-dir.spec.js +++ b/test/handlers/unixfs-dir.spec.js @@ -24,7 +24,7 @@ describe('UnixFS handler', () => { const dirBlock = await encode({ value: pbData, codec: pb, hasher }) const blockstore = mockBlockstore([dirBlock, fileBlock]) const dagula = new Dagula(blockstore) - const ctx = { waitUntil, dagula, dataCid: dirBlock.cid, path, searchParams } + const ctx = { waitUntil, unixfs: dagula, dataCid: dirBlock.cid, path, searchParams } const env = { DEBUG: 'true' } const req = new Request('http://localhost/ipfs/bafy') const res = await handleUnixfs(req, env, ctx) diff --git a/test/helpers.js b/test/helpers.js index 0eeb43a..24307fe 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,3 +1,5 @@ +import { resolveRange } from '../src/util/range.js' + /** * @returns {((p: Promise) => void) & { promises: Promise[] }} */ @@ -14,5 +16,24 @@ export const mockWaitUntil = () => { * @returns {import('dagula').Blockstore} */ export const mockBlockstore = blocks => ({ - get: async cid => blocks.find(b => b.cid.toString() === cid.toString()) + async get (cid) { + return blocks.find(b => b.cid.toString() === cid.toString()) + }, + async stream (cid, options) { + const block = await this.get(cid) + if (!block) return + return new ReadableStream({ + pull (controller) { + const range = resolveRange(options?.range ?? [0], block.bytes.length) + const bytes = block.bytes.slice(range[0], range[1] + 1) + controller.enqueue(bytes) + controller.close() + } + }) + }, + async stat (cid) { + const block = await this.get(cid) + if (!block) return + return { size: block.bytes.length } + } }) From 0f74fcc1bd1fc8c3d4cec7141ccac72b67c2e5a1 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 13 May 2024 10:29:31 +0100 Subject: [PATCH 2/4] chore: use git dependency temporarily --- package-lock.json | 957 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 424 insertions(+), 535 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1733227..79cbfa7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@web3-storage/handlebars": "^1.0.0", "bytes": "^3.1.2", "chardet": "^2.0.0", - "dagula": "^7.3.0", + "dagula": "github:web3-storage/dagula#feat/add-block-streaming-interface", "magic-bytes.js": "^1.8.0", "mrmime": "^1.0.1", "multiformats": "^13.0.1", @@ -69,49 +69,45 @@ } }, "node_modules/@achingbrain/nat-port-mapper/node_modules/@libp2p/logger": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-4.0.5.tgz", - "integrity": "sha512-cXETMNZINnxeQBlfQ2S4di92FDDU89R7RHagrpebGrM7oLl5nf/Mw6myc23kGaM3/2YG3ko2rl9sYjemu0azTA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-4.0.12.tgz", + "integrity": "sha512-eSiHY06Zijq6b1rMBob/ZuGBEavFm8IPNPEzeOU3JrBU7v/OV8Da0FesbemtkudZVPRi8mqRoOiIwmWn0mObng==", "dependencies": { - "@libp2p/interface": "^1.1.2", - "@multiformats/multiaddr": "^12.1.10", + "@libp2p/interface": "^1.3.1", + "@multiformats/multiaddr": "^12.2.1", "debug": "^4.3.4", - "interface-datastore": "^8.2.0", - "multiformats": "^13.0.0" + "interface-datastore": "^8.2.11", + "multiformats": "^13.1.0" } }, "node_modules/@achingbrain/nat-port-mapper/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@achingbrain/nat-port-mapper/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@achingbrain/nat-port-mapper/node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.6.tgz", + "integrity": "sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==" + }, + "node_modules/@achingbrain/nat-port-mapper/node_modules/multiformats": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/@achingbrain/nat-port-mapper/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -217,34 +213,25 @@ } }, "node_modules/@chainsafe/libp2p-yamux/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@chainsafe/libp2p-yamux/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@chainsafe/libp2p-yamux/node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", + "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", "dependencies": { - "it-pushable": "^3.2.0" + "it-pushable": "^3.2.3" } }, "node_modules/@chainsafe/libp2p-yamux/node_modules/it-pipe": { @@ -271,9 +258,9 @@ } }, "node_modules/@chainsafe/libp2p-yamux/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -366,9 +353,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } @@ -473,6 +460,11 @@ "npm": ">=7.0.0" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, "node_modules/@libp2p/crypto": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-1.0.17.tgz", @@ -520,16 +512,16 @@ } }, "node_modules/@libp2p/interface": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-1.1.2.tgz", - "integrity": "sha512-uC4hxtEJuWiDiZfokkSNEEbCzdyZrqb5kp67Wc5PjZsySZ2IoImdIfie003yQXlB1xBp/XUJzdC6kVu4M7LUmg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-1.3.1.tgz", + "integrity": "sha512-KJoYP6biAgIHUU3pxaixaaYCvIHZshzXetxfoNigadAZ3hCGuwpdFhk7IABEaI3RgadOOYUwW3MXPbL+cxnXVQ==", "dependencies": { - "@multiformats/multiaddr": "^12.1.10", + "@multiformats/multiaddr": "^12.2.1", "it-pushable": "^3.2.3", "it-stream-types": "^2.0.1", - "multiformats": "^13.0.0", + "multiformats": "^13.1.0", "progress-events": "^1.0.0", - "uint8arraylist": "^2.4.7" + "uint8arraylist": "^2.4.8" } }, "node_modules/@libp2p/interface-address-manager": { @@ -546,32 +538,23 @@ } }, "node_modules/@libp2p/interface-address-manager/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-address-manager/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-address-manager/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -639,64 +622,46 @@ } }, "node_modules/@libp2p/interface-connection-manager/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-connection-manager/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-connection-manager/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/interface-connection/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-connection/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-connection/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -867,28 +832,19 @@ } }, "node_modules/@libp2p/interface-libp2p/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-libp2p/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-libp2p/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -899,9 +855,9 @@ } }, "node_modules/@libp2p/interface-libp2p/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -936,28 +892,19 @@ } }, "node_modules/@libp2p/interface-metrics/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-metrics/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-metrics/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -968,9 +915,9 @@ } }, "node_modules/@libp2p/interface-metrics/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1024,32 +971,23 @@ } }, "node_modules/@libp2p/interface-peer-info/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-peer-info/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-peer-info/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1083,32 +1021,23 @@ } }, "node_modules/@libp2p/interface-peer-store/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-peer-store/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-peer-store/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1147,32 +1076,23 @@ } }, "node_modules/@libp2p/interface-pubsub/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-pubsub/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-pubsub/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1221,28 +1141,19 @@ } }, "node_modules/@libp2p/interface-registrar/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-registrar/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-registrar/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -1253,9 +1164,9 @@ } }, "node_modules/@libp2p/interface-registrar/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1297,28 +1208,19 @@ } }, "node_modules/@libp2p/interface-stream-muxer/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-stream-muxer/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-stream-muxer/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -1329,9 +1231,9 @@ } }, "node_modules/@libp2p/interface-stream-muxer/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1384,60 +1286,42 @@ } }, "node_modules/@libp2p/interface-transport/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface-transport/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface-transport/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/interface/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/interface/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/interface/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -1447,10 +1331,15 @@ "npm": ">=7.0.0" } }, + "node_modules/@libp2p/interface/node_modules/multiformats": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" + }, "node_modules/@libp2p/interface/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1482,32 +1371,23 @@ } }, "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/logger/node_modules/@multiformats/multiaddr/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" - }, - "node_modules/@libp2p/logger/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/@libp2p/logger/node_modules/multiformats": { "version": "11.0.2", @@ -1519,9 +1399,9 @@ } }, "node_modules/@libp2p/logger/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -1583,23 +1463,23 @@ } }, "node_modules/@libp2p/mplex/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/mplex/node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -1613,28 +1493,19 @@ "it-stream-types": "^1.0.3" } }, - "node_modules/@libp2p/mplex/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/mplex/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/mplex/node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -1681,9 +1552,9 @@ } }, "node_modules/@libp2p/multistream-select/node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.6.tgz", + "integrity": "sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==" }, "node_modules/@libp2p/multistream-select/node_modules/it-length-prefixed": { "version": "9.0.4", @@ -1703,19 +1574,19 @@ } }, "node_modules/@libp2p/multistream-select/node_modules/it-length-prefixed/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } }, "node_modules/@libp2p/multistream-select/node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", + "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", "dependencies": { - "it-pushable": "^3.2.0" + "it-pushable": "^3.2.3" } }, "node_modules/@libp2p/multistream-select/node_modules/it-pipe": { @@ -1742,18 +1613,18 @@ } }, "node_modules/@libp2p/multistream-select/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/multistream-select/node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -1897,45 +1768,36 @@ } }, "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/peer-record/node_modules/@multiformats/multiaddr/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } }, - "node_modules/@libp2p/peer-record/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/peer-record/node_modules/uint8arrays": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", @@ -2000,41 +1862,32 @@ } }, "node_modules/@libp2p/peer-store/node_modules/@libp2p/interface-peer-store/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/peer-store/node_modules/@libp2p/interface-peer-store/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/@libp2p/peer-store/node_modules/@libp2p/interface-peer-store/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } }, - "node_modules/@libp2p/peer-store/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/peer-store/node_modules/interface-datastore": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-7.0.4.tgz", @@ -2086,23 +1939,23 @@ } }, "node_modules/@libp2p/peer-store/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/@libp2p/peer-store/node_modules/uint8-varint/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/@libp2p/peer-store/node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -2161,32 +2014,23 @@ } }, "node_modules/@libp2p/tcp/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/tcp/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/tcp/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -2243,28 +2087,19 @@ } }, "node_modules/@libp2p/utils/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/utils/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/utils/node_modules/it-stream-types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", @@ -2275,9 +2110,9 @@ } }, "node_modules/@libp2p/utils/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -2325,14 +2160,14 @@ } }, "node_modules/@libp2p/websockets/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" @@ -2347,19 +2182,10 @@ "it-stream-types": "^1.0.3" } }, - "node_modules/@libp2p/websockets/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@libp2p/websockets/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -2384,6 +2210,20 @@ "multiformats": "^13.0.0" } }, + "node_modules/@multiformats/dns": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", + "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", + "dependencies": { + "@types/dns-packet": "^5.6.5", + "buffer": "^6.0.3", + "dns-packet": "^5.6.1", + "hashlru": "^2.3.0", + "p-queue": "^8.0.1", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, "node_modules/@multiformats/mafmt": { "version": "12.1.6", "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-12.1.6.tgz", @@ -2393,32 +2233,23 @@ } }, "node_modules/@multiformats/mafmt/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@multiformats/mafmt/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@multiformats/mafmt/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -2442,44 +2273,31 @@ } }, "node_modules/@multiformats/multiaddr-to-uri": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.7.tgz", - "integrity": "sha512-i3ldtPMN6XJt+MCi34hOl0wGuGEHfWWMw6lmNag5BpckPwPTf9XGOOFMmh7ed/uO3Vjah/g173iOe61HTQVoBA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.8.tgz", + "integrity": "sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==", "dependencies": { "@multiformats/multiaddr": "^12.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" } }, "node_modules/@multiformats/multiaddr-to-uri/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, - "node_modules/@multiformats/multiaddr-to-uri/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/@multiformats/multiaddr-to-uri/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -2767,6 +2585,14 @@ "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==", "dev": true }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2774,9 +2600,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2856,14 +2682,14 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -3059,12 +2885,12 @@ } }, "node_modules/atomically": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.2.tgz", - "integrity": "sha512-Xfmb4q5QV7uqTlVdMSTtO5eF4DCHfNOdaPyKlbFShkzeNP+3lj3yjjcbdjSmEY4+pDBKJ9g26aP+ImTe88UHoQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", "dependencies": { "stubborn-fs": "^1.2.5", - "when-exit": "^2.0.0" + "when-exit": "^2.1.1" } }, "node_modules/available-typed-arrays": { @@ -3085,6 +2911,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -3109,6 +2954,29 @@ "concat-map": "0.0.1" } }, + "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/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -3266,8 +3134,8 @@ }, "node_modules/dagula": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/dagula/-/dagula-7.3.0.tgz", - "integrity": "sha512-ZF+4sg64BP9UV82+2HtgmT/yDEC6shlJgJOu8wGv1o9GyjcOliGsx4cxhxJa8AL0NNsjU4PzgaUaUiNvJPDidg==", + "resolved": "git+ssh://git@github.com/web3-storage/dagula.git#8c0075d5b4441d49600c2676f5d98526e8569196", + "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/libp2p-noise": "^11.0.0", "@chainsafe/libp2p-yamux": "^4.0.2", @@ -3296,7 +3164,7 @@ "p-defer": "^4.0.0", "protobufjs": "^7.0.0", "sade": "^1.8.1", - "streaming-iterables": "^7.0.4", + "streaming-iterables": "^8.0.1", "timeout-abort-controller": "^3.0.0", "varint": "^6.0.0" }, @@ -3474,6 +3342,17 @@ "undici": "^5.12.0" } }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4632,6 +4511,25 @@ "node": ">=14.18.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -4692,12 +4590,12 @@ } }, "node_modules/interface-datastore": { - "version": "8.2.10", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.10.tgz", - "integrity": "sha512-D8RuxMdjOPB+j6WMDJ+I2aXTDzUT6DIVjgzo1E+ODL7w8WrSFl9FXD2SYmgj6vVzdb7Kb5qmAI9pEnDZJz7ifg==", + "version": "8.2.11", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.11.tgz", + "integrity": "sha512-9E0iXehfp/j0UbZ2mvlYB4K9pP7uQBCppfuy8WHs1EHF6wLQrM9+zwyX+8Qt6HnH4GKZRyXX/CNXm6oD4+QYgA==", "dependencies": { "interface-store": "^5.0.0", - "uint8arrays": "^5.0.0" + "uint8arrays": "^5.0.2" } }, "node_modules/interface-store": { @@ -4731,9 +4629,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } @@ -5395,9 +5293,9 @@ } }, "node_modules/it-pb-stream/node_modules/it-length-prefixed/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" @@ -5724,28 +5622,28 @@ } }, "node_modules/libp2p/node_modules/@libp2p/interface-peer-store/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/libp2p/node_modules/@libp2p/interface-peer-store/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/libp2p/node_modules/@libp2p/interface-peer-store/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -5781,28 +5679,28 @@ } }, "node_modules/libp2p/node_modules/@libp2p/interface-stream-muxer/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/libp2p/node_modules/@libp2p/interface-stream-muxer/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/libp2p/node_modules/@libp2p/interface-stream-muxer/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -5820,28 +5718,28 @@ } }, "node_modules/libp2p/node_modules/@multiformats/mafmt/node_modules/@multiformats/multiaddr": { - "version": "12.1.12", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.12.tgz", - "integrity": "sha512-hrY4uN/oeYhn410jBSpVXn37eenn4djKOj6Dh20Yh4xzGgqmS6u+/X08zQfHgWNjk7NJejPUcRfHEfs8e/MOcw==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.2.1.tgz", + "integrity": "sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "@chainsafe/netmask": "^2.0.0", "@libp2p/interface": "^1.0.0", - "dns-over-http-resolver": "3.0.0", + "@multiformats/dns": "^1.0.3", "multiformats": "^13.0.0", "uint8-varint": "^2.0.1", "uint8arrays": "^5.0.0" } }, "node_modules/libp2p/node_modules/@multiformats/mafmt/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/libp2p/node_modules/@multiformats/mafmt/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -5860,15 +5758,6 @@ "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-3.0.1.tgz", "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" }, - "node_modules/libp2p/node_modules/dns-over-http-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz", - "integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==", - "dependencies": { - "debug": "^4.3.4", - "receptacle": "^1.3.2" - } - }, "node_modules/libp2p/node_modules/interface-datastore": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-7.0.4.tgz", @@ -5936,23 +5825,23 @@ } }, "node_modules/libp2p/node_modules/uint8-varint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.3.tgz", - "integrity": "sha512-seXTM8ba4uuAMDgi3UHXPdDxCBKjWWZigW+F+1ESPhOZv9ekT1qmbdzYHLSNA+u+wHj10P55dQ41y2Qh7NOqiA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "node_modules/libp2p/node_modules/uint8-varint/node_modules/multiformats": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz", - "integrity": "sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==" + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", + "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" }, "node_modules/libp2p/node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -6224,9 +6113,9 @@ } }, "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { "path-key": "^4.0.0" }, @@ -6730,9 +6619,9 @@ } }, "node_modules/private-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.1.tgz", - "integrity": "sha512-Ezc16ANuhSHmWAE6lbXUKburNzGpR0J5X0Zh5Um/PZ/s57Fp+HYqYe6BYPH2QbqKr/5WebfzJQ1jq6Kj5dbRmA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.2.tgz", + "integrity": "sha512-2pkOVPGYD/4QyAg95c6E/4bLYXPthT5Xw4ocXYzIIsMBhskOMn6IwkWXmg6ZiA6K58+O6VD/n02r1hDhk7vDPw==", "dependencies": { "@chainsafe/is-ip": "^2.0.1", "ip-regex": "^5.0.0", @@ -6764,9 +6653,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -7238,11 +7127,11 @@ "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" }, "node_modules/streaming-iterables": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/streaming-iterables/-/streaming-iterables-7.1.0.tgz", - "integrity": "sha512-t2KmiLVhqafTRqGefD98s5XAMskfkfprr/BTzPIZz0kWB23iyR7XUkY03yjUf4aZpAuuV2/2SUOVri3LgKuOKw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/streaming-iterables/-/streaming-iterables-8.0.1.tgz", + "integrity": "sha512-yfQdmUB1b+rGLZkD/r6YisT/eNOjZxBAckXKlzYNmRJnwSzHaiScykD8gsQceFcShtK09qAbLhOqvzIpnBPoDQ==", "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/string-width": { @@ -7579,9 +7468,9 @@ } }, "node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", "dependencies": { "multiformats": "^13.0.0" } @@ -7602,9 +7491,9 @@ } }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -7774,9 +7663,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 7550af4..66bfc5b 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@web3-storage/handlebars": "^1.0.0", "bytes": "^3.1.2", "chardet": "^2.0.0", - "dagula": "^7.3.0", + "dagula": "github:web3-storage/dagula#feat/add-block-streaming-interface", "magic-bytes.js": "^1.8.0", "mrmime": "^1.0.1", "multiformats": "^13.0.1", From 5a027e05be62f985407b46bce70748f543d302b7 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 13 May 2024 15:34:30 +0100 Subject: [PATCH 3/4] fix: caching range requests --- src/handlers/block.js | 8 ++++++-- src/middleware.js | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/handlers/block.js b/src/handlers/block.js index 9c67467..db88108 100644 --- a/src/handlers/block.js +++ b/src/handlers/block.js @@ -88,16 +88,20 @@ export async function handleBlock (request, env, ctx) { const handleRange = async (blocks, cid, range, options) => { const stat = await blocks.statBlock(cid, { signal: options?.signal }) const [first, last] = resolveRange(range, stat.size) - const contentRange = `bytes ${first}-${last}/${stat.size}` const contentLength = last - first + 1 + /** @type {Record} */ const headers = { ...options?.headers, 'Content-Type': 'application/vnd.ipld.raw', - 'Content-Range': contentRange, 'Content-Length': String(contentLength) } + if (stat.size !== contentLength) { + const contentRange = `bytes ${first}-${last}/${stat.size}` + headers['Content-Range'] = contentRange + } + const status = stat.size === contentLength ? 200 : 206 const content = await blocks.streamBlock(cid, { range, signal: options?.signal }) return new Response(content, { status, headers }) diff --git a/src/middleware.js b/src/middleware.js index 0e31ad4..544274c 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -208,8 +208,8 @@ export function withCdnCache (handler) { response = await handler(request, env, ctx) - // cache the repsonse if success status - if (response.ok && !response.headers.has('Content-Range')) { + // cache the repsonse if success status, and not range request + if (response.ok && response.status !== 206) { const contentLength = response.headers.get('Content-Length') if (contentLength && parseInt(contentLength) < CF_CACHE_MAX_OBJECT_SIZE) { ctx.waitUntil(cache.put(request, response.clone())) From a303d0f24240fbcbd9a0dcd5b7e1bbc56bd7cdac Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Tue, 14 May 2024 18:53:22 +0100 Subject: [PATCH 4/4] refactor: address review comments --- src/middleware.js | 3 ++- src/util/range.js | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/middleware.js b/src/middleware.js index 544274c..b7a7b02 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -7,6 +7,7 @@ import { parseCid, tryParseCid } from './util/cid.js' /** @typedef {import('./bindings.js').Context} Context */ const CF_CACHE_MAX_OBJECT_SIZE = 512 * Math.pow(1024, 2) // 512MB to bytes +const HTTP_PARTIAL_CONTENT = 206 /** * Creates a fresh context object that can be mutated by the request. @@ -209,7 +210,7 @@ export function withCdnCache (handler) { response = await handler(request, env, ctx) // cache the repsonse if success status, and not range request - if (response.ok && response.status !== 206) { + if (response.ok && response.status !== HTTP_PARTIAL_CONTENT) { const contentLength = response.headers.get('Content-Length') if (contentLength && parseInt(contentLength) < CF_CACHE_MAX_OBJECT_SIZE) { ctx.waitUntil(cache.put(request, response.clone())) diff --git a/src/util/range.js b/src/util/range.js index df9e2f7..0268443 100644 --- a/src/util/range.js +++ b/src/util/range.js @@ -27,8 +27,7 @@ export const decodeRangeHeader = (str) => { * @param {number} totalSize * @returns {import('dagula').AbsoluteRange} */ -export const resolveRange = (range, totalSize) => { - const last = range[1] == null ? (totalSize - 1) : range[1] - const first = range[1] == null && range[0] < 0 ? totalSize + range[0] : range[0] - return [first, last] -} +export const resolveRange = ([first, last], totalSize) => [ + first < 0 ? totalSize + first : first, + last ?? totalSize - 1 +]