import { readFileSync } from "fs"; import { createHash } from "crypto"; import { Browser, BrowserContext, BrowserContextOptions, firefox, } from "playwright"; import { join } from "path/posix"; export class BrowserManager { private browser: Browser; private contexts = new Map(); async openBrowser(headless = false) { this.browser = await firefox.launch({ headless: headless, args: ['--lang="it-IT"'], }); return this.browser; } async createNewContext(session: string): Promise { const options: BrowserContextOptions = { locale: "en-US", bypassCSP: true, colorScheme: "dark", acceptDownloads: true, permissions: ["geolocation"], reducedMotion: "reduce", extraHTTPHeaders: { "accept-language": "en-US,en;q=0.9", }, }; options.storageState = session; const context = await this.browser.newContext(options); //await this.createNewPage(context); const contextId = this.getContextId(context); console.log(contextId); this.contexts.set(contextId, context); return context; } getContextId(context: BrowserContext) { return createHash("md5").update(JSON.stringify(context)).digest("hex"); } async createNewPage(context: BrowserContext) { const page = await context.newPage(); const intialScript = readFileSync( join(__dirname,"../utils/initial-context.js") ).toString(); await page.addInitScript(intialScript); } async closeContext(context: BrowserContext) { await context.close(); this.contexts.delete(this.getContextId(context)); } }