Compare commits

...

2 Commits

Author SHA1 Message Date
1fca69fa66 fix: fix testing torrents container 2025-04-01 03:45:56 +08:00
a0fc4c04d9 feat: add testing-torrents 2025-04-01 03:00:29 +08:00
23 changed files with 1131 additions and 465 deletions

View File

@ -0,0 +1,33 @@
name: Build and Push Testing Torrents Container
on:
workflow_dispatch:
env:
REGISTRY: ghcr.io
ORG: dumtruck
PROJECT: konobangu
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: 'packages/testing-torrents'
file: './Dockerfile'
push: true
tags: 'ghcr.io/${{ env.ORG }}/${{ env.PROJECT }}-testing-torrents:latest'
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@ -27,7 +27,6 @@
},
"emmet.showExpandedAbbreviation": "never",
"prettier.enable": false,
"tailwindCSS.experimental.configFile": "./packages/tailwind-config/config.ts",
"typescript.tsdk": "node_modules/typescript/lib",
"rust-analyzer.cargo.features": ["testcontainers"]
}

1167
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@ once_cell = "1.20.2"
reqwest-middleware = "0.4.0"
reqwest-retry = "0.7.0"
reqwest-tracing = "0.5.5"
scraper = "0.22.0"
scraper = "0.23"
leaky-bucket = "1.1.2"
serde_with = "3"
jwt-authorizer = "0.15.0"
@ -87,8 +87,8 @@ color-eyre = "0.6"
log = "0.4.22"
anyhow = "1.0.95"
bollard = { version = "0.18", optional = true }
async-graphql = { version = "7.0.15", features = [] }
async-graphql-axum = "7.0.15"
async-graphql = { version = "7", features = [] }
async-graphql-axum = "7"
fastrand = "2.3.0"
seaography = { version = "1.1" }
quirks_path = "0.1.1"
@ -129,13 +129,11 @@ tracing-appender = "0.2.3"
clap = "4.5.31"
futures-util = "0.3.31"
ipnetwork = "0.21.1"
kanal = "0.1.0-pre8"
append-only-vec = "0.1.7"
typed-builder = "0.20.0"
ctor = "0.4.0"
librqbit = "8.0.0"
[dev-dependencies]
serial_test = "3"
insta = { version = "1", features = ["redactions", "yaml", "filters"] }
mockito = "1.6.1"
rstest = "0.24.0"
rstest = "0.25"

View File

@ -1,11 +1,12 @@
pub mod core;
pub mod error;
pub mod qbit;
mod utils;
pub mod rqbit;
pub mod utils;
pub use core::{
Torrent, TorrentContent, TorrentDownloader, TorrentFilter, TorrentSource, BITTORRENT_MIME_TYPE,
MAGNET_SCHEMA,
BITTORRENT_MIME_TYPE, MAGNET_SCHEMA, Torrent, TorrentContent, TorrentDownloader, TorrentFilter,
TorrentSource,
};
pub use error::TorrentDownloadError;

View File

@ -0,0 +1 @@
use librqbit::TorrentMetadata;

View File

