import { devices, type BrowserContext, type Locator } from "patchright"; import logger from "../logger.js"; import * as twitch from "../website/twitch.js"; import * as constants from "../constants.js"; async function spawn(context: BrowserContext, targetUrl: string, changeViewport: boolean = false, spawnId: string = "unknown") { const server = constants.REFLECT4_SERVERS[Math.floor(Math.random() * constants.REFLECT4_SERVERS.length)]; logger.debug(`[${spawnId}] Using reflect4 server: ${server}`); const page = await context.newPage(); if (changeViewport) { logger.debug(`[${spawnId}] Changing viewport size...`); const deviceName = Object.keys(devices)[Math.floor(Math.random() * Object.keys(devices).length)]; const device = devices[deviceName]; logger.debug(`[${spawnId}] Using device: ${deviceName}`); await page.setViewportSize(device.viewport); } try { await page.goto(server); } catch (e) { logger.error(`[${spawnId}] Error while navigating to proxy website: ${e}`); await page.close(); throw e; } let targetInput: Locator | null = null; const allInput = await page.locator("input").all(); for (const input of allInput) { const placeholder = await input.getAttribute("placeholder"); if (placeholder?.includes("URL")) { targetInput = input; break; } } if (!targetInput) { logger.error(`[${spawnId}] Failed to find input field for URL input`); await page.close(); throw new Error(`Failed to find input field for URL input`); } await targetInput.fill(targetUrl); await targetInput.press("Enter"); logger.info(`[${spawnId}] Navigating to ${targetUrl}`); await page.waitForTimeout(15000); // Wait for 15 second to let the page load // Keep-alive the page open for 5 minutes then refresh if (targetUrl.startsWith("https://www.twitch.tv/")) { logger.info(`[${spawnId}] Twitch URL detected, using Twitch mode...`); await twitch.keepAlive(page, spawnId); } else { logger.warn(`[${spawnId}] Unsupported URL: ${targetUrl}`); logger.warn(`[${spawnId}] Will try to keep alive, but no guarantees`); while (true) { await page.waitForTimeout(5 * 60 * 1000); // 5 minutes await page.reload(); logger.debug(`[${spawnId}] Reloaded page`); } } await page.close(); logger.info(`[${spawnId}] Proxy with the server ${server} closed`); } export { spawn };