diff --git a/package.json b/package.json index 533f3df743..d90de61229 100644 --- a/package.json +++ b/package.json @@ -124,10 +124,10 @@ "vitest>@vitest/browser>webdriverio>@wdio/utils>edgedriver": false, "vitest>@vitest/browser>webdriverio>@wdio/utils>geckodriver": false, "vitest>@vitest/mocker>msw": false, - "@metamask/kernel-cli>@metamask/kernel-node-runtime>@libp2p/webrtc>@ipshipyard/node-datachannel": false, + "@metamask/kernel-cli>@metamask/kernel-node-runtime>@libp2p/webrtc>node-datachannel": false, "@metamask/kernel-cli>@metamask/kernel-node-runtime>@metamask/kernel-store>better-sqlite3": false, "@metamask/kernel-cli>@metamask/kernel-node-runtime>@metamask/streams": false, - "@metamask/kernel-cli>@metamask/kernel-shims>@libp2p/webrtc>@ipshipyard/node-datachannel": false, + "@metamask/kernel-cli>@metamask/kernel-shims>@libp2p/webrtc>node-datachannel": false, "@metamask/kernel-cli>@metamask/kernel-utils": false, "vitest>jsdom>ws>bufferutil": false, "vitest>jsdom>ws>utf-8-validate": false @@ -136,10 +136,10 @@ "resolutions": { "@radix-ui/react-slot@npm:^1.1.0": "1.2.4", "cookie": "^0.7.0", - "@chainsafe/libp2p-noise": "16.1.5", - "@libp2p/interface": "2.11.0", - "@multiformats/multiaddr": "12.5.1", - "@multiformats/multiaddr-to-uri": "11.0.2", + "@chainsafe/libp2p-noise": "17.0.0", + "@libp2p/interface": "3.1.1", + "@multiformats/multiaddr": "13.0.1", + "@multiformats/multiaddr-to-uri": "12.0.0", "@multiformats/dns": "1.0.9" } } diff --git a/packages/brow-2-brow/README.md b/packages/brow-2-brow/README.md deleted file mode 100644 index 1586d4aa3c..0000000000 --- a/packages/brow-2-brow/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Browser-to-browser connectivity demo - -A work in progress, for sure. - -Derived from https://github.com/libp2p/libp2p-webrtc-guide diff --git a/packages/brow-2-brow/esbuild.js b/packages/brow-2-brow/esbuild.js deleted file mode 100644 index d6ff9eaf0d..0000000000 --- a/packages/brow-2-brow/esbuild.js +++ /dev/null @@ -1,13 +0,0 @@ -import { build } from 'esbuild'; - -build({ - entryPoints: ['./src/index.js'], - outfile: './dist/index.js', - sourcemap: 'inline', - minify: false, - bundle: true, - define: { - 'process.env.NODE_DEBUG': 'false', - global: 'globalThis', - }, -}); diff --git a/packages/brow-2-brow/package.json b/packages/brow-2-brow/package.json deleted file mode 100644 index 76d85b0aee..0000000000 --- a/packages/brow-2-brow/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "@ocap/brow-2-brow", - "version": "1.0.0", - "private": true, - "description": "Browser-to-browser libp2p communications proof of concept", - "repository": { - "type": "git", - "url": "https://github.com/MetaMask/ocap-kernel.git" - }, - "type": "module", - "scripts": { - "build": "ts-bridge --project tsconfig.build.json --no-references --clean", - "build:dev": "mkdir -p dist && ln -fs ../src/index.html dist/index.html", - "build:docs": "typedoc", - "changelog:validate": "../../scripts/validate-changelog.sh @ocap/brow-2-brow", - "clean": "rimraf --glob './*.tsbuildinfo' ./.eslintcache ./coverage ./dist ./.turbo ./logs", - "lint": "yarn lint:eslint && yarn lint:misc --check && yarn constraints && yarn lint:dependencies", - "lint:dependencies": "depcheck --quiet", - "lint:eslint": "eslint . --cache", - "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write && yarn constraints --fix && yarn lint:dependencies", - "lint:misc": "prettier --no-error-on-unmatched-pattern '**/*.json' '**/*.md' '**/*.html' '!**/CHANGELOG.old.md' '**/*.yml' '!.yarnrc.yml' '!merged-packages/**' --ignore-path ../../.gitignore --log-level error", - "test": "vitest run --config vitest.config.ts", - "test:clean": "yarn test --no-cache --coverage.clean", - "test:dev": "yarn test --mode development", - "test:verbose": "yarn test --reporter verbose", - "test:watch": "vitest --config vitest.config.ts", - "start": "npm run build:dev && esbuild src/index.js --serve --sourcemap --bundle --outdir=dist --servedir=dist --external:@types/web", - "start:relay": "node dist/src/relay.mjs", - "test:dev:quiet": "yarn test:dev --reporter @ocap/repo-tools/vitest-reporters/silent" - }, - "dependencies": { - "@chainsafe/libp2p-noise": "^16.1.3", - "@chainsafe/libp2p-yamux": "7.0.4", - "@libp2p/autonat": "2.0.38", - "@libp2p/bootstrap": "11.0.47", - "@libp2p/circuit-relay-v2": "3.2.24", - "@libp2p/crypto": "5.1.8", - "@libp2p/identify": "3.0.39", - "@libp2p/interface": "2.11.0", - "@libp2p/peer-id": "5.1.9", - "@libp2p/ping": "2.0.37", - "@libp2p/tcp": "10.1.19", - "@libp2p/webrtc": "5.2.24", - "@libp2p/websockets": "9.2.19", - "@libp2p/webtransport": "5.0.51", - "@multiformats/multiaddr": "^12.4.4", - "@multiformats/multiaddr-matcher": "^2.0.0", - "@ts-bridge/cli": "^0.6.3", - "@ts-bridge/shims": "^0.1.1", - "it-byte-stream": "^2.0.1", - "libp2p": "2.10.0", - "uint8arrays": "^5.1.0" - }, - "devDependencies": { - "@ocap/repo-tools": "workspace:^", - "@types/node": "^22.13.1", - "@typescript-eslint/eslint-plugin": "^8.29.0", - "@typescript-eslint/parser": "^8.29.0", - "@typescript-eslint/utils": "^8.29.0", - "depcheck": "^1.4.7", - "esbuild": "^0.25.3", - "eslint": "^9.23.0", - "eslint-config-prettier": "^10.1.1", - "eslint-import-resolver-typescript": "^4.3.1", - "eslint-plugin-import-x": "^4.10.0", - "eslint-plugin-jsdoc": "^50.6.9", - "eslint-plugin-n": "^17.17.0", - "eslint-plugin-prettier": "^5.2.6", - "eslint-plugin-promise": "^7.2.1", - "prettier": "^3.5.3", - "rimraf": "^6.0.1", - "ses": "^1.14.0", - "turbo": "^2.5.6", - "typescript": "~5.8.2", - "typescript-eslint": "^8.29.0", - "vitest": "^4.0.16" - }, - "eslintConfig": { - "extends": "ipfs", - "parserOptions": { - "sourceType": "module" - } - }, - "engines": { - "node": ">=22" - }, - "exports": { - "./package.json": "./package.json" - } -} diff --git a/packages/brow-2-brow/src/constants.ts b/packages/brow-2-brow/src/constants.ts deleted file mode 100644 index 5e111fb0fb..0000000000 --- a/packages/brow-2-brow/src/constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -// peer ids of known bootstrap nodes -export const bootstrapPeers = [ - 'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN', - 'QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa', - 'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb', - 'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt', - 'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ', - 'QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp', -]; - -export const PUBSUB_PEER_DISCOVERY = 'browser-peer-discovery'; diff --git a/packages/brow-2-brow/src/index.html b/packages/brow-2-brow/src/index.html deleted file mode 100644 index 0cbbdad828..0000000000 --- a/packages/brow-2-brow/src/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - Browser-to-browser comm test - - - - -
-

- Browser-to-browser comm test (TS) -

- -
-

Node

- -
- -
-

Peers

-

- - - -

- -
- -
-

Message

-

- - - - - -

-
- -

Output

-