@ -8,13 +8,13 @@ use tracing::instrument;
use url::Url;
use crate::{
download::core::BITTORRENT_MIME_TYPE,
errors::{RError, RResult},
extract::mikan::{
MikanClient,
web_extract::{MikanEpisodeHomepage, extract_mikan_episode_id_from_homepage},
},
fetch::bytes::fetch_bytes,
sync::core::BITTORRENT_MIME_TYPE,
};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
@ -339,11 +339,11 @@ mod tests {
use url::Url;
use crate::{
download::core::BITTORRENT_MIME_TYPE,
extract::mikan::{
MikanBangumiAggregationRssChannel, MikanBangumiRssChannel, MikanRssChannel,
extract_mikan_rss_channel_from_rss_link,
},
sync::core::BITTORRENT_MIME_TYPE,
test_utils::mikan::build_testing_mikan_client,
};

View File

@ -12,6 +12,7 @@ pub mod app;
pub mod auth;
pub mod cache;
pub mod database;
pub mod download;
pub mod errors;
pub mod extract;
pub mod fetch;
@ -20,7 +21,6 @@ pub mod logger;
pub mod migrations;
pub mod models;
pub mod storage;
pub mod sync;
pub mod tasks;
#[cfg(test)]
pub mod test_utils;

View File

@ -10,7 +10,9 @@
"noNonNullAssertion": "off"
},
"suspicious": {
"noExplicitAny": "off"
"noExplicitAny": "off",
"noConsole": "off",
"noConsoleLog": "off"
},
"a11y": {
"noSvgWithoutTitle": "off"
@ -27,14 +29,6 @@
}
},
"files": {
"ignore": [
"packages/design-system/components/ui/**",
"packages/design-system/lib/**",
"packages/design-system/hooks/**",
"packages/collaboration/config.ts",
"apps/docs/**/*.json",
"apps/email/.react-email/**",
".vscode/*.json"
]
"ignore": [".vscode/*.json"]
}
}

View File

@ -1,31 +0,0 @@
version: '3'
services:
webui:
image: node:22-alpine
ports:
- '5000:5000'
volumes:
- ./apps/webui:/home/node/app
- node_modules:/home/node/app/node_modules
working_dir: /home/node/app/
command: sh -c "yarn install && yarn dev"
depends_on:
- mongo
env_file:
- .env
mongo:
image: mongo:latest
ports:
- '27017:27017'
command:
- --storageEngine=wiredTiger
volumes:
- data:/data/db
logging:
driver: none
volumes:
data:
node_modules:

View File

@ -0,0 +1,17 @@
FROM node:23-slim AS nodebt
RUN npm install -g pnpm
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
FROM nodebt AS deps
RUN mkdir -p /app/workspace
WORKDIR /app
COPY package.json /app/
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --no-frozen-lockfile
FROM deps AS app
COPY main.ts /app/
CMD [ "npm", "start" ]

View File

@ -0,0 +1,20 @@
# Konobangu Testing Torrents Container
## Build
```bash
docker buildx build --platform linux/amd64 --tag konobangu-testing-torrents:latest --load .
```
## Run
```bash
docker run --network_mode=host --name konobangu-testing-torrents konobangu-testing-torrents:latest
```
## Publish
```bash
docker tag konobangu-testing-torrents:latest ghcr.io/dumtruck/konobangu-testing-torrents:latest
docker push ghcr.io/dumtruck/konobangu-testing-torrents:latest
```

View File

@ -0,0 +1,5 @@
services:
konobangu-testing-torrents:
build: .
network_mode: host
container_name: konobangu-testing-torrents

View File

