const { env } = require('./config.js'); const puppeteer = require('puppeteer-extra'); const logger = require('./logger.js'); // add stealth plugin and use defaults (all evasion techniques) const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); function createWebSocketIterator() { const queue = []; let resolve; let done = false; const push = (value) => { if (resolve) { resolve({ value, done: false }); resolve = null; } else { queue.push(value); } }; const close = () => { done = true; if (resolve) { resolve({ value: undefined, done: true }); resolve = null; } }; const iterator = { async next() { if (queue.length > 0) { return { value: queue.shift(), done: false }; } if (done) { return { value: undefined, done: true }; } return new Promise((res) => { resolve = res; }); }, [Symbol.asyncIterator]() { return this; } }; (async () => { const browser = await puppeteer.launch({ headless: env.HEADLESS }); const page = await browser.newPage(); const client = await page.target().createCDPSession(); await client.send('Network.enable'); client.on('Network.webSocketCreated', ({ requestId, url }) => { logger.debug(`webSocketCreated: ${url}`); }); client.on('Network.webSocketClosed', ({ requestId, timestamp }) => { logger.debug(`webSocketClosed: ${requestId}`); }); client.on('Network.webSocketFrameReceived', ({ requestId, timestamp, response }) => { logger.debug('FrameReceived:', response.payloadData); push(response.payloadData); }); client.on('Network.webSocketFrameSent', ({ requestId, timestamp, response }) => { logger.debug(`FrameSent: ${response.payloadData}`); }); await page.goto(env.CB_ROOM); await page.setViewport({ width: 1080, height: 1024 }); // Optional: close iterator when page closes page.on('close', () => { close(); }); })().catch((err) => { logger.error(`Fatal error: ${err}`); close(); }); return iterator; } module.exports = createWebSocketIterator