Openstatus www.openstatus.dev
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

🤓 reuse session browser (#748)

authored by

Thibault Le Ouay and committed by
GitHub
a8fafea3 5a2f14c3

+38 -3
+1 -1
apps/screenshot-worker/package.json
··· 2 2 "name": "@openstatus/screenshot-worker", 3 3 "version": "0.0.1", 4 4 "scripts": { 5 - "dev": "wrangler dev src/index.ts", 5 + "dev": "wrangler dev src/index.ts --remote", 6 6 "deploy": "wrangler deploy --minify src/index.ts" 7 7 }, 8 8 "dependencies": {
+37 -2
apps/screenshot-worker/src/index.ts
··· 53 53 54 54 const env = c.env; 55 55 const db = createDrizzleClient(env); 56 - const browser = await puppeteer.launch(c.env.MYBROWSER); 56 + 57 + const sessionId = await getRandomSession(c.env.MYBROWSER); 58 + let browser; 59 + if (sessionId) { 60 + try { 61 + browser = await puppeteer.connect(env.MYBROWSER, sessionId); 62 + } catch (e) { 63 + // another worker may have connected first 64 + console.log(`Failed to connect to ${sessionId}. Error ${e}`); 65 + } 66 + } 67 + if (!browser) { 68 + // No open sessions, launch new session 69 + browser = await puppeteer.launch(env.MYBROWSER); 70 + } 71 + 57 72 const page = await browser.newPage(); 58 73 await page.goto(data.url, { waitUntil: "networkidle2" }); 59 74 const img = await page.screenshot(); 75 + await browser.disconnect(); 60 76 const id = `${data.incidentId}-${Date.now()}.png`; 61 77 const url = `https://screenshot.openstat.us/${id}`; 62 78 await c.env.MY_BUCKET.put(id, img); 63 - await browser.close(); 64 79 if (data.kind === "incident") { 65 80 await db 66 81 .update(incidentTable) ··· 78 93 return c.text("Screenshot saved"); 79 94 }, 80 95 ); 96 + const getRandomSession = async ( 97 + endpoint: puppeteer.BrowserWorker, 98 + ): Promise<string | undefined> => { 99 + const sessions: puppeteer.ActiveSession[] = 100 + await puppeteer.sessions(endpoint); 101 + console.log(`Sessions: ${JSON.stringify(sessions)}`); 102 + const sessionsIds = sessions 103 + .filter((v) => { 104 + return !v.connectionId; // remove sessions with workers connected to them 105 + }) 106 + .map((v) => { 107 + return v.sessionId; 108 + }); 109 + if (sessionsIds.length === 0) { 110 + return; 111 + } 81 112 113 + const sessionId = sessionsIds[Math.floor(Math.random() * sessionsIds.length)]; 114 + 115 + return sessionId!; 116 + }; 82 117 export default app;