@ -0,0 +1,185 @@
import fastifyStatic from '@fastify/static';
import Fastify from 'fastify';
import fs from 'node:fs';
import fsp from 'node:fs/promises';
import path from 'node:path';
// @ts-ignore
import TrackerServer from 'bittorrent-tracker/server';
import createTorrent from 'create-torrent';
import WebTorrent, { type Torrent } from 'webtorrent';
// Configuration
const API_PORT = 6080;
const TRACKER_PORT = 6081;
const STATIC_API_PATH = '/api/static';
const LOCAL_IP = '127.0.0.1';
const WORKSPACE_PATH = 'workspace';
const TRACKER_URL = `http://${LOCAL_IP}:${TRACKER_PORT}/announce`;
const API_BASE_URL = `http://${LOCAL_IP}:${API_PORT}/${STATIC_API_PATH}/`;
// Initialize Fastify instance
const app = Fastify({ logger: true });
// Mount static file service, mapping ./workspace directory to /api/static route
app.register(fastifyStatic, {
root: path.join(process.cwd(), WORKSPACE_PATH),
prefix: STATIC_API_PATH,
});
const tracker = new TrackerServer({
udp: true, // enable udp server? [default=true]
http: true, // enable http server? [default=true]
ws: true, // enable websocket server? [default=true]
stats: true, // enable web-based statistics? [default=true]
trustProxy: true, // enable trusting x-forwarded-for header for remote IP [default=false]
});
// Define request and response type definitions
interface FileItem {
path: string;
size: number;
}
interface RequestSchema {
id: string;
fileList: FileItem[];
}
interface ResponseSchema {
torrentUrl: string;
magnetUrl: string;
}
// Start local Tracker
async function startTracker(): Promise<void> {
return new Promise<void>((resolve, reject) => {
tracker.listen(TRACKER_PORT, 'localhost', () => {
console.log(`Tracker listening on port ${TRACKER_PORT}`);
resolve();
});
tracker.on('error', (err: any) => {
reject(`Tracker error: ${err}`);
});
tracker.on('warning', (warn: any) =>
console.warn(`Tracker warning: ${warn}`)
);
// Log tracked torrents
tracker.on('update', (addr: any, params: any) => {
console.log(`Tracker update: ${params.info_hash} from ${addr}`);
});
});
}
// Tracker and WebTorrent client
const webTorrent = new WebTorrent({});
// Generate mock file
async function generateMockFile(filePath: string, size: number) {
const dir = path.dirname(filePath);
if (!fs.existsSync(dir)) {
await fsp.mkdir(dir, { recursive: true });
}
await fsp.truncate(filePath, size);
}
// Generate torrent file
function generateTorrent(folderPath: string, torrentPath: string) {
return new Promise<void>((resolve, reject) => {
createTorrent(
folderPath,
{
announceList: [[TRACKER_URL]], // Specify tracker URL
private: false,
createdBy: 'WebTorrent',
comment: 'Generated by WebTorrent server',
urlList: [API_BASE_URL],
},
async (err, torrent) => {
if (err) {
reject(new Error(`Failed to create torrent: ${err}`));
return;
}
await fsp.writeFile(torrentPath, torrent);
if (!fs.existsSync(torrentPath)) {
reject(new Error(`Torrent file ${torrentPath} was not created`));
return;
}
console.log(`Generated torrent with tracker: ${TRACKER_URL}`);
resolve();
}
);
});
}
// Add torrent and seed
async function seedTorrent(torrentPath: string): Promise<Torrent> {
return new Promise((resolve) => {
const torrent = webTorrent.seed(
torrentPath,
{
announce: [TRACKER_URL],
},
(t) => {
resolve(t);
}
);
torrent.on('error', (err) => console.error(`Torrent error: ${err}`));
torrent.on('wire', (wire) =>
console.log(`Connected to peer: ${wire.peerId}`)
);
torrent.on('done', () =>
console.log(`Torrent ${torrent.infoHash} fully seeded`)
);
});
}
// Handle POST request to /api/torrents/mock
app.post<{ Body: RequestSchema }>('/api/torrents/mock', async (req, _reply) => {
const { id, fileList } = req.body;
const idFolder = path.join(WORKSPACE_PATH, id);
if (!fs.existsSync(idFolder)) {
await fsp.mkdir(idFolder, { recursive: true });
}
for (const fileItem of fileList) {
const filePath = path.join(idFolder, fileItem.path);
await generateMockFile(filePath, fileItem.size);
}
const torrentPath = path.join(WORKSPACE_PATH, `${id}.torrent`);
await generateTorrent(idFolder, torrentPath);
const torrent = await seedTorrent(torrentPath);
const magnetUrl = `magnet:?xt=urn:btih:${torrent.infoHash}&tr=${TRACKER_URL}`;
return {
torrentUrl: `${API_BASE_URL}${id}.torrent`,
magnetUrl,
} as ResponseSchema;
});
// Main program entry
async function main() {
try {
await startTracker();
await app.listen({ port: API_PORT, host: LOCAL_IP });
} catch (err) {
console.error('Startup error:', err);
webTorrent.destroy();
tracker.close();
process.exit(1);
}
}
main();
// Graceful shutdown
process.on('SIGINT', () => {
console.log('Shutting down...');
tracker.close();
webTorrent.destroy();
process.exit(0);
});

