first commit
This commit is contained in:
41
apps/server/src/torrent/torrent.generator.ts
Normal file
41
apps/server/src/torrent/torrent.generator.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
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) => {
|
||||
logger.error({ error }, "Torrent metadata error");
|
||||
clearTimeout(timeout);
|
||||
client.destroy();
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user