-
-      
-
- - diff --git a/packages/brow-2-brow/src/index.ts b/packages/brow-2-brow/src/index.ts deleted file mode 100644 index fdbf4064bc..0000000000 --- a/packages/brow-2-brow/src/index.ts +++ /dev/null @@ -1,453 +0,0 @@ -import { noise } from '@chainsafe/libp2p-noise'; -import { yamux } from '@chainsafe/libp2p-yamux'; -import { bootstrap } from '@libp2p/bootstrap'; -import { circuitRelayTransport } from '@libp2p/circuit-relay-v2'; -import { identify } from '@libp2p/identify'; -import type { - PeerId, - Connection, - Libp2p, - Libp2pEvents, - PrivateKey, -} from '@libp2p/interface'; -import { peerIdFromPrivateKey } from '@libp2p/peer-id'; -import { webRTC } from '@libp2p/webrtc'; -import { webSockets } from '@libp2p/websockets'; -import { webTransport } from '@libp2p/webtransport'; -import { multiaddr } from '@multiformats/multiaddr'; -import type { ByteStream } from 'it-byte-stream'; -import { byteStream } from 'it-byte-stream'; -import { createLibp2p } from 'libp2p'; -import { toString as bufToString, fromString } from 'uint8arrays'; - -import { generateKeyPair } from './key-manglage.ts'; -import { update, getPeerTypes, getAddresses, getPeerDetails } from './utils.ts'; - -// Our eslint rules have a hard time understanding that this is not Node code -/* eslint-disable n/no-unsupported-features/node-builtins */ - -const RELAY_ID = 200; -const RELAY_HOST = '/dns4/troll.fudco.com'; - -type Channel = { - msgStream: ByteStream; - id: number; -}; - -declare global { - // TypeScript requires you to use `var` here for these declarations to work. - // eslint-disable-next-line no-var - var libp2p: Libp2p; - // eslint-disable-next-line no-var - var location: Location; - // eslint-disable-next-line no-var - var document: Document; -} - -const App = async (): Promise => { - const peerIdList: (PeerId | undefined)[] = []; // id -> peerID - const keyList: (PrivateKey | undefined)[] = []; // id -> private key - const idMap = new Map(); // peerID string -> id - peerIdList[0] = undefined; - for (let i = 1; i < 256; ++i) { - const keyPair = await generateKeyPair(i); - keyList[i] = keyPair; - const peerId = peerIdFromPrivateKey(keyPair); - peerIdList[i] = peerId; - idMap.set(peerId.toString(), i); - } - - const activeChannels = new Map(); // peerID -> channel info - const queryParams = new URLSearchParams(location.search); - const idParam = queryParams.get('id'); - // Nullish coalescing does the wrong thing here; the eslint rule is bad - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - let localId = (idParam && Number.parseInt(idParam, 10)) || 0; - if (localId < 1 || localId > 255) { - localId = 0; - } - const showEvents = queryParams.get('events'); - const showPeerTypes = queryParams.get('peertypes'); - const showAddresses = queryParams.get('addresses'); - const peerId = peerIdList[localId] as unknown as PeerId; - const privateKey = keyList[localId] as unknown as PrivateKey; - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.log(`I am id:${localId} peerId:${peerId.toString()}`); - - const relayPeerId = peerIdList[RELAY_ID]; - if (!relayPeerId) { - throw Error(`relay peer ID is undefined`); - } - const relayAddr = `${RELAY_HOST}/tcp/9001/ws/p2p/${relayPeerId.toString()}`; - - const libp2p = await createLibp2p({ - privateKey, - addresses: { - listen: [ - // Both webRTC and p2p-circuit are needed for inbound hole punching to actually work - '/webrtc', - '/p2p-circuit', - ], - announce: ['/webrtc'], - }, - transports: [ - webSockets(), - webTransport(), - webRTC(), - // Required to create circuit relay reservations in order to hole punch browser-to-browser WebRTC connections - circuitRelayTransport(), - ], - connectionEncrypters: [noise()], - streamMuxers: [yamux()], - connectionGater: { - // Allow private addresses for local testing - denyDialMultiaddr: async () => false, - }, - peerDiscovery: [ - bootstrap({ - list: [relayAddr], - }), - ], - services: { - identify: identify(), - }, - }); - - globalThis.libp2p = libp2p; - - const DOM = { - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - nodePeerId: () => document.getElementById('output-node-peer-id')!, - nodeStatus: () => document.getElementById('output-node-status')!, - nodePeerCount: () => document.getElementById('output-peer-count')!, - nodePeerTypes: () => document.getElementById('output-peer-types')!, - nodeAddressCount: () => document.getElementById('output-address-count')!, - nodeAddresses: () => document.getElementById('output-addresses')!, - nodePeerDetails: () => document.getElementById('output-peer-details')!, - - inputMultiaddr: () => - document.getElementById('input-multiaddr') as HTMLInputElement, - inputTarget: () => - document.getElementById('input-target') as HTMLInputElement, - inputMessage: () => - document.getElementById('input-message') as HTMLInputElement, - connectButton: () => document.getElementById('button-connect')!, - sendButton: () => document.getElementById('button-send')!, - outputMessages: () => document.getElementById('output-messages')!, - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - } satisfies Record HTMLElement | HTMLInputElement>; - - outputLine(`I am id:${localId} peerId:${peerId.toString()}`); - - update(DOM.nodePeerId(), libp2p.peerId.toString()); - update(DOM.nodeStatus(), 'Online'); - - /** - * Output a line of text to the display. - * - * @param text - The text to output. - */ - function outputLine(text: string): void { - const line = document.createElement('div'); - line.setAttribute('class', 'text-sm break-all'); - line.appendChild(document.createTextNode(text)); - DOM.outputMessages().append(line); - } - - /** - * Output text about an event, if that behavior is turned on. - * - * @param desc - Descriptive text to output. - */ - function outputEvent(desc: string): void { - if (showEvents) { - outputLine(`#### ${desc}`); - } - } - - /** - * Output a message that was received. - * - * @param id - The network node the message came from. - * @param message - The message itself. - */ - function outputMsg(id: number, message: string): void { - outputLine(`${id}:: '${message}'`); - } - - /** - * Output information about an error that happened. - * - * @param id - The network node the error was associated with. - * @param task - What we were trying to do at the time. - * @param problem - The error itself. - */ - function outputError(id: number, task: string, problem: unknown): void { - if (problem) { - const realProblem: Error = problem as Error; // to make eslint stfu - outputLine(`${id}:: error ${task}: ${realProblem}`); - } else { - outputLine(`${id}:: error ${task}`); - } - } - - /** - * Output information about a libp2p event that happened. - * - * @param type - The event type. - * @param event - The event itself. - */ - function logEvent(type: string, event: CustomEvent): void { - switch (type) { - case 'certificate:provision': - case 'certificate:renew': { - const cert = event.detail; - outputEvent(`${type}: cert=${cert.cert} key=${cert.key}`); - break; - } - case 'connection:close': - case 'connection:open': { - const conn = event.detail; - outputEvent( - `${type}: id=${conn.id} dir=${conn.direction} remote=${conn.remotePeer} addr=${conn.remoteAddr} status=${conn.status}`, - ); - break; - } - case 'connection:prune': { - const conns = event.detail; - outputEvent( - `${type}: ids=[${conns.map((conn: Connection) => conn.id).join(',')}]`, - ); - break; - } - case 'peer:connect': - case 'peer:disconnect': - case 'peer:reconnect-failure': - outputEvent(`${type}: ${event.detail}`); - break; - case 'peer:discovery': { - const peerInfo = event.detail; - outputEvent( - `${type}: ${peerInfo.id} [${peerInfo.multiaddrs.join(',')}]`, - ); - break; - } - case 'peer:identify': { - const ir = event.detail; - outputEvent(`${type}: conn=${ir.connection.id} peer=${ir.peerId}`); - break; - } - case 'peer:update': - case 'self:peer:update': { - const pu = event.detail; - outputEvent(`${type}: peer=${pu.peer.id} previous=${pu.previous?.id}`); - break; - } - case 'start': - case 'stop': - case 'transport:close': - case 'transport:listening': - outputEvent(`${type}`); - break; - default: - outputEvent(`${type}: unknown event ${JSON.stringify(event.detail)}`); - break; - } - } - - const eventTypes = [ - 'certificate:provision', - 'certificate:renew', - 'connection:close', - 'connection:open', - 'connection:prune', - 'peer:connect', - 'peer:disconnect', - 'peer:discovery', - 'peer:identify', - 'peer:reconnect-failure', - 'peer:update', - 'self:peer:update', - 'start', - 'stop', - 'transport:close', - 'transport:listening', - ]; - if (showEvents) { - for (const et of eventTypes) { - libp2p.addEventListener(et as keyof Libp2pEvents, (event) => - logEvent(et, event), - ); - } - } - - setInterval(() => { - update(DOM.nodePeerCount(), String(libp2p.getConnections().length)); - if (showPeerTypes) { - update(DOM.nodePeerTypes(), getPeerTypes(libp2p)); - } - update(DOM.nodeAddressCount(), String(libp2p.getMultiaddrs().length)); - if (showAddresses) { - update(DOM.nodeAddresses(), getAddresses(libp2p)); - } - update(DOM.nodePeerDetails(), getPeerDetails(libp2p)); - }, 1000); - - const connectButton = DOM.connectButton(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - connectButton.onclick = async (event: any) => { - event.preventDefault(); - const maddr = multiaddr(DOM.inputMultiaddr().value); - - outputLine(`connect to ${maddr.toString()}`); - try { - await libp2p.dial(maddr); - } catch (problem) { - outputLine( - `error connecting to ${maddr.toString()}: ${(problem as Error).toString()}`, - ); - } - }; - - const sendButton = DOM.sendButton(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendButton.onclick = async (event: any) => { - event.preventDefault(); - const target = DOM.inputTarget().value; - const message = DOM.inputMessage().value; - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.log(`send to ${target}: '${message}'`); - await sendMsg(Number(target), message); - }; - - /** - * Act upon a message received from another network node. - * - * @param id - The network node received from. - * @param message - The message that was received. - */ - function receiveMsg(id: number, message: string): void { - outputMsg(id, message); - } - - /** - * Send a message to another network node, opening a Channel to it if necessary. - * - * @param id - The network node to send to. - * @param message - The message to send. - */ - async function sendMsg(id: number, message: string): Promise { - let channel: Channel = activeChannels.get(id); - if (!channel) { - try { - channel = await openChannel(id); - } catch (problem) { - outputError(id, 'opening connection', problem); - return; - } - readChannel(channel).catch((problem) => { - outputError(id, 'reading channel', problem); - }); - } - try { - await channel.msgStream.write(fromString(message)); - } catch (problem) { - outputError(id, 'sending message', problem); - } - } - - const SCTP_USER_INITIATED_ABORT = 12; // see RFC 4960 - - /** - * Start reading (and processing) messages arriving on a channel. - * - * @param channel - The Channel to start reading from. - */ - async function readChannel(channel: Channel): Promise { - for (;;) { - let readBuf; - try { - readBuf = await channel.msgStream.read(); - } catch (problem) { - const rtcProblem = problem as RTCError; - if ( - rtcProblem.errorDetail === 'sctp-failure' && - rtcProblem?.sctpCauseCode === SCTP_USER_INITIATED_ABORT - ) { - outputLine(`${channel.id}:: remote disconnected`); - } else { - outputError(channel.id, 'reading message', problem); - } - throw problem; - } - if (readBuf) { - receiveMsg(channel.id, bufToString(readBuf.subarray())); - } - } - } - - /** - * Open a channel to the node with the given id. - * - * @param id - The network node to connect to. - * - * @returns a Channel to `id`. - */ - async function openChannel(id: number): Promise { - const targetPeerId = peerIdList[id]; - if (!targetPeerId) { - throw Error(`no peer ID for id = ${id}`); - } - outputLine(`connecting to id:${id} peerId:${targetPeerId.toString()}`); - const signal = AbortSignal.timeout(500000); - const addressString = `${relayAddr}/p2p-circuit/webrtc/p2p/${targetPeerId.toString()}`; - outputLine(`dial address ${addressString}`); - const connectToAddr = multiaddr(addressString); - - let stream; - try { - stream = await libp2p.dialProtocol(connectToAddr, 'whatever', { signal }); - } catch (problem) { - if (signal.aborted) { - outputError( - id, - `timed out opening channel to ${targetPeerId.toString()}`, - problem, - ); - } else { - outputError( - id, - `opening channel to ${targetPeerId.toString()}`, - problem, - ); - } - throw problem; - } - const msgStream = byteStream(stream); - const channel = { msgStream, id }; - activeChannels.set(targetPeerId, channel); - return channel; - } - - await libp2p.handle('whatever', ({ connection, stream }) => { - const msgStream = byteStream(stream); - const remotePeerId = connection.remotePeer; - const id = idMap.get(peerId.toString()) ?? -1; - outputLine( - `inbound connection from id:${id} peerId:${remotePeerId.toString()}`, - ); - const channel = { msgStream, id }; - activeChannels.set(remotePeerId, channel); - readChannel(channel).catch(() => { - /* Nothing to do here. */ - }); - }); -}; - -App().catch((problem) => { - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.error(problem); -}); diff --git a/packages/brow-2-brow/src/key-manglage.ts b/packages/brow-2-brow/src/key-manglage.ts deleted file mode 100644 index 6ca9348c0f..0000000000 --- a/packages/brow-2-brow/src/key-manglage.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { generateKeyPairFromSeed } from '@libp2p/crypto/keys'; -import type { PrivateKey } from '@libp2p/interface'; - -/** - * Convert a Uint8Array into a hex string. - * - * @param arr - The bytes to convert. - * - * @returns `arr` represented as a hex string. - */ -export function toHex(arr: Uint8Array): string { - let result = ''; - for (const byte of arr) { - const byteHex = byte.toString(16); - result += byteHex.length === 1 ? `0${byteHex}` : byteHex; - } - return result; -} - -/** - * Convert a hex string into a Uint8Array. - * - * @param str - The string to convert. - * - * @returns the bytes described by `str`. - */ -export function fromHex(str: string): Uint8Array { - const len = str.length; - const resultLen = len / 2; - const bytes = new Uint8Array(resultLen); - let inIdx = 0; - let outIdx = 0; - while (outIdx < resultLen) { - const digits = str.slice(inIdx, inIdx + 2); - bytes[outIdx] = parseInt(digits, 16); - outIdx += 2; - inIdx += 2; - } - return bytes; -} - -// seed: 1 peerId: 12D3KooWPjceQrSwdWXPyLLeABRXmuqt69Rg3sBYbU1Nft9HyQ6X -// seed: 2 peerId: 12D3KooWH3uVF6wv47WnArKHk5p6cvgCJEb74UTmxztmQDc298L3 -// seed: 3 peerId: 12D3KooWQYhTNQdmr3ArTeUHRYzFg94BKyTkoWBDWez9kSCVe2Xo -// seed: 4 peerId: 12D3KooWLJtG8fd2hkQzTn96MrLvThmnNQjTUFZwGEsLRz5EmSzc -// seed: 5 peerId: 12D3KooWSHj3RRbBjD15g6wekV8y3mm57Pobmps2g2WJm6F67Lay - -/** - * Generate the private key for a given localID. - * - * @param localId - The localID whose peerID is sought. - * - * @returns the private key for `localID`. - */ -export async function generateKeyPair(localId: number): Promise { - let seed; - if (localId > 0 && localId < 256) { - seed = new Uint8Array(32); - seed[0] = localId; - } else { - // eslint-disable-next-line n/no-unsupported-features/node-builtins - seed = globalThis.crypto.getRandomValues(new Uint8Array(32)); - } - return await generateKeyPairFromSeed('Ed25519', seed); -} diff --git a/packages/brow-2-brow/src/relay.ts b/packages/brow-2-brow/src/relay.ts deleted file mode 100644 index 2b048d095f..0000000000 --- a/packages/brow-2-brow/src/relay.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { noise } from '@chainsafe/libp2p-noise'; -import { yamux } from '@chainsafe/libp2p-yamux'; -import { autoNAT } from '@libp2p/autonat'; -import { circuitRelayServer } from '@libp2p/circuit-relay-v2'; -import { identify } from '@libp2p/identify'; -import { ping } from '@libp2p/ping'; -import { tcp } from '@libp2p/tcp'; -import { webSockets } from '@libp2p/websockets'; -import { createLibp2p } from 'libp2p'; - -import { generateKeyPair } from './key-manglage.ts'; - -const RELAY_OFFSET = 200; // for historical reasons, don't ask - -/** - * Main. - */ -async function main(): Promise { - const localId = process.argv.length > 2 ? Number(process.argv[2]) : 0; - const privateKey = await generateKeyPair(localId + RELAY_OFFSET); - const port = 9001 + localId * 2; - - const libp2p = await createLibp2p({ - privateKey, - addresses: { - listen: [`/ip4/0.0.0.0/tcp/${port}/ws`, `/ip4/0.0.0.0/tcp/${port + 1}`], - }, - transports: [webSockets(), tcp()], - connectionEncrypters: [noise()], - streamMuxers: [yamux()], - connectionGater: { - // Allow private addresses for local testing - denyDialMultiaddr: async () => false, - }, - services: { - identify: identify(), - autoNat: autoNAT(), - relay: circuitRelayServer(), - ping: ping(), - }, - }); - - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.log('PeerID: ', libp2p.peerId.toString()); - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.log('Multiaddrs: ', libp2p.getMultiaddrs()); - // eslint-disable-next-line no-console - console.log('Protocols: ', libp2p.getProtocols()); -} - -main().catch(() => { - /* do nothing on error; it's a PoC */ -}); diff --git a/packages/brow-2-brow/src/utils.ts b/packages/brow-2-brow/src/utils.ts deleted file mode 100644 index 327a77d866..0000000000 --- a/packages/brow-2-brow/src/utils.ts +++ /dev/null @@ -1,131 +0,0 @@ -import type { Libp2p } from '@libp2p/interface'; -import { protocols } from '@multiformats/multiaddr'; -import { - WebRTC, - WebSockets, - WebSocketsSecure, - // eslint-disable-next-line @typescript-eslint/no-shadow - WebTransport, - Circuit, -} from '@multiformats/multiaddr-matcher'; - -import { bootstrapPeers } from './constants.ts'; - -/** - * Fetch info about our own known addresses. - * - * @param libp2p - The libp2p object managing all the libp2p stuff. - * - * @returns HTML text for displaying our known addresses. - */ -export function getAddresses(libp2p: Libp2p): string { - return libp2p - .getMultiaddrs() - .map((ma) => { - return `
  • ${ma.toString()}
  • `; - }) - .join(''); -} - -/** - * Fetch info about known peer types. - * - * @param libp2p - The libp2p object managing all the libp2p stuff. - * - * @returns HTML text for displaying the known peer types. - */ -export function getPeerTypes(libp2p: Libp2p): string { - const types = { - 'Circuit Relay': 0, - WebRTC: 0, - WebSockets: 0, - 'WebSockets (secure)': 0, - WebTransport: 0, - Other: 0, - }; - - libp2p - .getConnections() - .map((conn) => conn.remoteAddr) - .forEach((ma) => { - if (WebRTC.exactMatch(ma) || ma.toString().includes('/webrtc/')) { - types.WebRTC += 1; - } else if (WebSockets.exactMatch(ma)) { - types.WebSockets += 1; - } else if (WebSocketsSecure.exactMatch(ma)) { - types['WebSockets (secure)'] += 1; - } else if (WebTransport.exactMatch(ma)) { - types.WebTransport += 1; - } else if (Circuit.exactMatch(ma)) { - types['Circuit Relay'] += 1; - } else { - types.Other += 1; - // TODO(#562): Use logger instead. - // eslint-disable-next-line no-console - console.info('wat', ma.toString()); - } - }); - - return Object.entries(types) - .map(([name, count]) => `
  • ${name}: ${count}
  • `) - .join(''); -} - -/** - * Fetch info about known peers. - * - * @param libp2p - The libp2p object managing all the libp2p stuff. - * - * @returns HTML text for displaying the known peers. - */ -export function getPeerDetails(libp2p: Libp2p): string { - return libp2p - .getPeers() - .map((peer) => { - const peerConnections = libp2p.getConnections(peer); - - const nodeType = []; - - // detect if this is a bootstrap node - if (bootstrapPeers.includes(peer.toString())) { - nodeType.push('bootstrap'); - } - - const relayMultiaddrs = libp2p - .getMultiaddrs() - .filter((ma) => Circuit.exactMatch(ma)); - const relayPeers = relayMultiaddrs.map((ma) => { - return ma - .stringTuples() - .filter(([name, _]) => name === protocols('p2p').code) - .map(([_, value]) => value)[0]; - }); - - // detect if this is a relay we have a reservation on - if (relayPeers.includes(peer.toString())) { - nodeType.push('relay'); - } - - return `
  • - ${peer.toString()}${nodeType.length > 0 ? `(${nodeType.join(', ')})` : ''} -
      ${peerConnections - .map((conn) => { - return `
    • ${conn.remoteAddr.toString()}
    • `; - }) - .join('')}
    -
  • `; - }) - .join(''); -} - -/** - * Update the value of an HTML data element on the page. - * - * @param element - The element to update. - * @param newContent - The new value to update it to. - */ -export function update(element: HTMLElement, newContent: string): void { - if (element.innerHTML !== newContent) { - element.innerHTML = newContent; - } -} diff --git a/packages/brow-2-brow/tsconfig.build.json b/packages/brow-2-brow/tsconfig.build.json deleted file mode 100644 index 96bb9a4a55..0000000000 --- a/packages/brow-2-brow/tsconfig.build.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../../tsconfig.packages.build.json", - "compilerOptions": { - "target": "ES2022", - "module": "node16", - "lib": ["ES2023", "ES2023.Array", "DOM", "DOM.Iterable", "WebWorker"], - "moduleResolution": "node16", - "esModuleInterop": true, - "verbatimModuleSyntax": true, - "isolatedModules": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "declaration": true, - "sourceMap": true, - "outDir": "dist", - "strict": true, - "moduleDetection": "force" - }, - "files": [], - "include": ["./src"] -} diff --git a/packages/brow-2-brow/tsconfig.json b/packages/brow-2-brow/tsconfig.json deleted file mode 100644 index c7f0cf795c..0000000000 --- a/packages/brow-2-brow/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "../../tsconfig.packages.json", - "compilerOptions": { - "baseUrl": "./", - "lib": ["DOM", "ES2022"], - "types": ["ses", "vitest", "node"], - "noEmit": true - }, - "references": [{ "path": "../repo-tools" }, { "path": "../kernel-utils" }], - "include": [ - "../../vitest.config.ts", - "./src/**/*.ts", - "./test", - "./vitest.config.ts", - "./vitest.integration.config.ts" - ] -} diff --git a/packages/brow-2-brow/typedoc.json b/packages/brow-2-brow/typedoc.json deleted file mode 100644 index 9b891fc4ce..0000000000 --- a/packages/brow-2-brow/typedoc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "entryPoints": [], - "excludePrivate": true, - "hideGenerator": true, - "out": "docs", - "tsconfig": "./tsconfig.build.json" -} diff --git a/packages/brow-2-brow/vitest.config.ts b/packages/brow-2-brow/vitest.config.ts deleted file mode 100644 index 9ff3a3f75d..0000000000 --- a/packages/brow-2-brow/vitest.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { mergeConfig } from '@ocap/repo-tools/vitest-config'; -import { defineConfig, defineProject } from 'vitest/config'; - -import defaultConfig from '../../vitest.config.ts'; - -export default defineConfig((args) => { - return mergeConfig( - args, - defaultConfig, - defineProject({ - build: { - ssr: true, - rollupOptions: { - output: { - esModule: true, - }, - }, - }, - test: { - name: 'brow2brow', - exclude: ['**/test/integration/**'], - passWithNoTests: true, - }, - }), - ); -}); diff --git a/packages/kernel-errors/package.json b/packages/kernel-errors/package.json index b99b01e67b..47fdad4f71 100644 --- a/packages/kernel-errors/package.json +++ b/packages/kernel-errors/package.json @@ -57,7 +57,7 @@ "test:dev:quiet": "yarn test:dev --reporter @ocap/repo-tools/vitest-reporters/silent" }, "dependencies": { - "@libp2p/interface": "2.11.0", + "@libp2p/interface": "3.1.1", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.9.0" }, diff --git a/packages/kernel-node-runtime/package.json b/packages/kernel-node-runtime/package.json index b800a19618..04f22e0d34 100644 --- a/packages/kernel-node-runtime/package.json +++ b/packages/kernel-node-runtime/package.json @@ -69,12 +69,12 @@ "test:dev:quiet": "yarn test:dev --reporter @ocap/repo-tools/vitest-reporters/silent" }, "dependencies": { - "@chainsafe/libp2p-quic": "^1.1.8", + "@chainsafe/libp2p-quic": "^2.0.1", "@endo/eventual-send": "^1.3.4", "@endo/promise-kit": "^1.1.13", - "@libp2p/interface": "2.11.0", - "@libp2p/tcp": "10.1.19", - "@libp2p/webrtc": "5.2.24", + "@libp2p/interface": "3.1.1", + "@libp2p/tcp": "11.0.14", + "@libp2p/webrtc": "6.0.15", "@metamask/kernel-platforms": "workspace:^", "@metamask/kernel-rpc-methods": "workspace:^", "@metamask/kernel-shims": "workspace:^", diff --git a/packages/kernel-node-runtime/test/e2e/bip39-identity-recovery.test.ts b/packages/kernel-node-runtime/test/e2e/bip39-identity-recovery.test.ts index a63c4ca4c3..e54c111668 100644 --- a/packages/kernel-node-runtime/test/e2e/bip39-identity-recovery.test.ts +++ b/packages/kernel-node-runtime/test/e2e/bip39-identity-recovery.test.ts @@ -1,12 +1,12 @@ import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs'; import { Kernel } from '@metamask/ocap-kernel'; -import type { KernelStatus } from '@metamask/ocap-kernel'; import { mkdtemp, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { describe, it, expect } from 'vitest'; import { makeTestKernel } from '../helpers/kernel.ts'; +import { getRemoteCommsPeerId } from '../helpers/remote-comms.ts'; // Valid 12-word test mnemonic (DO NOT use in production) const TEST_MNEMONIC = @@ -19,22 +19,9 @@ const TEST_TIMEOUT = 30_000; // Dummy relay addresses - not actually connected to, just needed for bootstrap // Using localhost addresses that won't conflict with real relay ports -const DUMMY_RELAYS = ['/ip4/127.0.0.1/tcp/19001/ws/p2p/QmDummyPeerId']; - -/** - * Extract peerId from remoteComms status, returning undefined for disconnected state. - * - * @param remoteComms - The remote comms status object. - * @returns The peer ID string or undefined. - */ -function getRemoteCommsPeerId( - remoteComms: KernelStatus['remoteComms'], -): string | undefined { - if (remoteComms && remoteComms.state !== 'disconnected') { - return remoteComms.peerId; - } - return undefined; -} +const DUMMY_RELAYS = [ + '/ip4/127.0.0.1/tcp/19001/ws/p2p/12D3KooWBTf3S95YAsh6fi5rhohMsk8qaTy19rrpW8X9G69vn6GP', +]; // Tests for identity recovery using mnemonic // Note: These tests verify that the same mnemonic produces the same peer ID diff --git a/packages/kernel-node-runtime/test/e2e/quic-transport.test.ts b/packages/kernel-node-runtime/test/e2e/quic-transport.test.ts index 3fec07e3b4..53cca6346e 100644 --- a/packages/kernel-node-runtime/test/e2e/quic-transport.test.ts +++ b/packages/kernel-node-runtime/test/e2e/quic-transport.test.ts @@ -10,34 +10,11 @@ import { makeRemoteVatConfig, sendRemoteMessage, } from '../helpers/remote-comms.ts'; +import { stopWithTimeout } from '../helpers/stop-with-timeout.ts'; // Increase timeout for network operations const NETWORK_TIMEOUT = 30_000; -/** - * Stop an operation with a timeout to prevent hangs during cleanup. - * - * @param stopFn - The stop function to call. - * @param timeoutMs - The timeout in milliseconds. - * @param label - A label for logging. - */ -async function stopWithTimeout( - stopFn: () => Promise, - timeoutMs: number, - label: string, -): Promise { - try { - await Promise.race([ - stopFn(), - new Promise((_resolve, reject) => - setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs), - ), - ]); - } catch { - // Ignore timeout errors during cleanup - } -} - // Listen addresses for each kernel (port 0 = OS-assigned) const quicListenAddress = '/ip4/127.0.0.1/udp/0/quic-v1'; const tcpListenAddress = '/ip4/127.0.0.1/tcp/0'; diff --git a/packages/kernel-node-runtime/test/e2e/relay-connectivity.test.ts b/packages/kernel-node-runtime/test/e2e/relay-connectivity.test.ts new file mode 100644 index 0000000000..13ec963bc2 --- /dev/null +++ b/packages/kernel-node-runtime/test/e2e/relay-connectivity.test.ts @@ -0,0 +1,169 @@ +import type { Libp2p } from '@libp2p/interface'; +import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs'; +import { startRelay } from '@metamask/kernel-utils/libp2p'; +import { Kernel } from '@metamask/ocap-kernel'; +import { createConnection } from 'node:net'; +import { describe, it, expect, beforeAll, afterAll } from 'vitest'; + +import { makeTestKernel } from '../helpers/kernel.ts'; +import { getRemoteCommsPeerId } from '../helpers/remote-comms.ts'; +import { stopWithTimeout } from '../helpers/stop-with-timeout.ts'; + +const STOP_TIMEOUT = 5_000; +const TEST_TIMEOUT = 30_000; +const RELAY_PEER_ID = '12D3KooWJBDqsyHQF2MWiCdU4kdqx4zTsSTLRdShg7Ui6CRWB4uc'; +const RELAY_WS_PORT = 9001; + +/** + * Check if a TCP port is already in use. + * + * @param port - The port to check. + * @returns True if the port is in use. + */ +async function isPortInUse(port: number): Promise { + return new Promise((resolve) => { + const socket = createConnection({ port, host: '127.0.0.1' }); + socket.on('connect', () => { + socket.destroy(); + resolve(true); + }); + socket.on('error', () => { + socket.destroy(); + resolve(false); + }); + }); +} + +describe('Relay Connectivity', () => { + let relay: Libp2p | undefined; + const relayAddr = `/ip4/127.0.0.1/tcp/${RELAY_WS_PORT}/ws/p2p/${RELAY_PEER_ID}`; + + beforeAll(async () => { + // In CI, the test-e2e-ci.sh script or another test file may already have + // a relay running on port 9001. Only start our own if the port is free. + if (!(await isPortInUse(RELAY_WS_PORT))) { + relay = await startRelay(console); + } + }, 15_000); + + afterAll(async () => { + if (relay) { + await stopWithTimeout( + async () => relay!.stop(), + STOP_TIMEOUT, + 'relay.stop', + ); + } + }, 10_000); + + it('relay is reachable on expected port', async () => { + expect(await isPortInUse(RELAY_WS_PORT)).toBe(true); + }); + + it( + 'kernel connects to relay and obtains a peer ID', + async () => { + const kernelDb = await makeSQLKernelDatabase({ dbFilename: ':memory:' }); + let kernel: Kernel | undefined; + + try { + kernel = await makeTestKernel(kernelDb); + await kernel.initRemoteComms({ relays: [relayAddr] }); + + const status = await kernel.getStatus(); + expect(status.remoteComms?.state).toBe('connected'); + const peerId = getRemoteCommsPeerId(status.remoteComms); + expect(peerId).toBeDefined(); + expect(typeof peerId).toBe('string'); + } finally { + if (kernel) { + await stopWithTimeout( + async () => kernel!.stop(), + STOP_TIMEOUT, + 'kernel.stop', + ); + } + } + }, + TEST_TIMEOUT, + ); + + it( + 'two kernels can discover each other via the relay', + async () => { + const kernelDb1 = await makeSQLKernelDatabase({ dbFilename: ':memory:' }); + const kernelDb2 = await makeSQLKernelDatabase({ dbFilename: ':memory:' }); + let kernel1: Kernel | undefined; + let kernel2: Kernel | undefined; + + try { + kernel1 = await makeTestKernel(kernelDb1); + kernel2 = await makeTestKernel(kernelDb2); + + await kernel1.initRemoteComms({ relays: [relayAddr] }); + await kernel2.initRemoteComms({ relays: [relayAddr] }); + + const status1 = await kernel1.getStatus(); + const status2 = await kernel2.getStatus(); + + expect(status1.remoteComms?.state).toBe('connected'); + expect(status2.remoteComms?.state).toBe('connected'); + + const peerId1 = getRemoteCommsPeerId(status1.remoteComms); + const peerId2 = getRemoteCommsPeerId(status2.remoteComms); + + expect(peerId1).toBeDefined(); + expect(peerId2).toBeDefined(); + expect(peerId1).not.toBe(peerId2); + } finally { + await Promise.all([ + kernel1 && + stopWithTimeout( + async () => kernel1!.stop(), + STOP_TIMEOUT, + 'kernel1.stop', + ), + kernel2 && + stopWithTimeout( + async () => kernel2!.stop(), + STOP_TIMEOUT, + 'kernel2.stop', + ), + ]); + } + }, + TEST_TIMEOUT, + ); + + it( + 'kernel reports connected state even with unreachable relay', + async () => { + // Use a valid but unreachable relay address on a port nothing listens on + const badRelayAddr = + '/ip4/127.0.0.1/tcp/19999/ws/p2p/12D3KooWBTf3S95YAsh6fi5rhohMsk8qaTy19rrpW8X9G69vn6GP'; + const kernelDb = await makeSQLKernelDatabase({ dbFilename: ':memory:' }); + let kernel: Kernel | undefined; + + try { + kernel = await makeTestKernel(kernelDb); + // initRemoteComms should not throw even if the relay is unreachable — + // the libp2p node starts locally and relay connection happens async. + await kernel.initRemoteComms({ relays: [badRelayAddr] }); + + const status = await kernel.getStatus(); + // The kernel still gets a local peer ID even without relay connectivity + expect(status.remoteComms?.state).toBe('connected'); + expect(getRemoteCommsPeerId(status.remoteComms)).toBeDefined(); + } finally { + if (kernel) { + await stopWithTimeout( + async () => kernel!.stop(), + STOP_TIMEOUT, + 'kernel.stop', + ); + } + } + }, + TEST_TIMEOUT, + ); +}); diff --git a/packages/kernel-node-runtime/test/e2e/remote-comms.test.ts b/packages/kernel-node-runtime/test/e2e/remote-comms.test.ts index 2ef598a7bd..d2b287263e 100644 --- a/packages/kernel-node-runtime/test/e2e/remote-comms.test.ts +++ b/packages/kernel-node-runtime/test/e2e/remote-comms.test.ts @@ -22,33 +22,10 @@ import { sendRemoteMessage, setupAliceAndBob, } from '../helpers/remote-comms.ts'; +import { stopWithTimeout } from '../helpers/stop-with-timeout.ts'; // Increase timeout for network operations const NETWORK_TIMEOUT = 30_000; - -/** - * Stop an operation with a timeout to prevent hangs during cleanup. - * - * @param stopFn - The stop function to call. - * @param timeoutMs - The timeout in milliseconds. - * @param label - A label for logging. - */ -async function stopWithTimeout( - stopFn: () => Promise, - timeoutMs: number, - label: string, -): Promise { - try { - await Promise.race([ - stopFn(), - new Promise((_resolve, reject) => - setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs), - ), - ]); - } catch { - // Ignore timeout errors during cleanup - } -} // Test relay configuration // The relay peer ID is deterministic based on RELAY_LOCAL_ID = 200 in relay.ts const relayPeerId = '12D3KooWJBDqsyHQF2MWiCdU4kdqx4zTsSTLRdShg7Ui6CRWB4uc'; diff --git a/packages/kernel-node-runtime/test/e2e/setup-suppress-datachannel-error.ts b/packages/kernel-node-runtime/test/e2e/setup-suppress-datachannel-error.ts new file mode 100644 index 0000000000..70a31fb282 --- /dev/null +++ b/packages/kernel-node-runtime/test/e2e/setup-suppress-datachannel-error.ts @@ -0,0 +1,25 @@ +/** + * Suppress known uncaught exceptions from node-datachannel native module. + * + * When a WebRTC DataChannel is closed while a send is in flight, + * node-datachannel v0.29.0 (@libp2p/webrtc v6) throws an asynchronous + * uncaught exception from the native layer. This is benign — the connection + * is already being torn down — but Vitest v4 treats uncaught exceptions as + * test failures. + * + * This setup file installs a handler that suppresses only this specific error. + */ +process.on('uncaughtException', (error: Error) => { + if ( + error.message?.includes('DataChannel is closed') || + error.message?.includes('libdatachannel error') + ) { + // Benign: native WebRTC module fires async error after channel teardown. + return; + } + // For non-datachannel errors, log and set exit code so Vitest reports + // the failure. Re-throwing inside uncaughtException would hard-kill the + // process without Vitest diagnostics. + console.error('Uncaught exception in e2e test:', error); + process.exitCode = 1; +}); diff --git a/packages/kernel-node-runtime/test/helpers/remote-comms.ts b/packages/kernel-node-runtime/test/helpers/remote-comms.ts index 09feb2f1b2..0323a758ed 100644 --- a/packages/kernel-node-runtime/test/helpers/remote-comms.ts +++ b/packages/kernel-node-runtime/test/helpers/remote-comms.ts @@ -4,11 +4,28 @@ import { Kernel, kunser, makeKernelStore } from '@metamask/ocap-kernel'; import type { ClusterConfig, KRef, + KernelStatus, RemoteCommsOptions, } from '@metamask/ocap-kernel'; import { makeTestKernel } from './kernel.ts'; +/** + * Extract peerId from remoteComms status, returning undefined for + * disconnected state. + * + * @param remoteComms - The remote comms status object. + * @returns The peer ID string or undefined. + */ +export function getRemoteCommsPeerId( + remoteComms: KernelStatus['remoteComms'], +): string | undefined { + if (remoteComms && remoteComms.state !== 'disconnected') { + return remoteComms.peerId; + } + return undefined; +} + /** * Helper to create a vat configuration for a remote vat. * diff --git a/packages/kernel-node-runtime/test/helpers/stop-with-timeout.ts b/packages/kernel-node-runtime/test/helpers/stop-with-timeout.ts new file mode 100644 index 0000000000..1621f77d0e --- /dev/null +++ b/packages/kernel-node-runtime/test/helpers/stop-with-timeout.ts @@ -0,0 +1,23 @@ +/** + * Stop an operation with a timeout to prevent hangs during cleanup. + * + * @param stopFn - The stop function to call. + * @param timeoutMs - The timeout in milliseconds. + * @param label - A label for logging. + */ +export async function stopWithTimeout( + stopFn: () => Promise, + timeoutMs: number, + label: string, +): Promise { + try { + await Promise.race([ + stopFn(), + new Promise((_resolve, reject) => + setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs), + ), + ]); + } catch { + // Ignore timeout errors during cleanup + } +} diff --git a/packages/kernel-node-runtime/vitest.config.e2e.ts b/packages/kernel-node-runtime/vitest.config.e2e.ts index 922508bce0..50fe7c16eb 100644 --- a/packages/kernel-node-runtime/vitest.config.e2e.ts +++ b/packages/kernel-node-runtime/vitest.config.e2e.ts @@ -16,6 +16,12 @@ export default defineConfig((args) => { fileURLToPath( import.meta.resolve('@metamask/kernel-shims/endoify-node'), ), + fileURLToPath( + new URL( + './test/e2e/setup-suppress-datachannel-error.ts', + import.meta.url, + ), + ), ], include: ['./test/e2e/**/*.test.ts'], exclude: ['./src/**/*'], diff --git a/packages/kernel-shims/package.json b/packages/kernel-shims/package.json index d4c5d54b1c..dc98aae14d 100644 --- a/packages/kernel-shims/package.json +++ b/packages/kernel-shims/package.json @@ -83,7 +83,7 @@ "vitest": "^4.0.16" }, "peerDependencies": { - "@libp2p/webrtc": "5.2.24" + "@libp2p/webrtc": "6.0.15" }, "engines": { "node": ">=22" diff --git a/packages/kernel-test/package.json b/packages/kernel-test/package.json index 9d9ebc133f..cd43178408 100644 --- a/packages/kernel-test/package.json +++ b/packages/kernel-test/package.json @@ -52,8 +52,8 @@ "@endo/marshal": "^1.8.0", "@endo/patterns": "^1.7.0", "@endo/promise-kit": "^1.1.13", - "@libp2p/crypto": "5.1.8", - "@libp2p/peer-id": "5.1.9", + "@libp2p/crypto": "5.1.14", + "@libp2p/peer-id": "6.0.5", "@metamask/kernel-node-runtime": "workspace:^", "@metamask/kernel-store": "workspace:^", "@metamask/kernel-utils": "workspace:^", diff --git a/packages/kernel-utils/package.json b/packages/kernel-utils/package.json index c498680f81..be08b1ffdb 100644 --- a/packages/kernel-utils/package.json +++ b/packages/kernel-utils/package.json @@ -75,8 +75,7 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.cts", "files": [ - "dist/", - "patches/" + "dist/" ], "scripts": { "build": "ts-bridge --project tsconfig.build.json --no-references --clean", @@ -89,7 +88,6 @@ "lint:eslint": "eslint . --cache", "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write && yarn constraints --fix && yarn lint:dependencies", "lint:misc": "prettier --no-error-on-unmatched-pattern '**/*.json' '**/*.md' '**/*.html' '!**/CHANGELOG.old.md' '**/*.yml' '!.yarnrc.yml' '!merged-packages/**' --ignore-path ../../.gitignore --log-level error", - "postinstall": "[ ! -d patches ] || patch-package --patch-dir patches", "publish:preview": "yarn npm publish --tag preview", "test": "vitest run --config vitest.config.ts", "test:clean": "yarn test --no-cache --coverage.clean", @@ -99,24 +97,24 @@ "test:dev:quiet": "yarn test:dev --reporter @ocap/repo-tools/vitest-reporters/silent" }, "dependencies": { - "@chainsafe/libp2p-noise": "^16.1.3", - "@chainsafe/libp2p-yamux": "7.0.4", + "@chainsafe/libp2p-noise": "^17.0.0", + "@chainsafe/libp2p-yamux": "8.0.1", "@endo/captp": "^4.4.8", "@endo/errors": "^1.2.13", "@endo/exo": "^1.5.12", "@endo/patterns": "^1.7.0", "@endo/promise-kit": "^1.1.13", - "@libp2p/autonat": "2.0.38", - "@libp2p/circuit-relay-v2": "3.2.24", - "@libp2p/crypto": "5.1.8", - "@libp2p/identify": "3.0.39", - "@libp2p/interface": "2.11.0", - "@libp2p/ping": "2.0.37", - "@libp2p/tcp": "10.1.19", - "@libp2p/websockets": "9.2.19", + "@libp2p/autonat": "3.0.14", + "@libp2p/circuit-relay-v2": "4.1.7", + "@libp2p/crypto": "5.1.14", + "@libp2p/identify": "4.0.14", + "@libp2p/interface": "3.1.1", + "@libp2p/ping": "3.0.14", + "@libp2p/tcp": "11.0.14", + "@libp2p/websockets": "10.1.7", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.9.0", - "libp2p": "2.10.0", + "libp2p": "3.1.7", "setimmediate": "^1.0.5" }, "devDependencies": { @@ -144,7 +142,6 @@ "eslint-plugin-prettier": "^5.2.6", "eslint-plugin-promise": "^7.2.1", "jsdom": "^27.4.0", - "patch-package": "^8.0.0", "prettier": "^3.5.3", "rimraf": "^6.0.1", "ses": "^1.14.0", @@ -156,7 +153,6 @@ }, "peerDependencies": { "acorn": "^8.15.0", - "patch-package": "^8.0.0", "vite": "^7.3.0" }, "peerDependenciesMeta": { diff --git a/packages/ocap-kernel/package.json b/packages/ocap-kernel/package.json index f268891ef2..45436ee100 100644 --- a/packages/ocap-kernel/package.json +++ b/packages/ocap-kernel/package.json @@ -69,23 +69,24 @@ }, "dependencies": { "@agoric/swingset-liveslots": "0.10.3-u21.0.1", - "@chainsafe/libp2p-noise": "^16.1.3", - "@chainsafe/libp2p-yamux": "7.0.4", + "@chainsafe/libp2p-noise": "^17.0.0", + "@chainsafe/libp2p-yamux": "8.0.1", "@endo/errors": "^1.2.13", "@endo/eventual-send": "^1.3.4", "@endo/marshal": "^1.8.0", "@endo/pass-style": "^1.6.3", "@endo/promise-kit": "^1.1.13", - "@libp2p/bootstrap": "11.0.47", - "@libp2p/circuit-relay-v2": "3.2.24", - "@libp2p/crypto": "5.1.8", - "@libp2p/identify": "3.0.39", - "@libp2p/interface": "2.11.0", - "@libp2p/peer-id": "5.1.9", - "@libp2p/ping": "2.0.37", - "@libp2p/webrtc": "5.2.24", - "@libp2p/websockets": "9.2.19", - "@libp2p/webtransport": "5.0.51", + "@libp2p/bootstrap": "12.0.15", + "@libp2p/circuit-relay-v2": "4.1.7", + "@libp2p/crypto": "5.1.14", + "@libp2p/identify": "4.0.14", + "@libp2p/interface": "3.1.1", + "@libp2p/peer-id": "6.0.5", + "@libp2p/ping": "3.0.14", + "@libp2p/utils": "7.0.14", + "@libp2p/webrtc": "6.0.15", + "@libp2p/websockets": "10.1.7", + "@libp2p/webtransport": "6.0.16", "@metamask/kernel-errors": "workspace:^", "@metamask/kernel-platforms": "workspace:^", "@metamask/kernel-rpc-methods": "workspace:^", @@ -96,10 +97,9 @@ "@metamask/streams": "workspace:^", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.9.0", - "@multiformats/multiaddr": "^12.4.4", + "@multiformats/multiaddr": "^13.0.1", "@scure/bip39": "^2.0.1", - "it-byte-stream": "^2.0.1", - "libp2p": "2.10.0", + "libp2p": "3.1.7", "multiformats": "^13.3.6", "ses": "^1.14.0", "setimmediate": "^1.0.5", diff --git a/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts b/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts index 76aea2f3c8..029352c048 100644 --- a/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts +++ b/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts @@ -9,10 +9,10 @@ import type { Channel } from '../types.ts'; // Track state shared between mocks and tests const libp2pState: { handler?: - | ((args: { - connection: { remotePeer: { toString: () => string } }; - stream: object; - }) => void | Promise) + | (( + stream: object, + connection: { remotePeer: { toString: () => string } }, + ) => void | Promise) | undefined; dials: { addr: string; @@ -127,34 +127,69 @@ vi.mock('@metamask/logger', () => ({ }, })); +/** Protocol codes matching @multiformats/multiaddr v13 */ +const PROTO_CODES: Record = { + ip4: 4, + ip6: 41, + tcp: 6, + udp: 273, + dns4: 54, + dns6: 55, + dnsaddr: 56, + ws: 477, + wss: 478, + tls: 448, + p2p: 421, + 'p2p-circuit': 290, + webrtc: 281, + 'quic-v1': 461, + webtransport: 465, +}; + vi.mock('@multiformats/multiaddr', () => ({ + CODE_P2P: 421, + CODE_IP4: 4, + CODE_IP6: 41, + CODE_DNS4: 54, + CODE_DNS6: 55, + CODE_DNSADDR: 56, multiaddr: (addr: string) => { // Real multiaddr() throws on malformed addresses if (!addr.startsWith('/')) { throw new Error(`invalid multiaddr "${addr}"`); } - // Extract the last /p2p/ segment if present - const peerIdMatch = addr.match(/\/p2p\/([^/]+)$/u); - // Extract protocol names from multiaddr segments (e.g. /dns4/.../tcp/.../ws/...) + // Parse segments into components const segments = addr.split('/').filter(Boolean); - const protos: string[] = []; - for (const seg of segments) { - if (!/^\d+$/u.test(seg) && !peerIdMatch?.[1]?.includes(seg)) { - protos.push(seg); + const components: { code: number; name: string; value?: string }[] = []; + const valuedProtos = new Set([ + 'ip4', + 'ip6', + 'tcp', + 'udp', + 'dns4', + 'dns6', + 'dnsaddr', + 'p2p', + ]); + let idx = 0; + while (idx < segments.length) { + const name = segments[idx]; + const code = PROTO_CODES[name]; + if (code === undefined) { + idx += 1; + continue; + } + if (valuedProtos.has(name) && idx + 1 < segments.length) { + components.push({ code, name, value: segments[idx + 1] }); + idx += 2; + } else { + components.push({ code, name }); + idx += 1; } } - // Extract host: value after dns4/dns6/ip4/ip6 - const hostMatch = addr.match(/\/(dns[46]?|ip[46])\/([^/]+)/u); return { toString: () => addr, - getPeerId: () => peerIdMatch?.[1] ?? null, - protoNames: () => protos, - toOptions: () => ({ - host: hostMatch?.[2] ?? 'unknown', - port: 0, - transport: 'tcp' as const, - family: 4 as const, - }), + getComponents: () => components, }; }, })); @@ -167,14 +202,19 @@ vi.mock('@multiformats/multiaddr', () => ({ * @returns A minimal Multiaddr-shaped object. */ function makeTestMultiaddr(protoNames: string[], host: string) { + // Build components: first component is the host (ip4/ip6/dns4/dns6) + const hostProto = protoNames.find((proto) => + ['ip4', 'ip6', 'dns4', 'dns6', 'dnsaddr'].includes(proto), + ); + const components = protoNames.map((name) => { + const code = PROTO_CODES[name] ?? 0; + if (name === hostProto) { + return { code, name, value: host }; + } + return { code, name }; + }); return { - protoNames: () => protoNames, - toOptions: () => ({ - host, - port: 0, - transport: 'tcp' as const, - family: 4 as const, - }), + getComponents: () => components, }; } @@ -186,7 +226,7 @@ type MockByteStream = { }; const streamMap = new WeakMap(); -vi.mock('it-byte-stream', () => ({ +vi.mock('@libp2p/utils', () => ({ byteStream: (stream: object) => { const bs: MockByteStream = { writes: [], @@ -264,10 +304,10 @@ describe('ConnectionFactory', () => { handle: vi.fn( async ( _protocol: string, - handler?: (args: { - connection: { remotePeer: { toString: () => string } }; - stream: object; - }) => void | Promise, + handler?: ( + stream: object, + connection: { remotePeer: { toString: () => string } }, + ) => void | Promise, ) => { libp2pState.handler = handler; }, @@ -540,9 +580,8 @@ describe('ConnectionFactory', () => { // Simulate inbound connection const inboundStream = {}; - await libp2pState.handler?.({ - connection: { remotePeer: { toString: () => 'remote-peer' } }, - stream: inboundStream, + await libp2pState.handler?.(inboundStream, { + remotePeer: { toString: () => 'remote-peer' }, }); expect(handler).toHaveBeenCalledWith( @@ -561,9 +600,8 @@ describe('ConnectionFactory', () => { }); const inboundStream = {}; - await libp2pState.handler?.({ - connection: { remotePeer: { toString: () => 'inbound-peer' } }, - stream: inboundStream, + await libp2pState.handler?.(inboundStream, { + remotePeer: { toString: () => 'inbound-peer' }, }); expect(capturedChannel).toBeDefined(); @@ -1767,10 +1805,10 @@ describe('ConnectionFactory', () => { handle: vi.fn( async ( _protocol: string, - handler?: (args: { - connection: { remotePeer: { toString: () => string } }; - stream: object; - }) => void | Promise, + handler?: ( + stream: object, + connection: { remotePeer: { toString: () => string } }, + ) => void | Promise, ) => { libp2pState.handler = handler; }, @@ -1805,9 +1843,8 @@ describe('ConnectionFactory', () => { // Simulate inbound connection const inboundStream = {}; - await libp2pState.handler?.({ - connection: { remotePeer: { toString: () => 'inbound-peer' } }, - stream: inboundStream, + await libp2pState.handler?.(inboundStream, { + remotePeer: { toString: () => 'inbound-peer' }, }); // Make outbound connection diff --git a/packages/ocap-kernel/src/remotes/platform/connection-factory.ts b/packages/ocap-kernel/src/remotes/platform/connection-factory.ts index b1b65628b6..0999ecb2eb 100644 --- a/packages/ocap-kernel/src/remotes/platform/connection-factory.ts +++ b/packages/ocap-kernel/src/remotes/platform/connection-factory.ts @@ -7,9 +7,9 @@ import { identify } from '@libp2p/identify'; import { MuxerClosedError } from '@libp2p/interface'; import type { PrivateKey, Libp2p } from '@libp2p/interface'; import { ping } from '@libp2p/ping'; +import { byteStream } from '@libp2p/utils'; import { webRTC } from '@libp2p/webrtc'; import { webSockets } from '@libp2p/websockets'; -import * as wsFilters from '@libp2p/websockets/filters'; import { webTransport } from '@libp2p/webtransport'; import { AbortError, isRetryableNetworkError } from '@metamask/kernel-errors'; import { @@ -20,9 +20,15 @@ import { import { Logger } from '@metamask/logger'; import { multiaddr } from '@multiformats/multiaddr'; import type { Multiaddr } from '@multiformats/multiaddr'; -import { byteStream } from 'it-byte-stream'; import { createLibp2p } from 'libp2p'; +import { + RELAY_RECONNECT_BASE_DELAY_MS, + RELAY_RECONNECT_MAX_DELAY_MS, + RELAY_RECONNECT_MAX_ATTEMPTS, +} from './constants.ts'; +import { getHost, getLastPeerId, isPlainWs } from '../../utils/multiaddr.ts'; +import { isPrivateAddress } from '../../utils/network.ts'; import type { Channel, ConnectionFactoryOptions, @@ -30,74 +36,6 @@ import type { InboundConnectionHandler, } from '../types.ts'; -/** - * Returns true if the multiaddr uses plain (unencrypted) WebSocket transport. - * - * @param ma - The multiaddr to check. - * @returns True if the multiaddr is a plain ws:// address. - */ -function isPlainWs(ma: Multiaddr): boolean { - const names = ma.protoNames(); - return ( - names.includes('ws') && !names.includes('wss') && !names.includes('tls') - ); -} - -const isIPv4Address = (host: string): boolean => { - return /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/u.test(host); -}; - -const isIPv6Address = (host: string): boolean => { - // IPv6 addresses consist only of hex digits and colons, and always contain - // at least one colon. DNS hostnames never contain colons, so requiring one - // prevents an all-hex hostname like 'fdcafe' from matching the fc/fd prefix - // checks in isPrivateAddress. - return /^[0-9a-f]*:[0-9a-f:]+$/u.test(host); -}; - -/** - * Returns true if the given host is a private/loopback address. - * Covers IPv4 loopback per RFC 1122 §3.2.1.3 (127.0.0.0/8), IPv4 private - * ranges per RFC 1918, IPv6 loopback per RFC 4291 §2.5.3 (::1), IPv6 - * unique-local per RFC 4193 (fc00::/7), and IPv6 link-local per RFC 4291 - * §2.5.6 (fe80::/10). - * - * @param host - The hostname or IP address to check. - * @returns True if the host is a private or loopback address. - */ -function isPrivateAddress(host: string): boolean { - if (host === 'localhost' || host === '::1') { - return true; // ::1 loopback per RFC 4291 §2.5.3 - } - const lower = host.toLowerCase(); - if ( - isIPv6Address(lower) && - (lower.startsWith('fc') || - lower.startsWith('fd') || // fc00::/7 unique-local per RFC 4193 - lower.startsWith('fe80:')) // fe80::/10 link-local per RFC 4291 §2.5.6 - ) { - return true; - } - if (!isIPv4Address(host)) { - return false; - } - const octets = host.split('.').map(Number); - if (octets.some((octet) => octet > 255)) { - return false; - } - const [p0, p1] = octets as [number, number, number, number]; - return ( - p0 === 127 || // 127.0.0.0/8 loopback per RFC 1122 §3.2.1.3 - p0 === 10 || // 10.0.0.0/8 private per RFC 1918 - (p0 === 172 && p1 >= 16 && p1 <= 31) || // 172.16.0.0/12 private per RFC 1918 - (p0 === 192 && p1 === 168) // 192.168.0.0/16 private per RFC 1918 - ); -} - -const RELAY_RECONNECT_BASE_DELAY_MS = 5_000; -const RELAY_RECONNECT_MAX_DELAY_MS = 60_000; -const RELAY_RECONNECT_MAX_ATTEMPTS = 10; - /** * Connection factory for libp2p network operations. * Handles libp2p initialization, dialing, and connection management. @@ -160,7 +98,7 @@ export class ConnectionFactory { for (const relay of this.#knownRelays) { try { const ma = multiaddr(relay); - const peerId = ma.getPeerId(); + const peerId = getLastPeerId(ma); if (peerId) { this.#relayPeerIds.add(peerId); this.#relayMultiaddrs.set(peerId, relay); @@ -171,7 +109,10 @@ export class ConnectionFactory { } // Auto-allow the relay host for plain ws:// connections if (isPlainWs(ma)) { - relayHosts.push(ma.toOptions().host); + const host = getHost(ma); + if (host) { + relayHosts.push(host); + } } } catch (error) { this.#logger.warn(`skipping malformed relay address: ${relay}`, error); @@ -219,7 +160,7 @@ export class ConnectionFactory { appendAnnounce: ['/webrtc'], }, transports: [ - webSockets({ filter: wsFilters.all }), + webSockets(), webTransport(), webRTC({ rtcConfiguration: { @@ -245,7 +186,7 @@ export class ConnectionFactory { if (!isPlainWs(ma)) { return false; // allow wss://, webRTC, circuit relay, etc. } - const { host } = ma.toOptions(); + const host = getHost(ma) ?? ''; if (isPrivateAddress(host) || this.#allowedWsHosts.includes(host)) { return false; } @@ -269,7 +210,7 @@ export class ConnectionFactory { }); // Set up inbound handler - await this.#libp2p.handle('whatever', ({ connection, stream }) => { + await this.#libp2p.handle('whatever', (stream, connection) => { const msgStream = byteStream(stream); const remotePeerId = connection.remotePeer.toString(); this.#logger.log(`inbound connection from peerId:${remotePeerId}`); @@ -353,7 +294,7 @@ export class ConnectionFactory { for (const hint of hints) { try { - if (multiaddr(hint).getPeerId() === peerId) { + if (getLastPeerId(multiaddr(hint)) === peerId) { directAddresses.push(hint); } else { relayHints.push(hint); @@ -671,3 +612,4 @@ export class ConnectionFactory { } } } +harden(ConnectionFactory); diff --git a/packages/ocap-kernel/src/remotes/platform/constants.ts b/packages/ocap-kernel/src/remotes/platform/constants.ts index ca66968fc7..29133eb18e 100644 --- a/packages/ocap-kernel/src/remotes/platform/constants.ts +++ b/packages/ocap-kernel/src/remotes/platform/constants.ts @@ -27,3 +27,18 @@ export const DEFAULT_CONNECTION_RATE_LIMIT = 10; /** Default connection rate window in milliseconds (1 minute) */ export const DEFAULT_CONNECTION_RATE_WINDOW_MS = 60_000; + +/** Base delay for relay reconnection backoff in milliseconds (5 seconds) */ +export const RELAY_RECONNECT_BASE_DELAY_MS = 5_000; + +/** Maximum delay for relay reconnection backoff in milliseconds (60 seconds) */ +export const RELAY_RECONNECT_MAX_DELAY_MS = 60_000; + +/** Maximum number of relay reconnection attempts */ +export const RELAY_RECONNECT_MAX_ATTEMPTS = 10; + +/** Handshake timeout in milliseconds (10 seconds) */ +export const HANDSHAKE_TIMEOUT_MS = 10_000; + +/** Default threshold for consecutive identical errors before marking as permanently failed */ +export const DEFAULT_CONSECUTIVE_ERROR_THRESHOLD = 5; diff --git a/packages/ocap-kernel/src/remotes/platform/handshake.ts b/packages/ocap-kernel/src/remotes/platform/handshake.ts index 6c7191d719..ff95565f73 100644 --- a/packages/ocap-kernel/src/remotes/platform/handshake.ts +++ b/packages/ocap-kernel/src/remotes/platform/handshake.ts @@ -2,14 +2,9 @@ import type { Logger } from '@metamask/logger'; import { toString as bufToString, fromString } from 'uint8arrays'; import { writeWithTimeout } from './channel-utils.ts'; -import { DEFAULT_WRITE_TIMEOUT_MS } from './constants.ts'; +import { DEFAULT_WRITE_TIMEOUT_MS, HANDSHAKE_TIMEOUT_MS } from './constants.ts'; import type { Channel } from '../types.ts'; -/** - * Handshake timeout in milliseconds. - */ -const HANDSHAKE_TIMEOUT_MS = 10_000; - /** * Type for handshake protocol messages exchanged during connection establishment. */ diff --git a/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts b/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts index e0cf6f3553..1c57112c3e 100644 --- a/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts +++ b/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts @@ -1,9 +1,9 @@ import * as kernelUtils from '@metamask/kernel-utils'; import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { DEFAULT_CONSECUTIVE_ERROR_THRESHOLD } from './constants.ts'; import { ReconnectionManager, - DEFAULT_CONSECUTIVE_ERROR_THRESHOLD, PERMANENT_FAILURE_ERROR_CODES, } from './reconnection.ts'; diff --git a/packages/ocap-kernel/src/remotes/platform/reconnection.ts b/packages/ocap-kernel/src/remotes/platform/reconnection.ts index c822df31f5..83fe586db0 100644 --- a/packages/ocap-kernel/src/remotes/platform/reconnection.ts +++ b/packages/ocap-kernel/src/remotes/platform/reconnection.ts @@ -1,9 +1,6 @@ import { calculateReconnectionBackoff } from '@metamask/kernel-utils'; -/** - * Default threshold for consecutive identical errors before marking as permanently failed. - */ -export const DEFAULT_CONSECUTIVE_ERROR_THRESHOLD = 5; +import { DEFAULT_CONSECUTIVE_ERROR_THRESHOLD } from './constants.ts'; /** * Error codes that can indicate permanent failure when occurring consecutively. diff --git a/packages/ocap-kernel/src/remotes/types.ts b/packages/ocap-kernel/src/remotes/types.ts index bbd67e04a8..c881e74f98 100644 --- a/packages/ocap-kernel/src/remotes/types.ts +++ b/packages/ocap-kernel/src/remotes/types.ts @@ -1,10 +1,11 @@ +import type { Stream } from '@libp2p/interface'; +import type { ByteStream } from '@libp2p/utils'; import type { Logger } from '@metamask/logger'; -import type { ByteStream } from 'it-byte-stream'; export type InboundConnectionHandler = (channel: Channel) => void; export type Channel = { - msgStream: ByteStream; + msgStream: ByteStream; peerId: string; }; diff --git a/packages/ocap-kernel/src/utils/multiaddr.test.ts b/packages/ocap-kernel/src/utils/multiaddr.test.ts new file mode 100644 index 0000000000..212a77bff9 --- /dev/null +++ b/packages/ocap-kernel/src/utils/multiaddr.test.ts @@ -0,0 +1,86 @@ +import { multiaddr } from '@multiformats/multiaddr'; +import { describe, it, expect } from 'vitest'; + +import { getHost, getLastPeerId, isPlainWs } from './multiaddr.ts'; + +describe('getLastPeerId', () => { + it.each([ + { + desc: 'simple address with one /p2p/ segment', + addr: '/ip4/127.0.0.1/tcp/9001/ws/p2p/12D3KooWTest', + expected: '12D3KooWTest', + }, + { + desc: 'circuit relay address returns target, not relay', + addr: '/dns4/relay.example/tcp/443/wss/p2p/12D3KooWRelay/p2p-circuit/webrtc/p2p/12D3KooWTarget', + expected: '12D3KooWTarget', + }, + { + desc: 'address without /p2p/ segment', + addr: '/ip4/127.0.0.1/tcp/9001/ws', + expected: undefined, + }, + ])('$desc', ({ addr, expected }) => { + expect(getLastPeerId(multiaddr(addr))).toBe(expected); + }); +}); + +describe('getHost', () => { + it.each([ + { + desc: 'extracts IPv4 host', + addr: '/ip4/192.168.1.1/tcp/9001/ws', + expected: '192.168.1.1', + }, + { + desc: 'extracts dns4 host', + addr: '/dns4/relay.example.com/tcp/443/wss', + expected: 'relay.example.com', + }, + { + desc: 'extracts IPv6 host', + addr: '/ip6/::1/tcp/9001/ws', + expected: '::1', + }, + { + desc: 'extracts dns6 host', + addr: '/dns6/relay.example.com/tcp/443/wss', + expected: 'relay.example.com', + }, + { + desc: 'returns undefined for address without host component', + addr: '/p2p-circuit/webrtc/p2p/12D3KooWTest', + expected: undefined, + }, + ])('$desc', ({ addr, expected }) => { + expect(getHost(multiaddr(addr))).toBe(expected); + }); +}); + +describe('isPlainWs', () => { + it.each([ + { desc: 'plain ws://', addr: '/ip4/127.0.0.1/tcp/9001/ws', expected: true }, + { + desc: 'secure wss://', + addr: '/ip4/127.0.0.1/tcp/443/wss', + expected: false, + }, + { + desc: 'ws with tls', + addr: '/ip4/127.0.0.1/tcp/443/tls/ws', + expected: false, + }, + { + desc: 'webrtc (no ws)', + addr: '/ip4/127.0.0.1/udp/9001/webrtc', + expected: false, + }, + { + desc: 'plain tcp (no ws)', + addr: '/ip4/127.0.0.1/tcp/9001', + expected: false, + }, + ])('$desc → $expected', ({ addr, expected }) => { + expect(isPlainWs(multiaddr(addr))).toBe(expected); + }); +}); diff --git a/packages/ocap-kernel/src/utils/multiaddr.ts b/packages/ocap-kernel/src/utils/multiaddr.ts new file mode 100644 index 0000000000..26937b4d7c --- /dev/null +++ b/packages/ocap-kernel/src/utils/multiaddr.ts @@ -0,0 +1,53 @@ +import { + CODE_P2P, + CODE_IP4, + CODE_IP6, + CODE_DNS4, + CODE_DNS6, + CODE_DNSADDR, +} from '@multiformats/multiaddr'; +import type { Multiaddr } from '@multiformats/multiaddr'; + +const HOST_CODES = [CODE_IP4, CODE_IP6, CODE_DNS4, CODE_DNS6, CODE_DNSADDR]; + +/** + * Extract the last /p2p/ peer ID from a multiaddr, matching the semantics of + * the removed `Multiaddr.getPeerId()`. For circuit relay addresses like + * `/p2p/relay-id/p2p-circuit/webrtc/p2p/target-id`, this returns `target-id`. + * + * @param ma - The multiaddr to extract the peer ID from. + * @returns The peer ID string, or undefined if no /p2p/ component exists. + */ +export function getLastPeerId(ma: Multiaddr): string | undefined { + let peerId: string | undefined; + for (const comp of ma.getComponents()) { + if (comp.code === CODE_P2P) { + peerId = comp.value; + } + } + return peerId; +} + +/** + * Extract the hostname or IP from a multiaddr (first ip4/ip6/dns component). + * + * @param ma - The multiaddr to extract the host from. + * @returns The host string, or undefined if no host component exists. + */ +export function getHost(ma: Multiaddr): string | undefined { + return ma.getComponents().find((comp) => HOST_CODES.includes(comp.code)) + ?.value; +} + +/** + * Returns true if the multiaddr uses plain (unencrypted) WebSocket transport. + * + * @param ma - The multiaddr to check. + * @returns True if the multiaddr is a plain ws:// address. + */ +export function isPlainWs(ma: Multiaddr): boolean { + const names = ma.getComponents().map((comp) => comp.name); + return ( + names.includes('ws') && !names.includes('wss') && !names.includes('tls') + ); +} diff --git a/packages/ocap-kernel/src/utils/network.test.ts b/packages/ocap-kernel/src/utils/network.test.ts new file mode 100644 index 0000000000..4e24b87da1 --- /dev/null +++ b/packages/ocap-kernel/src/utils/network.test.ts @@ -0,0 +1,58 @@ +import { describe, it, expect } from 'vitest'; + +import { isPrivateAddress } from './network.ts'; + +describe('isPrivateAddress', () => { + it.each([ + // IPv4 loopback (127.0.0.0/8) + { host: '127.0.0.1', expected: true }, + { host: '127.255.255.255', expected: true }, + + // IPv4 private (10.0.0.0/8) + { host: '10.0.0.1', expected: true }, + { host: '10.255.255.255', expected: true }, + + // IPv4 private (172.16.0.0/12) + { host: '172.16.0.1', expected: true }, + { host: '172.31.255.255', expected: true }, + { host: '172.15.0.1', expected: false }, + { host: '172.32.0.1', expected: false }, + + // IPv4 private (192.168.0.0/16) + { host: '192.168.0.1', expected: true }, + { host: '192.168.255.255', expected: true }, + { host: '192.169.0.1', expected: false }, + + // IPv4 public + { host: '8.8.8.8', expected: false }, + { host: '1.1.1.1', expected: false }, + + // localhost + { host: 'localhost', expected: true }, + + // IPv6 loopback + { host: '::1', expected: true }, + + // IPv6 unique-local (fc00::/7) + { host: 'fc00::1', expected: true }, + { host: 'fd12:3456:789a::1', expected: true }, + + // IPv6 link-local (fe80::/10) + { host: 'fe80::1', expected: true }, + + // IPv6 public + { host: '2001:db8::1', expected: false }, + + // DNS hostnames + { host: 'relay.example.com', expected: false }, + { host: 'google.com', expected: false }, + + // Empty string (from getHost() ?? '' fallback) + { host: '', expected: false }, + + // Invalid IPv4 (octets > 255) + { host: '256.0.0.1', expected: false }, + ])('isPrivateAddress("$host") → $expected', ({ host, expected }) => { + expect(isPrivateAddress(host)).toBe(expected); + }); +}); diff --git a/packages/ocap-kernel/src/utils/network.ts b/packages/ocap-kernel/src/utils/network.ts new file mode 100644 index 0000000000..56852343a4 --- /dev/null +++ b/packages/ocap-kernel/src/utils/network.ts @@ -0,0 +1,50 @@ +const isIPv4Address = (host: string): boolean => { + return /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/u.test(host); +}; + +const isIPv6Address = (host: string): boolean => { + // IPv6 addresses consist only of hex digits and colons, and always contain + // at least one colon. DNS hostnames never contain colons, so requiring one + // prevents an all-hex hostname like 'fdcafe' from matching the fc/fd prefix + // checks in isPrivateAddress. + return /^[0-9a-f]*:[0-9a-f:]+$/u.test(host); +}; + +/** + * Returns true if the given host is a private/loopback address. + * Covers IPv4 loopback per RFC 1122 §3.2.1.3 (127.0.0.0/8), IPv4 private + * ranges per RFC 1918, IPv6 loopback per RFC 4291 §2.5.3 (::1), IPv6 + * unique-local per RFC 4193 (fc00::/7), and IPv6 link-local (fe80::/64 — + * the practical subset of the RFC 4291 §2.5.6 fe80::/10 range). + * + * @param host - The hostname or IP address to check. + * @returns True if the host is a private or loopback address. + */ +export function isPrivateAddress(host: string): boolean { + if (host === 'localhost' || host === '::1') { + return true; // ::1 loopback per RFC 4291 §2.5.3 + } + const lower = host.toLowerCase(); + if ( + isIPv6Address(lower) && + (lower.startsWith('fc') || + lower.startsWith('fd') || // fc00::/7 unique-local per RFC 4193 + lower.startsWith('fe80:')) // fe80::/64 link-local (RFC 4291 §2.5.6 defines /10 but bits 11-64 are always zero in practice) + ) { + return true; + } + if (!isIPv4Address(host)) { + return false; + } + const octets = host.split('.').map(Number); + if (octets.some((octet) => octet > 255)) { + return false; + } + const [p0, p1] = octets as [number, number, number, number]; + return ( + p0 === 127 || // 127.0.0.0/8 loopback per RFC 1122 §3.2.1.3 + p0 === 10 || // 10.0.0.0/8 private per RFC 1918 + (p0 === 172 && p1 >= 16 && p1 <= 31) || // 172.16.0.0/12 private per RFC 1918 + (p0 === 192 && p1 === 168) // 192.168.0.0/16 private per RFC 1918 + ); +} diff --git a/patches/@chainsafe+libp2p-yamux+7.0.4.patch b/patches/@chainsafe+libp2p-yamux+7.0.4.patch deleted file mode 100644 index 2a362e9328..0000000000 --- a/patches/@chainsafe+libp2p-yamux+7.0.4.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/node_modules/@chainsafe/libp2p-yamux/dist/src/decode.js b/node_modules/@chainsafe/libp2p-yamux/dist/src/decode.js -index 58728fddc7355906bcb8d8273d41e73ecbbc9d67..7aa39de8fc9268d632be340d10f87a2522f18c45 100644 ---- a/node_modules/@chainsafe/libp2p-yamux/dist/src/decode.js -+++ b/node_modules/@chainsafe/libp2p-yamux/dist/src/decode.js -@@ -111,14 +111,14 @@ export class Decoder { - export function returnlessSource(source) { - if (source[Symbol.iterator] !== undefined) { - const iterator = source[Symbol.iterator](); -- iterator.return = undefined; -+ Object.defineProperty(iterator, 'return', {}); - return { - [Symbol.iterator]() { return iterator; } - }; - } - else if (source[Symbol.asyncIterator] !== undefined) { - const iterator = source[Symbol.asyncIterator](); -- iterator.return = undefined; -+ Object.defineProperty(iterator, 'return', {}); - return { - [Symbol.asyncIterator]() { return iterator; } - }; diff --git a/scripts/rebuild-native.sh b/scripts/rebuild-native.sh index 36465db5d6..2de43a8d0b 100755 --- a/scripts/rebuild-native.sh +++ b/scripts/rebuild-native.sh @@ -40,14 +40,14 @@ if [ -d node_modules/better-sqlite3 ] && \ fi fi -# Check and rebuild @ipshipyard/node-datachannel -if [ -d node_modules/@ipshipyard/node-datachannel ] && \ +# Check and rebuild node-datachannel +if [ -d node_modules/node-datachannel ] && \ { [ "$FORCE_REBUILD" -eq 1 ] || \ - [ ! -f node_modules/@ipshipyard/node-datachannel/build/Release/node_datachannel.node ]; \ + [ ! -f node_modules/node-datachannel/build/Release/node_datachannel.node ]; \ }; then - echo "🔨 Building @ipshipyard/node-datachannel..." - if ! npm rebuild @ipshipyard/node-datachannel; then - echo "❌ Failed to build @ipshipyard/node-datachannel" >&2 + echo "🔨 Building node-datachannel..." + if ! npm rebuild node-datachannel; then + echo "❌ Failed to build node-datachannel" >&2 BUILD_FAILED=1 fi fi diff --git a/vitest.config.ts b/vitest.config.ts index 0e5f5caa6c..292041cbc2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -58,7 +58,6 @@ export default defineConfig({ '**/test/**', '**/node_modules/**', '**/*.{test,spec}.{ts,tsx,js,jsx}', - path.join(import.meta.dirname, './packages/brow-2-brow/**'), ], }, }, diff --git a/yarn.lock b/yarn.lock index 31ad62c9f6..9ba23ce663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -446,10 +446,10 @@ __metadata: languageName: node linkType: hard -"@chainsafe/as-sha256@npm:^1.0.0": - version: 1.1.0 - resolution: "@chainsafe/as-sha256@npm:1.1.0" - checksum: 10/d8513dccab251ba651f555be52b4ecfe95cce40dbab20d6bcd90af28aafe4f1768369fcc499b2692cad2f4c0363bc749071164be393d3f43c994e65476aef303 +"@chainsafe/as-sha256@npm:^1.2.0": + version: 1.2.0 + resolution: "@chainsafe/as-sha256@npm:1.2.0" + checksum: 10/9c1bf0009954fc07a288b4a920d2289cec21f74662805b60e78f7449fdb7743a4d23875eb292695f12d95fdfa1d44e3f78af8c8e1d1703601a5585bd964e9f5b languageName: node linkType: hard @@ -460,97 +460,93 @@ __metadata: languageName: node linkType: hard -"@chainsafe/libp2p-noise@npm:16.1.5": - version: 16.1.5 - resolution: "@chainsafe/libp2p-noise@npm:16.1.5" +"@chainsafe/libp2p-noise@npm:17.0.0": + version: 17.0.0 + resolution: "@chainsafe/libp2p-noise@npm:17.0.0" dependencies: "@chainsafe/as-chacha20poly1305": "npm:^0.1.0" - "@chainsafe/as-sha256": "npm:^1.0.0" - "@libp2p/crypto": "npm:^5.0.0" - "@libp2p/interface": "npm:^2.9.0" - "@libp2p/peer-id": "npm:^5.0.0" - "@noble/ciphers": "npm:^1.1.3" - "@noble/curves": "npm:^1.1.0" - "@noble/hashes": "npm:^1.3.1" - it-length-prefixed: "npm:^10.0.1" - it-length-prefixed-stream: "npm:^2.0.1" - it-pair: "npm:^2.0.6" - it-pipe: "npm:^3.0.1" - it-stream-types: "npm:^2.0.1" - protons-runtime: "npm:^5.5.0" - uint8arraylist: "npm:^2.4.3" - uint8arrays: "npm:^5.0.0" + "@chainsafe/as-sha256": "npm:^1.2.0" + "@libp2p/crypto": "npm:^5.1.9" + "@libp2p/interface": "npm:^3.0.0" + "@libp2p/peer-id": "npm:^6.0.0" + "@libp2p/utils": "npm:^7.0.0" + "@noble/ciphers": "npm:^2.0.1" + "@noble/curves": "npm:^2.0.1" + "@noble/hashes": "npm:^2.0.1" + protons-runtime: "npm:^5.6.0" + uint8arraylist: "npm:^2.4.8" + uint8arrays: "npm:^5.1.0" wherearewe: "npm:^2.0.1" - checksum: 10/c0f05383003fb9463c8965f23ea16c9ece53c6296b38c9b9c6fc164aa3e486f2a1f94e8fd582b0ec695cd4cb0914bf870c21c5d73270967e29ea0f267b7df559 + checksum: 10/8411fb8065206ece8fbabe2f310557fb44eff718010acf9c62f37f3bf6b3225e9a2c68df4d227e974220999a8e76d47f66e6e8df5d790d2e07ee84a89c5f457c languageName: node linkType: hard -"@chainsafe/libp2p-quic-darwin-arm64@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-darwin-arm64@npm:1.1.8" +"@chainsafe/libp2p-quic-darwin-arm64@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-darwin-arm64@npm:2.0.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@chainsafe/libp2p-quic-darwin-x64@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-darwin-x64@npm:1.1.8" +"@chainsafe/libp2p-quic-darwin-x64@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-darwin-x64@npm:2.0.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@chainsafe/libp2p-quic-linux-arm64-gnu@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-linux-arm64-gnu@npm:1.1.8" +"@chainsafe/libp2p-quic-linux-arm64-gnu@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-linux-arm64-gnu@npm:2.0.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@chainsafe/libp2p-quic-linux-arm64-musl@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-linux-arm64-musl@npm:1.1.8" +"@chainsafe/libp2p-quic-linux-arm64-musl@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-linux-arm64-musl@npm:2.0.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@chainsafe/libp2p-quic-linux-x64-gnu@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-linux-x64-gnu@npm:1.1.8" +"@chainsafe/libp2p-quic-linux-x64-gnu@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-linux-x64-gnu@npm:2.0.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@chainsafe/libp2p-quic-linux-x64-musl@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-linux-x64-musl@npm:1.1.8" +"@chainsafe/libp2p-quic-linux-x64-musl@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-linux-x64-musl@npm:2.0.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@chainsafe/libp2p-quic-win32-x64-msvc@npm:1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic-win32-x64-msvc@npm:1.1.8" +"@chainsafe/libp2p-quic-win32-x64-msvc@npm:2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic-win32-x64-msvc@npm:2.0.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@chainsafe/libp2p-quic@npm:^1.1.8": - version: 1.1.8 - resolution: "@chainsafe/libp2p-quic@npm:1.1.8" - dependencies: - "@chainsafe/libp2p-quic-darwin-arm64": "npm:1.1.8" - "@chainsafe/libp2p-quic-darwin-x64": "npm:1.1.8" - "@chainsafe/libp2p-quic-linux-arm64-gnu": "npm:1.1.8" - "@chainsafe/libp2p-quic-linux-arm64-musl": "npm:1.1.8" - "@chainsafe/libp2p-quic-linux-x64-gnu": "npm:1.1.8" - "@chainsafe/libp2p-quic-linux-x64-musl": "npm:1.1.8" - "@chainsafe/libp2p-quic-win32-x64-msvc": "npm:1.1.8" +"@chainsafe/libp2p-quic@npm:^2.0.1": + version: 2.0.1 + resolution: "@chainsafe/libp2p-quic@npm:2.0.1" + dependencies: + "@chainsafe/libp2p-quic-darwin-arm64": "npm:2.0.1" + "@chainsafe/libp2p-quic-darwin-x64": "npm:2.0.1" + "@chainsafe/libp2p-quic-linux-arm64-gnu": "npm:2.0.1" + "@chainsafe/libp2p-quic-linux-arm64-musl": "npm:2.0.1" + "@chainsafe/libp2p-quic-linux-x64-gnu": "npm:2.0.1" + "@chainsafe/libp2p-quic-linux-x64-musl": "npm:2.0.1" + "@chainsafe/libp2p-quic-win32-x64-msvc": "npm:2.0.1" "@libp2p/crypto": "npm:^5.1.7" - "@libp2p/interface": "npm:^2.10.5" - "@libp2p/utils": "npm:^6.7.1" - "@multiformats/multiaddr": "npm:^12.4.0" - "@multiformats/multiaddr-matcher": "npm:^2.0.1" - it-stream-types: "npm:^2.0.2" + "@libp2p/interface": "npm:^3.1.0" + "@libp2p/peer-id": "npm:^6.0.4" + "@libp2p/utils": "npm:^7.0.11" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" race-signal: "npm:^1.1.3" uint8arraylist: "npm:^2.4.8" dependenciesMeta: @@ -568,23 +564,19 @@ __metadata: optional: true "@chainsafe/libp2p-quic-win32-x64-msvc": optional: true - checksum: 10/7db59436903a62788c99b1be076231cbc21f7742f177d61757730a39b97037c002713e239a6f7d3f80088252c87e3048e684eeb9fba33b6de8e6a0374d380dd0 + checksum: 10/d3be13fdf069b2d50a507ef45112c14f8989c1743ed6986740b796463c35ecb3273b8088421ca4280da4136ed4027ad3ba6ef4ed149a655a93665d98788385ae languageName: node linkType: hard -"@chainsafe/libp2p-yamux@npm:7.0.4": - version: 7.0.4 - resolution: "@chainsafe/libp2p-yamux@npm:7.0.4" +"@chainsafe/libp2p-yamux@npm:8.0.1": + version: 8.0.1 + resolution: "@chainsafe/libp2p-yamux@npm:8.0.1" dependencies: - "@libp2p/interface": "npm:^2.0.0" - "@libp2p/utils": "npm:^6.0.0" - get-iterator: "npm:^2.0.1" - it-foreach: "npm:^2.0.6" - it-pushable: "npm:^3.2.3" - it-stream-types: "npm:^2.0.1" - race-signal: "npm:^1.1.3" + "@libp2p/interface": "npm:^3.0.0" + "@libp2p/utils": "npm:^7.0.0" + race-signal: "npm:^2.0.0" uint8arraylist: "npm:^2.4.8" - checksum: 10/64a4c44d6d42fd783350c89075ee6fc1a1f312cad0055a1a5c00f0b777950b02b9ca7cc03979ba57d091850971158121a7fd587141d59ed42501b253bb8f9cb0 + checksum: 10/be3e19fb81d87572311f85de1c4390fd734251c5a5fed40ed4e971e00d3725d4f1804e112267ddbe4a88e4bc118903a1622f8a6112c43f119494b31abc03cabc languageName: node linkType: hard @@ -1544,16 +1536,6 @@ __metadata: languageName: node linkType: hard -"@ipshipyard/node-datachannel@npm:^0.26.6": - version: 0.26.6 - resolution: "@ipshipyard/node-datachannel@npm:0.26.6" - dependencies: - node-gyp: "npm:latest" - prebuild-install: "npm:^7.1.3" - checksum: 10/23e19f792717e15e34bd43fb8f6dd60eedffa6b5c01a4492a7105d8d2630f75e6b2afd5a11e94dd96c8093f1ced1c37998ed4d36329b6086b324da5cdd6ba5d4 - languageName: node - linkType: hard - "@isaacs/balanced-match@npm:^4.0.1": version: 4.0.1 resolution: "@isaacs/balanced-match@npm:4.0.1" @@ -1680,405 +1662,373 @@ __metadata: languageName: node linkType: hard -"@libp2p/autonat@npm:2.0.38": - version: 2.0.38 - resolution: "@libp2p/autonat@npm:2.0.38" +"@libp2p/autonat@npm:3.0.14": + version: 3.0.14 + resolution: "@libp2p/autonat@npm:3.0.14" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/peer-collections": "npm:^6.0.35" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/peer-collections": "npm:^7.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" any-signal: "npm:^4.1.1" - it-protobuf-stream: "npm:^2.0.2" main-event: "npm:^1.0.1" - multiformats: "npm:^13.3.6" - protons-runtime: "npm:^5.5.0" + multiformats: "npm:^13.4.0" + protons-runtime: "npm:^6.0.1" uint8arraylist: "npm:^2.4.8" - checksum: 10/725004400fd24cf3533f5ebdcf16bc20e949a406877fe61349514d4e66935d107e727fc75253add116cbdfa383dd299a834780deec3d2a4020525ad2f3506d7f + checksum: 10/c37d650295b7be27576c3080620cc9e91a05e40599ffab25550e834a3fe0ee4bf92ad0f7309215af4796051cb1b7f20d4e7a0369c99aa9ce14186af239dcfd26 languageName: node linkType: hard -"@libp2p/bootstrap@npm:11.0.47": - version: 11.0.47 - resolution: "@libp2p/bootstrap@npm:11.0.47" +"@libp2p/bootstrap@npm:12.0.15": + version: 12.0.15 + resolution: "@libp2p/bootstrap@npm:12.0.15" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/peer-id": "npm:^5.1.9" - "@multiformats/mafmt": "npm:^12.1.6" - "@multiformats/multiaddr": "npm:^12.4.4" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" main-event: "npm:^1.0.1" - checksum: 10/d10c92570e3e586d61d91a7f89aab87e666232f79c64b84f3146e4cdea132b48eb5e96ad374936307759994b9bb95a379581801436c7831fde05d6cce2357dfb + checksum: 10/4ae1e0db138fe1eb22ded3a7f50fd87f84a9cc9a4bb5ca4353514a5d49c3e614ea2de8bd15eedc3a20e48f8c844c3bb10b3bcd1e2175998966cc2b1ea4fd8bf3 languageName: node linkType: hard -"@libp2p/circuit-relay-v2@npm:3.2.24": - version: 3.2.24 - resolution: "@libp2p/circuit-relay-v2@npm:3.2.24" - dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/peer-collections": "npm:^6.0.35" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/peer-record": "npm:^8.0.35" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" +"@libp2p/circuit-relay-v2@npm:4.1.7": + version: 4.1.7 + resolution: "@libp2p/circuit-relay-v2@npm:4.1.7" + dependencies: + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/peer-collections": "npm:^7.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/peer-record": "npm:^9.0.6" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" any-signal: "npm:^4.1.1" - it-protobuf-stream: "npm:^2.0.2" - it-stream-types: "npm:^2.0.2" main-event: "npm:^1.0.1" - multiformats: "npm:^13.3.6" + multiformats: "npm:^13.4.0" nanoid: "npm:^5.1.5" progress-events: "npm:^1.0.1" - protons-runtime: "npm:^5.5.0" + protons-runtime: "npm:^6.0.1" retimeable-signal: "npm:^1.0.1" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/bea0ce870b37ff77f43dd7b52b1053bb458fa5a1b936451151f3c1bab3f8ad88601f00cfeb1084ad4f7d630b5f67cd151306a328eeeffdb52c576240b1f2b7cc - languageName: node - linkType: hard - -"@libp2p/crypto@npm:5.1.8": - version: 5.1.8 - resolution: "@libp2p/crypto@npm:5.1.8" - dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@noble/curves": "npm:^1.9.1" - "@noble/hashes": "npm:^1.8.0" - multiformats: "npm:^13.3.6" - protons-runtime: "npm:^5.5.0" - uint8arraylist: "npm:^2.4.8" - uint8arrays: "npm:^5.1.0" - checksum: 10/33c9fec065c1ef7de269f469e1e40aad9390af339b7ad55faf8896c4840ddbc2eac0c4e882ad48ac80a4d5cfde457277f6af7704ba3294858bc2cabfc8aaa6cd + checksum: 10/1b2615dea5cd0b620fb826f9a9d4af93e4f634c84e48665c1cfc332e230a5c7e9875e4719674a69c769880172e1b556299435570e3830601fab7b1fd399c516e languageName: node linkType: hard -"@libp2p/crypto@npm:^5.0.0, @libp2p/crypto@npm:^5.1.7, @libp2p/crypto@npm:^5.1.8": - version: 5.1.13 - resolution: "@libp2p/crypto@npm:5.1.13" +"@libp2p/crypto@npm:5.1.14, @libp2p/crypto@npm:^5.1.14, @libp2p/crypto@npm:^5.1.7, @libp2p/crypto@npm:^5.1.9": + version: 5.1.14 + resolution: "@libp2p/crypto@npm:5.1.14" dependencies: - "@libp2p/interface": "npm:^3.1.0" + "@libp2p/interface": "npm:^3.1.1" "@noble/curves": "npm:^2.0.1" "@noble/hashes": "npm:^2.0.1" multiformats: "npm:^13.4.0" - protons-runtime: "npm:^5.6.0" + protons-runtime: "npm:^6.0.1" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/8e4a248ab34f668d2ad55e7c579df6043750e13ab2008e488a6ece7a6b3c4271728691da0f28eee52d134a6044fa8b8dc662af7c0a4a17fac8fc0a17b5bf19e3 + checksum: 10/945b98b06bd8c1b02d99df259c7d953a19c9cd277be65d975383605ea771fa3c85520cd0df1347ab865da6303be069ea8a4c6af9adfcf1b104b166a5bfa15fd4 languageName: node linkType: hard -"@libp2p/identify@npm:3.0.39": - version: 3.0.39 - resolution: "@libp2p/identify@npm:3.0.39" +"@libp2p/identify@npm:4.0.14": + version: 4.0.14 + resolution: "@libp2p/identify@npm:4.0.14" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/peer-record": "npm:^8.0.35" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" - it-drain: "npm:^3.0.9" - it-parallel: "npm:^3.0.11" - it-protobuf-stream: "npm:^2.0.2" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/peer-record": "npm:^9.0.6" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" + it-drain: "npm:^3.0.10" + it-parallel: "npm:^3.0.13" main-event: "npm:^1.0.1" - protons-runtime: "npm:^5.5.0" + protons-runtime: "npm:^6.0.1" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/17f014008fe40f447c79284f12cc576635083bc815ec177b8a4045a19486f9e11c21d94b01d6494f4f38bd5187316094116687abd7a49bdc1545bbbaecf3945e + checksum: 10/e6d3480fe7d20f1d409383d5d044f1bc53971a478c472803c564107a9b44b0ba4173f8556296906bbbccaad3af4401b6317277f7de0e77fbd71b834186e23cb7 languageName: node linkType: hard -"@libp2p/interface-internal@npm:^2.3.19": - version: 2.3.19 - resolution: "@libp2p/interface-internal@npm:2.3.19" +"@libp2p/interface-internal@npm:^3.0.14": + version: 3.0.14 + resolution: "@libp2p/interface-internal@npm:3.0.14" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/peer-collections": "npm:^6.0.35" - "@multiformats/multiaddr": "npm:^12.4.4" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/peer-collections": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" progress-events: "npm:^1.0.1" - checksum: 10/92290f147761a243c2551f183f6cf0b12a6dbab3fb8b22f8307bf3ddfff391cf693d6bf0e28a372dc75ec74136a9d5c42e5ba5e328b6d1f6aa3a94c3e468d9a6 + checksum: 10/bbac479d193af0ab175d49d0041376c040c42c870f69d3e479cf617d24d5aa94aab736b7ebcdc50464bd0b4886e3992a36dd638ba67183895bd3451f41875ae3 languageName: node linkType: hard -"@libp2p/interface@npm:2.11.0": - version: 2.11.0 - resolution: "@libp2p/interface@npm:2.11.0" +"@libp2p/interface@npm:3.1.1": + version: 3.1.1 + resolution: "@libp2p/interface@npm:3.1.1" dependencies: "@multiformats/dns": "npm:^1.0.6" - "@multiformats/multiaddr": "npm:^12.4.4" - it-pushable: "npm:^3.2.3" - it-stream-types: "npm:^2.0.2" + "@multiformats/multiaddr": "npm:^13.0.1" main-event: "npm:^1.0.1" - multiformats: "npm:^13.3.6" + multiformats: "npm:^13.4.0" progress-events: "npm:^1.0.1" uint8arraylist: "npm:^2.4.8" - checksum: 10/7609fc0f8f7bf1956370287d9e8764e8a80e004a1846071460295794a6d6c76c5a6c84502359017c2bdeda31eff20b2948def05e794a9c06135179a68311a4ee + checksum: 10/1eef869f7537668a81d187bc8a65f5549139ef737323dc4da954b8d11e93f9beb15b9b183501a91e3a3a294f5f273b21f5d5f8645f4eb9b1d88b9623aacc6b11 languageName: node linkType: hard -"@libp2p/keychain@npm:^5.2.9": - version: 5.2.9 - resolution: "@libp2p/keychain@npm:5.2.9" +"@libp2p/keychain@npm:^6.0.11": + version: 6.0.11 + resolution: "@libp2p/keychain@npm:6.0.11" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/utils": "npm:^6.7.2" - "@noble/hashes": "npm:^1.8.0" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@noble/hashes": "npm:^2.0.1" asn1js: "npm:^3.0.6" - interface-datastore: "npm:^8.3.1" - multiformats: "npm:^13.3.6" + interface-datastore: "npm:^9.0.1" + multiformats: "npm:^13.4.0" sanitize-filename: "npm:^1.6.3" uint8arrays: "npm:^5.1.0" - checksum: 10/15d29a5f0aa22a01f18de00bc4700c4e8426ba843eebfbdf7aa4ec9d65c639eead15c62e187da5ed0e8cc8322e1357432231e9591cd1ddafffdb6c108fdc2cee + checksum: 10/4e7465497fdd160d12ba2a2bd3640a6b0aeeecd7e76f9296b043635fc2525d35b802f349717af2a8db97663867ce9087d0d233da8b95b0e660bfa318f9743f6d languageName: node linkType: hard -"@libp2p/logger@npm:^5.0.1, @libp2p/logger@npm:^5.2.0": - version: 5.2.0 - resolution: "@libp2p/logger@npm:5.2.0" +"@libp2p/logger@npm:^6.0.0, @libp2p/logger@npm:^6.2.3": + version: 6.2.3 + resolution: "@libp2p/logger@npm:6.2.3" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@multiformats/multiaddr": "npm:^12.4.4" - interface-datastore: "npm:^8.3.1" - multiformats: "npm:^13.3.6" - weald: "npm:^1.0.4" - checksum: 10/29e5d2ad6af811bdb7ce0c2d61c61dc96380b05c8f6dce80f424ebab44de18786f9c81305bcaf6d06f6b8d6a2ba7aaa69c126c5f527d2ce5ae0b9c731e8cb565 + "@libp2p/interface": "npm:^3.1.1" + "@multiformats/multiaddr": "npm:^13.0.1" + interface-datastore: "npm:^9.0.1" + multiformats: "npm:^13.4.0" + weald: "npm:^1.1.0" + checksum: 10/a216365fd0a941ae045a9a223089ec996aeccaf5c37ec4262d3cf4f06a57edebb8bf3138ea882e480858e228252e258c223ee79672912744b6c0e3b538ef66f2 languageName: node linkType: hard -"@libp2p/multistream-select@npm:^6.0.29": - version: 6.0.29 - resolution: "@libp2p/multistream-select@npm:6.0.29" +"@libp2p/multistream-select@npm:^7.0.14": + version: 7.0.14 + resolution: "@libp2p/multistream-select@npm:7.0.14" dependencies: - "@libp2p/interface": "npm:^2.11.0" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/utils": "npm:^7.0.14" it-length-prefixed: "npm:^10.0.1" - it-length-prefixed-stream: "npm:^2.0.2" - it-stream-types: "npm:^2.0.2" - p-defer: "npm:^4.0.1" - race-signal: "npm:^1.1.3" - uint8-varint: "npm:^2.0.4" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/72378bf852cb5c4305b3aa89122a24571866e887d387d6e239a6732c173914018bf7e39577b2a773452e546c00805ae407a15c9920081748d48e38ec5c04e489 + checksum: 10/73d89bfde71f3ef9bf0c24af96d8062aa7b296d32a26f08c0da0f80172de1ea40054bb5cccc5adc1dfd7374e7aafff99e089b0a61d51b7efc5522b1fdddce037 languageName: node linkType: hard -"@libp2p/peer-collections@npm:^6.0.35": - version: 6.0.35 - resolution: "@libp2p/peer-collections@npm:6.0.35" +"@libp2p/peer-collections@npm:^7.0.14": + version: 7.0.14 + resolution: "@libp2p/peer-collections@npm:7.0.14" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/utils": "npm:^6.7.2" - multiformats: "npm:^13.3.6" - checksum: 10/166c68a25ea98af2a6349e77b77ad49ecf1390633e710d6e8c5b21104e42f0fe3ec95d21d7a3bf5d19dfd35efae69325f554f646cce88e8ef0bc954ce5b38951 + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/utils": "npm:^7.0.14" + multiformats: "npm:^13.4.0" + checksum: 10/5b71bcfdffadf7fdf241c0bf4346b6db133acc2049aafa86b24bcd7171bb6c607340b48abb9e57cc464f397c09b64aaa5b2ef83b715102f0b5296bce2fb322bb languageName: node linkType: hard -"@libp2p/peer-id@npm:5.1.9, @libp2p/peer-id@npm:^5.0.0, @libp2p/peer-id@npm:^5.1.9": - version: 5.1.9 - resolution: "@libp2p/peer-id@npm:5.1.9" +"@libp2p/peer-id@npm:6.0.5, @libp2p/peer-id@npm:^6.0.0, @libp2p/peer-id@npm:^6.0.4, @libp2p/peer-id@npm:^6.0.5": + version: 6.0.5 + resolution: "@libp2p/peer-id@npm:6.0.5" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - multiformats: "npm:^13.3.6" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + multiformats: "npm:^13.4.0" uint8arrays: "npm:^5.1.0" - checksum: 10/ff2257d7237eddbae3e0e48364544b6877d475c657265bed6fd007253536afb797e337493e2cb2061c8017c3cb875f4be63b6566eac7bbf7bde831b64a987112 + checksum: 10/06838738eb75a7d82bdac4cab95b9365bf13dbbdcba623cc2d64417d0c0f3ceac706fb8987d618548727a69c785da32bddc2c484a31489e88a1d1a649e9e3128 languageName: node linkType: hard -"@libp2p/peer-record@npm:^8.0.35": - version: 8.0.35 - resolution: "@libp2p/peer-record@npm:8.0.35" +"@libp2p/peer-record@npm:^9.0.6": + version: 9.0.6 + resolution: "@libp2p/peer-record@npm:9.0.6" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - multiformats: "npm:^13.3.6" - protons-runtime: "npm:^5.5.0" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/peer-id": "npm:^6.0.5" + "@multiformats/multiaddr": "npm:^13.0.1" + multiformats: "npm:^13.4.0" + protons-runtime: "npm:^6.0.1" uint8-varint: "npm:^2.0.4" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/256fb905ad7abc000a9161db991ad113b3db1dbdc9a030e931442def6c10fcd37e2bd3fd08cfe66a32a5cf3886e23c325407cbc9593b52571a5f0f629a18a650 + checksum: 10/3b9560a5eacf8718b36e63b7c7b0ed82b52466e6c26964893de4851cccde5c24f46fb0733b2150dfadf757feacb9e2625da10fd513f1e7bd9203d0695a039ce4 languageName: node linkType: hard -"@libp2p/peer-store@npm:^11.2.7": - version: 11.2.7 - resolution: "@libp2p/peer-store@npm:11.2.7" +"@libp2p/peer-store@npm:^12.0.14": + version: 12.0.14 + resolution: "@libp2p/peer-store@npm:12.0.14" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/peer-collections": "npm:^6.0.35" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/peer-record": "npm:^8.0.35" - "@multiformats/multiaddr": "npm:^12.4.4" - interface-datastore: "npm:^8.3.1" - it-all: "npm:^3.0.8" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/peer-collections": "npm:^7.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/peer-record": "npm:^9.0.6" + "@multiformats/multiaddr": "npm:^13.0.1" + interface-datastore: "npm:^9.0.1" + it-all: "npm:^3.0.9" main-event: "npm:^1.0.1" - mortice: "npm:^3.2.1" - multiformats: "npm:^13.3.6" - protons-runtime: "npm:^5.5.0" + mortice: "npm:^3.3.1" + multiformats: "npm:^13.4.0" + protons-runtime: "npm:^6.0.1" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/8cc39e20224e90fc0fb1687fe19d010ee5ffb605c1a3ebd5d376d1fd7266cd6a1b4eba35c94b146040cd4b151a5e172a55d4c25f777e05de5243ad10541cf5f5 + checksum: 10/39b79cf77dede2e10633f052860516ff1457e5dd4e68589a81051e7ad88f63583ab60fe6ef460cd40759858bc1b0e0c081a1f5f71ea27f959c00cbf02eb6b5b1 languageName: node linkType: hard -"@libp2p/ping@npm:2.0.37": - version: 2.0.37 - resolution: "@libp2p/ping@npm:2.0.37" +"@libp2p/ping@npm:3.0.14": + version: 3.0.14 + resolution: "@libp2p/ping@npm:3.0.14" dependencies: - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@multiformats/multiaddr": "npm:^12.4.4" - it-byte-stream: "npm:^2.0.2" - main-event: "npm:^1.0.1" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + p-event: "npm:^7.0.0" + race-signal: "npm:^2.0.0" + uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/63ae8f1c264b92fb6f021cf8fe039017c698ad4c6a29b172685c6c94ae747fbbf85ba9204b5581b592569ccb9edf6264dc2ab222e8364fc095731588115c4ae7 + checksum: 10/6ef91d95483553aa71cc35adee3548afefd1929c2907e13e8b8d859a49e307afd59e645f19e76bee65880a7cd7bdd85bf62b902a1c4bb9ee1551eeb47bf900f2 languageName: node linkType: hard -"@libp2p/tcp@npm:10.1.19": - version: 10.1.19 - resolution: "@libp2p/tcp@npm:10.1.19" +"@libp2p/tcp@npm:11.0.14": + version: 11.0.14 + resolution: "@libp2p/tcp@npm:11.0.14" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" - "@types/sinon": "npm:^17.0.4" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" + "@types/sinon": "npm:^20.0.0" main-event: "npm:^1.0.1" - p-defer: "npm:^4.0.1" - p-event: "npm:^6.0.1" + p-event: "npm:^7.0.0" progress-events: "npm:^1.0.1" - race-event: "npm:^1.3.0" - stream-to-it: "npm:^1.0.1" - checksum: 10/a8e2c3833dc44d086b1521fc88d29005157cd21407b9a18e62a1bf646ff9c3b4381dc77f5fd8fd88067baaa577dab073aae6eb6e8b0788c1f876e0132ccc9655 + uint8arraylist: "npm:^2.4.8" + checksum: 10/bb2a2ae313f81bb328ec9510ef44e03178c94d68b05057059c6c8ded17d226b8cf5694609cd2b88c55c15ae45898e8ecf711c37285029ac200ac8cfa3bc97aba languageName: node linkType: hard -"@libp2p/utils@npm:^6.0.0, @libp2p/utils@npm:^6.7.1, @libp2p/utils@npm:^6.7.2": - version: 6.7.2 - resolution: "@libp2p/utils@npm:6.7.2" +"@libp2p/utils@npm:7.0.14, @libp2p/utils@npm:^7.0.0, @libp2p/utils@npm:^7.0.11, @libp2p/utils@npm:^7.0.14": + version: 7.0.14 + resolution: "@libp2p/utils@npm:7.0.14" dependencies: "@chainsafe/is-ip": "npm:^2.1.0" "@chainsafe/netmask": "npm:^2.0.0" - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/logger": "npm:^5.2.0" - "@multiformats/multiaddr": "npm:^12.4.4" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/logger": "npm:^6.2.3" + "@multiformats/multiaddr": "npm:^13.0.1" "@sindresorhus/fnv1a": "npm:^3.1.0" any-signal: "npm:^4.1.1" - delay: "npm:^6.0.0" - get-iterator: "npm:^2.0.1" + cborg: "npm:^4.2.14" + delay: "npm:^7.0.0" is-loopback-addr: "npm:^2.0.2" - is-plain-obj: "npm:^4.1.0" - it-foreach: "npm:^2.1.3" + it-length-prefixed: "npm:^10.0.1" it-pipe: "npm:^3.0.1" it-pushable: "npm:^3.2.3" it-stream-types: "npm:^2.0.2" main-event: "npm:^1.0.1" netmask: "npm:^2.0.2" p-defer: "npm:^4.0.1" - race-event: "npm:^1.3.0" - race-signal: "npm:^1.1.3" + p-event: "npm:^7.0.0" + race-signal: "npm:^2.0.0" + uint8-varint: "npm:^2.0.4" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/5bb8636717216d095efc3e857f939c5cc9f5ad3170bdedec7f5dc2cbfe5edb3ea18a78ad9f406c2c1223149340a231d386040dbe40838d97456dcfb0f97126fd + checksum: 10/091baf01498983f93fea17be07e9f2eff9bc7edca85f8922d9720ac0ce5047afd68e80c0f46bc37d2867e9b7e6fbb3f47d0dbab185675c7b8949fc34aa49cd65 languageName: node linkType: hard -"@libp2p/webrtc@npm:5.2.24": - version: 5.2.24 - resolution: "@libp2p/webrtc@npm:5.2.24" +"@libp2p/webrtc@npm:6.0.15": + version: 6.0.15 + resolution: "@libp2p/webrtc@npm:6.0.15" dependencies: "@chainsafe/is-ip": "npm:^2.1.0" - "@chainsafe/libp2p-noise": "npm:^16.1.3" - "@ipshipyard/node-datachannel": "npm:^0.26.6" - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/keychain": "npm:^5.2.9" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" + "@chainsafe/libp2p-noise": "npm:^17.0.0" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/keychain": "npm:^6.0.11" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" "@peculiar/webcrypto": "npm:^1.5.0" - "@peculiar/x509": "npm:^1.12.3" - any-signal: "npm:^4.1.1" + "@peculiar/x509": "npm:^1.13.0" detect-browser: "npm:^5.3.0" get-port: "npm:^7.1.0" - interface-datastore: "npm:^8.3.1" + interface-datastore: "npm:^9.0.1" it-length-prefixed: "npm:^10.0.1" - it-protobuf-stream: "npm:^2.0.2" + it-protobuf-stream: "npm:^2.0.3" it-pushable: "npm:^3.2.3" it-stream-types: "npm:^2.0.2" main-event: "npm:^1.0.1" - multiformats: "npm:^13.3.6" + multiformats: "npm:^13.4.0" + node-datachannel: "npm:^0.29.0" p-defer: "npm:^4.0.1" - p-timeout: "npm:^6.1.4" - p-wait-for: "npm:^5.0.2" + p-event: "npm:^7.0.0" + p-timeout: "npm:^7.0.0" + p-wait-for: "npm:^6.0.0" progress-events: "npm:^1.0.1" - protons-runtime: "npm:^5.5.0" - race-event: "npm:^1.3.0" - race-signal: "npm:^1.1.3" - react-native-webrtc: "npm:^124.0.5" + protons-runtime: "npm:^6.0.1" + race-signal: "npm:^2.0.0" + react-native-webrtc: "npm:^124.0.6" uint8-varint: "npm:^2.0.4" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/1c9cb4120c0989097a1778179f3f83b7109ce5bedf5307f0faeb8b3fae34851c0fb26594b6e37f81de5518e5ea7812b2a62852e3188a594f0349cc204c947db6 + checksum: 10/154ea6c79d53d37b64e67d26266a76fd0096d6990b28667dca9f949b75fe3b3e3b2e51e01a0e9e788a9aee6653a1b3f65bc960a3ea444d7adbbd7e22e98d27bb languageName: node linkType: hard -"@libp2p/websockets@npm:9.2.19": - version: 9.2.19 - resolution: "@libp2p/websockets@npm:9.2.19" +"@libp2p/websockets@npm:10.1.7": + version: 10.1.7 + resolution: "@libp2p/websockets@npm:10.1.7" dependencies: - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" - "@multiformats/multiaddr-to-uri": "npm:^11.0.0" - "@types/ws": "npm:^8.18.1" - it-ws: "npm:^6.1.5" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" + "@multiformats/multiaddr-to-uri": "npm:^12.0.0" main-event: "npm:^1.0.1" - p-defer: "npm:^4.0.1" - p-event: "npm:^6.0.1" + p-event: "npm:^7.0.0" progress-events: "npm:^1.0.1" - race-signal: "npm:^1.1.3" - ws: "npm:^8.18.2" - checksum: 10/81e35386ba8c07be8811dc828cf934ccd1eadaa79eb61a49c84b8a1fdaf7f79bc3a2077e3749a07b3a191d71f52e31d681fe6386f004da967b6bd4940aa255ae + uint8arraylist: "npm:^2.4.8" + uint8arrays: "npm:^5.1.0" + ws: "npm:^8.18.3" + checksum: 10/22be9a836fd58808161cdb8b0f741ddaaf886339998c0d3ea065b3b0ecead5677b866f9029664345fa254c9fccfff2c56e350a6c7f3e58b81438ea6fd5314f88 languageName: node linkType: hard -"@libp2p/webtransport@npm:5.0.51": - version: 5.0.51 - resolution: "@libp2p/webtransport@npm:5.0.51" +"@libp2p/webtransport@npm:6.0.16": + version: 6.0.16 + resolution: "@libp2p/webtransport@npm:6.0.16" dependencies: - "@chainsafe/libp2p-noise": "npm:^16.1.3" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/utils": "npm:^6.7.2" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" - it-stream-types: "npm:^2.0.2" + "@chainsafe/libp2p-noise": "npm:^17.0.0" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/utils": "npm:^7.0.14" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" multiformats: "npm:^13.3.6" progress-events: "npm:^1.0.1" - race-signal: "npm:^1.1.3" + race-signal: "npm:^2.0.0" uint8arraylist: "npm:^2.4.8" uint8arrays: "npm:^5.1.0" - checksum: 10/c57541ca550808291919141fb1c4170a0c362aded88e91718414718e198c568d27105b674ed6c33b00a869cdd7ab8e4ba9e85e1ba901e10a759a115cc7c767b4 + checksum: 10/86c6bf9928ecbe3b641100ea57cd3b8a4cc50ed019fe80bf7e289806b188d0f30f1a1a5f433ab1bff9fe76b434e360c780692deb349fef7d840362af98f5e799 languageName: node linkType: hard @@ -2551,7 +2501,7 @@ __metadata: resolution: "@metamask/kernel-errors@workspace:packages/kernel-errors" dependencies: "@arethetypeswrong/cli": "npm:^0.17.4" - "@libp2p/interface": "npm:2.11.0" + "@libp2p/interface": "npm:3.1.1" "@metamask/auto-changelog": "npm:^5.3.0" "@metamask/eslint-config": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" @@ -2592,13 +2542,13 @@ __metadata: resolution: "@metamask/kernel-node-runtime@workspace:packages/kernel-node-runtime" dependencies: "@arethetypeswrong/cli": "npm:^0.17.4" - "@chainsafe/libp2p-quic": "npm:^1.1.8" + "@chainsafe/libp2p-quic": "npm:^2.0.1" "@endo/captp": "npm:^4.4.8" "@endo/eventual-send": "npm:^1.3.4" "@endo/promise-kit": "npm:^1.1.13" - "@libp2p/interface": "npm:2.11.0" - "@libp2p/tcp": "npm:10.1.19" - "@libp2p/webrtc": "npm:5.2.24" + "@libp2p/interface": "npm:3.1.1" + "@libp2p/tcp": "npm:11.0.14" + "@libp2p/webrtc": "npm:6.0.15" "@metamask/auto-changelog": "npm:^5.3.0" "@metamask/eslint-config": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" @@ -2757,7 +2707,7 @@ __metadata: vite: "npm:^7.3.0" vitest: "npm:^4.0.16" peerDependencies: - "@libp2p/webrtc": 5.2.24 + "@libp2p/webrtc": 6.0.15 languageName: unknown linkType: soft @@ -2869,21 +2819,21 @@ __metadata: resolution: "@metamask/kernel-utils@workspace:packages/kernel-utils" dependencies: "@arethetypeswrong/cli": "npm:^0.17.4" - "@chainsafe/libp2p-noise": "npm:^16.1.3" - "@chainsafe/libp2p-yamux": "npm:7.0.4" + "@chainsafe/libp2p-noise": "npm:^17.0.0" + "@chainsafe/libp2p-yamux": "npm:8.0.1" "@endo/captp": "npm:^4.4.8" "@endo/errors": "npm:^1.2.13" "@endo/exo": "npm:^1.5.12" "@endo/patterns": "npm:^1.7.0" "@endo/promise-kit": "npm:^1.1.13" - "@libp2p/autonat": "npm:2.0.38" - "@libp2p/circuit-relay-v2": "npm:3.2.24" - "@libp2p/crypto": "npm:5.1.8" - "@libp2p/identify": "npm:3.0.39" - "@libp2p/interface": "npm:2.11.0" - "@libp2p/ping": "npm:2.0.37" - "@libp2p/tcp": "npm:10.1.19" - "@libp2p/websockets": "npm:9.2.19" + "@libp2p/autonat": "npm:3.0.14" + "@libp2p/circuit-relay-v2": "npm:4.1.7" + "@libp2p/crypto": "npm:5.1.14" + "@libp2p/identify": "npm:4.0.14" + "@libp2p/interface": "npm:3.1.1" + "@libp2p/ping": "npm:3.0.14" + "@libp2p/tcp": "npm:11.0.14" + "@libp2p/websockets": "npm:10.1.7" "@metamask/auto-changelog": "npm:^5.3.0" "@metamask/eslint-config": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" @@ -2909,8 +2859,7 @@ __metadata: eslint-plugin-prettier: "npm:^5.2.6" eslint-plugin-promise: "npm:^7.2.1" jsdom: "npm:^27.4.0" - libp2p: "npm:2.10.0" - patch-package: "npm:^8.0.0" + libp2p: "npm:3.1.7" prettier: "npm:^3.5.3" rimraf: "npm:^6.0.1" ses: "npm:^1.14.0" @@ -2922,7 +2871,6 @@ __metadata: vitest: "npm:^4.0.16" peerDependencies: acorn: ^8.15.0 - patch-package: ^8.0.0 vite: ^7.3.0 peerDependenciesMeta: acorn: @@ -3018,23 +2966,24 @@ __metadata: resolution: "@metamask/ocap-kernel@workspace:packages/ocap-kernel" dependencies: "@agoric/swingset-liveslots": "npm:0.10.3-u21.0.1" - "@chainsafe/libp2p-noise": "npm:^16.1.3" - "@chainsafe/libp2p-yamux": "npm:7.0.4" + "@chainsafe/libp2p-noise": "npm:^17.0.0" + "@chainsafe/libp2p-yamux": "npm:8.0.1" "@endo/errors": "npm:^1.2.13" "@endo/eventual-send": "npm:^1.3.4" "@endo/marshal": "npm:^1.8.0" "@endo/pass-style": "npm:^1.6.3" "@endo/promise-kit": "npm:^1.1.13" - "@libp2p/bootstrap": "npm:11.0.47" - "@libp2p/circuit-relay-v2": "npm:3.2.24" - "@libp2p/crypto": "npm:5.1.8" - "@libp2p/identify": "npm:3.0.39" - "@libp2p/interface": "npm:2.11.0" - "@libp2p/peer-id": "npm:5.1.9" - "@libp2p/ping": "npm:2.0.37" - "@libp2p/webrtc": "npm:5.2.24" - "@libp2p/websockets": "npm:9.2.19" - "@libp2p/webtransport": "npm:5.0.51" + "@libp2p/bootstrap": "npm:12.0.15" + "@libp2p/circuit-relay-v2": "npm:4.1.7" + "@libp2p/crypto": "npm:5.1.14" + "@libp2p/identify": "npm:4.0.14" + "@libp2p/interface": "npm:3.1.1" + "@libp2p/peer-id": "npm:6.0.5" + "@libp2p/ping": "npm:3.0.14" + "@libp2p/utils": "npm:7.0.14" + "@libp2p/webrtc": "npm:6.0.15" + "@libp2p/websockets": "npm:10.1.7" + "@libp2p/webtransport": "npm:6.0.16" "@metamask/auto-changelog": "npm:^5.3.0" "@metamask/eslint-config": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" @@ -3049,7 +2998,7 @@ __metadata: "@metamask/streams": "workspace:^" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.9.0" - "@multiformats/multiaddr": "npm:^12.4.4" + "@multiformats/multiaddr": "npm:^13.0.1" "@ocap/repo-tools": "workspace:^" "@scure/bip39": "npm:^2.0.1" "@ts-bridge/cli": "npm:^0.6.3" @@ -3066,8 +3015,7 @@ __metadata: eslint-plugin-n: "npm:^17.17.0" eslint-plugin-prettier: "npm:^5.2.6" eslint-plugin-promise: "npm:^7.2.1" - it-byte-stream: "npm:^2.0.1" - libp2p: "npm:2.10.0" + libp2p: "npm:3.1.7" multiformats: "npm:^13.3.6" prettier: "npm:^3.5.3" rimraf: "npm:^6.0.1" @@ -3509,45 +3457,33 @@ __metadata: languageName: node linkType: hard -"@multiformats/mafmt@npm:^12.1.6": - version: 12.1.6 - resolution: "@multiformats/mafmt@npm:12.1.6" - dependencies: - "@multiformats/multiaddr": "npm:^12.0.0" - checksum: 10/53492ea6332e0d65a7952358b4ec67c9e07f10cc771886295820b14678786e74ee80ba94b779e308796e9298c14acccc910179a5458ac92a4b5d08155dbfec52 - languageName: node - linkType: hard - -"@multiformats/multiaddr-matcher@npm:^2.0.0, @multiformats/multiaddr-matcher@npm:^2.0.1": - version: 2.0.2 - resolution: "@multiformats/multiaddr-matcher@npm:2.0.2" +"@multiformats/multiaddr-matcher@npm:^3.0.1": + version: 3.0.1 + resolution: "@multiformats/multiaddr-matcher@npm:3.0.1" dependencies: - "@multiformats/multiaddr": "npm:^12.0.0" - checksum: 10/e757a5d32d8a2dd354ecc252bd3a20f4c284b8b4cd2d4504a589e42c9ff9b4ad209493ab1f6ce848e451a7a0ee221a8ff0526f3f6a0dcf6235b7a6e9dc6ad431 + "@multiformats/multiaddr": "npm:^13.0.0" + checksum: 10/4778cd268b7acb604d9edbe4316dd68e648e5711a5b35cdb0db181e28d7dc75263331e7fce2fb43c20977bea059df77542ab18dd2817f42e35e61723794e0421 languageName: node linkType: hard -"@multiformats/multiaddr-to-uri@npm:11.0.2": - version: 11.0.2 - resolution: "@multiformats/multiaddr-to-uri@npm:11.0.2" +"@multiformats/multiaddr-to-uri@npm:12.0.0": + version: 12.0.0 + resolution: "@multiformats/multiaddr-to-uri@npm:12.0.0" dependencies: - "@multiformats/multiaddr": "npm:^12.3.0" - checksum: 10/a6bebe6766f424106315d99233f217766cfcd0b3c5322a4a093c49c5e974275fa304f2a1845184620de986c9d1ce72f1f01d5e1ca92cd23b593c9289d07abbd6 + "@multiformats/multiaddr": "npm:^13.0.0" + checksum: 10/bd34de3ebcedeff0f5b2ba7354c65cbcd725b078e98f0ecdd68248e52c385c74addf14d3100a7f4828f09a319b7076b762a9329dab97e18d25a4977e1ef7a9c2 languageName: node linkType: hard -"@multiformats/multiaddr@npm:12.5.1": - version: 12.5.1 - resolution: "@multiformats/multiaddr@npm:12.5.1" +"@multiformats/multiaddr@npm:13.0.1": + version: 13.0.1 + resolution: "@multiformats/multiaddr@npm:13.0.1" dependencies: "@chainsafe/is-ip": "npm:^2.0.1" - "@chainsafe/netmask": "npm:^2.0.0" - "@multiformats/dns": "npm:^1.0.3" - abort-error: "npm:^1.0.1" multiformats: "npm:^13.0.0" uint8-varint: "npm:^2.0.1" uint8arrays: "npm:^5.0.0" - checksum: 10/3db0235ea276f4be55a606501ea240e48f39705a4e98a262d25ccd6eeb5e2adbf1ccb24452f8b2f5cf41cda5450ecda237920b672aee0e3e6033f3d56bc0d071 + checksum: 10/c142fc5b3f491877f6ec27b2983a1ace5a113a5052aadb87e2f9b9ebf2a29558dd1f9f28c00fef47cb27dbc25cb6f7c2bdf29d2d818041fb124ab588eccac91f languageName: node linkType: hard @@ -3562,13 +3498,20 @@ __metadata: languageName: node linkType: hard -"@noble/ciphers@npm:^1.1.3, @noble/ciphers@npm:^1.3.0": +"@noble/ciphers@npm:^1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" checksum: 10/051660051e3e9e2ca5fb9dece2885532b56b7e62946f89afa7284a0fb8bc02e2bd1c06554dba68162ff42d295b54026456084198610f63c296873b2f1cd7a586 languageName: node linkType: hard +"@noble/ciphers@npm:^2.0.1": + version: 2.1.1 + resolution: "@noble/ciphers@npm:2.1.1" + checksum: 10/efca189b2719ed7309616a6824328d713bd37156e1bcead453725e51fc93311fb2f54e4d46bef0391fa17ce18bd9c2364511290774504a8600264b572f6a1db5 + languageName: node + linkType: hard + "@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" @@ -3587,7 +3530,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.1.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:^1.9.1, @noble/curves@npm:^1.9.7, @noble/curves@npm:~1.9.0": +"@noble/curves@npm:^1.2.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:^1.9.7, @noble/curves@npm:~1.9.0": version: 1.9.7 resolution: "@noble/curves@npm:1.9.7" dependencies: @@ -3766,56 +3709,6 @@ __metadata: languageName: node linkType: hard -"@ocap/brow-2-brow@workspace:packages/brow-2-brow": - version: 0.0.0-use.local - resolution: "@ocap/brow-2-brow@workspace:packages/brow-2-brow" - dependencies: - "@chainsafe/libp2p-noise": "npm:^16.1.3" - "@chainsafe/libp2p-yamux": "npm:7.0.4" - "@libp2p/autonat": "npm:2.0.38" - "@libp2p/bootstrap": "npm:11.0.47" - "@libp2p/circuit-relay-v2": "npm:3.2.24" - "@libp2p/crypto": "npm:5.1.8" - "@libp2p/identify": "npm:3.0.39" - "@libp2p/interface": "npm:2.11.0" - "@libp2p/peer-id": "npm:5.1.9" - "@libp2p/ping": "npm:2.0.37" - "@libp2p/tcp": "npm:10.1.19" - "@libp2p/webrtc": "npm:5.2.24" - "@libp2p/websockets": "npm:9.2.19" - "@libp2p/webtransport": "npm:5.0.51" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" - "@ocap/repo-tools": "workspace:^" - "@ts-bridge/cli": "npm:^0.6.3" - "@ts-bridge/shims": "npm:^0.1.1" - "@types/node": "npm:^22.13.1" - "@typescript-eslint/eslint-plugin": "npm:^8.29.0" - "@typescript-eslint/parser": "npm:^8.29.0" - "@typescript-eslint/utils": "npm:^8.29.0" - depcheck: "npm:^1.4.7" - esbuild: "npm:^0.25.3" - eslint: "npm:^9.23.0" - eslint-config-prettier: "npm:^10.1.1" - eslint-import-resolver-typescript: "npm:^4.3.1" - eslint-plugin-import-x: "npm:^4.10.0" - eslint-plugin-jsdoc: "npm:^50.6.9" - eslint-plugin-n: "npm:^17.17.0" - eslint-plugin-prettier: "npm:^5.2.6" - eslint-plugin-promise: "npm:^7.2.1" - it-byte-stream: "npm:^2.0.1" - libp2p: "npm:2.10.0" - prettier: "npm:^3.5.3" - rimraf: "npm:^6.0.1" - ses: "npm:^1.14.0" - turbo: "npm:^2.5.6" - typescript: "npm:~5.8.2" - typescript-eslint: "npm:^8.29.0" - uint8arrays: "npm:^5.1.0" - vitest: "npm:^4.0.16" - languageName: unknown - linkType: soft - "@ocap/create-package@workspace:packages/create-package": version: 0.0.0-use.local resolution: "@ocap/create-package@workspace:packages/create-package" @@ -4141,8 +4034,8 @@ __metadata: "@endo/marshal": "npm:^1.8.0" "@endo/patterns": "npm:^1.7.0" "@endo/promise-kit": "npm:^1.1.13" - "@libp2p/crypto": "npm:5.1.8" - "@libp2p/peer-id": "npm:5.1.9" + "@libp2p/crypto": "npm:5.1.14" + "@libp2p/peer-id": "npm:6.0.5" "@metamask/eslint-config": "npm:^15.0.0" "@metamask/eslint-config-nodejs": "npm:^15.0.0" "@metamask/eslint-config-typescript": "npm:^15.0.0" @@ -4736,129 +4629,129 @@ __metadata: languageName: node linkType: hard -"@peculiar/asn1-cms@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-cms@npm:2.5.0" +"@peculiar/asn1-cms@npm:^2.6.0, @peculiar/asn1-cms@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-cms@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" - "@peculiar/asn1-x509-attr": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + "@peculiar/asn1-x509-attr": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/cb2f2efb26d324fd3732fac5296b48e7bb6e7d960c5d4d3a0240d1e323f06df2d37ffd9f90f5197172ff36433b92e805bcda82df8e42b34c4cfc2aa8de059e0b + checksum: 10/e431f6229b98c63a929538d266488e8c2dddc895936117da8f9ec775558e08c20ded6a4adcca4bb88bfea282e7204d4f6bba7a46da2cced162c174e1e6964f36 languageName: node linkType: hard -"@peculiar/asn1-csr@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-csr@npm:2.5.0" +"@peculiar/asn1-csr@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-csr@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/a08a278443626ac29fdd0bbfd76022f24f6f42b1e29a012f3436c6a13de4cffa89dd1fc09ea0d35960ff51e8daa8901603b2cf285d595ae7d605b4d6bdb36abe + checksum: 10/4ac2f1c3a2cb392fcdd5aa602140abe90f849af0a9e8296aab9aaf1712ee2e0c4f5fa86b0fe83975e771b0aba91fc848670f9c2008ea1e850c849fae6e181179 languageName: node linkType: hard -"@peculiar/asn1-ecc@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-ecc@npm:2.5.0" +"@peculiar/asn1-ecc@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-ecc@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/0d530f2c4011a38e74e08b5cdf0a8604ed5104e0a5c0cd9aca6df4e0bb350da9eb86e12e90e6b7e1baedc9297c9fce6753d069a864c7ad43f4518b0f8e5e0fee + checksum: 10/baa646c1c86283d5876230b1cfbd80cf42f97b3bb8d8b23cd5830f6f8d6466e6a06887c6838f3c4c61c87df9ffd2abe905f555472e8e70d722ce964a8074d838 languageName: node linkType: hard -"@peculiar/asn1-pfx@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-pfx@npm:2.5.0" +"@peculiar/asn1-pfx@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pfx@npm:2.6.1" dependencies: - "@peculiar/asn1-cms": "npm:^2.5.0" - "@peculiar/asn1-pkcs8": "npm:^2.5.0" - "@peculiar/asn1-rsa": "npm:^2.5.0" - "@peculiar/asn1-schema": "npm:^2.5.0" + "@peculiar/asn1-cms": "npm:^2.6.1" + "@peculiar/asn1-pkcs8": "npm:^2.6.1" + "@peculiar/asn1-rsa": "npm:^2.6.1" + "@peculiar/asn1-schema": "npm:^2.6.0" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/c5414ad96b4e16fef6c80ebf98f072207513e5f78d0a33df1389515c6f3356a0246d50dda01f8e291064acef57a254c5ec23d7d302ae744e2813bd8b6a2d0841 + checksum: 10/50adc7db96928d98b85a1a2e6765ba1d4ec708f937b8172ea6a22e3b92137ea36d656aded64b3be661db39f924102c5a80da54ee647e2441af3bc19c55a183ef languageName: node linkType: hard -"@peculiar/asn1-pkcs8@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-pkcs8@npm:2.5.0" +"@peculiar/asn1-pkcs8@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs8@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/66c9524629410d504779e8432788794dc75419a0d1e7c420345a8bcc5d0eb36d9832a07c234d464d20a572ad5dd912bc5d1cd56b2e2787c2ca6315c728498a4f + checksum: 10/99c4326da30e7ef17bb8e92d8a9525b78c101e4d743493000e220f3da6bbc4755371f1dbcc2a36951fb15769c2efead20d90a08918fd268c21bebcac26e71053 languageName: node linkType: hard -"@peculiar/asn1-pkcs9@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-pkcs9@npm:2.5.0" - dependencies: - "@peculiar/asn1-cms": "npm:^2.5.0" - "@peculiar/asn1-pfx": "npm:^2.5.0" - "@peculiar/asn1-pkcs8": "npm:^2.5.0" - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" - "@peculiar/asn1-x509-attr": "npm:^2.5.0" +"@peculiar/asn1-pkcs9@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs9@npm:2.6.1" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.1" + "@peculiar/asn1-pfx": "npm:^2.6.1" + "@peculiar/asn1-pkcs8": "npm:^2.6.1" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + "@peculiar/asn1-x509-attr": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/a597a1eaa20fe2eac0ef2e5bda67245b4ffceb8f2e1009007477add655c1fae0faedc68a816de2aa2d5f3b5ec1d597b19b839e1eb0ef42281785cdff1d7927ed + checksum: 10/61759a50d6adf108a0376735b2e76cdfc9c41db39a7abed23ca332f7699d831aa6324534aa38153018a31e6ee5e8fef85534c92b68067f6afcb90787e953c449 languageName: node linkType: hard -"@peculiar/asn1-rsa@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-rsa@npm:2.5.0" +"@peculiar/asn1-rsa@npm:^2.6.0, @peculiar/asn1-rsa@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-rsa@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/5a5db66832dadfee08df1c12a214ac82ec52a0f1bdd707fe4802d3204064671beb5c8fd748c299aad457190a73b0fd86aef9e1eb0f4778ce13957533b074c2a5 + checksum: 10/e91efe57017feac71c69ee5950e9c323b45aaf10baa32153fe88f237948f9d906ba04c645d085c4293c90440cad95392a91b3760251cd0ebc8e4c1a383fc331a languageName: node linkType: hard -"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8, @peculiar/asn1-schema@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-schema@npm:2.5.0" +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8, @peculiar/asn1-schema@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-schema@npm:2.6.0" dependencies: asn1js: "npm:^3.0.6" pvtsutils: "npm:^1.3.6" tslib: "npm:^2.8.1" - checksum: 10/6256d0ecd30a091df95dcecbd1c8fb4d0da355c84bf4306f1a2232d318d2fe6f398333f72e1f05c44eedfe9be807900ac87eeebda3276fbca5a0505d5435ce7a + checksum: 10/af9b1094d0e020f0fd828777488578322d62a41f597ead7d80939dafcfe35b672fcb0ec7460ef66b2a155f9614d4340a98896d417a830aff1685cb4c21d5bbe4 languageName: node linkType: hard -"@peculiar/asn1-x509-attr@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-x509-attr@npm:2.5.0" +"@peculiar/asn1-x509-attr@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509-attr@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" asn1js: "npm:^3.0.6" tslib: "npm:^2.8.1" - checksum: 10/f802d2a97cec844d833cd1e74030260aaeab937f0a787994ccfe86a66bece1a21fd69b0a4bab89ba92586569d9e764e939ad5b09e2c70af03102af707de155f4 + checksum: 10/86f7d5495459dee81daadd830ebb7d26ec15a98f6479c88b90a915ac9f28105b0d5003ba0c382b4aa8f7fa42e399f7cc37e4fe73c26cbaacd47e63a50b132e25 languageName: node linkType: hard -"@peculiar/asn1-x509@npm:^2.5.0": - version: 2.5.0 - resolution: "@peculiar/asn1-x509@npm:2.5.0" +"@peculiar/asn1-x509@npm:^2.6.0, @peculiar/asn1-x509@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509@npm:2.6.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.5.0" + "@peculiar/asn1-schema": "npm:^2.6.0" asn1js: "npm:^3.0.6" pvtsutils: "npm:^1.3.6" tslib: "npm:^2.8.1" - checksum: 10/d9bcaec630ef2e378395b16cd30de5e8c0dba4ffbdd394d69a7cbc712693f9d87f6005194fa8dd32199f9b600f6b1a6d7ba1c7f4b6948a3ba8551c1daf95b4ea + checksum: 10/e3187ad04d397cdd6a946895a51202b67f57992dfef55e40acc7e7ea325e2854267ed2581c4b1ea729d7147e9e8e6f34af77f1ffb48e3e8b25b2216b213b4641 languageName: node linkType: hard @@ -4884,22 +4777,22 @@ __metadata: languageName: node linkType: hard -"@peculiar/x509@npm:^1.12.3": - version: 1.14.0 - resolution: "@peculiar/x509@npm:1.14.0" +"@peculiar/x509@npm:^1.13.0": + version: 1.14.3 + resolution: "@peculiar/x509@npm:1.14.3" dependencies: - "@peculiar/asn1-cms": "npm:^2.5.0" - "@peculiar/asn1-csr": "npm:^2.5.0" - "@peculiar/asn1-ecc": "npm:^2.5.0" - "@peculiar/asn1-pkcs9": "npm:^2.5.0" - "@peculiar/asn1-rsa": "npm:^2.5.0" - "@peculiar/asn1-schema": "npm:^2.5.0" - "@peculiar/asn1-x509": "npm:^2.5.0" + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-csr": "npm:^2.6.0" + "@peculiar/asn1-ecc": "npm:^2.6.0" + "@peculiar/asn1-pkcs9": "npm:^2.6.0" + "@peculiar/asn1-rsa": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" pvtsutils: "npm:^1.3.6" reflect-metadata: "npm:^0.2.2" tslib: "npm:^2.8.1" tsyringe: "npm:^4.10.0" - checksum: 10/c167a31cd66b1bda9ff0d0de225cf7b94ca50fa4186d6d8d02adfbe3035d9bf7df23ec38ff672f3c0ef890fd353f725f48d587f12ca6cd20c7edb10d7a67e280 + checksum: 10/d37c56fa5f2c644141948d85010e14f0e4963089e3b0b81edd0bfe85bdfea0eb3f38ab6ff20d322db2bd6977117824cc498a77b2d35af111983b4d58b5e2ccd1 languageName: node linkType: hard @@ -5738,13 +5631,6 @@ __metadata: languageName: node linkType: hard -"@types/retry@npm:0.12.2": - version: 0.12.2 - resolution: "@types/retry@npm:0.12.2" - checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a - languageName: node - linkType: hard - "@types/semver@npm:^7.3.6, @types/semver@npm:^7.7.1": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" @@ -5768,12 +5654,12 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:^17.0.4": - version: 17.0.4 - resolution: "@types/sinon@npm:17.0.4" +"@types/sinon@npm:^20.0.0": + version: 20.0.0 + resolution: "@types/sinon@npm:20.0.0" dependencies: "@types/sinonjs__fake-timers": "npm:*" - checksum: 10/286c34e66e3573673ba59a332ac81189e20dd591c5c5360c8ff3ed83a59a60bdb1d4c8f13ab8863a4d5ce636282e4b11c640b87f398663eee152988ca09b1933 + checksum: 10/abb8d86e1d44e1b618b555104a654730844dcb7bfb45bd7f0a83252cdcbcd167f4a0da8bac3dfd60621ad855582a8697cd695104b06c2aa497ecc789004660b7 languageName: node linkType: hard @@ -5798,15 +5684,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.18.1, @types/ws@npm:^8.2.2": - version: 8.18.1 - resolution: "@types/ws@npm:8.18.1" - dependencies: - "@types/node": "npm:*" - checksum: 10/1ce05e3174dcacf28dae0e9b854ef1c9a12da44c7ed73617ab6897c5cbe4fccbb155a20be5508ae9a7dde2f83bd80f5cf3baa386b934fc4b40889ec963e94f3a - languageName: node - linkType: hard - "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -7438,6 +7315,15 @@ __metadata: languageName: node linkType: hard +"cborg@npm:^4.2.14": + version: 4.5.8 + resolution: "cborg@npm:4.5.8" + bin: + cborg: lib/bin.js + checksum: 10/25cfbe5f8034a1f982e1c4d5e1ca7d18183f08f58793c3087160afc0ef385a4f0a5cf3bc26e5976c28ccfbbbe5d914a30c6dc7e0cf9e39f6c4e3056669d036a0 + languageName: node + linkType: hard + "chai@npm:^6.2.1": version: 6.2.2 resolution: "chai@npm:6.2.2" @@ -7998,22 +7884,21 @@ __metadata: languageName: node linkType: hard -"datastore-core@npm:^10.0.2": - version: 10.0.2 - resolution: "datastore-core@npm:10.0.2" - dependencies: - "@libp2p/logger": "npm:^5.0.1" - interface-datastore: "npm:^8.0.0" - interface-store: "npm:^6.0.0" - it-drain: "npm:^3.0.7" - it-filter: "npm:^3.1.1" - it-map: "npm:^3.1.1" - it-merge: "npm:^3.0.5" +"datastore-core@npm:^11.0.1": + version: 11.0.2 + resolution: "datastore-core@npm:11.0.2" + dependencies: + "@libp2p/logger": "npm:^6.0.0" + interface-datastore: "npm:^9.0.0" + interface-store: "npm:^7.0.0" + it-drain: "npm:^3.0.9" + it-filter: "npm:^3.1.3" + it-map: "npm:^3.1.3" + it-merge: "npm:^3.0.11" it-pipe: "npm:^3.0.1" - it-pushable: "npm:^3.2.3" - it-sort: "npm:^3.0.6" - it-take: "npm:^3.0.6" - checksum: 10/6e758c5498d6ac85512c306289e1401f77c98c085c4d2e6bd005153802c8ca42ec456da46efe944d83a2145b86daf457defa17eb3759ca4cea2d504c0825b2bf + it-sort: "npm:^3.0.8" + it-take: "npm:^3.0.8" + checksum: 10/a2ed3ea71d81c20a57fa52a75fd9b0fe417dc4856a88c4ee67af8408187d621f710bcc6d1f9720cc0f6c5f6cd0d42d005ffd64ed1712a22b23744ec57715c9fe languageName: node linkType: hard @@ -8158,10 +8043,13 @@ __metadata: languageName: node linkType: hard -"delay@npm:^6.0.0": - version: 6.0.0 - resolution: "delay@npm:6.0.0" - checksum: 10/e00190cf6e56e3f746af6664a9b7a837a582a70b96ce18d83b86a97300cc9f727189b9f6a7082557134223c0bd23eee88e681cab54cb4e5d8f6b2f4054e7b49a +"delay@npm:^7.0.0": + version: 7.0.0 + resolution: "delay@npm:7.0.0" + dependencies: + random-int: "npm:^3.1.0" + unlimited-timeout: "npm:^0.1.0" + checksum: 10/bb4e53545a3d46c65f785a9fdd8c0fb6ec57f2a5810e1f36bb628f66ae7b361808277ee74cc080ef832ff2836c4dadfd444d1ee014eb39905d7c8eb8055f8203 languageName: node linkType: hard @@ -8710,36 +8598,36 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.25.3, esbuild@npm:~0.25.0": - version: 0.25.11 - resolution: "esbuild@npm:0.25.11" +"esbuild@npm:^0.27.0": + version: 0.27.2 + resolution: "esbuild@npm:0.27.2" dependencies: - "@esbuild/aix-ppc64": "npm:0.25.11" - "@esbuild/android-arm": "npm:0.25.11" - "@esbuild/android-arm64": "npm:0.25.11" - "@esbuild/android-x64": "npm:0.25.11" - "@esbuild/darwin-arm64": "npm:0.25.11" - "@esbuild/darwin-x64": "npm:0.25.11" - "@esbuild/freebsd-arm64": "npm:0.25.11" - "@esbuild/freebsd-x64": "npm:0.25.11" - "@esbuild/linux-arm": "npm:0.25.11" - "@esbuild/linux-arm64": "npm:0.25.11" - "@esbuild/linux-ia32": "npm:0.25.11" - "@esbuild/linux-loong64": "npm:0.25.11" - "@esbuild/linux-mips64el": "npm:0.25.11" - "@esbuild/linux-ppc64": "npm:0.25.11" - "@esbuild/linux-riscv64": "npm:0.25.11" - "@esbuild/linux-s390x": "npm:0.25.11" - "@esbuild/linux-x64": "npm:0.25.11" - "@esbuild/netbsd-arm64": "npm:0.25.11" - "@esbuild/netbsd-x64": "npm:0.25.11" - "@esbuild/openbsd-arm64": "npm:0.25.11" - "@esbuild/openbsd-x64": "npm:0.25.11" - "@esbuild/openharmony-arm64": "npm:0.25.11" - "@esbuild/sunos-x64": "npm:0.25.11" - "@esbuild/win32-arm64": "npm:0.25.11" - "@esbuild/win32-ia32": "npm:0.25.11" - "@esbuild/win32-x64": "npm:0.25.11" + "@esbuild/aix-ppc64": "npm:0.27.2" + "@esbuild/android-arm": "npm:0.27.2" + "@esbuild/android-arm64": "npm:0.27.2" + "@esbuild/android-x64": "npm:0.27.2" + "@esbuild/darwin-arm64": "npm:0.27.2" + "@esbuild/darwin-x64": "npm:0.27.2" + "@esbuild/freebsd-arm64": "npm:0.27.2" + "@esbuild/freebsd-x64": "npm:0.27.2" + "@esbuild/linux-arm": "npm:0.27.2" + "@esbuild/linux-arm64": "npm:0.27.2" + "@esbuild/linux-ia32": "npm:0.27.2" + "@esbuild/linux-loong64": "npm:0.27.2" + "@esbuild/linux-mips64el": "npm:0.27.2" + "@esbuild/linux-ppc64": "npm:0.27.2" + "@esbuild/linux-riscv64": "npm:0.27.2" + "@esbuild/linux-s390x": "npm:0.27.2" + "@esbuild/linux-x64": "npm:0.27.2" + "@esbuild/netbsd-arm64": "npm:0.27.2" + "@esbuild/netbsd-x64": "npm:0.27.2" + "@esbuild/openbsd-arm64": "npm:0.27.2" + "@esbuild/openbsd-x64": "npm:0.27.2" + "@esbuild/openharmony-arm64": "npm:0.27.2" + "@esbuild/sunos-x64": "npm:0.27.2" + "@esbuild/win32-arm64": "npm:0.27.2" + "@esbuild/win32-ia32": "npm:0.27.2" + "@esbuild/win32-x64": "npm:0.27.2" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -8795,40 +8683,40 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/287dfc7909d169501be9daa55973ae9398bd69c7114dfc0b682eef04c22f5c33fdba934398af0f36ed5aab1366ee4be25062235d6a1bff4b74fa3d185e208e56 + checksum: 10/7f1229328b0efc63c4184a61a7eb303df1e99818cc1d9e309fb92600703008e69821e8e984e9e9f54a627da14e0960d561db3a93029482ef96dc82dd267a60c2 languageName: node linkType: hard -"esbuild@npm:^0.27.0": - version: 0.27.2 - resolution: "esbuild@npm:0.27.2" +"esbuild@npm:~0.25.0": + version: 0.25.11 + resolution: "esbuild@npm:0.25.11" dependencies: - "@esbuild/aix-ppc64": "npm:0.27.2" - "@esbuild/android-arm": "npm:0.27.2" - "@esbuild/android-arm64": "npm:0.27.2" - "@esbuild/android-x64": "npm:0.27.2" - "@esbuild/darwin-arm64": "npm:0.27.2" - "@esbuild/darwin-x64": "npm:0.27.2" - "@esbuild/freebsd-arm64": "npm:0.27.2" - "@esbuild/freebsd-x64": "npm:0.27.2" - "@esbuild/linux-arm": "npm:0.27.2" - "@esbuild/linux-arm64": "npm:0.27.2" - "@esbuild/linux-ia32": "npm:0.27.2" - "@esbuild/linux-loong64": "npm:0.27.2" - "@esbuild/linux-mips64el": "npm:0.27.2" - "@esbuild/linux-ppc64": "npm:0.27.2" - "@esbuild/linux-riscv64": "npm:0.27.2" - "@esbuild/linux-s390x": "npm:0.27.2" - "@esbuild/linux-x64": "npm:0.27.2" - "@esbuild/netbsd-arm64": "npm:0.27.2" - "@esbuild/netbsd-x64": "npm:0.27.2" - "@esbuild/openbsd-arm64": "npm:0.27.2" - "@esbuild/openbsd-x64": "npm:0.27.2" - "@esbuild/openharmony-arm64": "npm:0.27.2" - "@esbuild/sunos-x64": "npm:0.27.2" - "@esbuild/win32-arm64": "npm:0.27.2" - "@esbuild/win32-ia32": "npm:0.27.2" - "@esbuild/win32-x64": "npm:0.27.2" + "@esbuild/aix-ppc64": "npm:0.25.11" + "@esbuild/android-arm": "npm:0.25.11" + "@esbuild/android-arm64": "npm:0.25.11" + "@esbuild/android-x64": "npm:0.25.11" + "@esbuild/darwin-arm64": "npm:0.25.11" + "@esbuild/darwin-x64": "npm:0.25.11" + "@esbuild/freebsd-arm64": "npm:0.25.11" + "@esbuild/freebsd-x64": "npm:0.25.11" + "@esbuild/linux-arm": "npm:0.25.11" + "@esbuild/linux-arm64": "npm:0.25.11" + "@esbuild/linux-ia32": "npm:0.25.11" + "@esbuild/linux-loong64": "npm:0.25.11" + "@esbuild/linux-mips64el": "npm:0.25.11" + "@esbuild/linux-ppc64": "npm:0.25.11" + "@esbuild/linux-riscv64": "npm:0.25.11" + "@esbuild/linux-s390x": "npm:0.25.11" + "@esbuild/linux-x64": "npm:0.25.11" + "@esbuild/netbsd-arm64": "npm:0.25.11" + "@esbuild/netbsd-x64": "npm:0.25.11" + "@esbuild/openbsd-arm64": "npm:0.25.11" + "@esbuild/openbsd-x64": "npm:0.25.11" + "@esbuild/openharmony-arm64": "npm:0.25.11" + "@esbuild/sunos-x64": "npm:0.25.11" + "@esbuild/win32-arm64": "npm:0.25.11" + "@esbuild/win32-ia32": "npm:0.25.11" + "@esbuild/win32-x64": "npm:0.25.11" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -8884,7 +8772,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/7f1229328b0efc63c4184a61a7eb303df1e99818cc1d9e309fb92600703008e69821e8e984e9e9f54a627da14e0960d561db3a93029482ef96dc82dd267a60c2 + checksum: 10/287dfc7909d169501be9daa55973ae9398bd69c7114dfc0b682eef04c22f5c33fdba934398af0f36ed5aab1366ee4be25062235d6a1bff4b74fa3d185e208e56 languageName: node linkType: hard @@ -9288,13 +9176,6 @@ __metadata: languageName: node linkType: hard -"event-iterator@npm:^2.0.0": - version: 2.0.0 - resolution: "event-iterator@npm:2.0.0" - checksum: 10/52f041696b6f99f3c09725b5d5de25189479d26ad0f30e33dd6bea5eb4a1df9894f7c7663ce5335a5e0e77d32ffae9dbca1d6ef0db87d7c173d683a3ff94857b - languageName: node - linkType: hard - "event-target-shim@npm:6.0.2": version: 6.0.2 resolution: "event-target-shim@npm:6.0.2" @@ -9889,13 +9770,6 @@ __metadata: languageName: node linkType: hard -"get-iterator@npm:^2.0.1": - version: 2.0.1 - resolution: "get-iterator@npm:2.0.1" - checksum: 10/353baac51f5e335c19cb734cbf0401d7c47deeac9d375e2939fed646fe52db2912d61ed2a60112050cf4687080817d159ec938803e48e03cd602edd489a116f2 - languageName: node - linkType: hard - "get-port@npm:^7.1.0": version: 7.1.0 resolution: "get-port@npm:7.1.0" @@ -10450,20 +10324,20 @@ __metadata: languageName: node linkType: hard -"interface-datastore@npm:^8.0.0, interface-datastore@npm:^8.3.1": - version: 8.3.1 - resolution: "interface-datastore@npm:8.3.1" +"interface-datastore@npm:^9.0.0, interface-datastore@npm:^9.0.1": + version: 9.0.2 + resolution: "interface-datastore@npm:9.0.2" dependencies: - interface-store: "npm:^6.0.0" + interface-store: "npm:^7.0.0" uint8arrays: "npm:^5.1.0" - checksum: 10/23ff57c1c9fc1ceb0bf147921a6e56f07972f537cd7340a84406c68d44244981ddf1b411677ee9ee7710f9c9f5aaf0b1cfe08fe1de15ffb2333f84814f870a7b + checksum: 10/830cc462db520f977ca1cd42db937ed7c4d598a0790e335f7292389117b7d56de9270e6e20a9f6b260977fe27e65077d8ce3b62fe1c10609eefc9a68aa99f99f languageName: node linkType: hard -"interface-store@npm:^6.0.0": - version: 6.0.2 - resolution: "interface-store@npm:6.0.2" - checksum: 10/4689c1476061efb2c0ef4b1eccf70c8cba48eec2acf8f8bab189ef14466f45d2f0d57c2622bcdfde229249c629ccd69ea9c16c20d706f049d6a1e4a7841fac39 +"interface-store@npm:^7.0.0": + version: 7.0.1 + resolution: "interface-store@npm:7.0.1" + checksum: 10/d1bc7f05110dafabf70b3409c20a372c2d8b96204bcf281da5fe4fe74d1ec894bda67c10010c259efc6dc292cc06bc3df9465f8e3f2c637ba81c8ddd48a34ee8 languageName: node linkType: hard @@ -10735,10 +10609,10 @@ __metadata: languageName: node linkType: hard -"is-network-error@npm:^1.0.0": - version: 1.1.0 - resolution: "is-network-error@npm:1.1.0" - checksum: 10/b2fe6aac07f814a9de275efd05934c832c129e7ba292d27614e9e8eec9e043b7a0bbeaeca5d0916b0f462edbec2aa2eaee974ee0a12ac095040e9515c222c251 +"is-network-error@npm:^1.1.0": + version: 1.3.1 + resolution: "is-network-error@npm:1.3.1" + checksum: 10/96d0a3f21e7b3655a386ef11405fd0cd8e615d3ef3a463cfe937b78ec585f2ed3717841aada5306eb96c89984b1bddc6ff0da49e18fcd6e52aa86206a1431f56 languageName: node linkType: hard @@ -10986,14 +10860,14 @@ __metadata: languageName: node linkType: hard -"it-all@npm:^3.0.0, it-all@npm:^3.0.8": +"it-all@npm:^3.0.0, it-all@npm:^3.0.9": version: 3.0.9 resolution: "it-all@npm:3.0.9" checksum: 10/7aa16a375dc077b7b4f71308a74877144146f057b3e9d360eb28393d0040a7f69f5fd5ead51cbaa9f347044a4bd0945d783259e62e1905ce947d46c8e7953026 languageName: node linkType: hard -"it-byte-stream@npm:^2.0.0, it-byte-stream@npm:^2.0.1, it-byte-stream@npm:^2.0.2": +"it-byte-stream@npm:^2.0.0": version: 2.0.3 resolution: "it-byte-stream@npm:2.0.3" dependencies: @@ -11006,32 +10880,23 @@ __metadata: languageName: node linkType: hard -"it-drain@npm:^3.0.7, it-drain@npm:^3.0.9": +"it-drain@npm:^3.0.10, it-drain@npm:^3.0.9": version: 3.0.10 resolution: "it-drain@npm:3.0.10" checksum: 10/f6ed3261aa4a9f7f371c2eefa1fa0288e86e38fbf219b6394c78d2e7eeb1415592321f30909b29dada982255938942573001070c6797c0369b434c2b99cc4b82 languageName: node linkType: hard -"it-filter@npm:^3.1.1": - version: 3.1.2 - resolution: "it-filter@npm:3.1.2" - dependencies: - it-peekable: "npm:^3.0.0" - checksum: 10/79975868aac8e07340021cba1ed12a27295859ad5b47ebe7908a61dcd10ca97518c3fe4b363208fbca6e6e09db3c9585c909115b15181239430205f9bed25bc9 - languageName: node - linkType: hard - -"it-foreach@npm:^2.0.6, it-foreach@npm:^2.1.3": - version: 2.1.4 - resolution: "it-foreach@npm:2.1.4" +"it-filter@npm:^3.1.3": + version: 3.1.4 + resolution: "it-filter@npm:3.1.4" dependencies: it-peekable: "npm:^3.0.0" - checksum: 10/24bab5ebf6deab1af8f96fccd22af8b017fc31d266db37d4c6b7135014f28e853837047e637f0ec324354f0e6f384e1d6db8233c5ab03e431607049a196248b2 + checksum: 10/40dfc8d6808ea456330fba9db2aaa9346a90fde845ebd944c6fadaabe313ead82df414734df20a447aead9a7e28db6db2a6cf1c0cd9a994d1b8f096394178bf8 languageName: node linkType: hard -"it-length-prefixed-stream@npm:^2.0.0, it-length-prefixed-stream@npm:^2.0.1, it-length-prefixed-stream@npm:^2.0.2": +"it-length-prefixed-stream@npm:^2.0.0": version: 2.0.3 resolution: "it-length-prefixed-stream@npm:2.0.3" dependencies: @@ -11057,16 +10922,16 @@ __metadata: languageName: node linkType: hard -"it-map@npm:^3.1.1": - version: 3.1.2 - resolution: "it-map@npm:3.1.2" +"it-map@npm:^3.1.3": + version: 3.1.4 + resolution: "it-map@npm:3.1.4" dependencies: it-peekable: "npm:^3.0.0" - checksum: 10/5d1059ee99944e25c9f014f27d86c2b3ac549243dbb8640a2f18a0777c42a107c2145a7abd41d32bc9e15be4d007520be0eee8756ad43123c58d21fbca02247e + checksum: 10/556654e0e3047ed4aca72eb942a86a288f33b9568fc122aa616e7a12a1dcf75ecbd5c4040211dc223d827dffb365db2b98397f5f4f7ef42c65d7babe8e469a0d languageName: node linkType: hard -"it-merge@npm:^3.0.0, it-merge@npm:^3.0.11, it-merge@npm:^3.0.5": +"it-merge@npm:^3.0.0, it-merge@npm:^3.0.11, it-merge@npm:^3.0.12": version: 3.0.12 resolution: "it-merge@npm:3.0.12" dependencies: @@ -11075,17 +10940,7 @@ __metadata: languageName: node linkType: hard -"it-pair@npm:^2.0.6": - version: 2.0.6 - resolution: "it-pair@npm:2.0.6" - dependencies: - it-stream-types: "npm:^2.0.1" - p-defer: "npm:^4.0.0" - checksum: 10/14d72ac414177c4dc92ed818e8ae4d9af2effd2459aafa935e5b2ab41a873fee036f938fc9c1f707d02e52c7807dffe778c1f2edf2c219d50e5c9086e0ad3180 - languageName: node - linkType: hard - -"it-parallel@npm:^3.0.11": +"it-parallel@npm:^3.0.13": version: 3.0.13 resolution: "it-parallel@npm:3.0.13" dependencies: @@ -11112,7 +10967,7 @@ __metadata: languageName: node linkType: hard -"it-protobuf-stream@npm:^2.0.2": +"it-protobuf-stream@npm:^2.0.3": version: 2.0.3 resolution: "it-protobuf-stream@npm:2.0.3" dependencies: @@ -11167,12 +11022,12 @@ __metadata: languageName: node linkType: hard -"it-sort@npm:^3.0.6": - version: 3.0.7 - resolution: "it-sort@npm:3.0.7" +"it-sort@npm:^3.0.8": + version: 3.0.9 + resolution: "it-sort@npm:3.0.9" dependencies: it-all: "npm:^3.0.0" - checksum: 10/0e376837d587cc7239e03ca01acf7969576630d97c44c380b85414ea3189fb3942fb0c96fab920fcbd681eabb817617748a7e57991542d562b256b701cbcb3a0 + checksum: 10/8390eb0a1e799d1abb2e0d9ec910d4e1d5fb4ace58a462400d966872e881cba9ed5bde7c6fb89c33694d74d002717a593727e96a78cea4326724de7e279c9fe1 languageName: node linkType: hard @@ -11183,23 +11038,10 @@ __metadata: languageName: node linkType: hard -"it-take@npm:^3.0.6": - version: 3.0.7 - resolution: "it-take@npm:3.0.7" - checksum: 10/7fb6b69b4f8930a3bb85b30ecff2c7a8f78b18fd9df4a27f46e209a1ad131b7c70c72508a18b9017032fcb4892bc6892e9a1b0df27d2c658940b31e4d14532d3 - languageName: node - linkType: hard - -"it-ws@npm:^6.1.5": - version: 6.1.5 - resolution: "it-ws@npm:6.1.5" - dependencies: - "@types/ws": "npm:^8.2.2" - event-iterator: "npm:^2.0.0" - it-stream-types: "npm:^2.0.1" - uint8arrays: "npm:^5.0.0" - ws: "npm:^8.4.0" - checksum: 10/e0c172001bb2ea62cf44886ea9494468da74fe5ab5c80105ec5c89e753928bb8137c4b9b2133cc388c1e72a3a4803999f4d15f8f891a0de4ff1ead49deffd6d3 +"it-take@npm:^3.0.8": + version: 3.0.9 + resolution: "it-take@npm:3.0.9" + checksum: 10/e09f7223ee006ff2a6638c270e48b73614737b1c84b0177d7a628b67be894203eb14c5bdfe757a4fab59df27283e9cb7e4a4c1c232debfe7ca51dd63e13d33e9 languageName: node linkType: hard @@ -11509,39 +11351,38 @@ __metadata: languageName: node linkType: hard -"libp2p@npm:2.10.0": - version: 2.10.0 - resolution: "libp2p@npm:2.10.0" +"libp2p@npm:3.1.7": + version: 3.1.7 + resolution: "libp2p@npm:3.1.7" dependencies: "@chainsafe/is-ip": "npm:^2.1.0" "@chainsafe/netmask": "npm:^2.0.0" - "@libp2p/crypto": "npm:^5.1.8" - "@libp2p/interface": "npm:^2.11.0" - "@libp2p/interface-internal": "npm:^2.3.19" - "@libp2p/logger": "npm:^5.2.0" - "@libp2p/multistream-select": "npm:^6.0.29" - "@libp2p/peer-collections": "npm:^6.0.35" - "@libp2p/peer-id": "npm:^5.1.9" - "@libp2p/peer-store": "npm:^11.2.7" - "@libp2p/utils": "npm:^6.7.2" + "@libp2p/crypto": "npm:^5.1.14" + "@libp2p/interface": "npm:^3.1.1" + "@libp2p/interface-internal": "npm:^3.0.14" + "@libp2p/logger": "npm:^6.2.3" + "@libp2p/multistream-select": "npm:^7.0.14" + "@libp2p/peer-collections": "npm:^7.0.14" + "@libp2p/peer-id": "npm:^6.0.5" + "@libp2p/peer-store": "npm:^12.0.14" + "@libp2p/utils": "npm:^7.0.14" "@multiformats/dns": "npm:^1.0.6" - "@multiformats/multiaddr": "npm:^12.4.4" - "@multiformats/multiaddr-matcher": "npm:^2.0.0" + "@multiformats/multiaddr": "npm:^13.0.1" + "@multiformats/multiaddr-matcher": "npm:^3.0.1" any-signal: "npm:^4.1.1" - datastore-core: "npm:^10.0.2" - interface-datastore: "npm:^8.3.1" - it-byte-stream: "npm:^2.0.2" - it-merge: "npm:^3.0.11" - it-parallel: "npm:^3.0.11" + datastore-core: "npm:^11.0.1" + interface-datastore: "npm:^9.0.1" + it-merge: "npm:^3.0.12" + it-parallel: "npm:^3.0.13" main-event: "npm:^1.0.1" - multiformats: "npm:^13.3.6" + multiformats: "npm:^13.4.0" p-defer: "npm:^4.0.1" - p-retry: "npm:^6.2.1" + p-event: "npm:^7.0.0" + p-retry: "npm:^7.0.0" progress-events: "npm:^1.0.1" - race-event: "npm:^1.3.0" - race-signal: "npm:^1.1.3" + race-signal: "npm:^2.0.0" uint8arrays: "npm:^5.1.0" - checksum: 10/31b30b8a19eeeefa048e40e6fe87b9fd5cf1e62cb4c745145bb4d9a5d2657a890cee3c6daeb914c7837271ad27b3f7e70b688b38b24675f628485d4ad72575a4 + checksum: 10/5b09592328f1bfce4bbf14c325773f60268a7dead318ca20e038d5d791a2614f07fb650a32cc862f471efca85eddb2cdac77b1d527eb3e4c65701e35d4499ffe languageName: node linkType: hard @@ -12185,7 +12026,7 @@ __metadata: languageName: node linkType: hard -"mortice@npm:^3.2.1": +"mortice@npm:^3.3.1": version: 3.3.1 resolution: "mortice@npm:3.3.1" dependencies: @@ -12365,6 +12206,16 @@ __metadata: languageName: node linkType: hard +"node-datachannel@npm:^0.29.0": + version: 0.29.0 + resolution: "node-datachannel@npm:0.29.0" + dependencies: + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.3" + checksum: 10/77fd7012695070ad639e35bbeb6bed3b8b2f45dd88be9d1f1283c5991e96be3694604b4edf36d5cf1be8eb01b810776c69f07a26ed78fc5a669f471beb6b02e9 + languageName: node + linkType: hard + "node-emoji@npm:^2.2.0": version: 2.2.0 resolution: "node-emoji@npm:2.2.0" @@ -12814,12 +12665,12 @@ __metadata: languageName: node linkType: hard -"p-event@npm:^6.0.1": - version: 6.0.1 - resolution: "p-event@npm:6.0.1" +"p-event@npm:^7.0.0": + version: 7.1.0 + resolution: "p-event@npm:7.1.0" dependencies: - p-timeout: "npm:^6.1.2" - checksum: 10/f8a6bb7e5addee541f5be42685fb070d9848aa0fb761132e825762c1e4009d90416b3f78ec06f7d4ee96b48ef9cebda0b809a0a87e504d7ae5f371f406cf16a8 + p-timeout: "npm:^7.0.1" + checksum: 10/63e68881e251127d272de2d614a68d8ac5e19fffc94d167c0be868588a5271a7ea62b607191ab01bf14deb16f9e3576d20212fc5a93a861b48d3dd90d1fe5a7a languageName: node linkType: hard @@ -12867,30 +12718,33 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^6.2.1": - version: 6.2.1 - resolution: "p-retry@npm:6.2.1" +"p-retry@npm:^7.0.0": + version: 7.1.1 + resolution: "p-retry@npm:7.1.1" dependencies: - "@types/retry": "npm:0.12.2" - is-network-error: "npm:^1.0.0" - retry: "npm:^0.13.1" - checksum: 10/7104ef13703b155d70883b0d3654ecc03148407d2711a4516739cf93139e8bec383451e14925e25e3c1ae04dbace3ed53c26dc3853c1e9b9867fcbdde25f4cdc + is-network-error: "npm:^1.1.0" + checksum: 10/ef8e5ac65e51d1b52bcdb78b197e09406c372e5c6cefb818aed4ab278c379fed4b3613e2bf674022503cc61d8c8aa6a8e3f70cd3a5a8e97be3a97899b801afef languageName: node linkType: hard -"p-timeout@npm:^6.0.0, p-timeout@npm:^6.1.2, p-timeout@npm:^6.1.4": +"p-timeout@npm:^6.1.2": version: 6.1.4 resolution: "p-timeout@npm:6.1.4" checksum: 10/5ee0df408ba353cc2d7036af90d2eb1724c428fd1cf67cd9110c03f0035077c29f6506bff7198dfbef4910ec558c711f21f9741d89d043a6f2c2ff82064afcaf languageName: node linkType: hard -"p-wait-for@npm:^5.0.2": - version: 5.0.2 - resolution: "p-wait-for@npm:5.0.2" - dependencies: - p-timeout: "npm:^6.0.0" - checksum: 10/29075bbeba40702752299021bdf111d57c38ecc1225f2ec4a23cc7546734c39ea486f984422b9d824a2b8ae388005060a377d9afce549a6e3c2f3d08c7d34af1 +"p-timeout@npm:^7.0.0, p-timeout@npm:^7.0.1": + version: 7.0.1 + resolution: "p-timeout@npm:7.0.1" + checksum: 10/1d65827a07fd10eae5bc1fa493ef5c40522acda21cbbb04131cdb0f63f703c91e5fac2701431e28e308992284a86807d7138dbc2be694e2b8342bee20be652f6 + languageName: node + linkType: hard + +"p-wait-for@npm:^6.0.0": + version: 6.0.0 + resolution: "p-wait-for@npm:6.0.0" + checksum: 10/f7c502a9a366acba4a06aca7a07b78ae625fcf3f1bf43f13e7299de7f0edbfb36f48ba56244ec2a23231441acdc5960fe41434ff7294b533f322a9cdd5af3127 languageName: node linkType: hard @@ -13511,7 +13365,7 @@ __metadata: languageName: node linkType: hard -"protons-runtime@npm:^5.5.0, protons-runtime@npm:^5.6.0": +"protons-runtime@npm:^5.6.0": version: 5.6.0 resolution: "protons-runtime@npm:5.6.0" dependencies: @@ -13522,6 +13376,17 @@ __metadata: languageName: node linkType: hard +"protons-runtime@npm:^6.0.1": + version: 6.0.1 + resolution: "protons-runtime@npm:6.0.1" + dependencies: + uint8-varint: "npm:^2.0.4" + uint8arraylist: "npm:^2.4.8" + uint8arrays: "npm:^5.1.0" + checksum: 10/2957023adbe57bf068a95bff24f3a65076273daf97e4853c74fd692c07943cd4c0d47ac8db93eb991f54b00dcc500838b8a40f84195cbe4afda9720d47be8474 + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -13616,6 +13481,20 @@ __metadata: languageName: node linkType: hard +"race-signal@npm:^2.0.0": + version: 2.0.0 + resolution: "race-signal@npm:2.0.0" + checksum: 10/00a6b094d4b55163796c0b89692080ce9b804b0e92b20730ac2b430de275b4c2577a6c3bea4e7698a5e011ab7ec3e79c6bc07da47a6791551af236fdbde80f3f + languageName: node + linkType: hard + +"random-int@npm:^3.1.0": + version: 3.1.0 + resolution: "random-int@npm:3.1.0" + checksum: 10/6436be7ab8db4378eb2b6b852eb74acb8726e327cef634cdd30d45602c1cacb1cd24d869df9be4d9935e5203361338ba91f61538d19becd01f91e09577b7260b + languageName: node + linkType: hard + "range-parser@npm:1.2.0": version: 1.2.0 resolution: "range-parser@npm:1.2.0" @@ -13682,7 +13561,7 @@ __metadata: languageName: node linkType: hard -"react-native-webrtc@npm:^124.0.5": +"react-native-webrtc@npm:^124.0.6": version: 124.0.7 resolution: "react-native-webrtc@npm:124.0.7" dependencies: @@ -13957,13 +13836,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -14693,15 +14565,6 @@ __metadata: languageName: node linkType: hard -"stream-to-it@npm:^1.0.1": - version: 1.0.1 - resolution: "stream-to-it@npm:1.0.1" - dependencies: - it-stream-types: "npm:^2.0.1" - checksum: 10/df6b11bda9d3eb8f5607a450866edc9e2cc49a1a1a3731fbfdd5872a17231398f960ec4509331dbaa3db3cbf23dbca3bd286bb7d56c303a51ded63a013ade71d - languageName: node - linkType: hard - "string-argv@npm:^0.3.2, string-argv@npm:~0.3.1": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -14925,6 +14788,13 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^10.0.0": + version: 10.2.2 + resolution: "supports-color@npm:10.2.2" + checksum: 10/bd132705fc07213a4024131fb061f0a46a48b49ecaf434bb029c0a5aa0339b969236d496d63969e3c248a90fdcac16d4f9c5bf187e7be0bfb5e804ed13bef6b0 + languageName: node + linkType: hard + "supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -14934,13 +14804,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^9.4.0": - version: 9.4.0 - resolution: "supports-color@npm:9.4.0" - checksum: 10/cb8ff8daeaf1db642156f69a9aa545b6c01dd9c4def4f90a49f46cbf24be0c245d392fcf37acd119cd1819b99dad2cc9b7e3260813f64bcfd7f5b18b5a1eefb8 - languageName: node - linkType: hard - "supports-color@npm:~8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" @@ -15738,6 +15601,13 @@ __metadata: languageName: node linkType: hard +"unlimited-timeout@npm:^0.1.0": + version: 0.1.0 + resolution: "unlimited-timeout@npm:0.1.0" + checksum: 10/450ae77e3bd2a71c340987fff30c0dc1b1fa913ddcba4c8998c703d0c60d8aaea23825510edc1aed48e2baa08bd6b1da22543ea474764e0c26042ba4efba53b0 + languageName: node + linkType: hard + "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -16189,13 +16059,13 @@ __metadata: languageName: node linkType: hard -"weald@npm:^1.0.4": - version: 1.0.4 - resolution: "weald@npm:1.0.4" +"weald@npm:^1.1.0": + version: 1.1.1 + resolution: "weald@npm:1.1.1" dependencies: ms: "npm:^3.0.0-canary.1" - supports-color: "npm:^9.4.0" - checksum: 10/6bb68cdb030547a77cfec690efc0bda3938abb5471196404161c312f7611abeb1497cfcb6932f20096fc48181ad3018faa11c0c68568501d8dccbf064e1a28a2 + supports-color: "npm:^10.0.0" + checksum: 10/3b9274495d59b0b5ce4aab035b9a1704eadb7187a828641c4f3121e5cd4243922e7d080e9b65f32b120dcba3f26e2e9a7359d888ccff887cab5aaf6937b3f44d languageName: node linkType: hard @@ -16487,7 +16357,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.18.3, ws@npm:^8.18.2, ws@npm:^8.18.3, ws@npm:^8.4.0, ws@npm:~8.18.3": +"ws@npm:8.18.3, ws@npm:^8.18.3, ws@npm:~8.18.3": version: 8.18.3 resolution: "ws@npm:8.18.3" peerDependencies: