From 8e80901c0f1e48625efbf6ab95ef99ce7577fed8 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Thu, 10 Apr 2025 12:28:26 +0200 Subject: [PATCH] optimize: browser open / close at sequential printing --- src/helpers/pdfExport.ts | 88 +++++++++++++++++++++++++---------- src/helpers/templateHelper.ts | 4 +- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/helpers/pdfExport.ts b/src/helpers/pdfExport.ts index e59ba54..429f551 100644 --- a/src/helpers/pdfExport.ts +++ b/src/helpers/pdfExport.ts @@ -1,10 +1,47 @@ -import puppeteer from "puppeteer"; +import puppeteer, { Browser } from "puppeteer"; import { TemplateHelper } from "./templateHelper"; import { PermissionModule } from "../type/permissionTypes"; import { FileSystemHelper } from "./fileSystemHelper"; import { PDFDocument } from "pdf-lib"; +import { StringHelper } from "./stringHelper"; export abstract class PdfExport { + private static browserInstance: undefined | Browser = undefined; + private static timeout: undefined | NodeJS.Timeout = undefined; + private static printing = new Map(); + + private static async renderTemplate( + template: `${PermissionModule}` | `${PermissionModule}.${string}`, + title: string, + data: any, + customTemplate?: { + headerId?: number; + footerId?: number; + bodyId?: string | number; + headerHeight: number; + footerHeight: number; + } + ): Promise<{ header: string; footer: string; body: string; headerMargin?: number; footerMargin?: number }> { + if (!customTemplate) { + return await TemplateHelper.renderFileForModule({ + module: template, + headerData: data, + bodyData: data, + footerData: data, + title: title, + }); + } else { + return await TemplateHelper.renderFileForCustom({ + module: template, + customTemplate, + headerData: data, + bodyData: data, + footerData: data, + title: title, + }); + } + } + static async renderFile({ template, title = "pdf-export FF Admin", @@ -28,33 +65,25 @@ export abstract class PdfExport { footerHeight: number; }; }) { + try { + clearTimeout(this.timeout); + } catch (err) {} + let id = StringHelper.random(32); + this.printing.set(id, "printing"); + if (folder != "") FileSystemHelper.createFolder(folder); - let header: string, footer: string, body: string, headerMargin: number, footerMargin: number; - if (!customTemplate) { - ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForModule({ - module: template, - headerData: data, - bodyData: data, - footerData: data, - title: title, - })); - } else { - ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForCustom({ - module: template, - customTemplate, - headerData: data, - bodyData: data, - footerData: data, - title: title, - })); + const renderedTemplate = await this.renderTemplate(template, title, data, customTemplate); + let { header, footer, body, headerMargin, footerMargin } = renderedTemplate; + + if (!this.browserInstance || !this.browserInstance.connected) { + this.browserInstance = await puppeteer.launch({ + headless: true, + args: ["--no-sandbox", "--disable-gpu", "--disable-setuid-sandbox"], + }); } - const browser = await puppeteer.launch({ - headless: true, - args: ["--no-sandbox", "--disable-gpu", "--disable-setuid-sandbox"], - }); - const page = await browser.newPage(); + const page = await this.browserInstance.newPage(); await page.setContent(body, { waitUntil: "domcontentloaded" }); const exportPath = FileSystemHelper.formatPath(folder, `${filename}.pdf`); @@ -74,7 +103,16 @@ export abstract class PdfExport { footerTemplate: footer, }); - await browser.close(); + await page.close(); + + this.printing.delete(id); + + if (this.printing.size == 0) { + this.timeout = setTimeout(() => { + this.browserInstance.close(); + this.browserInstance = undefined; + }, 5000); + } return pdf; } diff --git a/src/helpers/templateHelper.ts b/src/helpers/templateHelper.ts index 2aac38b..3dc5ad8 100644 --- a/src/helpers/templateHelper.ts +++ b/src/helpers/templateHelper.ts @@ -11,7 +11,9 @@ export abstract class TemplateHelper { try { tmpFile = FileSystemHelper.readTemplateFile(`/src/templates/${template}.template.html`); } catch (err) { - tmpFile = FileSystemHelper.readTemplateFile(`/src/templates/${template.split(".")[1]}.template.html`); + tmpFile = FileSystemHelper.readTemplateFile( + `/src/templates/${template.split(".")[template.split(".").length - 1]}.template.html` + ); } return tmpFile; }