From 0f333b1f2490929f7594e2ec0552f6d3b6ea5547 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Mon, 26 Jan 2026 20:37:27 +0100 Subject: [PATCH] another attempt to improve printer service communication --- compose.yml | 1 + src/integrations/orpc/services/printer.ts | 31 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/compose.yml b/compose.yml index 0d4a9ae57..7f3051daa 100644 --- a/compose.yml +++ b/compose.yml @@ -22,6 +22,7 @@ services: restart: unless-stopped environment: - QUEUED=30 + - TIMEOUT=-1 - HEALTH=true - CONCURRENT=20 - TOKEN=1234567890 diff --git a/src/integrations/orpc/services/printer.ts b/src/integrations/orpc/services/printer.ts index 90d072ddc..995f84bf0 100644 --- a/src/integrations/orpc/services/printer.ts +++ b/src/integrations/orpc/services/printer.ts @@ -10,7 +10,13 @@ import { getStorageService, uploadFile } from "./storage"; const SCREENSHOT_TTL = 1000 * 60 * 60 * 6; // 6 hours +// Singleton browser instance for connection reuse +let browserInstance: Browser | null = null; + async function getBrowser(): Promise { + // Reuse existing connected browser if available + if (browserInstance?.connected) return browserInstance; + const args = ["--disable-dev-shm-usage", "--disable-features=LocalNetworkAccessChecks,site-per-process,FedCm"]; const endpoint = new URL(env.PRINTER_ENDPOINT); @@ -22,9 +28,28 @@ async function getBrowser(): Promise { if (isWebSocket) connectOptions.browserWSEndpoint = endpoint.toString(); else connectOptions.browserURL = endpoint.toString(); - return puppeteer.connect(connectOptions); + browserInstance = await puppeteer.connect(connectOptions); + return browserInstance; } +async function closeBrowser(): Promise { + if (browserInstance?.connected) { + await browserInstance.close(); + browserInstance = null; + } +} + +// Close browser on process termination +process.on("SIGINT", async () => { + await closeBrowser(); + process.exit(0); +}); + +process.on("SIGTERM", async () => { + await closeBrowser(); + process.exit(0); +}); + export const printerService = { healthcheck: async (): Promise => { const headers = new Headers({ Accept: "application/json" }); @@ -210,8 +235,6 @@ export const printerService = { return result.url; } catch (error) { throw new ORPCError("INTERNAL_SERVER_ERROR", error as Error); - } finally { - if (browser?.connected) await browser.disconnect(); } }, @@ -292,8 +315,6 @@ export const printerService = { return result.url; } catch (error) { throw new ORPCError("INTERNAL_SERVER_ERROR", error as Error); - } finally { - if (browser?.connected) await browser.disconnect(); } }, };