import { Page, chromium, devices } from "playwright"; import { prisma } from "@/lib/api/db"; import createFile from "@/lib/api/storage/createFile"; export default async function archive(linkId: number, url: string) { const browser = await chromium.launch(); const context = await browser.newContext(devices["Desktop Chrome"]); const page = await context.newPage(); try { await page.goto(url, { waitUntil: "domcontentloaded" }); await autoScroll(page); const linkExists = await prisma.link.findUnique({ where: { id: linkId, }, }); if (linkExists) { const pdf = await page.pdf({ width: "1366px", height: "1931px", printBackground: true, margin: { top: "15px", bottom: "15px" }, }); const screenshot = await page.screenshot({ fullPage: true, }); createFile({ data: screenshot, filePath: `archives/${linkExists.collectionId}/${linkId}.png`, }); createFile({ data: pdf, filePath: `archives/${linkExists.collectionId}/${linkId}.pdf`, }); } await browser.close(); } catch (err) { console.log(err); await browser.close(); } } const autoScroll = async (page: Page) => { await page.evaluate(async () => { const timeoutPromise = new Promise((_, reject) => { setTimeout(() => { reject(new Error("Auto scroll took too long (more than 20 seconds).")); }, 20000); }); const scrollingPromise = new Promise((resolve) => { let totalHeight = 0; let distance = 100; let scrollDown = setInterval(() => { let scrollHeight = document.body.scrollHeight; window.scrollBy(0, distance); totalHeight += distance; if (totalHeight >= scrollHeight) { clearInterval(scrollDown); window.scroll(0, 0); resolve(); } }, 100); }); await Promise.race([scrollingPromise, timeoutPromise]); }); };