From d8e0ced54cf879cce5b90b8194f163e0fb3aabec Mon Sep 17 00:00:00 2001 From: Avinash Bathula Date: Tue, 2 Sep 2025 08:25:41 +0530 Subject: [PATCH] fix(printer-service): ensure profile image fully loads before PDF render --- apps/server/src/printer/printer.service.ts | 24 ++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/apps/server/src/printer/printer.service.ts b/apps/server/src/printer/printer.service.ts index 973f3f4f..8f9eee2e 100644 --- a/apps/server/src/printer/printer.service.ts +++ b/apps/server/src/printer/printer.service.ts @@ -127,13 +127,33 @@ export class PrinterService { // Set the data of the resume to be printed in the browser's session storage const numberPages = resume.data.metadata.layout.length; - await page.goto(`${url}/artboard/preview`, { waitUntil: "networkidle0" }); + await page.goto(`${url}/artboard/preview`, { waitUntil: "domcontentloaded" }); await page.evaluate((data) => { window.localStorage.setItem("resume", JSON.stringify(data)); }, resume.data); - await page.reload({ waitUntil: "load" }); + await Promise.all([ + page.reload({ waitUntil: "load" }), + // Wait until first page is present before proceeding + page.waitForSelector('[data-page="1"]', { timeout: 15_000 }), + ]); + + if (resume.data.basics.picture.url) { + await page.waitForSelector('img[alt="Profile"]'); + await page.evaluate(() => + Promise.all( + // eslint-disable-next-line unicorn/prefer-spread + Array.from(document.images).map((img) => { + if (img.complete) return; + return new Promise((resolve) => { + // eslint-disable-next-line unicorn/prefer-add-event-listener + img.onload = img.onerror = resolve; + }); + }), + ), + ); + } const pagesBuffer: Buffer[] = [];