fp/services/scout/src/browser.js
CJ_Clippy 0b5ce37af8
Some checks failed
ci / build (push) Failing after 1m40s
ci / Tests & Checks (push) Failing after 1s
enable/disable headless via .env
2025-07-30 12:06:02 -08:00

91 lines
2.2 KiB
JavaScript

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