View File

@ -0,0 +1,29 @@
{
"name": "@konobangu/testing-torrents",
"version": "0.0.1",
"description": "Kono bangumi? Testing Torrents",
"main": "main.ts",
"type": "commonjs",
"scripts": {
"start": "tsx main.ts"
},
"dependencies": {
"@fastify/static": "^8.1.1",
"bittorrent-tracker": "^11.2.1",
"create-torrent": "^6.1.0",
"fastify": "^5.2.2",
"tsx": "^4.19.2",
"webtorrent": "^2.5.19"
},
"devDependencies": {
"@types/create-torrent": "^5.0.2",
"@types/webtorrent": "^0.110.0"
},
"pnpm": {
"onlyBuiltDependencies": [
"utf-8-validate",
"node-datachannel",
"utp-native"
]
}
}

2
packages/testing/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
resources/*
!resources/.gitkeep

View File

65
pnpm-lock.yaml generated
View File

@ -42,7 +42,7 @@ importers:
version: 19.0.0
react-email:
specifier: 3.0.4
version: 3.0.4(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
version: 3.0.4(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(utf-8-validate@6.0.5)
devDependencies:
'@types/react':
specifier: 19.0.1
@ -79,7 +79,7 @@ importers:
version: 0.2.4(solid-js@1.9.5)
'@graphiql/toolkit':
specifier: ^0.11.1
version: 0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)
version: 0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)
'@kobalte/core':
specifier: ^0.13.9
version: 0.13.9(solid-js@1.9.5)
@ -127,7 +127,7 @@ importers:
version: 8.5.2(solid-js@1.9.5)
graphiql:
specifier: ^3.8.3
version: 3.8.3(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 3.8.3(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
lucide-solid:
specifier: ^0.477.0
version: 0.477.0(solid-js@1.9.5)
@ -247,7 +247,7 @@ importers:
version: 4.3.4(vite@5.4.11(@types/node@22.13.8)(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0))
vitest:
specifier: ^2.1.8
version: 2.1.8(@types/node@22.13.8)(jsdom@25.0.1(bufferutil@4.0.9))(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0)
version: 2.1.8(@types/node@22.13.8)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0)
packages:
@ -5770,6 +5770,10 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
utf-8-validate@6.0.5:
resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==}
engines: {node: '>=6.14.2'}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@ -6989,9 +6993,9 @@ snapshots:
'@floating-ui/utils@0.2.9': {}
'@graphiql/react@0.28.2(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@graphiql/react@0.28.2(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@graphiql/toolkit': 0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)
'@graphiql/toolkit': 0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)
'@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-dialog': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-dropdown-menu': 2.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -7018,13 +7022,13 @@ snapshots:
- '@types/react-dom'
- graphql-ws
'@graphiql/toolkit@0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)':
'@graphiql/toolkit@0.11.1(@types/node@22.13.8)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)':
dependencies:
'@n1ru4l/push-pull-async-iterable-iterator': 3.2.0
graphql: 16.10.0
meros: 1.3.0(@types/node@22.13.8)
optionalDependencies:
graphql-ws: 6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9))
graphql-ws: 6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))
transitivePeerDependencies:
- '@types/node'
@ -9679,7 +9683,7 @@ snapshots:
engine.io-parser@5.2.3: {}
engine.io@6.6.2(bufferutil@4.0.9):
engine.io@6.6.2(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies:
'@types/cookie': 0.4.1
'@types/cors': 2.8.17
@ -9690,7 +9694,7 @@ snapshots:
cors: 2.8.5
debug: 4.3.7
engine.io-parser: 5.2.3
ws: 8.17.1(bufferutil@4.0.9)
ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- bufferutil
- supports-color
@ -10224,9 +10228,9 @@ snapshots:
graceful-readlink@1.0.1: {}
graphiql@3.8.3(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
graphiql@3.8.3(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@graphiql/react': 0.28.2(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@graphiql/react': 0.28.2(@codemirror/language@6.0.0)(@types/node@22.13.8)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)))(graphql@16.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
graphql: 16.10.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@ -10244,11 +10248,11 @@ snapshots:
nullthrows: 1.1.1
vscode-languageserver-types: 3.17.5
graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)):
graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)):
dependencies:
graphql: 16.10.0
optionalDependencies:
ws: 8.18.1(bufferutil@4.0.9)
ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
optional: true
graphql@16.10.0: {}
@ -10570,7 +10574,7 @@ snapshots:
js-tokens@4.0.0: {}
jsdom@25.0.1(bufferutil@4.0.9):
jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies:
cssstyle: 4.2.1
data-urls: 5.0.0
@ -10591,7 +10595,7 @@ snapshots:
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.1.1
ws: 8.18.1(bufferutil@4.0.9)
ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
@ -11214,7 +11218,7 @@ snapshots:
react: 19.0.0
scheduler: 0.25.0
react-email@3.0.4(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4):
react-email@3.0.4(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(utf-8-validate@6.0.5):
dependencies:
'@babel/core': 7.24.5
'@babel/parser': 7.24.5
@ -11229,7 +11233,7 @@ snapshots:
next: 15.0.4(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
normalize-path: 3.0.0
ora: 5.4.1
socket.io: 4.8.0(bufferutil@4.0.9)
socket.io: 4.8.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- '@opentelemetry/api'
- '@playwright/test'
@ -11654,10 +11658,10 @@ snapshots:
sni@1.0.0: {}
socket.io-adapter@2.5.5(bufferutil@4.0.9):
socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies:
debug: 4.3.7
ws: 8.17.1(bufferutil@4.0.9)
ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- bufferutil
- supports-color
@ -11670,14 +11674,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
socket.io@4.8.0(bufferutil@4.0.9):
socket.io@4.8.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies:
accepts: 1.3.8
base64id: 2.0.0
cors: 2.8.5
debug: 4.3.7
engine.io: 6.6.2(bufferutil@4.0.9)
socket.io-adapter: 2.5.5(bufferutil@4.0.9)
engine.io: 6.6.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)
socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5)
socket.io-parser: 4.2.4
transitivePeerDependencies:
- bufferutil
@ -12151,6 +12155,11 @@ snapshots:
dependencies:
react: 18.3.1
utf-8-validate@6.0.5:
dependencies:
node-gyp-build: 4.8.4
optional: true
util-deprecate@1.0.2: {}
utils-merge@1.0.1: {}
@ -12191,7 +12200,7 @@ snapshots:
sass: 1.77.4
terser: 5.39.0
vitest@2.1.8(@types/node@22.13.8)(jsdom@25.0.1(bufferutil@4.0.9))(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0):
vitest@2.1.8(@types/node@22.13.8)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0):
dependencies:
'@vitest/expect': 2.1.8
'@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.13.8)(lightningcss@1.29.1)(sass@1.77.4)(terser@5.39.0))
@ -12215,7 +12224,7 @@ snapshots:
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.13.8
jsdom: 25.0.1(bufferutil@4.0.9)
jsdom: 25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- less
- lightningcss
@ -12422,13 +12431,15 @@ snapshots:
dependencies:
async-limiter: 2.0.0
ws@8.17.1(bufferutil@4.0.9):
ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5):
optionalDependencies:
bufferutil: 4.0.9
utf-8-validate: 6.0.5
ws@8.18.1(bufferutil@4.0.9):
ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5):
optionalDependencies:
bufferutil: 4.0.9
utf-8-validate: 6.0.5
optional: true
xml-name-validator@5.0.0:

View File

@ -1,6 +1,7 @@
packages:
- packages/*
- apps/*
- '!packages/testing-torrents'
onlyBuiltDependencies:
- '@biomejs/biome'
- bufferutil