const { chromium } = require("playwright")
// Save browser state, and close it when non used
setInterval(() => {
var browser = globalThis.browser
var lastBrowserUse = globalThis.lastBrowserUse
if(browser && Date.now() - lastBrowserUse > 15 * 60 * 1000){
browser.close()
browser = null
}
}, 5 * 60 * 1000)
var viewportsList = [{ width: 406, height: 902 }, { width: 397, height: 882 }, { width: 388, height: 862 }]
async function createPage({ isMobile = true }){
if(!globalThis.browser) globalThis.browser = await chromium.launch({
headless: true,
ignoreDefaultArgs: [
"--disable-extensions",
"--enable-automation"
]
})
lastBrowserUse = Date.now()
var page = await globalThis.browser.newPage({
viewport: isMobile ? viewportsList[Math.floor(Math.random() * viewportsList.length)] : { width: 1540, height: 900 },
acceptDownloads: false,
bypassCSP: false,
hasTouch: isMobile,
ignoreHTTPSErrors: true,
isMobile: isMobile,
serviceWorkers: "block",
userAgent: isMobile ? "Mozilla/5.0 (Linux; Android 15; GR83Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
locale: "en-US"
})
await page.route("**/*", (route, request) => {
var url = request.url()
var type = request.resourceType()
if(type == "ping" || type == "image" || type == "font" || type == "media" || type == "websocket" || type == "texttrack"){
console.error(`Blocking request: ${url} / ${type}`)
route.abort()
return
}
console.error(`Allowing request: ${url} / ${type}`)
route.continue()
})
return page
}
module.exports = {
createPage
}