diff --git a/ironfish/package.json b/ironfish/package.json index aaf42966e7..e45fcb8e90 100644 --- a/ironfish/package.json +++ b/ironfish/package.json @@ -41,7 +41,7 @@ "leveldown": "6.1.1", "levelup": "4.4.0", "lodash": "4.17.21", - "node-datachannel": "0.5.1", + "node-datachannel": "0.8.0", "node-forge": "1.3.1", "parse-json": "5.2.0", "sqlite": "4.0.23", diff --git a/ironfish/src/network/peerNetwork.test.ts b/ironfish/src/network/peerNetwork.test.ts index 3dda7949ed..f24d7fde07 100644 --- a/ironfish/src/network/peerNetwork.test.ts +++ b/ironfish/src/network/peerNetwork.test.ts @@ -97,13 +97,10 @@ describe('PeerNetwork', () => { describe('when peers connect', () => { it('changes isReady', async () => { - const dc = await import('node-datachannel') - const peerNetwork = new PeerNetwork({ identity: mockPrivateIdentity('local'), agent: 'sdk/1/cli', webSocket: ws, - nodeDataChannel: dc, node: mockNode(), chain: mockChain(), minPeers: 1, @@ -138,13 +135,10 @@ describe('PeerNetwork', () => { describe('when at max peers', () => { it('rejects websocket connections', async () => { const wsActual = jest.requireActual('ws') - const dc = await import('node-datachannel') - const peerNetwork = new PeerNetwork({ identity: mockPrivateIdentity('local'), agent: 'sdk/1/cli', webSocket: wsActual, - nodeDataChannel: dc, node: mockNode(), chain: mockChain(), listen: true, diff --git a/ironfish/src/network/peerNetwork.ts b/ironfish/src/network/peerNetwork.ts index d1978b0066..3982882587 100644 --- a/ironfish/src/network/peerNetwork.ts +++ b/ironfish/src/network/peerNetwork.ts @@ -62,7 +62,7 @@ import { BAN_SCORE, KnownBlockHashesValue, Peer } from './peers/peer' import { PeerConnectionManager } from './peers/peerConnectionManager' import { PeerManager } from './peers/peerManager' import { TransactionFetcher } from './transactionFetcher' -import { IsomorphicWebSocketConstructor, NodeDataChannelType } from './types' +import { IsomorphicWebSocketConstructor } from './types' import { getBlockSize } from './utils/serializers' import { parseUrl, WebSocketAddress } from './utils/url' import { @@ -159,7 +159,6 @@ export class PeerNetwork { identity: PrivateIdentity agent?: string webSocket: IsomorphicWebSocketConstructor - nodeDataChannel: NodeDataChannelType listen?: boolean port?: number bootstrapNodes?: string[] @@ -195,7 +194,6 @@ export class PeerNetwork { VERSION_PROTOCOL, options.chain, options.webSocket, - options.nodeDataChannel, options.networkId, this.enableSyncing, ) diff --git a/ironfish/src/network/peers/connections/webRtcConnection.test.ts b/ironfish/src/network/peers/connections/webRtcConnection.test.ts index 7ca4964b8b..47bad814a8 100644 --- a/ironfish/src/network/peers/connections/webRtcConnection.test.ts +++ b/ironfish/src/network/peers/connections/webRtcConnection.test.ts @@ -9,10 +9,8 @@ import { WebRtcConnection } from './webRtcConnection' describe('WebRtcConnection', () => { describe('send', () => { describe('with no datachannel', () => { - it('returns false', async () => { - const nodeDataChannel = await import('node-datachannel') - - const connection = new WebRtcConnection(nodeDataChannel, false, createRootLogger()) + it('returns false', () => { + const connection = new WebRtcConnection(false, createRootLogger()) const message = new IdentifyMessage({ agent: '', head: Buffer.alloc(32, 0), @@ -31,10 +29,8 @@ describe('WebRtcConnection', () => { }) describe('with a valid message', () => { - it('serializes and sends the message on the datachannel', async () => { - const nodeDataChannel = await import('node-datachannel') - - const connection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + it('serializes and sends the message on the datachannel', () => { + const connection = new WebRtcConnection(true, createRootLogger()) const sendSpy = jest.spyOn(connection, '_send') const message = new IdentifyMessage({ diff --git a/ironfish/src/network/peers/connections/webRtcConnection.ts b/ironfish/src/network/peers/connections/webRtcConnection.ts index 69db4334cf..5557d8a2cf 100644 --- a/ironfish/src/network/peers/connections/webRtcConnection.ts +++ b/ironfish/src/network/peers/connections/webRtcConnection.ts @@ -3,15 +3,13 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import type { Logger } from '../../../logger' -// @ts-expect-error Allow type-only import https://github.com/microsoft/TypeScript/issues/49721 -import type { DataChannel, DescriptionType, PeerConnection } from 'node-datachannel' import colors from 'colors/safe' +import { DataChannel, DescriptionType, PeerConnection } from 'node-datachannel' import { Assert } from '../../../assert' import { Event } from '../../../event' import { MetricsMonitor } from '../../../metrics' import { ErrorUtils } from '../../../utils' import { parseNetworkMessage } from '../../messageRegistry' -import { NodeDataChannelType } from '../../types' import { MAX_MESSAGE_SIZE } from '../../version' import { Connection, ConnectionDirection, ConnectionType } from './connection' import { NetworkError } from './errors' @@ -57,7 +55,6 @@ export class WebRtcConnection extends Connection { onSignal = new Event<[SignalData]>() constructor( - nodeDataChannel: NodeDataChannelType, initiator: boolean, logger: Logger, metrics?: MetricsMonitor, @@ -70,7 +67,7 @@ export class WebRtcConnection extends Connection { metrics, ) - this.peer = new nodeDataChannel.PeerConnection('peer', { + this.peer = new PeerConnection('peer', { iceServers: options.stunServers ?? [], maxMessageSize: MAX_MESSAGE_SIZE, }) @@ -222,7 +219,7 @@ export class WebRtcConnection extends Connection { this.datachannel?.close() try { - this.peer.destroy() + this.peer.close() } catch (e) { // peer.destroy() may throw "It seems peer-connection is closed" if the // peer connection has been disposed already diff --git a/ironfish/src/network/peers/localPeer.ts b/ironfish/src/network/peers/localPeer.ts index 7106f8367c..a080c9e4cc 100644 --- a/ironfish/src/network/peers/localPeer.ts +++ b/ironfish/src/network/peers/localPeer.ts @@ -6,7 +6,7 @@ import { Assert } from '../../assert' import { Blockchain } from '../../blockchain' import { Identity, PrivateIdentity, privateIdentityToIdentity } from '../identity' import { IdentifyMessage } from '../messages/identify' -import { IsomorphicWebSocketConstructor, NodeDataChannelType } from '../types' +import { IsomorphicWebSocketConstructor } from '../types' /** * Wraps configuration needed for establishing connections with other peers @@ -24,8 +24,6 @@ export class LocalPeer { readonly version: number // constructor for either a Node WebSocket or a browser WebSocket readonly webSocket: IsomorphicWebSocketConstructor - // asynchronously imported WebRTC datachannel library - readonly nodeDataChannel: NodeDataChannelType // the unique ID number of the network readonly networkId: number // true if the peer supports syncing and gossip messages @@ -42,7 +40,6 @@ export class LocalPeer { version: number, chain: Blockchain, webSocket: IsomorphicWebSocketConstructor, - nodeDataChannel: NodeDataChannelType, networkId: number, enableSyncing: boolean, ) { @@ -55,7 +52,6 @@ export class LocalPeer { this.enableSyncing = enableSyncing this.webSocket = webSocket - this.nodeDataChannel = nodeDataChannel this.port = null this.name = null } diff --git a/ironfish/src/network/peers/peer.test.ts b/ironfish/src/network/peers/peer.test.ts index d96c08a84a..ebcc9caa4a 100644 --- a/ironfish/src/network/peers/peer.test.ts +++ b/ironfish/src/network/peers/peer.test.ts @@ -51,12 +51,10 @@ describe('setWebSocketConnection', () => { }) describe('setWebRtcConnection', () => { - it('Changes to CONNECTING when in DISCONNECTED', async () => { - const nodeDataChannel = await import('node-datachannel') - + it('Changes to CONNECTING when in DISCONNECTED', () => { const identity = mockIdentity('peer') const peer = new Peer(identity) - const connection = new WebRtcConnection(nodeDataChannel, false, createRootLogger()) + const connection = new WebRtcConnection(false, createRootLogger()) peer.setWebRtcConnection(connection) expect(peer.state).toEqual({ @@ -67,10 +65,8 @@ describe('setWebRtcConnection', () => { }) }) -it('Times out WebRTC handshake', async () => { - const nodeDataChannel = await import('node-datachannel') - - const connection = new WebRtcConnection(nodeDataChannel, false, createRootLogger()) +it('Times out WebRTC handshake', () => { + const connection = new WebRtcConnection(false, createRootLogger()) expect(connection.state.type).toEqual('CONNECTING') const peer = new Peer(null) @@ -114,10 +110,8 @@ it('Times out WebRTC handshake', async () => { }) describe('Handles message send failure', () => { - it('Disconnects peer on error in _send', async () => { - const nodeDataChannel = await import('node-datachannel') - - const connection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + it('Disconnects peer on error in _send', () => { + const connection = new WebRtcConnection(true, createRootLogger()) expect(connection.state.type).toEqual('CONNECTING') const peer = new Peer(null) @@ -155,10 +149,8 @@ describe('Handles message send failure', () => { expect(peer.state.type).toEqual('CONNECTED') }) - it('Falls back to WebSockets if available and WebRTC send fails', async () => { - const nodeDataChannel = await import('node-datachannel') - - const wrtcConnection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + it('Falls back to WebSockets if available and WebRTC send fails', () => { + const wrtcConnection = new WebRtcConnection(true, createRootLogger()) const wsConnection = new WebSocketConnection( new ws(''), ConnectionDirection.Outbound, @@ -255,9 +247,7 @@ it('Transitions to CONNECTED when adding a connection with state CONNECTED', () }) }) -it('Stays in CONNECTED when adding an additional connection', async () => { - const nodeDataChannel = await import('node-datachannel') - +it('Stays in CONNECTED when adding an additional connection', () => { const identity = mockIdentity('peer') const peer = new Peer(null) const connection = new WebSocketConnection( @@ -275,7 +265,7 @@ it('Stays in CONNECTED when adding an additional connection', async () => { connection.setState({ type: 'CONNECTED', identity }) // Add in an additional connection - const wrtcConnection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + const wrtcConnection = new WebRtcConnection(true, createRootLogger()) peer.setWebRtcConnection(wrtcConnection) expect(wrtcConnection.state.type).not.toBe('CONNECTED') @@ -287,9 +277,7 @@ it('Stays in CONNECTED when adding an additional connection', async () => { }) describe('Stays in CONNECTED when one connection disconnects', () => { - it('WebSocket disconnects', async () => { - const nodeDataChannel = await import('node-datachannel') - + it('WebSocket disconnects', () => { const identity = mockIdentity('peer') const peer = new Peer(null) @@ -303,7 +291,7 @@ describe('Stays in CONNECTED when one connection disconnects', () => { connection.setState({ type: 'CONNECTED', identity }) // Add a CONNECTED WebRTC connection - const wrtcConnection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + const wrtcConnection = new WebRtcConnection(true, createRootLogger()) peer.setWebRtcConnection(wrtcConnection) wrtcConnection.setState({ type: 'CONNECTED', identity }) @@ -318,9 +306,7 @@ describe('Stays in CONNECTED when one connection disconnects', () => { }) }) - it('WebRTC disconnects', async () => { - const nodeDataChannel = await import('node-datachannel') - + it('WebRTC disconnects', () => { const identity = mockIdentity('peer') const peer = new Peer(null) @@ -334,7 +320,7 @@ describe('Stays in CONNECTED when one connection disconnects', () => { connection.setState({ type: 'CONNECTED', identity }) // Add a CONNECTED WebRTC connection - const wrtcConnection = new WebRtcConnection(nodeDataChannel, true, createRootLogger()) + const wrtcConnection = new WebRtcConnection(true, createRootLogger()) peer.setWebRtcConnection(wrtcConnection) wrtcConnection.setState({ type: 'CONNECTED', identity }) diff --git a/ironfish/src/network/peers/peerManager.test.ts b/ironfish/src/network/peers/peerManager.test.ts index 10113ae2ea..69ad2a5203 100644 --- a/ironfish/src/network/peers/peerManager.test.ts +++ b/ironfish/src/network/peers/peerManager.test.ts @@ -1159,7 +1159,7 @@ describe('PeerManager', () => { peer.onMessage.emit(message, connection) expect(initWebRtcConnectionMock).toHaveBeenCalledTimes(1) - expect(initWebRtcConnectionMock).toHaveBeenCalledWith(peer, expect.anything(), true) + expect(initWebRtcConnectionMock).toHaveBeenCalledWith(peer, true) expect(pm['getBrokeringPeers'](peer)[0]).toEqual(peer) }) diff --git a/ironfish/src/network/peers/peerManager.ts b/ironfish/src/network/peers/peerManager.ts index 6be1809d72..c95a2627af 100644 --- a/ironfish/src/network/peers/peerManager.ts +++ b/ironfish/src/network/peers/peerManager.ts @@ -22,7 +22,7 @@ import { PeerListMessage } from '../messages/peerList' import { PeerListRequestMessage } from '../messages/peerListRequest' import { SignalMessage } from '../messages/signal' import { SignalRequestMessage } from '../messages/signalRequest' -import { IsomorphicWebSocket, NodeDataChannelType } from '../types' +import { IsomorphicWebSocket } from '../types' import { formatWebSocketAddress, WebSocketAddress } from '../utils' import { VERSION_PROTOCOL_MIN } from '../version' import { ConnectionRetry } from './connectionRetry' @@ -275,7 +275,7 @@ export class PeerManager { } if (canInitiateWebRTC(this.localPeer.publicIdentity, peer.state.identity)) { - this.initWebRtcConnection(peer, this.localPeer.nodeDataChannel, true) + this.initWebRtcConnection(peer, true) return true } @@ -284,7 +284,7 @@ export class PeerManager { destinationIdentity: peer.state.identity, }) - const connection = this.initWebRtcConnection(peer, this.localPeer.nodeDataChannel, false) + const connection = this.initWebRtcConnection(peer, false) connection.setState({ type: 'REQUEST_SIGNALING' }) const brokeringPeers = this.getBrokeringPeers(peer) @@ -338,20 +338,10 @@ export class PeerManager { * @param peer The peer to establish a connection with * @param initiator Set to true if we are initiating a connection with `peer` */ - private initWebRtcConnection( - peer: Peer, - nodeDataChannel: NodeDataChannelType, - initiator: boolean, - ): WebRtcConnection { - const connection = new WebRtcConnection( - nodeDataChannel, - initiator, - this.logger, - this.metrics, - { - stunServers: this.stunServers, - }, - ) + private initWebRtcConnection(peer: Peer, initiator: boolean): WebRtcConnection { + const connection = new WebRtcConnection(initiator, this.logger, this.metrics, { + stunServers: this.stunServers, + }) connection.onSignal.on((data) => { let errorMessage @@ -1271,7 +1261,7 @@ export class PeerManager { return } - this.initWebRtcConnection(targetPeer, this.localPeer.nodeDataChannel, true) + this.initWebRtcConnection(targetPeer, true) } /** @@ -1376,11 +1366,7 @@ export class PeerManager { return } - signalingConnection = this.initWebRtcConnection( - signalingPeer, - this.localPeer.nodeDataChannel, - false, - ) + signalingConnection = this.initWebRtcConnection(signalingPeer, false) } else { signalingConnection = signalingPeer.state.connections.webRtc } diff --git a/ironfish/src/network/testUtilities/mockLocalPeer.ts b/ironfish/src/network/testUtilities/mockLocalPeer.ts index f0bac75c02..7ea8aec65a 100644 --- a/ironfish/src/network/testUtilities/mockLocalPeer.ts +++ b/ironfish/src/network/testUtilities/mockLocalPeer.ts @@ -6,31 +6,10 @@ import { Blockchain } from '../../blockchain' import { mockChain } from '../../testUtilities/mocks' import { PrivateIdentity } from '../identity' import { LocalPeer } from '../peers/localPeer' -import { NodeDataChannelType } from '../types' import { VERSION_PROTOCOL } from '../version' import { WebSocketClient } from '../webSocketClient' import { mockPrivateIdentity } from './mockPrivateIdentity' -const mockNodeDataChannel: NodeDataChannelType = { - PeerConnection: class { - onLocalDescription() {} - onLocalCandidate() {} - onDataChannel() {} - createDataChannel() { - return { - onOpen: () => {}, - onError: () => {}, - onClosed: () => {}, - onMessage: () => {}, - close: () => {}, - isOpen: () => {}, - sendMessage: () => {}, - sendMessageBinary: () => {}, - } - } - }, -} as unknown as NodeDataChannelType - /** * Utility to create a fake "keypair" for testing the network layer */ @@ -52,7 +31,6 @@ export function mockLocalPeer({ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument chain || mockChain(), WebSocketClient, - mockNodeDataChannel, 0, true, ) diff --git a/ironfish/src/network/types.ts b/ironfish/src/network/types.ts index a4ae3e41e6..93db6dbb5e 100644 --- a/ironfish/src/network/types.ts +++ b/ironfish/src/network/types.ts @@ -1,8 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -// @ts-expect-error Allow type-only import https://github.com/microsoft/TypeScript/issues/49721 -import type nodeDataChannel from 'node-datachannel' import type { ErrorEvent as WSErrorEvent } from 'ws' import { WebSocketClient } from './webSocketClient' @@ -36,7 +34,6 @@ export enum NetworkMessageType { NewTransactions = 83, } -export type NodeDataChannelType = typeof nodeDataChannel export type IsomorphicWebSocketConstructor = typeof WebSocket | typeof WebSocketClient export type IsomorphicWebSocket = WebSocket | WebSocketClient export type IsomorphicWebSocketErrorEvent = WSErrorEvent diff --git a/ironfish/src/node.ts b/ironfish/src/node.ts index e7f7582e2e..bb4a2931ab 100644 --- a/ironfish/src/node.ts +++ b/ironfish/src/node.ts @@ -22,7 +22,7 @@ import { Migrator } from './migrations' import { MiningManager } from './mining' import { PeerNetwork, PrivateIdentity, privateIdentityToIdentity } from './network' import { isHexSecretKey } from './network/identity' -import { IsomorphicWebSocketConstructor, NodeDataChannelType } from './network/types' +import { IsomorphicWebSocketConstructor } from './network/types' import { getNetworkDefinition } from './networks' import { Network } from './networks/network' import { Package } from './package' @@ -70,7 +70,6 @@ export class FullNode { workerPool, logger, webSocket, - nodeDataChannel, privateIdentity, peerStore, assetsVerifier, @@ -87,7 +86,6 @@ export class FullNode { workerPool: WorkerPool logger: Logger webSocket: IsomorphicWebSocketConstructor - nodeDataChannel: NodeDataChannelType privateIdentity: PrivateIdentity peerStore: PeerStore assetsVerifier: AssetsVerifier @@ -148,7 +146,6 @@ export class FullNode { bootstrapNodes: config.getArray('bootstrapNodes'), stunServers: config.getArray('p2pStunServers'), webSocket: webSocket, - nodeDataChannel: nodeDataChannel, node: this, chain: chain, metrics: this.metrics, @@ -331,8 +328,6 @@ export class FullNode { logger, }) - const nodeDataChannel = await import('node-datachannel') - const node = new FullNode({ pkg, chain, @@ -345,7 +340,6 @@ export class FullNode { workerPool, logger, webSocket, - nodeDataChannel, privateIdentity, peerStore, assetsVerifier, diff --git a/yarn.lock b/yarn.lock index 2211653f23..850094fc80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2358,6 +2358,86 @@ dependencies: esquery "^1.0.1" +"@rollup/rollup-android-arm-eabi@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" + integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== + +"@rollup/rollup-android-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" + integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== + +"@rollup/rollup-darwin-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" + integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== + +"@rollup/rollup-darwin-x64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" + integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" + integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== + +"@rollup/rollup-linux-arm-musleabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" + integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== + +"@rollup/rollup-linux-arm64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" + integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== + +"@rollup/rollup-linux-arm64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" + integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" + integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== + +"@rollup/rollup-linux-riscv64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" + integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== + +"@rollup/rollup-linux-s390x-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" + integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== + +"@rollup/rollup-linux-x64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" + integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== + +"@rollup/rollup-linux-x64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" + integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== + +"@rollup/rollup-win32-arm64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" + integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== + +"@rollup/rollup-win32-ia32-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" + integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== + +"@rollup/rollup-win32-x64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" + integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2495,6 +2575,11 @@ dependencies: colors "*" +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/expect@^1.20.4": version "1.20.4" resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" @@ -5128,6 +5213,11 @@ fsevents@^2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7456,13 +7546,14 @@ node-cleanup@^2.1.2: resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" integrity sha1-esGavSl+Caf3KnFUXZUbUX5N3iw= -node-datachannel@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/node-datachannel/-/node-datachannel-0.5.1.tgz#55bf24c86ffb83ffa03a1d4363965598971e5a84" - integrity sha512-3hwCrBWJqYoozwVtJNzNtISLKwa3l/XTbrPFCyhC3KCgW1IvYMHhHm5FW37p0p2oth3J6MDwCw3T/0m7DTR7lw== +node-datachannel@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/node-datachannel/-/node-datachannel-0.8.0.tgz#56340ec4360819ae5fb379309af00a9142e8acce" + integrity sha512-05vYthhjESfO5qumWRbqHI1PN71rc19DJjc14ofOLapJrTCnmhx0JYw0G5wcL56b57uHQP9WjEak3+XklrB+Og== dependencies: node-domexception "^2.0.1" prebuild-install "^7.0.1" + rollup "^4.14.1" node-domexception@^2.0.1: version "2.0.1" @@ -8713,6 +8804,31 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rollup@^4.14.1: + version "4.17.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" + integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.17.2" + "@rollup/rollup-android-arm64" "4.17.2" + "@rollup/rollup-darwin-arm64" "4.17.2" + "@rollup/rollup-darwin-x64" "4.17.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" + "@rollup/rollup-linux-arm-musleabihf" "4.17.2" + "@rollup/rollup-linux-arm64-gnu" "4.17.2" + "@rollup/rollup-linux-arm64-musl" "4.17.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" + "@rollup/rollup-linux-riscv64-gnu" "4.17.2" + "@rollup/rollup-linux-s390x-gnu" "4.17.2" + "@rollup/rollup-linux-x64-gnu" "4.17.2" + "@rollup/rollup-linux-x64-musl" "4.17.2" + "@rollup/rollup-win32-arm64-msvc" "4.17.2" + "@rollup/rollup-win32-ia32-msvc" "4.17.2" + "@rollup/rollup-win32-x64-msvc" "4.17.2" + fsevents "~2.3.2" + run-async@^2.0.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"