Files
q-buffer/apps/server/src/torrent/torrent.generator.ts
wisecolt 6507d13325 fix(server): tür derlemesi ve derleme yapılandırmasını düzelt
TypeScript derleme hatalarını çöz, Docker yapılandırmasını güncelle ve tip güvenliğini iyileştir

- tsconfig.json'a noImplicitAny: false ekle
- auth.middleware.ts'de Express tip tanımlamalarını kaldır
- torrent.generator.ts ve enforcement.worker.ts'de tip açıklamaları ekle
- loop.routes.ts'de torrentFilePath için null kontrolü ekle
- qbit.types.ts'ye added_on alanı ekle
- Dockerfile'da --prod=false bayrağını ekle ve node_modules kopyalamasını düzelt
- docker-compose.yml'de hizmet adını q-buffer olarak güncelle ve çevre değişkenlerini ekle
- .env.example'a WEB_ORIGIN değişkenini ekle
2026-02-01 21:22:02 +03:00

42 lines
1.1 KiB
TypeScript

import fs from "node:fs/promises";
import path from "node:path";
import { config } from "../config";
import { logger } from "../utils/logger";
export const generateTorrentFile = async (
magnet: string,
hash: string
): Promise<string> => {
const targetPath = path.join(config.torrentArchiveDir, `${hash}.torrent`);
const { default: WebTorrent } = await import("webtorrent");
const client = new WebTorrent();
return new Promise((resolve, reject) => {
const torrent = client.add(magnet, { path: config.dataDir });
const timeout = setTimeout(() => {
client.destroy();
reject(new Error("Metadata fetch timeout"));
}, 120_000);
torrent.on("metadata", async () => {
clearTimeout(timeout);
try {
const buffer = torrent.torrentFile;
await fs.writeFile(targetPath, buffer);
resolve(targetPath);
} catch (error) {
reject(error);
} finally {
client.destroy();
}
});
torrent.on("error", (error: unknown) => {
logger.error({ error }, "Torrent metadata error");
clearTimeout(timeout);
client.destroy();
reject(error);
});
});
};