@vpalmisano/webrtcperf 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/app.min.js +1 -1
- package/build/src/app.js +30 -10
- package/build/src/app.js.map +1 -1
- package/build/src/config.d.ts +1 -90
- package/build/src/config.js +7 -5
- package/build/src/config.js.map +1 -1
- package/build/src/session.js +3 -2
- package/build/src/session.js.map +1 -1
- package/build/src/stats.js +19 -18
- package/build/src/stats.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -17
- package/src/app.ts +35 -11
- package/src/config.ts +7 -5
- package/src/session.ts +3 -1
- package/src/stats.ts +4 -2
package/build/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSessionThrottleValues, throttleLauncher } from '@vpalmisano/throttler'\nimport assert from 'assert'\nimport axios from 'axios'\nimport chalk from 'chalk'\nimport EventEmitter from 'events'\nimport fs from 'fs'\nimport JSON5 from 'json5'\nimport { LoremIpsum } from 'lorem-ipsum'\nimport NodeCache from 'node-cache'\nimport os from 'os'\nimport path from 'path'\nimport puppeteer, {\n Browser,\n BrowserContext,\n CDPSession,\n CookieParam,\n ElementHandle,\n ImageFormat,\n KeyInput,\n Metrics,\n Page,\n Permission,\n} from 'puppeteer-core'\nimport {\n type Interception,\n RequestInterceptionManager,\n getUrlPatternRegExp,\n} from 'puppeteer-intercept-and-modify-requests'\nimport { gunzipSync } from 'zlib'\n\nimport { RtcStats, rtcStatKey, updateRtcStats } from './rtcstats'\nimport { FastStats } from './stats'\nimport {\n PeerConnectionExternal,\n PeerConnectionExternalMethod,\n checkChromeExecutable,\n downloadUrl,\n enabledForSession,\n getProcessStats,\n getSystemStats,\n hideAuth,\n increaseKey,\n logger,\n portForwarder,\n resolveIP,\n resolvePackagePath,\n sha256,\n sleep,\n waitStopProcess,\n} from './utils'\nimport { MediaPath } from './media'\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst NavigatorHardwareConcurrency = require('puppeteer-extra-plugin-stealth/evasions/navigator.hardwareConcurrency')\n\nconst log = logger('webrtcperf:session')\n\ndeclare global {\n let webrtcperf: {\n getActiveAudioTracks: () => MediaStreamTrack[]\n collectPeerConnectionStats: () => Promise<{\n stats: RtcStats[]\n signalingHost?: string\n participantName?: string\n activePeerConnections: number\n peerConnectionConnectionTime: number\n peerConnectionDisconnectionTime: number\n peerConnectionsCreated: number\n peerConnectionsConnected: number\n peerConnectionsDisconnected: number\n peerConnectionsFailed: number\n peerConnectionsClosed: number\n peerConnectionsDelay: number\n }>\n collectAudioEndToEndStats: () => {\n delay: number\n startFrameDelay: number\n }\n collectVideoEndToEndStats: () => {\n videoDelay: number\n videoStartFrameDelay: number\n screenDelay: number\n screenStartFrameDelay: number\n }\n collectCpuPressure: () => number\n collectVideoStats: () => {\n width: number\n height: number\n bufferedTime: number\n playingTime: number\n bufferingTime: number\n bufferingEvents: number\n }\n getParticipantName: () => string\n startFakeScreenshare: () => Promise<void>\n stopFakeScreenshare: () => void\n }\n let collectCustomMetrics: () => Promise<Record<string, number | string>>\n}\n\nconst PageLogColors = {\n error: 'red',\n warn: 'yellow',\n info: 'cyan',\n log: 'grey',\n debug: 'white',\n requestfailed: 'magenta',\n}\n\ntype PageLogColorsKey = 'error' | 'warn' | 'info' | 'log' | 'debug' | 'requestfailed'\n\ntype SessionStats = Record<string, number | Record<string, number>>\n\nexport interface SessionParams {\n /** The chromium running instance url. */\n chromiumUrl: string\n /** The chromium executable path. */\n chromiumPath: string\n /** Chromium additional field trials. */\n chromiumFieldTrials: string\n /** The browser width. */\n windowWidth: number\n /** The browser height. */\n windowHeight: number\n /** The browser device scale factor. */\n deviceScaleFactor: number\n /**\n * If unset, the browser will run in headless mode.\n * When running on Linux, set to a valid X display variable (e.g. `:0`).\n */\n display: string\n /** Enables RED for OPUS codec (experimental). */\n /* audioRedForOpus: boolean */\n /** The page URL. */\n url: string\n /** The page URL query. */\n urlQuery: string\n /** Custom URL handler. */\n customUrlHandler: string\n customUrlHandlerFn?: CustomUrlHandlerFn\n mediaPath?: MediaPath\n videoWidth: number\n videoHeight: number\n videoFramerate: number\n useFakeMedia: boolean\n enableGpu: string\n enableBrowserLogging: string\n startTimestamp: number\n sessions: number\n tabsPerSession: number\n spawnPeriod: number\n statsInterval: number\n disabledVideoCodecs: string\n localStorage: string\n sessionStorage: string\n clearCookies: boolean\n scriptPath: string\n showPageLog: boolean\n pageLogFilter: string\n pageLogPath: string\n userAgent: string\n id: number\n throttleIndex: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n evaluateAfter?: any[]\n exposedFunctions?: string\n scriptParams: string\n blockedUrls: string\n extraHeaders: string\n responseModifiers: string\n downloadResponses: string\n extraCSS: string\n cookies: string\n overridePermissions: string\n hardwareConcurrency: number\n debuggingPort: number\n debuggingAddress: string\n randomAudioPeriod: number\n maxVideoDecoders: number\n maxVideoDecodersRange: string\n incognito: boolean\n serverPort: number\n serverSecret: string\n serverUseHttps: boolean\n emulateCpuThrottling: number\n}\n\nexport type CustomUrlHandlerFn = (params: {\n id: number\n sessions: number\n tabIndex: number\n tabsPerSession: number\n index: number\n pid: number\n env: Record<string, string>\n params: Record<string, unknown>\n}) => Promise<string>\n\n/**\n * Implements a test session instance running on a browser instance.\n */\nexport class Session extends EventEmitter {\n private readonly chromiumUrl: string\n private readonly chromiumPath?: string\n private readonly chromiumFieldTrials?: string\n private readonly windowWidth: number\n private readonly windowHeight: number\n private readonly deviceScaleFactor: number\n private readonly display: string\n /* private readonly audioRedForOpus: boolean */\n public readonly mediaPath?: MediaPath\n private readonly videoWidth: number\n private readonly videoHeight: number\n private readonly videoFramerate: number\n private readonly useFakeMedia: boolean\n private readonly enableGpu: string\n private readonly enableBrowserLogging: boolean\n private readonly startTimestamp: number\n private readonly sessions: number\n private readonly tabsPerSession: number\n private readonly spawnPeriod: number\n private readonly statsInterval: number\n private readonly disabledVideoCodecs: string[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly localStorage?: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly sessionStorage?: any\n private readonly clearCookies: boolean\n private readonly scriptPath: string\n private readonly showPageLog: boolean\n private readonly pageLogFilter: string\n private readonly pageLogPath: string\n private readonly userAgent: string\n private readonly evaluateAfter: {\n // eslint-disable-next-line\n pageFunction: Function\n // eslint-disable-next-line\n args: any\n }[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly exposedFunctions: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly scriptParams: any\n private readonly blockedUrls: string[]\n private readonly extraHeaders?: Record<string, Record<string, string>>\n private readonly responseModifiers: Record<\n string,\n {\n search?: string | RegExp\n replace?: string\n file?: string\n headers?: Record<string, string>\n }[]\n > = {}\n private readonly downloadResponses: { urlPattern: RegExp; output: string; append?: boolean }[] = []\n private readonly extraCSS: string\n private readonly cookies: CookieParam[] = []\n private readonly overridePermissions: Permission[] = []\n private readonly hardwareConcurrency: number\n private readonly debuggingPort: number\n private readonly debuggingAddress: string\n private readonly randomAudioPeriod: number\n private readonly maxVideoDecoders: number\n private readonly maxVideoDecodersRange: string\n private readonly incognito: boolean\n private readonly serverPort: number\n private readonly serverSecret: string\n private readonly serverUseHttps: boolean\n private readonly emulateCpuThrottling: number\n\n private running = false\n private browser?: Browser\n private context?: BrowserContext\n private stopPortForwarder?: () => void\n\n /** The numeric id assigned to the session. */\n readonly id: number\n /** The throttle configuration index assigned to the session. */\n readonly throttleIndex: number\n /** The test page url. */\n readonly url: string\n /** The url query. */\n readonly urlQuery: string\n /**\n * The custom URL handler. This is the path to a JavaScript module (.mjs) exporting the function.\n * The function itself takes an object as input with the following parameters:\n *\n * @typedef {Object} CustomUrlHandler\n * @property {string} id - The identifier for the URL.\n * @property {string} sessions - The number of sessions.\n * @property {string} tabIndex - The index of the current tab.\n * @property {string} tabsPerSession - The number of tabs per session.\n * @property {string} index - The index for the URL.\n * @property {string} pid - The process identifier for the URL.\n *\n * @type {string} path - The path to the JavaScript file containing the function:\n * (params: CustomUrlHandler) => Promise<string>\n */\n readonly customUrlHandler: string\n /**\n * Imported custom URL handler function.\n * @typedef {Object} CustomUrlHandler\n * @property {number} id - The identifier for the URL.\n * @property {number} sessions - The number of sessions.\n * @property {number} tabIndex - The index of the current tab.\n * @property {number} tabsPerSession - The number of tabs per session.\n * @property {number} index - The index for the URL.\n * @property {number} pid - The process identifier for the URL.\n * @property {Record<string, string>} env - The process environment.\n *\n * @type {string} path - The path to the JavaScript file containing the function:\n * (params: CustomUrlHandler) => Promise<string>\n */\n public customUrlHandlerFn?: CustomUrlHandlerFn\n /** The latest stats extracted from page. */\n stats: SessionStats = {}\n /** The browser opened pages. */\n readonly pages = new Map<number, Page>()\n readonly httpResourcesStats = new Map<\n number,\n {\n sentBytes: number\n recvBytes: number\n recvLatency: FastStats\n wsSentBytes: number\n wsRecvBytes: number\n wsRecvLatency: FastStats\n }\n >()\n /** The browser opened pages metrics. */\n readonly pagesMetrics = new Map<number, Metrics>()\n /** The page warnings count. */\n pageWarnings = 0\n /** The page errors count. */\n pageErrors = 0\n private screensharePage?: Page\n\n private static readonly jsonFetchCache = new NodeCache({\n stdTTL: 30,\n checkperiod: 15,\n })\n\n constructor({\n chromiumUrl,\n chromiumPath,\n chromiumFieldTrials,\n windowWidth,\n windowHeight,\n deviceScaleFactor,\n display,\n /* audioRedForOpus, */\n url,\n urlQuery,\n customUrlHandler,\n customUrlHandlerFn,\n mediaPath,\n videoWidth,\n videoHeight,\n videoFramerate,\n useFakeMedia,\n enableGpu,\n enableBrowserLogging,\n startTimestamp,\n sessions,\n tabsPerSession,\n spawnPeriod,\n statsInterval,\n disabledVideoCodecs,\n localStorage,\n sessionStorage,\n clearCookies,\n scriptPath,\n showPageLog,\n pageLogFilter,\n pageLogPath,\n userAgent,\n id,\n throttleIndex,\n evaluateAfter,\n exposedFunctions,\n scriptParams,\n blockedUrls,\n extraHeaders,\n responseModifiers,\n downloadResponses,\n extraCSS,\n cookies,\n overridePermissions,\n hardwareConcurrency,\n debuggingPort,\n debuggingAddress,\n randomAudioPeriod,\n maxVideoDecoders,\n maxVideoDecodersRange,\n incognito,\n serverPort,\n serverSecret,\n serverUseHttps,\n emulateCpuThrottling,\n }: SessionParams) {\n super()\n log.debug('constructor', { id })\n this.id = id\n this.chromiumUrl = chromiumUrl\n this.chromiumPath = chromiumPath || undefined\n this.chromiumFieldTrials = chromiumFieldTrials || undefined\n this.windowWidth = windowWidth || 1920\n this.windowHeight = windowHeight || 1080\n this.deviceScaleFactor = deviceScaleFactor || 1\n this.debuggingPort = debuggingPort || 0\n this.debuggingAddress = debuggingAddress || ''\n this.display = display\n /* this.audioRedForOpus = !!audioRedForOpus */\n this.url = url\n this.urlQuery = urlQuery\n if (!this.urlQuery && url.includes('?')) {\n const parts = url.split('?', 2)\n this.url = parts[0]\n this.urlQuery = parts[1]\n }\n this.customUrlHandler = customUrlHandler\n this.customUrlHandlerFn = customUrlHandlerFn\n this.mediaPath = mediaPath\n this.videoWidth = videoWidth\n this.videoHeight = videoHeight\n this.videoFramerate = videoFramerate\n this.useFakeMedia = useFakeMedia\n this.enableGpu = enableGpu\n this.enableBrowserLogging = enabledForSession(this.id, enableBrowserLogging)\n this.startTimestamp = startTimestamp || Date.now()\n this.sessions = sessions || 1\n this.tabsPerSession = tabsPerSession || 1\n assert(this.tabsPerSession >= 1, 'tabsPerSession should be >= 1')\n this.spawnPeriod = spawnPeriod || 1000\n this.statsInterval = statsInterval || 10\n if (disabledVideoCodecs) {\n this.disabledVideoCodecs = disabledVideoCodecs\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n } else {\n this.disabledVideoCodecs = []\n }\n if (localStorage) {\n try {\n this.localStorage = JSON5.parse(localStorage)\n } catch (err: unknown) {\n log.error(`error parsing localStorage: ${(err as Error).stack}`)\n this.localStorage = null\n }\n }\n if (sessionStorage) {\n try {\n this.sessionStorage = JSON5.parse(sessionStorage)\n } catch (err: unknown) {\n log.error(`error parsing sessionStorage: ${(err as Error).stack}`)\n this.sessionStorage = null\n }\n }\n this.clearCookies = clearCookies\n this.scriptPath = scriptPath\n this.showPageLog = showPageLog\n this.pageLogFilter = pageLogFilter\n this.pageLogPath = pageLogPath\n this.userAgent = userAgent\n this.randomAudioPeriod = randomAudioPeriod\n this.maxVideoDecoders = maxVideoDecoders\n this.maxVideoDecodersRange = maxVideoDecodersRange\n this.incognito = incognito\n this.serverPort = serverPort\n this.serverSecret = serverSecret\n this.serverUseHttps = serverUseHttps\n this.emulateCpuThrottling = emulateCpuThrottling\n\n this.throttleIndex = throttleIndex\n this.evaluateAfter = evaluateAfter || []\n this.exposedFunctions = exposedFunctions || {}\n if (scriptParams) {\n try {\n this.scriptParams = JSON5.parse(scriptParams)\n } catch (err) {\n log.error(`error parsing scriptParams '${scriptParams}': ${(err as Error).stack}`)\n throw err\n }\n } else {\n this.scriptParams = {}\n }\n this.blockedUrls = (blockedUrls || '')\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n // Always block sentry.io.\n this.blockedUrls.push('ingest.sentry.io')\n\n if (extraHeaders) {\n try {\n this.extraHeaders = JSON5.parse(extraHeaders)\n } catch (err) {\n log.error(`error parsing extraHeaders: ${(err as Error).stack}`)\n this.extraHeaders = undefined\n }\n } else {\n this.extraHeaders = undefined\n }\n\n if (responseModifiers) {\n try {\n const parsed = JSON5.parse(responseModifiers)\n Object.entries(parsed).forEach(([url, replacements]) => {\n if (!Array.isArray(replacements)) {\n throw new Error(\n `responseModifiers replacements should be an array of { search, replace, body, headers } objects: ${replacements}`,\n )\n }\n this.responseModifiers[url] = replacements.map(({ search, regexp, replace, file, headers }) => ({\n search: regexp ? new RegExp(regexp, 'g') : search,\n replace,\n file,\n headers,\n }))\n })\n } catch (err) {\n throw new Error(`error parsing responseModifiers \"${responseModifiers}\": ${(err as Error).stack}`)\n }\n }\n\n if (downloadResponses) {\n try {\n const parsed = JSON5.parse(downloadResponses)\n if (!Array.isArray(parsed)) throw new Error(`downloadResponses should be an array: ${downloadResponses}`)\n parsed.forEach(({ urlPattern, output, append }) => {\n this.downloadResponses.push({ urlPattern: getUrlPatternRegExp(urlPattern), output, append })\n })\n } catch (err) {\n throw new Error(`error parsing downloadResponses \"${downloadResponses}\": ${(err as Error).stack}`)\n }\n }\n\n this.extraCSS = extraCSS\n\n if (cookies) {\n try {\n this.cookies = JSON5.parse(cookies)\n } catch (err) {\n log.error(`error parsing cookies: ${(err as Error).stack}`)\n }\n }\n\n if (overridePermissions) {\n this.overridePermissions = overridePermissions\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length) as Permission[]\n }\n\n this.hardwareConcurrency = hardwareConcurrency\n }\n\n /**\n * Returns the chromium browser launch args\n * @return the args list\n */\n getBrowserArgs(env: Record<string, string>): string[] {\n // https://peter.sh/experiments/chromium-command-line-switches/\n // https://source.chromium.org/chromium/chromium/src/+/main:testing/variations/fieldtrial_testing_config.json;l=8877?q=%20fieldtrial_testing_config.json&ss=chromium\n const args = [\n '--no-sandbox',\n '--no-zygote',\n '--ignore-certificate-errors',\n '--no-user-gesture-required',\n '--autoplay-policy=no-user-gesture-required',\n '--disable-infobars',\n '--no-default-browser-check',\n '--allow-running-insecure-content',\n `--unsafely-treat-insecure-origin-as-secure=http://${new URL(this.url || 'http://localhost').host}`,\n '--disable-web-security',\n '--disable-features=IsolateOrigins,Translate,CalculateNativeWinOcclusion',\n '--disable-background-timer-throttling',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-site-isolation-trials',\n '--enable-usermedia-screen-capturing',\n '--allow-http-screen-capture',\n `--remote-debugging-port=${this.debuggingPort ? this.debuggingPort + this.id : 0}`,\n '--enable-features=VaapiVideoDecoder,VaapiVideoEncoder,VaapiVideoDecodeLinuxGL,ElementCapture',\n `--window-size=${this.windowWidth},${this.windowHeight}`,\n ]\n\n let fieldTrials = this.chromiumFieldTrials || ''\n\n if (this.enableBrowserLogging && this.pageLogPath) {\n const pageLogDir = path.dirname(this.pageLogPath)\n const eventLogPath = path.resolve(pageLogDir, `webrtc-event-logging-${this.id}`)\n fs.mkdirSync(eventLogPath, { recursive: true })\n args.push('--enable-logging', '--vmodule=*/webrtc/*=5', '--v=0', `--webrtc-event-logging=${eventLogPath}`)\n fieldTrials = 'WebRTC-RtcEventLogNewFormat/Disabled/' + fieldTrials\n env.CHROME_LOG_FILE = path.resolve(pageLogDir, `chrome-${this.id}.log`)\n }\n\n if (this.maxVideoDecoders !== -1 && enabledForSession(this.id, this.maxVideoDecodersRange)) {\n fieldTrials = `WebRTC-MaxVideoDecoders/${this.maxVideoDecoders}/` + fieldTrials\n }\n if (fieldTrials.length) {\n args.push(`--force-fieldtrials=${fieldTrials}`)\n }\n\n if (this.mediaPath) {\n if (this.useFakeMedia) {\n log.debug(`${this.id} using chromium as fake media source`)\n args.push(\n '--use-fake-ui-for-media-stream',\n `--use-fake-device-for-media-stream=display-media-type=browser,fps=30`,\n `--use-file-for-fake-video-capture=${this.mediaPath.video}`,\n `--use-file-for-fake-audio-capture=${this.mediaPath.audio}`,\n )\n } else {\n log.debug(`${this.id} using ${this.mediaPath} as fake media source`)\n args.push(\n '--auto-accept-camera-and-microphone-capture',\n `--auto-select-tab-capture-source-by-title=webrtcperf-screenshare`,\n '--mute-audio',\n )\n }\n }\n\n if (this.enableGpu) {\n args.push(\n '--ignore-gpu-blocklist',\n '--enable-gpu-rasterization',\n '--enable-zero-copy',\n '--disable-gpu-sandbox',\n '--enable-vulkan',\n )\n if (this.enableGpu === 'egl') {\n args.push('--use-gl=egl')\n } else {\n args.push('--use-gl=angle', '--use-angle=vulkan')\n }\n } else {\n args.push(\n // Disables webgl support.\n '--disable-3d-apis',\n '--disable-site-isolation-trials',\n // '--renderer-process-limit=2',\n // '--single-process',\n )\n }\n\n return args\n }\n\n /**\n * Start\n */\n async start(): Promise<void> {\n if (this.running) {\n return\n }\n this.running = true\n if (this.browser) {\n log.warn(`${this.id} start: already running`)\n return\n }\n log.debug(`${this.id} start`)\n\n if (this.chromiumUrl) {\n // connect to a remote chrome instance\n try {\n this.browser = await puppeteer.connect({\n browserURL: this.chromiumUrl,\n defaultViewport: {\n width: this.windowWidth,\n height: this.windowHeight,\n deviceScaleFactor: this.deviceScaleFactor,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n })\n } catch (err) {\n log.error(`${this.id} browser connect error: ${(err as Error).stack}`)\n return this.stop()\n }\n } else {\n // run a browser instance locally\n let executablePath = this.chromiumPath\n if (!executablePath || !fs.existsSync(executablePath)) {\n executablePath = await checkChromeExecutable()\n log.debug(`using executablePath=${executablePath}`)\n }\n\n // Create the process wrapper.\n if (this.throttleIndex > -1 && os.platform() === 'linux') {\n executablePath = await throttleLauncher(executablePath, this.throttleIndex)\n }\n\n const env = { ...process.env } as Record<string, string>\n if (!this.display) {\n delete env.DISPLAY\n } else {\n env.DISPLAY = this.display\n }\n\n const args = this.getBrowserArgs(env)\n const ignoreDefaultArgs = [\n '--disable-dev-shm-usage',\n '--remote-debugging-port',\n //'--hide-scrollbars',\n '--enable-automation',\n '--window-size',\n ]\n\n log.debug(`[session ${this.id}] Using args:\\n ${args.join('\\n ')}`)\n log.debug(`[session ${this.id}] Default args:\\n ${puppeteer.defaultArgs().join('\\n ')}`)\n\n try {\n this.browser = await puppeteer.launch({\n browser: 'chrome',\n headless: this.display ? false : true,\n executablePath,\n handleSIGINT: false,\n env,\n // dumpio: this.enableBrowserLogging,\n // devtools: true,\n defaultViewport: {\n width: this.windowWidth,\n height: this.windowHeight,\n deviceScaleFactor: this.deviceScaleFactor,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n ignoreDefaultArgs,\n args,\n })\n const version = await this.browser.version()\n log.debug(`[session ${this.id}] Using chrome version: ${version}`)\n } catch (err) {\n log.error(`[session ${this.id}] Browser launch error: ${(err as Error).stack}`)\n return this.stop()\n }\n }\n\n assert(this.browser, 'BrowserNotCreated')\n\n if (this.debuggingPort && this.debuggingAddress !== '127.0.0.1') {\n this.stopPortForwarder = await portForwarder(this.debuggingPort + this.id, this.debuggingAddress)\n }\n\n this.browser.once('disconnected', () => {\n log.debug('browser disconnected')\n return this.stop()\n })\n\n // get GPU infos from chrome://gpu page\n /* if (this.enableGpu) {\n try {\n const page = await this.browser.newPage()\n await page.goto('chrome://gpu')\n const data = await page.evaluate(() =>\n [\n // eslint-disable-next-line no-undef\n ...document.querySelectorAll('ul.feature-status-list > li > span'),\n ].map(\n (e, i) =>\n `${i % 2 === 0 ? '\\n- ' : ''}${(e as HTMLSpanElement).innerText}`,\n ),\n )\n await page.close()\n console.log(`GPU infos:${data.join('')}`)\n } catch (err) {\n log.warn(`${this.id} error getting gpu info: %j`, err)\n }\n } */\n\n // open pages\n for (let i = 0; i < this.tabsPerSession; i++) {\n this.openPage(i).catch(err => log.error(`openPage error: ${(err as Error).stack}`))\n if (i < this.tabsPerSession - 1) {\n await sleep(this.spawnPeriod)\n }\n }\n }\n\n private setupPageCmd(index: number, tabIndex: number, url: string) {\n let cmd = `\\\nwebrtcperf = {};\nwebrtcperf.config = {\n START_TIMESTAMP: ${this.startTimestamp},\n WEBRTC_PERF_URL: \"${hideAuth(url)}\",\n WEBRTC_PERF_SESSION: ${this.id},\n WEBRTC_PERF_TAB_INDEX: ${tabIndex},\n WEBRTC_PERF_INDEX: ${index},\n STATS_INTERVAL: ${this.statsInterval},\n VIDEO_WIDTH: ${this.videoWidth},\n VIDEO_HEIGHT: ${this.videoHeight},\n VIDEO_FRAMERATE: ${this.videoFramerate},\n};\ntry {\n webrtcperf.params = JSON.parse('${JSON.stringify(this.scriptParams)}' || '{}');\n} catch (err) {\n console.error('[webrtcperf] Error parsing scriptParams:', err);\n webrtcperf.params = {};\n}\n `\n\n if (this.serverPort) {\n cmd += `\\\nwebrtcperf.config.SAVE_MEDIA_URL = \"ws${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/?auth=${this.serverSecret}&action=write-stream\";\n `\n if (this.mediaPath?.mp4 && !this.useFakeMedia) {\n cmd += `\\\nwebrtcperf.config.VIDEO_URL = \"http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/cache/${path.basename(this.mediaPath.mp4)}?auth=${this.serverSecret}\";\nwebrtcperf.config.AUDIO_URL = \"http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/cache/${path.basename(this.mediaPath.m4a)}?auth=${this.serverSecret}\";\n `\n }\n }\n\n if (this.disabledVideoCodecs.length) {\n log.debug('Using disabledVideoCodecs:', this.disabledVideoCodecs)\n cmd += `webrtcperf.config.GET_CAPABILITIES_DISABLED_VIDEO_CODECS = JSON.parse('${JSON.stringify(\n this.disabledVideoCodecs,\n )}');\\n`\n }\n\n return cmd\n }\n\n /**\n * openPage\n * @param tabIndex\n */\n async openPage(tabIndex: number): Promise<void> {\n if (!this.browser) {\n return\n }\n const index = this.id + tabIndex\n let saveFile: fs.promises.FileHandle | undefined = undefined\n let url = this.url\n\n if (!url) {\n if (this.customUrlHandler && !this.customUrlHandlerFn) {\n const customUrlHandlerPath = path.resolve(process.cwd(), this.customUrlHandler)\n if (!fs.existsSync(customUrlHandlerPath)) {\n throw new Error(`Custom url handler script not found: \"${customUrlHandlerPath}\"`)\n }\n this.customUrlHandlerFn = (await import(/* webpackIgnore: true */ customUrlHandlerPath)).default\n }\n if (!this.customUrlHandlerFn) {\n throw new Error(`Custom url handler function not set`)\n }\n url = await this.customUrlHandlerFn({\n id: this.id,\n sessions: this.sessions,\n tabIndex,\n tabsPerSession: this.tabsPerSession,\n index,\n pid: process.pid,\n env: { ...process.env } as Record<string, string>,\n params: this.scriptParams,\n })\n log.debug(`customUrlHandlerFn: ${url}`)\n }\n\n if (!url) {\n throw new Error(`Page URL not set`)\n }\n\n if (this.urlQuery) {\n url += `?${this.urlQuery\n .replace(/\\$s/g, String(this.id))\n .replace(/\\$S/g, String(this.sessions))\n .replace(/\\$t/g, String(tabIndex))\n .replace(/\\$T/g, String(this.tabsPerSession))\n .replace(/\\$i/g, String(index))\n .replace(/\\$p/g, String(process.pid))}`\n }\n\n log.debug(`opening page ${index} (session: ${this.id} tab: ${tabIndex}): ${hideAuth(url)}`)\n\n if (this.incognito) {\n this.context = await this.browser.createBrowserContext()\n } else {\n this.context = this.browser.defaultBrowserContext()\n }\n\n if (this.overridePermissions.length) {\n await this.context.overridePermissions(new URL(url).origin, this.overridePermissions)\n }\n\n const page = await this.getNewPage(tabIndex)\n\n await page.setBypassCSP(true)\n\n if (this.userAgent) {\n await page.setUserAgent(this.userAgent)\n }\n\n await Promise.all(\n Object.keys(this.exposedFunctions).map(\n async (name: string) =>\n await page.exposeFunction(name, (...args: unknown[]) => this.exposedFunctions[name](...args)),\n ),\n )\n\n // Export config to page.\n let cmd = this.setupPageCmd(index, tabIndex, url)\n if (this.localStorage) {\n log.debug('Using localStorage:', this.localStorage)\n Object.entries(this.localStorage).map(([key, value]) => {\n cmd += `localStorage.setItem('${key}', '${JSON.stringify(value)}');\\n`\n })\n }\n if (this.sessionStorage) {\n log.debug('Using sessionStorage:', this.sessionStorage)\n Object.entries(this.sessionStorage).map(([key, value]) => {\n cmd += `sessionStorage.setItem('${key}', '${JSON.stringify(value)}');\\n`\n })\n }\n log.debug('init command:', cmd)\n await page.evaluateOnNewDocument(cmd)\n\n // Clear cookies.\n if (this.clearCookies) {\n try {\n const client = await page.target().createCDPSession()\n await client.send('Network.clearBrowserCookies')\n } catch (err) {\n log.error(`clearCookies error: ${(err as Error).stack}`)\n }\n }\n\n page.on('dialog', async dialog => {\n log.debug(`page ${index + 1} dialog ${dialog.type()}: ${dialog.message()}`)\n try {\n await dialog.accept()\n } catch (err) {\n log.debug(`dialog accept error: ${(err as Error).message}`)\n }\n try {\n await dialog.dismiss()\n } catch (err) {\n log.debug(`dialog dismiss error: ${(err as Error).message}`)\n }\n })\n\n page.once('close', () => {\n log.debug(`page ${index + 1} closed`)\n this.pages.delete(index)\n this.httpResourcesStats.delete(index)\n this.pagesMetrics.delete(index)\n\n if (saveFile) {\n saveFile.close().catch(err => {\n log.error(`saveFile close error: ${(err as Error).stack}`)\n })\n saveFile = undefined\n }\n\n if (this.browser && this.running) {\n setTimeout(\n () => this.openPage(index).catch(err => log.error(`openPage after close error: ${(err as Error).stack}`)),\n 1000,\n )\n }\n })\n\n // Enable request interception.\n let setRequestInterceptionState = true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pageCDPSession = (page as any)._client() as CDPSession\n await pageCDPSession.send('Network.setBypassServiceWorker', {\n bypass: true,\n })\n\n const interceptManager = new RequestInterceptionManager(pageCDPSession, {\n onError: error => {\n log.error('Request interception error:', error)\n },\n })\n\n const interceptions: Interception[] = []\n\n // Blocked URLs.\n this.blockedUrls.forEach(blockedUrl => {\n interceptions.push({\n urlPattern: blockedUrl,\n modifyRequest: () => ({ errorReason: 'BlockedByClient' }),\n })\n })\n\n // Add extra headers.\n if (this.extraHeaders) {\n Object.entries(this.extraHeaders).forEach(([url, obj]) => {\n const headers = Object.entries(obj).map(([name, value]) => ({\n name,\n value,\n }))\n interceptions.push({\n urlPattern: url,\n modifyRequest: ({ event }) => {\n log.debug(`adding extraHeaders in: ${event.request.url}`, headers)\n return { headers }\n },\n })\n })\n }\n\n // Response modifiers.\n Object.entries(this.responseModifiers).forEach(([url, replacements]) => {\n interceptions.push({\n urlPattern: url,\n modifyResponse: async ({ event, body }) => {\n const responseHeaders = event.responseHeaders || []\n for (const { search, replace, file, headers } of replacements) {\n if (search && replace) {\n log.debug(`using responseModifiers in: ${event.request.url}: ${search.toString()} => ${replace}`)\n body = body?.replace(search, replace)\n } else if (file) {\n log.debug(`using responseModifiers in: ${event.request.url}: ${file}`)\n body = await fs.promises.readFile(file, 'utf8')\n }\n if (headers) {\n for (const [name, value] of Object.entries(headers)) {\n responseHeaders.push({\n name,\n value,\n })\n }\n }\n }\n return { body, responseHeaders }\n },\n })\n })\n\n await interceptManager.intercept(...interceptions)\n\n // Download responses.\n if (this.downloadResponses.length) {\n page.on('response', async response => {\n if (!response.ok()) return\n const url = response.url()\n for (const { urlPattern, output, append } of this.downloadResponses) {\n if (!urlPattern.test(url)) continue\n try {\n const data = await response.buffer()\n if (data.byteLength > 0) {\n if (append) {\n const savePath = output.replaceAll('${id}', this.id.toString())\n if (!fs.existsSync(path.dirname(savePath))) {\n await fs.promises.mkdir(path.dirname(output), { recursive: true })\n }\n log.debug(`appending response body ${data.byteLength} to: ${savePath}`)\n await fs.promises.appendFile(savePath, data)\n } else {\n if (!fs.existsSync(output)) {\n await fs.promises.mkdir(output, { recursive: true })\n }\n const savePath = path.join(output, `${path.basename(new URL(url).pathname)}`)\n log.debug(`saving response body ${data.byteLength} to: ${savePath}`)\n await fs.promises.writeFile(savePath, data)\n }\n }\n } catch (err) {\n log.error(`downloadResponses error: ${(err as Error).stack}`)\n }\n }\n })\n }\n\n // Allow to change the setRequestInterception state from page.\n const setRequestInterceptionFunction = async (value: boolean) => {\n if (value === setRequestInterceptionState) {\n return\n }\n log.debug(`setRequestInterception to ${value}`)\n try {\n if (!value) {\n await interceptManager.disable()\n } else {\n await interceptManager.enable()\n }\n setRequestInterceptionState = value\n } catch (err) {\n log.error(`setRequestInterception error: ${(err as Error).stack}`)\n }\n }\n\n await page.exposeFunction('setRequestInterception', setRequestInterceptionFunction)\n\n await page.exposeFunction(\n 'jsonFetch',\n async (\n options: axios.AxiosRequestConfig & {\n validStatuses: number[]\n downloadPath: string\n },\n cacheKey = '',\n cacheTimeout = 0,\n ) => {\n if (cacheKey) {\n const ret = Session.jsonFetchCache.get(cacheKey)\n if (ret) {\n return ret\n }\n }\n try {\n if (options.validStatuses) {\n options.validateStatus = status => options.validStatuses.includes(status)\n }\n const { status, data, headers } = await axios(options)\n if (options.responseType === 'stream') {\n if (options.downloadPath && !fs.existsSync(options.downloadPath)) {\n log.debug(`jsonFetch saving file to: ${options.downloadPath}`, headers['content-disposition'])\n await fs.promises.mkdir(path.dirname(options.downloadPath), {\n recursive: true,\n })\n const writer = fs.createWriteStream(options.downloadPath)\n await new Promise<void>((resolve, reject) => {\n writer.on('error', err => reject(err))\n writer.on('close', () => resolve())\n data.pipe(writer)\n })\n }\n if (cacheKey) {\n Session.jsonFetchCache.set(cacheKey, { status }, cacheTimeout)\n }\n return { status, headers }\n } else {\n if (cacheKey) {\n Session.jsonFetchCache.set(cacheKey, { status, data }, cacheTimeout)\n }\n return { status, headers, data }\n }\n } catch (err) {\n const error = (err as Error).message\n log.warn(`jsonFetch error: ${error}`)\n return { status: 500, error }\n }\n },\n )\n\n await page.exposeFunction('readLocalFile', (filePath: string, encoding?: BufferEncoding) => {\n filePath = path.resolve(process.cwd(), filePath)\n return fs.promises.readFile(filePath, encoding)\n })\n\n if (this.pageLogPath) {\n const dirPath = path.dirname(this.pageLogPath)\n await page.exposeFunction(\n 'webrtcperf_writeFile',\n (paramPath: string, data: string | Buffer | Uint8Array, append = false) => {\n const filePath = path.resolve(dirPath, paramPath)\n if (append) {\n return fs.promises.appendFile(filePath, data)\n } else {\n return fs.promises.writeFile(filePath, data)\n }\n },\n )\n }\n\n await page.exposeFunction('webrtcperf_emulateCpuThrottling', (factor: number | null) => {\n return page.emulateCPUThrottling(factor)\n })\n\n if (this.emulateCpuThrottling) {\n log.debug(`emulateCpuThrottling: ${this.emulateCpuThrottling}`)\n await page.emulateCPUThrottling(this.emulateCpuThrottling)\n }\n\n // PeerConnectionExternal\n await page.exposeFunction(\n 'createPeerConnectionExternal',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async (options: any) => {\n const pc = new PeerConnectionExternal(options)\n return { id: pc.id }\n },\n )\n\n await page.exposeFunction(\n 'callPeerConnectionExternalMethod',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async (id: number, name: PeerConnectionExternalMethod, arg: any) => {\n const pc = PeerConnectionExternal.get(id)\n if (pc) {\n return pc[name](arg)\n }\n },\n )\n\n // Simulate keypress\n await page.exposeFunction('keypressText', async (selector: string, text: string, delay = 20) => {\n await page.type(selector, text, { delay })\n })\n\n // Simulate mouse clicks\n await page.exposeFunction('mouseClick', async (selector: string, x = 0, y = 0) => {\n await page.click(selector, { offset: { x, y } })\n })\n\n const lorem = new LoremIpsum({\n sentencesPerParagraph: {\n max: 4,\n min: 1,\n },\n wordsPerSentence: {\n max: 16,\n min: 2,\n },\n })\n\n await page.exposeFunction('loremIpsum', (count = 1) => lorem.generateSentences(count))\n\n await page.exposeFunction(\n 'keypressRandomText',\n async (selector: string, count = 1, prefix = '', suffix = '', delay = 0) => {\n const c = prefix + lorem.generateSentences(count) + suffix\n const frames = await page.frames()\n for (const frame of frames) {\n const el = await frame.$(selector)\n if (el) {\n await el.focus()\n await frame.type(selector, c, { delay })\n }\n }\n },\n )\n\n await page.exposeFunction('uploadFileFromUrl', async (fileUrl: string, selector: string) => {\n const filename = sha256(fileUrl) + '.' + fileUrl.split('.').slice(-1)[0]\n const filePath = path.join(os.homedir(), '.webrtcperf/uploads', filename)\n if (!fs.existsSync(filePath)) {\n await downloadUrl(fileUrl, undefined, filePath)\n }\n log.debug(`uploadFileFromUrl: ${filePath}`)\n const frames = await page.frames()\n for (const frame of frames) {\n const el = await frame.$(selector)\n if (el) {\n await (el as ElementHandle<HTMLInputElement>).uploadFile(filePath)\n break\n }\n }\n })\n\n // add extra styles\n if (this.extraCSS) {\n log.debug(`Add extraCSS: ${this.extraCSS}`)\n try {\n await page.evaluateOnNewDocument(\n (css: string) => {\n document.addEventListener('DOMContentLoaded', () => {\n const style = document.createElement('style')\n style.setAttribute('id', 'webrtcperf-extra-style')\n style.setAttribute('type', 'text/css')\n style.innerHTML = css\n\n document.head.appendChild(style)\n })\n },\n this.extraCSS.replace(/important/g, '!important'),\n )\n } catch (err) {\n log.error(`Add extraCSS error: ${(err as Error).stack}`)\n }\n }\n\n // add cookies\n if (this.cookies) {\n try {\n await page.setCookie(...this.cookies)\n } catch (err) {\n log.error(`Set cookies error: ${(err as Error).stack}`)\n }\n }\n\n // Page logs and errors.\n if (this.pageLogPath) {\n try {\n await fs.promises.mkdir(path.dirname(this.pageLogPath), {\n recursive: true,\n })\n saveFile = await fs.promises.open(this.pageLogPath, 'a')\n } catch (err) {\n log.error(`error opening page log file: ${this.pageLogPath}: ${(err as Error).stack}`)\n }\n }\n\n await page.exposeFunction('webrtcperf_serializedConsoleLog', async (type: PageLogColorsKey, text: string) => {\n if (this.showPageLog || saveFile) {\n try {\n await this.onPageMessage(index, type, text, saveFile)\n } catch (err) {\n log.error(`serializedConsoleLog error: ${(err as Error).stack}`)\n }\n }\n })\n\n if (this.showPageLog || saveFile) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n page.on('pageerror', async (error: any) => {\n const text = `pageerror: ${error.message?.message || error.message} - ${error.message?.stack || error.stack}`\n await this.onPageMessage(index, 'error', text, saveFile)\n })\n\n page.on('requestfailed', async request => {\n const err = (request.failure()?.errorText || '').trim()\n if (err === 'net::ERR_ABORTED') {\n return\n }\n const text = `${request.method()} ${request.url()}: ${err}`\n await this.onPageMessage(index, 'requestfailed', text, saveFile)\n })\n }\n\n await page.exposeFunction('webrtcperf_startFakeScreenshare', async () => {\n if (!this.browser) return\n let screensharePage = page\n if (!this.useFakeMedia) {\n if (!this.screensharePage) {\n screensharePage = this.screensharePage = await this.browser.newPage()\n await this.screensharePage.evaluateOnNewDocument(this.setupPageCmd(index, tabIndex, 'about:blank'))\n await this.screensharePage.evaluateOnNewDocument(\n fs.readFileSync(resolvePackagePath('node_modules/@vpalmisano/webrtcperf-js/dist/webrtcperf.js'), 'utf8'),\n )\n await screensharePage.exposeFunction(\n 'webrtcperf_keypressText',\n async (selector: string, text: string, delay = 20) => {\n await screensharePage.type(selector, text, { delay })\n },\n )\n await screensharePage.exposeFunction('webrtcperf_keyPress', async (key: KeyInput) => {\n await screensharePage.keyboard.press(key)\n })\n await screensharePage.goto(\n `http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/empty-page?auth=${this.serverSecret}&title=webrtcperf-screenshare`,\n )\n }\n }\n await screensharePage.evaluate(() => webrtcperf.startFakeScreenshare())\n })\n\n await page.exposeFunction('webrtcperf_stopFakeScreenshare', async () => {\n if (!this.useFakeMedia && this.screensharePage) {\n await this.screensharePage.close()\n this.screensharePage = undefined\n } else {\n await page.evaluate(() => webrtcperf.stopFakeScreenshare())\n }\n })\n\n // HTTP stats.\n const resourcesStats = {\n sentBytes: 0,\n recvBytes: 0,\n recvLatency: new FastStats({ store_data: false }),\n wsSentBytes: 0,\n wsRecvBytes: 0,\n wsRecvLatency: new FastStats({ store_data: false }),\n }\n this.httpResourcesStats.set(index, resourcesStats)\n\n const pendingRequests = new Map<string, { url: string; timestamp: number }>()\n pageCDPSession.on('Network.requestWillBeSent', event => {\n if (event.request.url.startsWith('data:')) return\n const { requestId, request, timestamp } = event\n const sentBytes = request.postDataEntries?.reduce((acc, entry) => acc + (entry.bytes?.length || 0), 0)\n //log.log('Network.requestWillBeSent', event.type, request.url, sentBytes)\n if (sentBytes) resourcesStats.sentBytes += sentBytes\n pendingRequests.set(requestId, { url: request.url, timestamp })\n })\n\n pageCDPSession.on('Network.responseReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n const { response } = event\n if (response.fromDiskCache) {\n pendingRequests.delete(event.requestId)\n return\n }\n resourcesStats.recvBytes += response.encodedDataLength\n })\n\n pageCDPSession.on('Network.dataReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n resourcesStats.recvBytes += event.encodedDataLength\n })\n\n pageCDPSession.on('Network.loadingFinished', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n pendingRequests.delete(event.requestId)\n const { timestamp } = event\n resourcesStats.recvLatency.push(timestamp - request.timestamp)\n })\n\n pageCDPSession.on('Network.webSocketCreated', event => {\n pendingRequests.set(event.requestId, { url: event.url, timestamp: Date.now() })\n })\n\n pageCDPSession.on('Network.webSocketHandshakeResponseReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n pendingRequests.delete(event.requestId)\n resourcesStats.wsRecvLatency.push((Date.now() - request.timestamp) / 1000)\n })\n\n pageCDPSession.on('Network.webSocketFrameSent', event => {\n resourcesStats.wsSentBytes += event.response.payloadData.length\n })\n\n pageCDPSession.on('Network.webSocketFrameReceived', event => {\n resourcesStats.wsRecvBytes += event.response.payloadData.length\n })\n\n // hardware concurrency\n if (this.hardwareConcurrency) {\n const plugin = NavigatorHardwareConcurrency({ hardwareConcurrency: this.hardwareConcurrency })\n await plugin.onPageCreated(page)\n }\n\n // Load page script.\n {\n const filePath = resolvePackagePath('node_modules/@vpalmisano/webrtcperf-js/dist/webrtcperf.js')\n if (!fs.existsSync(filePath)) {\n throw new Error(`@vpalmisano/webrtcperf-js script not found: ${filePath}`)\n }\n log.debug(`loading @vpalmisano/webrtcperf-js script from: ${filePath}`)\n await page.evaluateOnNewDocument(fs.readFileSync(filePath, 'utf8'))\n }\n\n // Execute external script(s).\n if (this.scriptPath) {\n if (this.scriptPath.startsWith('base64:gzip:')) {\n const data = Buffer.from(this.scriptPath.replace('base64:gzip:', ''), 'base64')\n const code = gunzipSync(data).toString()\n log.debug(`loading script from ${code.length} bytes`)\n await page.evaluateOnNewDocument(code)\n } else {\n for (const filePath of this.scriptPath.split(',')) {\n if (!filePath.trim()) {\n continue\n }\n if (filePath.startsWith('http')) {\n log.debug(`loading custom script from url: ${filePath}`)\n const res = await downloadUrl(filePath)\n if (!res?.data) {\n throw new Error(`Failed to download script from: ${filePath}`)\n }\n await page.evaluateOnNewDocument(res.data)\n } else {\n if (!fs.existsSync(filePath)) {\n log.warn(`custom script not found: ${filePath}`)\n continue\n }\n log.debug(`loading custom script from file: ${filePath}`)\n await page.evaluateOnNewDocument(fs.readFileSync(filePath, 'utf8'))\n }\n }\n }\n }\n\n log.debug(`Page ${index + 1} \"${url}\" loading`)\n const pageLoadTime = Date.now()\n\n // open the page url\n try {\n await page.goto(url, {\n waitUntil: 'domcontentloaded',\n timeout: 60 * 1000,\n })\n } catch (error) {\n log.error(`Page ${index + 1} \"${url}\" load error: ${(error as Error).stack}`)\n await page.close()\n return\n }\n\n // add to pages map\n this.pages.set(index, page)\n\n log.debug(`Page ${index + 1} \"${url}\" loaded in ${(Date.now() - pageLoadTime) / 1000}s`)\n\n for (let i = 0; i < this.evaluateAfter.length; i++) {\n await page.evaluate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.evaluateAfter[i].pageFunction as any,\n ...this.evaluateAfter[i].args,\n )\n }\n }\n\n private async getNewPage(tabIndex: number): Promise<Page> {\n log.debug(`getNewPage ${tabIndex}`)\n assert(this.context, 'NoBrowserContextCreated')\n return await this.context.newPage()\n }\n\n private async onPageMessage(\n index: number,\n type: PageLogColorsKey,\n text: string,\n saveFile?: fs.promises.FileHandle,\n ): Promise<void> {\n if (text.endsWith('net::ERR_BLOCKED_BY_CLIENT.Inspector')) {\n return\n }\n const isBlocked = this.blockedUrls.some(\n blockedUrl => (type === 'requestfailed' || text.search('FetchError') !== -1) && text.search(blockedUrl) !== -1,\n )\n if (isBlocked) {\n return\n }\n const color = PageLogColors[type] || 'grey'\n const filter = this.pageLogFilter ? new RegExp(this.pageLogFilter, 'ig') : null\n if (!filter || text.match(filter)) {\n const errorOrWarning = ['error', 'warning'].includes(type)\n const isWebrtcPerf = text.startsWith('[webrtcperf')\n if (saveFile) {\n if (!errorOrWarning && !isWebrtcPerf && text.length > 1024) {\n text = text.slice(0, 1024) + `... +${text.length - 1024} bytes`\n }\n await saveFile.write(`${new Date().toISOString()} [page ${index}] (${type}) ${text}\\n`)\n }\n if (this.showPageLog) {\n if (!errorOrWarning && !isWebrtcPerf && text.length > 256) {\n text = text.slice(0, 256) + `... +${text.length - 256} bytes`\n }\n console.log(chalk`{bold [page ${index}]} {${color} (${type}) ${text}}`)\n }\n if (type === 'error') {\n this.pageErrors += 1\n } else if (type === 'warn') {\n this.pageWarnings += 1\n }\n }\n }\n\n /**\n * updateStats\n */\n async updateStats(): Promise<SessionStats> {\n if (!this.browser) {\n this.stats = {}\n return this.stats\n }\n\n const collectedStats: SessionStats = {}\n\n try {\n const processStats = await getProcessStats()\n Object.assign(collectedStats, {\n nodeCpu: processStats.cpu,\n nodeMemory: processStats.memory,\n })\n } catch (err) {\n log.error(`node getProcessStats error: ${(err as Error).stack}`)\n }\n\n try {\n const systemStats = getSystemStats()\n if (systemStats) {\n collectedStats.usedCpu = systemStats.usedCpu\n collectedStats.usedMemory = systemStats.usedMemory\n collectedStats.usedGpu = systemStats.usedGpu\n if (collectedStats.usedCpu > 80) {\n log.warn(`High system CPU usage: ${collectedStats.usedCpu.toFixed(2)}%`)\n }\n if (collectedStats.usedMemory > 80) {\n log.warn(`High system memory usage: ${collectedStats.usedMemory.toFixed(2)}%`)\n }\n }\n } catch (err) {\n log.error(`node getSystemStats error: ${(err as Error).stack}`)\n }\n\n const browserProcess = this.browser.process()\n if (browserProcess) {\n try {\n const processStats = await getProcessStats(browserProcess.pid, true)\n Object.assign(collectedStats, processStats)\n } catch (err) {\n log.error(`getProcessStats error: ${(err as Error).stack}`)\n }\n }\n\n const pages: Record<string, number> = {}\n const peerConnections: Record<string, number> = {}\n const peerConnectionConnectionTime: Record<string, number> = {}\n const peerConnectionDisconnectionTime: Record<string, number> = {}\n const peerConnectionsCreated: Record<string, number> = {}\n const peerConnectionsClosed: Record<string, number> = {}\n const peerConnectionsConnected: Record<string, number> = {}\n const peerConnectionsDisconnected: Record<string, number> = {}\n const peerConnectionsFailed: Record<string, number> = {}\n const peerConnectionsDelay: Record<string, number> = {}\n const audioEndToEndDelayStats: Record<string, number> = {}\n const audioStartFrameDelayStats: Record<string, number> = {}\n const videoEndToEndDelayStats: Record<string, number> = {}\n const screenEndToEndDelayStats: Record<string, number> = {}\n const videoStartFrameDelayStats: Record<string, number> = {}\n const screenStartFrameDelayStats: Record<string, number> = {}\n const httpSentBytesStats: Record<string, number> = {}\n const httpRecvBytesStats: Record<string, number> = {}\n const httpRecvLatencyStats: Record<string, number> = {}\n const wsSentBytesStats: Record<string, number> = {}\n const wsRecvBytesStats: Record<string, number> = {}\n const wsRecvLatencyStats: Record<string, number> = {}\n const pageCpu: Record<string, number> = {}\n const pageMemory: Record<string, number> = {}\n const cpuPressureStats: Record<string, number> = {}\n\n const videoWidth: Record<string, number> = {}\n const videoHeight: Record<string, number> = {}\n const videoBufferedTime: Record<string, number> = {}\n const videoPlayingTime: Record<string, number> = {}\n const videoBufferingTime: Record<string, number> = {}\n const videoBufferingEvents: Record<string, number> = {}\n\n const throttleUpValuesRate: Record<string, number> = {}\n const throttleUpValuesDelay: Record<string, number> = {}\n const throttleUpValuesLoss: Record<string, number> = {}\n const throttleUpValuesQueue: Record<string, number> = {}\n const throttleDownValuesRate: Record<string, number> = {}\n const throttleDownValuesDelay: Record<string, number> = {}\n const throttleDownValuesLoss: Record<string, number> = {}\n const throttleDownValuesQueue: Record<string, number> = {}\n\n const customStats: Record<string, Record<string, number | string>> = {}\n\n await Promise.allSettled(\n [...this.pages.entries()].map(async ([pageIndex, page]) => {\n try {\n // Collect stats from the page.\n const {\n peerConnectionStats,\n audioEndToEndDelay,\n videoEndToEndDelay,\n cpuPressure,\n videoStats,\n customMetrics,\n } = await page.evaluate(async () => ({\n peerConnectionStats: await webrtcperf.collectPeerConnectionStats(),\n audioEndToEndDelay: webrtcperf.collectAudioEndToEndStats(),\n videoEndToEndDelay: webrtcperf.collectVideoEndToEndStats(),\n cpuPressure: webrtcperf.collectCpuPressure(),\n videoStats: webrtcperf.collectVideoStats(),\n customMetrics: 'collectCustomMetrics' in window ? collectCustomMetrics() : null,\n }))\n const { participantName } = peerConnectionStats\n\n const httpResourcesStats = this.httpResourcesStats.get(pageIndex)\n\n // Get host from the first collected remote address.\n if (!peerConnectionStats.signalingHost && peerConnectionStats.stats.length) {\n const values = Object.values(peerConnectionStats.stats[0])\n if (values.length) {\n peerConnectionStats.signalingHost = await resolveIP(values[0].remoteAddress as string)\n }\n }\n const { stats, activePeerConnections, signalingHost } = peerConnectionStats\n\n // Calculate stats keys.\n const hostKey = rtcStatKey({\n hostName: signalingHost,\n participantName,\n })\n const pageKey = rtcStatKey({\n pageIndex,\n hostName: signalingHost,\n participantName,\n })\n\n // Set pages counter.\n increaseKey(pages, hostKey, 1)\n\n // Set peerConnections counters.\n increaseKey(peerConnections, pageKey, activePeerConnections)\n increaseKey(peerConnectionConnectionTime, pageKey, peerConnectionStats.peerConnectionConnectionTime)\n increaseKey(peerConnectionDisconnectionTime, pageKey, peerConnectionStats.peerConnectionDisconnectionTime)\n increaseKey(peerConnectionsCreated, pageKey, peerConnectionStats.peerConnectionsCreated)\n increaseKey(peerConnectionsClosed, pageKey, peerConnectionStats.peerConnectionsClosed)\n increaseKey(peerConnectionsConnected, pageKey, peerConnectionStats.peerConnectionsConnected)\n increaseKey(peerConnectionsDisconnected, pageKey, peerConnectionStats.peerConnectionsDisconnected)\n increaseKey(peerConnectionsFailed, pageKey, peerConnectionStats.peerConnectionsFailed)\n increaseKey(peerConnectionsDelay, pageKey, peerConnectionStats.peerConnectionsDelay)\n\n // E2E stats.\n if (audioEndToEndDelay) {\n audioEndToEndDelayStats[pageKey] = audioEndToEndDelay.delay\n audioStartFrameDelayStats[pageKey] = audioEndToEndDelay.startFrameDelay\n }\n if (videoEndToEndDelay) {\n videoEndToEndDelayStats[pageKey] = videoEndToEndDelay.videoDelay\n videoStartFrameDelayStats[pageKey] = videoEndToEndDelay.videoStartFrameDelay\n screenEndToEndDelayStats[pageKey] = videoEndToEndDelay.screenDelay\n screenStartFrameDelayStats[pageKey] = videoEndToEndDelay.screenStartFrameDelay\n }\n\n // HTTP stats.\n if (httpResourcesStats) {\n if (httpResourcesStats.sentBytes > 0) httpSentBytesStats[pageKey] = httpResourcesStats.sentBytes\n if (httpResourcesStats.recvBytes > 0) httpRecvBytesStats[pageKey] = httpResourcesStats.recvBytes\n if (httpResourcesStats.recvLatency.length)\n httpRecvLatencyStats[pageKey] = httpResourcesStats.recvLatency.amean()\n if (httpResourcesStats.wsSentBytes > 0) wsSentBytesStats[pageKey] = httpResourcesStats.wsSentBytes\n if (httpResourcesStats.wsRecvBytes > 0) wsRecvBytesStats[pageKey] = httpResourcesStats.wsRecvBytes\n if (httpResourcesStats.wsRecvLatency.length)\n wsRecvLatencyStats[pageKey] = httpResourcesStats.wsRecvLatency.amean()\n }\n\n if (cpuPressure !== undefined) cpuPressureStats[pageKey] = cpuPressure\n if (videoStats) {\n videoWidth[pageKey] = videoStats.width\n videoHeight[pageKey] = videoStats.height\n videoBufferedTime[pageKey] = videoStats.bufferedTime\n videoPlayingTime[pageKey] = videoStats.playingTime\n videoBufferingTime[pageKey] = videoStats.bufferingTime\n videoBufferingEvents[pageKey] = videoStats.bufferingEvents\n }\n\n // Collect RTC stats.\n for (const s of stats) {\n for (const [trackId, value] of Object.entries(s)) {\n try {\n updateRtcStats(collectedStats as RtcStats, pageIndex, trackId, value, signalingHost, participantName)\n } catch (err) {\n log.error(`updateRtcStats error for ${trackId}: ${(err as Error).stack}`, err)\n }\n }\n }\n\n // Collect custom metrics.\n if (customMetrics) {\n for (const [name, value] of Object.entries(customMetrics)) {\n if (!customStats[name]) {\n customStats[name] = {}\n }\n customStats[name][pageKey] = value\n }\n }\n\n // Collect page metrics\n /* const metrics = await page.metrics()\n if (metrics.Timestamp) {\n const lastMetrics = this.pagesMetrics.get(pageIndex)\n if (lastMetrics?.Timestamp) {\n const elapsedTime = metrics.Timestamp - lastMetrics.Timestamp\n if (elapsedTime > 10) {\n const durationDiff =\n metricsTotalDuration(metrics) -\n metricsTotalDuration(lastMetrics)\n const usage = (100 * durationDiff) / elapsedTime\n pageCpu[pageKey] = usage\n pageMemory[pageKey] = (metrics.JSHeapUsedSize || 0) / 1e6\n this.pagesMetrics.set(pageIndex, metrics)\n }\n } else {\n this.pagesMetrics.set(pageIndex, metrics)\n }\n } */\n pageCpu[pageKey] = (collectedStats.cpu as number) / this.tabsPerSession\n pageMemory[pageKey] = (collectedStats.memory as number) / this.tabsPerSession\n\n // Collect throttle metrics\n const throttleUpValues = getSessionThrottleValues(this.throttleIndex, 'up')\n throttleUpValuesRate[pageKey] = throttleUpValues.rate || 0\n throttleUpValuesDelay[pageKey] = throttleUpValues.delay || 0\n throttleUpValuesLoss[pageKey] = throttleUpValues.loss || 0\n throttleUpValuesQueue[pageKey] = throttleUpValues.queue || 0\n\n const throttleDownValues = getSessionThrottleValues(this.throttleIndex, 'down')\n throttleDownValuesRate[pageKey] = throttleDownValues.rate || 0\n throttleDownValuesDelay[pageKey] = throttleDownValues.delay || 0\n throttleDownValuesLoss[pageKey] = throttleDownValues.loss || 0\n throttleDownValuesQueue[pageKey] = throttleDownValues.queue || 0\n } catch (err) {\n const error = err as Error\n if (error.message.includes('Execution context was destroyed, most likely because of a navigation.')) {\n log.warn(`collectPeerConnectionStats for page ${pageIndex} error: ${error.message}`)\n } else {\n log.error(`collectPeerConnectionStats for page ${pageIndex} error: ${error.stack}`)\n }\n }\n }),\n )\n\n Object.assign(collectedStats, {\n pages,\n errors: this.pageErrors,\n warnings: this.pageWarnings,\n peerConnections,\n peerConnectionConnectionTime,\n peerConnectionDisconnectionTime,\n peerConnectionsConnected,\n peerConnectionsCreated,\n peerConnectionsClosed,\n peerConnectionsDisconnected,\n peerConnectionsFailed,\n peerConnectionsDelay,\n audioEndToEndDelay: audioEndToEndDelayStats,\n audioStartFrameDelay: audioStartFrameDelayStats,\n videoEndToEndDelay: videoEndToEndDelayStats,\n videoStartFrameDelay: videoStartFrameDelayStats,\n screenEndToEndDelay: screenEndToEndDelayStats,\n screenStartFrameDelay: screenStartFrameDelayStats,\n httpSentBytes: httpSentBytesStats,\n httpRecvBytes: httpRecvBytesStats,\n httpRecvLatency: httpRecvLatencyStats,\n wsSentBytes: wsSentBytesStats,\n wsRecvBytes: wsRecvBytesStats,\n wsRecvLatency: wsRecvLatencyStats,\n cpuPressure: cpuPressureStats,\n videoWidth,\n videoHeight,\n videoBufferedTime,\n videoPlayingTime,\n videoBufferingTime,\n videoBufferingEvents,\n pageCpu,\n pageMemory,\n throttleUpRate: throttleUpValuesRate,\n throttleUpDelay: throttleUpValuesDelay,\n throttleUpLoss: throttleUpValuesLoss,\n throttleUpQueue: throttleUpValuesQueue,\n throttleDownRate: throttleDownValuesRate,\n throttleDownDelay: throttleDownValuesDelay,\n throttleDownLoss: throttleDownValuesLoss,\n throttleDownQueue: throttleDownValuesQueue,\n ...customStats,\n })\n\n if (pages.size < this.pages.size) {\n log.warn(`updateStats collected pages ${pages.size} < ${this.pages.size}`)\n }\n\n this.stats = collectedStats\n return this.stats\n }\n\n /**\n * stop\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return\n }\n this.running = false\n log.debug(`${this.id} stop`)\n\n if (this.stopPortForwarder) {\n this.stopPortForwarder()\n }\n\n if (this.browser) {\n // close the opened tabs\n log.debug(`${this.id} closing ${this.pages.size} pages`)\n await Promise.allSettled(\n [...this.pages.values()].map(page => {\n return page.close({ runBeforeUnload: true })\n }),\n )\n if (this.pages.size > 0) {\n const now = Date.now()\n const maxWaitTime = 1000 * this.pages.size\n while (this.pages.size > 0 && Date.now() - now < maxWaitTime) {\n log.debug(`${this.id} waiting for ${this.pages.size} pages to close`)\n await sleep(200)\n }\n if (this.pages.size > 0) {\n log.warn(`${this.id} timeout closing ${this.pages.size} pages`)\n }\n }\n\n if (this.screensharePage) {\n await this.screensharePage.close()\n this.screensharePage = undefined\n }\n\n this.browser.removeAllListeners()\n if (this.chromiumUrl) {\n log.debug(`${this.id} disconnect from browser`)\n try {\n await this.browser.disconnect()\n } catch (err) {\n log.warn(`${this.id} browser disconnect error: ${(err as Error).message}`)\n }\n } else {\n const pid = this.browser.process()?.pid\n if (pid) {\n log.debug(`${this.id} closing browser (pid: ${pid})`)\n try {\n await this.browser.close()\n } catch (err) {\n log.error(`${this.id} browser close error: ${(err as Error).stack}`)\n }\n await waitStopProcess(pid, 5000)\n }\n }\n this.pages.clear()\n this.pagesMetrics.clear()\n this.browser = undefined\n }\n\n this.emit('stop', this.id)\n }\n\n /**\n * pageScreenshot\n * @param {number} pageIndex\n * @param {String} format The image format (png|jpeg|webp).\n * @return {String}\n */\n async pageScreenshot(pageIndex = 0, format = 'webp'): Promise<string> {\n log.debug(`pageScreenshot ${this.id}-${pageIndex}`)\n const index = this.id + pageIndex\n const page = this.pages.get(index)\n if (!page) {\n throw new Error(`Page ${index} not found`)\n }\n const filePath = `/tmp/screenshot-${index}.${format}` as `${string}.${ImageFormat}`\n await page.screenshot({\n path: filePath,\n fullPage: true,\n })\n return filePath\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSessionThrottleValues, throttleLauncher } from '@vpalmisano/throttler'\nimport assert from 'assert'\nimport axios from 'axios'\nimport EventEmitter from 'events'\nimport fs from 'fs'\nimport JSON5 from 'json5'\nimport { LoremIpsum } from 'lorem-ipsum'\nimport NodeCache from 'node-cache'\nimport os from 'os'\nimport path from 'path'\nimport puppeteer, {\n Browser,\n BrowserContext,\n CDPSession,\n CookieParam,\n ElementHandle,\n ImageFormat,\n KeyInput,\n Metrics,\n Page,\n Permission,\n} from 'puppeteer-core'\nimport {\n type Interception,\n RequestInterceptionManager,\n getUrlPatternRegExp,\n} from 'puppeteer-intercept-and-modify-requests'\nimport { gunzipSync } from 'zlib'\n\nimport { RtcStats, rtcStatKey, updateRtcStats } from './rtcstats'\nimport { FastStats } from './stats'\nimport {\n PeerConnectionExternal,\n PeerConnectionExternalMethod,\n checkChromeExecutable,\n downloadUrl,\n enabledForSession,\n getProcessStats,\n getSystemStats,\n hideAuth,\n increaseKey,\n logger,\n portForwarder,\n resolveIP,\n resolvePackagePath,\n sha256,\n sleep,\n waitStopProcess,\n} from './utils'\nimport { MediaPath } from './media'\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst { default: chalk } = require('chalk-template')\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst NavigatorHardwareConcurrency = require('puppeteer-extra-plugin-stealth/evasions/navigator.hardwareConcurrency')\n\nconst log = logger('webrtcperf:session')\n\ndeclare global {\n let webrtcperf: {\n getActiveAudioTracks: () => MediaStreamTrack[]\n collectPeerConnectionStats: () => Promise<{\n stats: RtcStats[]\n signalingHost?: string\n participantName?: string\n activePeerConnections: number\n peerConnectionConnectionTime: number\n peerConnectionDisconnectionTime: number\n peerConnectionsCreated: number\n peerConnectionsConnected: number\n peerConnectionsDisconnected: number\n peerConnectionsFailed: number\n peerConnectionsClosed: number\n peerConnectionsDelay: number\n }>\n collectAudioEndToEndStats: () => {\n delay: number\n startFrameDelay: number\n }\n collectVideoEndToEndStats: () => {\n videoDelay: number\n videoStartFrameDelay: number\n screenDelay: number\n screenStartFrameDelay: number\n }\n collectCpuPressure: () => number\n collectVideoStats: () => {\n width: number\n height: number\n bufferedTime: number\n playingTime: number\n bufferingTime: number\n bufferingEvents: number\n }\n getParticipantName: () => string\n startFakeScreenshare: () => Promise<void>\n stopFakeScreenshare: () => void\n }\n let collectCustomMetrics: () => Promise<Record<string, number | string>>\n}\n\nconst PageLogColors = {\n error: 'red',\n warn: 'yellow',\n info: 'cyan',\n log: 'grey',\n debug: 'white',\n requestfailed: 'magenta',\n}\n\ntype PageLogColorsKey = 'error' | 'warn' | 'info' | 'log' | 'debug' | 'requestfailed'\n\ntype SessionStats = Record<string, number | Record<string, number>>\n\nexport interface SessionParams {\n /** The chromium running instance url. */\n chromiumUrl: string\n /** The chromium executable path. */\n chromiumPath: string\n /** Chromium additional field trials. */\n chromiumFieldTrials: string\n /** The browser width. */\n windowWidth: number\n /** The browser height. */\n windowHeight: number\n /** The browser device scale factor. */\n deviceScaleFactor: number\n /**\n * If unset, the browser will run in headless mode.\n * When running on Linux, set to a valid X display variable (e.g. `:0`).\n */\n display: string\n /** Enables RED for OPUS codec (experimental). */\n /* audioRedForOpus: boolean */\n /** The page URL. */\n url: string\n /** The page URL query. */\n urlQuery: string\n /** Custom URL handler. */\n customUrlHandler: string\n customUrlHandlerFn?: CustomUrlHandlerFn\n mediaPath?: MediaPath\n videoWidth: number\n videoHeight: number\n videoFramerate: number\n useFakeMedia: boolean\n enableGpu: string\n enableBrowserLogging: string\n startTimestamp: number\n sessions: number\n tabsPerSession: number\n spawnPeriod: number\n statsInterval: number\n disabledVideoCodecs: string\n localStorage: string\n sessionStorage: string\n clearCookies: boolean\n scriptPath: string\n showPageLog: boolean\n pageLogFilter: string\n pageLogPath: string\n userAgent: string\n id: number\n throttleIndex: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n evaluateAfter?: any[]\n exposedFunctions?: string\n scriptParams: string\n blockedUrls: string\n extraHeaders: string\n responseModifiers: string\n downloadResponses: string\n extraCSS: string\n cookies: string\n overridePermissions: string\n hardwareConcurrency: number\n debuggingPort: number\n debuggingAddress: string\n randomAudioPeriod: number\n maxVideoDecoders: number\n maxVideoDecodersRange: string\n incognito: boolean\n serverPort: number\n serverSecret: string\n serverUseHttps: boolean\n emulateCpuThrottling: number\n}\n\nexport type CustomUrlHandlerFn = (params: {\n id: number\n sessions: number\n tabIndex: number\n tabsPerSession: number\n index: number\n pid: number\n env: Record<string, string>\n params: Record<string, unknown>\n}) => Promise<string>\n\n/**\n * Implements a test session instance running on a browser instance.\n */\nexport class Session extends EventEmitter {\n private readonly chromiumUrl: string\n private readonly chromiumPath?: string\n private readonly chromiumFieldTrials?: string\n private readonly windowWidth: number\n private readonly windowHeight: number\n private readonly deviceScaleFactor: number\n private readonly display: string\n /* private readonly audioRedForOpus: boolean */\n public readonly mediaPath?: MediaPath\n private readonly videoWidth: number\n private readonly videoHeight: number\n private readonly videoFramerate: number\n private readonly useFakeMedia: boolean\n private readonly enableGpu: string\n private readonly enableBrowserLogging: boolean\n private readonly startTimestamp: number\n private readonly sessions: number\n private readonly tabsPerSession: number\n private readonly spawnPeriod: number\n private readonly statsInterval: number\n private readonly disabledVideoCodecs: string[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly localStorage?: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly sessionStorage?: any\n private readonly clearCookies: boolean\n private readonly scriptPath: string\n private readonly showPageLog: boolean\n private readonly pageLogFilter: string\n private readonly pageLogPath: string\n private readonly userAgent: string\n private readonly evaluateAfter: {\n // eslint-disable-next-line\n pageFunction: Function\n // eslint-disable-next-line\n args: any\n }[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly exposedFunctions: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly scriptParams: any\n private readonly blockedUrls: string[]\n private readonly extraHeaders?: Record<string, Record<string, string>>\n private readonly responseModifiers: Record<\n string,\n {\n search?: string | RegExp\n replace?: string\n file?: string\n headers?: Record<string, string>\n }[]\n > = {}\n private readonly downloadResponses: { urlPattern: RegExp; output: string; append?: boolean }[] = []\n private readonly extraCSS: string\n private readonly cookies: CookieParam[] = []\n private readonly overridePermissions: Permission[] = []\n private readonly hardwareConcurrency: number\n private readonly debuggingPort: number\n private readonly debuggingAddress: string\n private readonly randomAudioPeriod: number\n private readonly maxVideoDecoders: number\n private readonly maxVideoDecodersRange: string\n private readonly incognito: boolean\n private readonly serverPort: number\n private readonly serverSecret: string\n private readonly serverUseHttps: boolean\n private readonly emulateCpuThrottling: number\n\n private running = false\n private browser?: Browser\n private context?: BrowserContext\n private stopPortForwarder?: () => void\n\n /** The numeric id assigned to the session. */\n readonly id: number\n /** The throttle configuration index assigned to the session. */\n readonly throttleIndex: number\n /** The test page url. */\n readonly url: string\n /** The url query. */\n readonly urlQuery: string\n /**\n * The custom URL handler. This is the path to a JavaScript module (.mjs) exporting the function.\n * The function itself takes an object as input with the following parameters:\n *\n * @typedef {Object} CustomUrlHandler\n * @property {string} id - The identifier for the URL.\n * @property {string} sessions - The number of sessions.\n * @property {string} tabIndex - The index of the current tab.\n * @property {string} tabsPerSession - The number of tabs per session.\n * @property {string} index - The index for the URL.\n * @property {string} pid - The process identifier for the URL.\n *\n * @type {string} path - The path to the JavaScript file containing the function:\n * (params: CustomUrlHandler) => Promise<string>\n */\n readonly customUrlHandler: string\n /**\n * Imported custom URL handler function.\n * @typedef {Object} CustomUrlHandler\n * @property {number} id - The identifier for the URL.\n * @property {number} sessions - The number of sessions.\n * @property {number} tabIndex - The index of the current tab.\n * @property {number} tabsPerSession - The number of tabs per session.\n * @property {number} index - The index for the URL.\n * @property {number} pid - The process identifier for the URL.\n * @property {Record<string, string>} env - The process environment.\n *\n * @type {string} path - The path to the JavaScript file containing the function:\n * (params: CustomUrlHandler) => Promise<string>\n */\n public customUrlHandlerFn?: CustomUrlHandlerFn\n /** The latest stats extracted from page. */\n stats: SessionStats = {}\n /** The browser opened pages. */\n readonly pages = new Map<number, Page>()\n readonly httpResourcesStats = new Map<\n number,\n {\n sentBytes: number\n recvBytes: number\n recvLatency: FastStats\n wsSentBytes: number\n wsRecvBytes: number\n wsRecvLatency: FastStats\n }\n >()\n /** The browser opened pages metrics. */\n readonly pagesMetrics = new Map<number, Metrics>()\n /** The page warnings count. */\n pageWarnings = 0\n /** The page errors count. */\n pageErrors = 0\n private screensharePage?: Page\n\n private static readonly jsonFetchCache = new NodeCache({\n stdTTL: 30,\n checkperiod: 15,\n })\n\n constructor({\n chromiumUrl,\n chromiumPath,\n chromiumFieldTrials,\n windowWidth,\n windowHeight,\n deviceScaleFactor,\n display,\n /* audioRedForOpus, */\n url,\n urlQuery,\n customUrlHandler,\n customUrlHandlerFn,\n mediaPath,\n videoWidth,\n videoHeight,\n videoFramerate,\n useFakeMedia,\n enableGpu,\n enableBrowserLogging,\n startTimestamp,\n sessions,\n tabsPerSession,\n spawnPeriod,\n statsInterval,\n disabledVideoCodecs,\n localStorage,\n sessionStorage,\n clearCookies,\n scriptPath,\n showPageLog,\n pageLogFilter,\n pageLogPath,\n userAgent,\n id,\n throttleIndex,\n evaluateAfter,\n exposedFunctions,\n scriptParams,\n blockedUrls,\n extraHeaders,\n responseModifiers,\n downloadResponses,\n extraCSS,\n cookies,\n overridePermissions,\n hardwareConcurrency,\n debuggingPort,\n debuggingAddress,\n randomAudioPeriod,\n maxVideoDecoders,\n maxVideoDecodersRange,\n incognito,\n serverPort,\n serverSecret,\n serverUseHttps,\n emulateCpuThrottling,\n }: SessionParams) {\n super()\n log.debug('constructor', { id })\n this.id = id\n this.chromiumUrl = chromiumUrl\n this.chromiumPath = chromiumPath || undefined\n this.chromiumFieldTrials = chromiumFieldTrials || undefined\n this.windowWidth = windowWidth || 1920\n this.windowHeight = windowHeight || 1080\n this.deviceScaleFactor = deviceScaleFactor || 1\n this.debuggingPort = debuggingPort || 0\n this.debuggingAddress = debuggingAddress || ''\n this.display = display\n /* this.audioRedForOpus = !!audioRedForOpus */\n this.url = url\n this.urlQuery = urlQuery\n if (!this.urlQuery && url.includes('?')) {\n const parts = url.split('?', 2)\n this.url = parts[0]\n this.urlQuery = parts[1]\n }\n this.customUrlHandler = customUrlHandler\n this.customUrlHandlerFn = customUrlHandlerFn\n this.mediaPath = mediaPath\n this.videoWidth = videoWidth\n this.videoHeight = videoHeight\n this.videoFramerate = videoFramerate\n this.useFakeMedia = useFakeMedia\n this.enableGpu = enableGpu\n this.enableBrowserLogging = enabledForSession(this.id, enableBrowserLogging)\n this.startTimestamp = startTimestamp || Date.now()\n this.sessions = sessions || 1\n this.tabsPerSession = tabsPerSession || 1\n assert(this.tabsPerSession >= 1, 'tabsPerSession should be >= 1')\n this.spawnPeriod = spawnPeriod || 1000\n this.statsInterval = statsInterval || 10\n if (disabledVideoCodecs) {\n this.disabledVideoCodecs = disabledVideoCodecs\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n } else {\n this.disabledVideoCodecs = []\n }\n if (localStorage) {\n try {\n this.localStorage = JSON5.parse(localStorage)\n } catch (err: unknown) {\n log.error(`error parsing localStorage: ${(err as Error).stack}`)\n this.localStorage = null\n }\n }\n if (sessionStorage) {\n try {\n this.sessionStorage = JSON5.parse(sessionStorage)\n } catch (err: unknown) {\n log.error(`error parsing sessionStorage: ${(err as Error).stack}`)\n this.sessionStorage = null\n }\n }\n this.clearCookies = clearCookies\n this.scriptPath = scriptPath\n this.showPageLog = showPageLog\n this.pageLogFilter = pageLogFilter\n this.pageLogPath = pageLogPath\n this.userAgent = userAgent\n this.randomAudioPeriod = randomAudioPeriod\n this.maxVideoDecoders = maxVideoDecoders\n this.maxVideoDecodersRange = maxVideoDecodersRange\n this.incognito = incognito\n this.serverPort = serverPort\n this.serverSecret = serverSecret\n this.serverUseHttps = serverUseHttps\n this.emulateCpuThrottling = emulateCpuThrottling\n\n this.throttleIndex = throttleIndex\n this.evaluateAfter = evaluateAfter || []\n this.exposedFunctions = exposedFunctions || {}\n if (scriptParams) {\n try {\n this.scriptParams = JSON5.parse(scriptParams)\n } catch (err) {\n log.error(`error parsing scriptParams '${scriptParams}': ${(err as Error).stack}`)\n throw err\n }\n } else {\n this.scriptParams = {}\n }\n this.blockedUrls = (blockedUrls || '')\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n // Always block sentry.io.\n this.blockedUrls.push('ingest.sentry.io')\n\n if (extraHeaders) {\n try {\n this.extraHeaders = JSON5.parse(extraHeaders)\n } catch (err) {\n log.error(`error parsing extraHeaders: ${(err as Error).stack}`)\n this.extraHeaders = undefined\n }\n } else {\n this.extraHeaders = undefined\n }\n\n if (responseModifiers) {\n try {\n const parsed = JSON5.parse(responseModifiers)\n Object.entries(parsed).forEach(([url, replacements]) => {\n if (!Array.isArray(replacements)) {\n throw new Error(\n `responseModifiers replacements should be an array of { search, replace, body, headers } objects: ${replacements}`,\n )\n }\n this.responseModifiers[url] = replacements.map(({ search, regexp, replace, file, headers }) => ({\n search: regexp ? new RegExp(regexp, 'g') : search,\n replace,\n file,\n headers,\n }))\n })\n } catch (err) {\n throw new Error(`error parsing responseModifiers \"${responseModifiers}\": ${(err as Error).stack}`)\n }\n }\n\n if (downloadResponses) {\n try {\n const parsed = JSON5.parse(downloadResponses)\n if (!Array.isArray(parsed)) throw new Error(`downloadResponses should be an array: ${downloadResponses}`)\n parsed.forEach(({ urlPattern, output, append }) => {\n this.downloadResponses.push({ urlPattern: getUrlPatternRegExp(urlPattern), output, append })\n })\n } catch (err) {\n throw new Error(`error parsing downloadResponses \"${downloadResponses}\": ${(err as Error).stack}`)\n }\n }\n\n this.extraCSS = extraCSS\n\n if (cookies) {\n try {\n this.cookies = JSON5.parse(cookies)\n } catch (err) {\n log.error(`error parsing cookies: ${(err as Error).stack}`)\n }\n }\n\n if (overridePermissions) {\n this.overridePermissions = overridePermissions\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length) as Permission[]\n }\n\n this.hardwareConcurrency = hardwareConcurrency\n }\n\n /**\n * Returns the chromium browser launch args\n * @return the args list\n */\n getBrowserArgs(env: Record<string, string>): string[] {\n // https://peter.sh/experiments/chromium-command-line-switches/\n // https://source.chromium.org/chromium/chromium/src/+/main:testing/variations/fieldtrial_testing_config.json;l=8877?q=%20fieldtrial_testing_config.json&ss=chromium\n const args = [\n '--no-sandbox',\n '--no-zygote',\n '--ignore-certificate-errors',\n '--no-user-gesture-required',\n '--autoplay-policy=no-user-gesture-required',\n '--disable-infobars',\n '--no-default-browser-check',\n '--allow-running-insecure-content',\n `--unsafely-treat-insecure-origin-as-secure=http://${new URL(this.url || 'http://localhost').host}`,\n '--disable-web-security',\n '--disable-features=IsolateOrigins,Translate,CalculateNativeWinOcclusion',\n '--disable-background-timer-throttling',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-site-isolation-trials',\n '--enable-usermedia-screen-capturing',\n '--allow-http-screen-capture',\n `--remote-debugging-port=${this.debuggingPort ? this.debuggingPort + this.id : 0}`,\n '--enable-features=VaapiVideoDecoder,VaapiVideoEncoder,VaapiVideoDecodeLinuxGL,ElementCapture',\n `--window-size=${this.windowWidth},${this.windowHeight}`,\n ]\n\n let fieldTrials = this.chromiumFieldTrials || ''\n\n if (this.enableBrowserLogging && this.pageLogPath) {\n const pageLogDir = path.dirname(this.pageLogPath)\n const eventLogPath = path.resolve(pageLogDir, `webrtc-event-logging-${this.id}`)\n fs.mkdirSync(eventLogPath, { recursive: true })\n args.push('--enable-logging', '--vmodule=*/webrtc/*=5', '--v=0', `--webrtc-event-logging=${eventLogPath}`)\n fieldTrials = 'WebRTC-RtcEventLogNewFormat/Disabled/' + fieldTrials\n env.CHROME_LOG_FILE = path.resolve(pageLogDir, `chrome-${this.id}.log`)\n }\n\n if (this.maxVideoDecoders !== -1 && enabledForSession(this.id, this.maxVideoDecodersRange)) {\n fieldTrials = `WebRTC-MaxVideoDecoders/${this.maxVideoDecoders}/` + fieldTrials\n }\n if (fieldTrials.length) {\n args.push(`--force-fieldtrials=${fieldTrials}`)\n }\n\n if (this.mediaPath) {\n if (this.useFakeMedia) {\n log.debug(`${this.id} using chromium as fake media source`)\n args.push(\n '--use-fake-ui-for-media-stream',\n `--use-fake-device-for-media-stream=display-media-type=browser,fps=30`,\n `--use-file-for-fake-video-capture=${this.mediaPath.video}`,\n `--use-file-for-fake-audio-capture=${this.mediaPath.audio}`,\n )\n } else {\n log.debug(`${this.id} using ${this.mediaPath} as fake media source`)\n args.push(\n '--auto-accept-camera-and-microphone-capture',\n `--auto-select-tab-capture-source-by-title=webrtcperf-screenshare`,\n '--mute-audio',\n )\n }\n }\n\n if (this.enableGpu) {\n args.push(\n '--ignore-gpu-blocklist',\n '--enable-gpu-rasterization',\n '--enable-zero-copy',\n '--disable-gpu-sandbox',\n '--enable-vulkan',\n )\n if (this.enableGpu === 'egl') {\n args.push('--use-gl=egl')\n } else {\n args.push('--use-gl=angle', '--use-angle=vulkan')\n }\n } else {\n args.push(\n // Disables webgl support.\n '--disable-3d-apis',\n '--disable-site-isolation-trials',\n // '--renderer-process-limit=2',\n // '--single-process',\n )\n }\n\n return args\n }\n\n /**\n * Start\n */\n async start(): Promise<void> {\n if (this.running) {\n return\n }\n this.running = true\n if (this.browser) {\n log.warn(`${this.id} start: already running`)\n return\n }\n log.debug(`${this.id} start`)\n\n if (this.chromiumUrl) {\n // connect to a remote chrome instance\n try {\n this.browser = await puppeteer.connect({\n browserURL: this.chromiumUrl,\n defaultViewport: {\n width: this.windowWidth,\n height: this.windowHeight,\n deviceScaleFactor: this.deviceScaleFactor,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n })\n } catch (err) {\n log.error(`${this.id} browser connect error: ${(err as Error).stack}`)\n return this.stop()\n }\n } else {\n // run a browser instance locally\n let executablePath = this.chromiumPath\n if (!executablePath || !fs.existsSync(executablePath)) {\n executablePath = await checkChromeExecutable()\n log.debug(`using executablePath=${executablePath}`)\n }\n\n // Create the process wrapper.\n if (this.throttleIndex > -1 && os.platform() === 'linux') {\n executablePath = await throttleLauncher(executablePath, this.throttleIndex)\n }\n\n const env = { ...process.env } as Record<string, string>\n if (!this.display) {\n delete env.DISPLAY\n } else {\n env.DISPLAY = this.display\n }\n\n const args = this.getBrowserArgs(env)\n const ignoreDefaultArgs = [\n '--disable-dev-shm-usage',\n '--remote-debugging-port',\n //'--hide-scrollbars',\n '--enable-automation',\n '--window-size',\n ]\n\n log.debug(`[session ${this.id}] Using args:\\n ${args.join('\\n ')}`)\n log.debug(`[session ${this.id}] Default args:\\n ${puppeteer.defaultArgs().join('\\n ')}`)\n\n try {\n this.browser = await puppeteer.launch({\n browser: 'chrome',\n headless: this.display ? false : true,\n executablePath,\n handleSIGINT: false,\n env,\n // dumpio: this.enableBrowserLogging,\n // devtools: true,\n defaultViewport: {\n width: this.windowWidth,\n height: this.windowHeight,\n deviceScaleFactor: this.deviceScaleFactor,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n ignoreDefaultArgs,\n args,\n })\n const version = await this.browser.version()\n log.debug(`[session ${this.id}] Using chrome version: ${version}`)\n } catch (err) {\n log.error(`[session ${this.id}] Browser launch error: ${(err as Error).stack}`)\n return this.stop()\n }\n }\n\n assert(this.browser, 'BrowserNotCreated')\n\n if (this.debuggingPort && this.debuggingAddress !== '127.0.0.1') {\n this.stopPortForwarder = await portForwarder(this.debuggingPort + this.id, this.debuggingAddress)\n }\n\n this.browser.once('disconnected', () => {\n log.debug('browser disconnected')\n return this.stop()\n })\n\n // get GPU infos from chrome://gpu page\n /* if (this.enableGpu) {\n try {\n const page = await this.browser.newPage()\n await page.goto('chrome://gpu')\n const data = await page.evaluate(() =>\n [\n // eslint-disable-next-line no-undef\n ...document.querySelectorAll('ul.feature-status-list > li > span'),\n ].map(\n (e, i) =>\n `${i % 2 === 0 ? '\\n- ' : ''}${(e as HTMLSpanElement).innerText}`,\n ),\n )\n await page.close()\n console.log(`GPU infos:${data.join('')}`)\n } catch (err) {\n log.warn(`${this.id} error getting gpu info: %j`, err)\n }\n } */\n\n // open pages\n for (let i = 0; i < this.tabsPerSession; i++) {\n this.openPage(i).catch(err => log.error(`openPage error: ${(err as Error).stack}`))\n if (i < this.tabsPerSession - 1) {\n await sleep(this.spawnPeriod)\n }\n }\n }\n\n private setupPageCmd(index: number, tabIndex: number, url: string) {\n let cmd = `\\\nwebrtcperf = {};\nwebrtcperf.config = {\n START_TIMESTAMP: ${this.startTimestamp},\n WEBRTC_PERF_URL: \"${hideAuth(url)}\",\n WEBRTC_PERF_SESSION: ${this.id},\n WEBRTC_PERF_TAB_INDEX: ${tabIndex},\n WEBRTC_PERF_INDEX: ${index},\n STATS_INTERVAL: ${this.statsInterval},\n VIDEO_WIDTH: ${this.videoWidth},\n VIDEO_HEIGHT: ${this.videoHeight},\n VIDEO_FRAMERATE: ${this.videoFramerate},\n};\ntry {\n webrtcperf.params = JSON.parse('${JSON.stringify(this.scriptParams)}' || '{}');\n} catch (err) {\n console.error('[webrtcperf] Error parsing scriptParams:', err);\n webrtcperf.params = {};\n}\n `\n\n if (this.serverPort) {\n cmd += `\\\nwebrtcperf.config.SAVE_MEDIA_URL = \"ws${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/?auth=${this.serverSecret}&action=write-stream\";\n `\n if (this.mediaPath?.mp4 && !this.useFakeMedia) {\n cmd += `\\\nwebrtcperf.config.VIDEO_URL = \"http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/cache/${path.basename(this.mediaPath.mp4)}?auth=${this.serverSecret}\";\nwebrtcperf.config.AUDIO_URL = \"http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/cache/${path.basename(this.mediaPath.m4a)}?auth=${this.serverSecret}\";\n `\n }\n }\n\n if (this.disabledVideoCodecs.length) {\n log.debug('Using disabledVideoCodecs:', this.disabledVideoCodecs)\n cmd += `webrtcperf.config.GET_CAPABILITIES_DISABLED_VIDEO_CODECS = JSON.parse('${JSON.stringify(\n this.disabledVideoCodecs,\n )}');\\n`\n }\n\n return cmd\n }\n\n /**\n * openPage\n * @param tabIndex\n */\n async openPage(tabIndex: number): Promise<void> {\n if (!this.browser) {\n return\n }\n const index = this.id + tabIndex\n let saveFile: fs.promises.FileHandle | undefined = undefined\n let url = this.url\n\n if (!url) {\n if (this.customUrlHandler && !this.customUrlHandlerFn) {\n const customUrlHandlerPath = path.resolve(process.cwd(), this.customUrlHandler)\n if (!fs.existsSync(customUrlHandlerPath)) {\n throw new Error(`Custom url handler script not found: \"${customUrlHandlerPath}\"`)\n }\n this.customUrlHandlerFn = (await import(/* webpackIgnore: true */ customUrlHandlerPath)).default\n }\n if (!this.customUrlHandlerFn) {\n throw new Error(`Custom url handler function not set`)\n }\n url = await this.customUrlHandlerFn({\n id: this.id,\n sessions: this.sessions,\n tabIndex,\n tabsPerSession: this.tabsPerSession,\n index,\n pid: process.pid,\n env: { ...process.env } as Record<string, string>,\n params: this.scriptParams,\n })\n log.debug(`customUrlHandlerFn: ${url}`)\n }\n\n if (!url) {\n throw new Error(`Page URL not set`)\n }\n\n if (this.urlQuery) {\n url += `?${this.urlQuery\n .replace(/\\$s/g, String(this.id))\n .replace(/\\$S/g, String(this.sessions))\n .replace(/\\$t/g, String(tabIndex))\n .replace(/\\$T/g, String(this.tabsPerSession))\n .replace(/\\$i/g, String(index))\n .replace(/\\$p/g, String(process.pid))}`\n }\n\n log.debug(`opening page ${index} (session: ${this.id} tab: ${tabIndex}): ${hideAuth(url)}`)\n\n if (this.incognito) {\n this.context = await this.browser.createBrowserContext()\n } else {\n this.context = this.browser.defaultBrowserContext()\n }\n\n if (this.overridePermissions.length) {\n await this.context.overridePermissions(new URL(url).origin, this.overridePermissions)\n }\n\n const page = await this.getNewPage(tabIndex)\n\n await page.setBypassCSP(true)\n\n if (this.userAgent) {\n await page.setUserAgent(this.userAgent)\n }\n\n await Promise.all(\n Object.keys(this.exposedFunctions).map(\n async (name: string) =>\n await page.exposeFunction(name, (...args: unknown[]) => this.exposedFunctions[name](...args)),\n ),\n )\n\n // Export config to page.\n let cmd = this.setupPageCmd(index, tabIndex, url)\n if (this.localStorage) {\n log.debug('Using localStorage:', this.localStorage)\n Object.entries(this.localStorage).map(([key, value]) => {\n cmd += `localStorage.setItem('${key}', '${JSON.stringify(value)}');\\n`\n })\n }\n if (this.sessionStorage) {\n log.debug('Using sessionStorage:', this.sessionStorage)\n Object.entries(this.sessionStorage).map(([key, value]) => {\n cmd += `sessionStorage.setItem('${key}', '${JSON.stringify(value)}');\\n`\n })\n }\n log.debug('init command:', cmd)\n await page.evaluateOnNewDocument(cmd)\n\n // Clear cookies.\n if (this.clearCookies) {\n try {\n const client = await page.target().createCDPSession()\n await client.send('Network.clearBrowserCookies')\n } catch (err) {\n log.error(`clearCookies error: ${(err as Error).stack}`)\n }\n }\n\n page.on('dialog', async dialog => {\n log.debug(`page ${index + 1} dialog ${dialog.type()}: ${dialog.message()}`)\n try {\n await dialog.accept()\n } catch (err) {\n log.debug(`dialog accept error: ${(err as Error).message}`)\n }\n try {\n await dialog.dismiss()\n } catch (err) {\n log.debug(`dialog dismiss error: ${(err as Error).message}`)\n }\n })\n\n page.once('close', () => {\n log.debug(`page ${index + 1} closed`)\n this.pages.delete(index)\n this.httpResourcesStats.delete(index)\n this.pagesMetrics.delete(index)\n\n if (saveFile) {\n saveFile.close().catch(err => {\n log.error(`saveFile close error: ${(err as Error).stack}`)\n })\n saveFile = undefined\n }\n\n if (this.browser && this.running) {\n setTimeout(\n () => this.openPage(index).catch(err => log.error(`openPage after close error: ${(err as Error).stack}`)),\n 1000,\n )\n }\n })\n\n // Enable request interception.\n let setRequestInterceptionState = true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pageCDPSession = (page as any)._client() as CDPSession\n await pageCDPSession.send('Network.setBypassServiceWorker', {\n bypass: true,\n })\n\n const interceptManager = new RequestInterceptionManager(pageCDPSession, {\n onError: error => {\n log.error('Request interception error:', error)\n },\n })\n\n const interceptions: Interception[] = []\n\n // Blocked URLs.\n this.blockedUrls.forEach(blockedUrl => {\n interceptions.push({\n urlPattern: blockedUrl,\n modifyRequest: () => ({ errorReason: 'BlockedByClient' }),\n })\n })\n\n // Add extra headers.\n if (this.extraHeaders) {\n Object.entries(this.extraHeaders).forEach(([url, obj]) => {\n const headers = Object.entries(obj).map(([name, value]) => ({\n name,\n value,\n }))\n interceptions.push({\n urlPattern: url,\n modifyRequest: ({ event }) => {\n log.debug(`adding extraHeaders in: ${event.request.url}`, headers)\n return { headers }\n },\n })\n })\n }\n\n // Response modifiers.\n Object.entries(this.responseModifiers).forEach(([url, replacements]) => {\n interceptions.push({\n urlPattern: url,\n modifyResponse: async ({ event, body }) => {\n const responseHeaders = event.responseHeaders || []\n for (const { search, replace, file, headers } of replacements) {\n if (search && replace) {\n log.debug(`using responseModifiers in: ${event.request.url}: ${search.toString()} => ${replace}`)\n body = body?.replace(search, replace)\n } else if (file) {\n log.debug(`using responseModifiers in: ${event.request.url}: ${file}`)\n body = await fs.promises.readFile(file, 'utf8')\n }\n if (headers) {\n for (const [name, value] of Object.entries(headers)) {\n responseHeaders.push({\n name,\n value,\n })\n }\n }\n }\n return { body, responseHeaders }\n },\n })\n })\n\n await interceptManager.intercept(...interceptions)\n\n // Download responses.\n if (this.downloadResponses.length) {\n page.on('response', async response => {\n if (!response.ok()) return\n const url = response.url()\n for (const { urlPattern, output, append } of this.downloadResponses) {\n if (!urlPattern.test(url)) continue\n try {\n const data = await response.buffer()\n if (data.byteLength > 0) {\n if (append) {\n const savePath = output.replaceAll('${id}', this.id.toString())\n if (!fs.existsSync(path.dirname(savePath))) {\n await fs.promises.mkdir(path.dirname(output), { recursive: true })\n }\n log.debug(`appending response body ${data.byteLength} to: ${savePath}`)\n await fs.promises.appendFile(savePath, data)\n } else {\n if (!fs.existsSync(output)) {\n await fs.promises.mkdir(output, { recursive: true })\n }\n const savePath = path.join(output, `${path.basename(new URL(url).pathname)}`)\n log.debug(`saving response body ${data.byteLength} to: ${savePath}`)\n await fs.promises.writeFile(savePath, data)\n }\n }\n } catch (err) {\n log.error(`downloadResponses error: ${(err as Error).stack}`)\n }\n }\n })\n }\n\n // Allow to change the setRequestInterception state from page.\n const setRequestInterceptionFunction = async (value: boolean) => {\n if (value === setRequestInterceptionState) {\n return\n }\n log.debug(`setRequestInterception to ${value}`)\n try {\n if (!value) {\n await interceptManager.disable()\n } else {\n await interceptManager.enable()\n }\n setRequestInterceptionState = value\n } catch (err) {\n log.error(`setRequestInterception error: ${(err as Error).stack}`)\n }\n }\n\n await page.exposeFunction('setRequestInterception', setRequestInterceptionFunction)\n\n await page.exposeFunction(\n 'jsonFetch',\n async (\n options: axios.AxiosRequestConfig & {\n validStatuses: number[]\n downloadPath: string\n },\n cacheKey = '',\n cacheTimeout = 0,\n ) => {\n if (cacheKey) {\n const ret = Session.jsonFetchCache.get(cacheKey)\n if (ret) {\n return ret\n }\n }\n try {\n if (options.validStatuses) {\n options.validateStatus = status => options.validStatuses.includes(status)\n }\n const { status, data, headers } = await axios(options)\n if (options.responseType === 'stream') {\n if (options.downloadPath && !fs.existsSync(options.downloadPath)) {\n log.debug(`jsonFetch saving file to: ${options.downloadPath}`, headers['content-disposition'])\n await fs.promises.mkdir(path.dirname(options.downloadPath), {\n recursive: true,\n })\n const writer = fs.createWriteStream(options.downloadPath)\n await new Promise<void>((resolve, reject) => {\n writer.on('error', err => reject(err))\n writer.on('close', () => resolve())\n data.pipe(writer)\n })\n }\n if (cacheKey) {\n Session.jsonFetchCache.set(cacheKey, { status }, cacheTimeout)\n }\n return { status, headers }\n } else {\n if (cacheKey) {\n Session.jsonFetchCache.set(cacheKey, { status, data }, cacheTimeout)\n }\n return { status, headers, data }\n }\n } catch (err) {\n const error = (err as Error).message\n log.warn(`jsonFetch error: ${error}`)\n return { status: 500, error }\n }\n },\n )\n\n await page.exposeFunction('readLocalFile', (filePath: string, encoding?: BufferEncoding) => {\n filePath = path.resolve(process.cwd(), filePath)\n return fs.promises.readFile(filePath, encoding)\n })\n\n if (this.pageLogPath) {\n const dirPath = path.dirname(this.pageLogPath)\n await page.exposeFunction(\n 'webrtcperf_writeFile',\n (paramPath: string, data: string | Buffer | Uint8Array, append = false) => {\n const filePath = path.resolve(dirPath, paramPath)\n if (append) {\n return fs.promises.appendFile(filePath, data)\n } else {\n return fs.promises.writeFile(filePath, data)\n }\n },\n )\n }\n\n await page.exposeFunction('webrtcperf_emulateCpuThrottling', (factor: number | null) => {\n return page.emulateCPUThrottling(factor)\n })\n\n if (this.emulateCpuThrottling) {\n log.debug(`emulateCpuThrottling: ${this.emulateCpuThrottling}`)\n await page.emulateCPUThrottling(this.emulateCpuThrottling)\n }\n\n // PeerConnectionExternal\n await page.exposeFunction(\n 'createPeerConnectionExternal',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async (options: any) => {\n const pc = new PeerConnectionExternal(options)\n return { id: pc.id }\n },\n )\n\n await page.exposeFunction(\n 'callPeerConnectionExternalMethod',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async (id: number, name: PeerConnectionExternalMethod, arg: any) => {\n const pc = PeerConnectionExternal.get(id)\n if (pc) {\n return pc[name](arg)\n }\n },\n )\n\n // Simulate keypress\n await page.exposeFunction('keypressText', async (selector: string, text: string, delay = 20) => {\n await page.type(selector, text, { delay })\n })\n\n // Simulate mouse clicks\n await page.exposeFunction('mouseClick', async (selector: string, x = 0, y = 0) => {\n await page.click(selector, { offset: { x, y } })\n })\n\n const lorem = new LoremIpsum({\n sentencesPerParagraph: {\n max: 4,\n min: 1,\n },\n wordsPerSentence: {\n max: 16,\n min: 2,\n },\n })\n\n await page.exposeFunction('loremIpsum', (count = 1) => lorem.generateSentences(count))\n\n await page.exposeFunction(\n 'keypressRandomText',\n async (selector: string, count = 1, prefix = '', suffix = '', delay = 0) => {\n const c = prefix + lorem.generateSentences(count) + suffix\n const frames = await page.frames()\n for (const frame of frames) {\n const el = await frame.$(selector)\n if (el) {\n await el.focus()\n await frame.type(selector, c, { delay })\n }\n }\n },\n )\n\n await page.exposeFunction('uploadFileFromUrl', async (fileUrl: string, selector: string) => {\n const filename = sha256(fileUrl) + '.' + fileUrl.split('.').slice(-1)[0]\n const filePath = path.join(os.homedir(), '.webrtcperf/uploads', filename)\n if (!fs.existsSync(filePath)) {\n await downloadUrl(fileUrl, undefined, filePath)\n }\n log.debug(`uploadFileFromUrl: ${filePath}`)\n const frames = await page.frames()\n for (const frame of frames) {\n const el = await frame.$(selector)\n if (el) {\n await (el as ElementHandle<HTMLInputElement>).uploadFile(filePath)\n break\n }\n }\n })\n\n // add extra styles\n if (this.extraCSS) {\n log.debug(`Add extraCSS: ${this.extraCSS}`)\n try {\n await page.evaluateOnNewDocument(\n (css: string) => {\n document.addEventListener('DOMContentLoaded', () => {\n const style = document.createElement('style')\n style.setAttribute('id', 'webrtcperf-extra-style')\n style.setAttribute('type', 'text/css')\n style.innerHTML = css\n\n document.head.appendChild(style)\n })\n },\n this.extraCSS.replace(/important/g, '!important'),\n )\n } catch (err) {\n log.error(`Add extraCSS error: ${(err as Error).stack}`)\n }\n }\n\n // add cookies\n if (this.cookies) {\n try {\n await page.setCookie(...this.cookies)\n } catch (err) {\n log.error(`Set cookies error: ${(err as Error).stack}`)\n }\n }\n\n // Page logs and errors.\n if (this.pageLogPath) {\n try {\n await fs.promises.mkdir(path.dirname(this.pageLogPath), {\n recursive: true,\n })\n saveFile = await fs.promises.open(this.pageLogPath, 'a')\n } catch (err) {\n log.error(`error opening page log file: ${this.pageLogPath}: ${(err as Error).stack}`)\n }\n }\n\n await page.exposeFunction('webrtcperf_serializedConsoleLog', async (type: PageLogColorsKey, text: string) => {\n if (this.showPageLog || saveFile) {\n try {\n await this.onPageMessage(index, type, text, saveFile)\n } catch (err) {\n log.error(`serializedConsoleLog error: ${(err as Error).stack}`)\n }\n }\n })\n\n if (this.showPageLog || saveFile) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n page.on('pageerror', async (error: any) => {\n const text = `pageerror: ${error.message?.message || error.message} - ${error.message?.stack || error.stack}`\n await this.onPageMessage(index, 'error', text, saveFile)\n })\n\n page.on('requestfailed', async request => {\n const err = (request.failure()?.errorText || '').trim()\n if (err === 'net::ERR_ABORTED') {\n return\n }\n const text = `${request.method()} ${request.url()}: ${err}`\n await this.onPageMessage(index, 'requestfailed', text, saveFile)\n })\n }\n\n await page.exposeFunction('webrtcperf_startFakeScreenshare', async () => {\n if (!this.browser) return\n let screensharePage = page\n if (!this.useFakeMedia) {\n if (!this.screensharePage) {\n screensharePage = this.screensharePage = await this.browser.newPage()\n await this.screensharePage.evaluateOnNewDocument(this.setupPageCmd(index, tabIndex, 'about:blank'))\n await this.screensharePage.evaluateOnNewDocument(\n fs.readFileSync(resolvePackagePath('node_modules/@vpalmisano/webrtcperf-js/dist/webrtcperf.js'), 'utf8'),\n )\n await screensharePage.exposeFunction(\n 'webrtcperf_keypressText',\n async (selector: string, text: string, delay = 20) => {\n await screensharePage.type(selector, text, { delay })\n },\n )\n await screensharePage.exposeFunction('webrtcperf_keyPress', async (key: KeyInput) => {\n await screensharePage.keyboard.press(key)\n })\n await screensharePage.goto(\n `http${this.serverUseHttps ? 's' : ''}://localhost:${this.serverPort}/empty-page?auth=${this.serverSecret}&title=webrtcperf-screenshare`,\n )\n }\n }\n await screensharePage.evaluate(() => webrtcperf.startFakeScreenshare())\n })\n\n await page.exposeFunction('webrtcperf_stopFakeScreenshare', async () => {\n if (!this.useFakeMedia && this.screensharePage) {\n await this.screensharePage.close()\n this.screensharePage = undefined\n } else {\n await page.evaluate(() => webrtcperf.stopFakeScreenshare())\n }\n })\n\n // HTTP stats.\n const resourcesStats = {\n sentBytes: 0,\n recvBytes: 0,\n recvLatency: new FastStats({ store_data: false }),\n wsSentBytes: 0,\n wsRecvBytes: 0,\n wsRecvLatency: new FastStats({ store_data: false }),\n }\n this.httpResourcesStats.set(index, resourcesStats)\n\n const pendingRequests = new Map<string, { url: string; timestamp: number }>()\n pageCDPSession.on('Network.requestWillBeSent', event => {\n if (event.request.url.startsWith('data:')) return\n const { requestId, request, timestamp } = event\n const sentBytes = request.postDataEntries?.reduce((acc, entry) => acc + (entry.bytes?.length || 0), 0)\n //log.log('Network.requestWillBeSent', event.type, request.url, sentBytes)\n if (sentBytes) resourcesStats.sentBytes += sentBytes\n pendingRequests.set(requestId, { url: request.url, timestamp })\n })\n\n pageCDPSession.on('Network.responseReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n const { response } = event\n if (response.fromDiskCache) {\n pendingRequests.delete(event.requestId)\n return\n }\n resourcesStats.recvBytes += response.encodedDataLength\n })\n\n pageCDPSession.on('Network.dataReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n resourcesStats.recvBytes += event.encodedDataLength\n })\n\n pageCDPSession.on('Network.loadingFinished', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n pendingRequests.delete(event.requestId)\n const { timestamp } = event\n resourcesStats.recvLatency.push(timestamp - request.timestamp)\n })\n\n pageCDPSession.on('Network.webSocketCreated', event => {\n pendingRequests.set(event.requestId, { url: event.url, timestamp: Date.now() })\n })\n\n pageCDPSession.on('Network.webSocketHandshakeResponseReceived', event => {\n const request = pendingRequests.get(event.requestId)\n if (!request) return\n pendingRequests.delete(event.requestId)\n resourcesStats.wsRecvLatency.push((Date.now() - request.timestamp) / 1000)\n })\n\n pageCDPSession.on('Network.webSocketFrameSent', event => {\n resourcesStats.wsSentBytes += event.response.payloadData.length\n })\n\n pageCDPSession.on('Network.webSocketFrameReceived', event => {\n resourcesStats.wsRecvBytes += event.response.payloadData.length\n })\n\n // hardware concurrency\n if (this.hardwareConcurrency) {\n const plugin = NavigatorHardwareConcurrency({ hardwareConcurrency: this.hardwareConcurrency })\n await plugin.onPageCreated(page)\n }\n\n // Load page script.\n {\n const filePath = resolvePackagePath('node_modules/@vpalmisano/webrtcperf-js/dist/webrtcperf.js')\n if (!fs.existsSync(filePath)) {\n throw new Error(`@vpalmisano/webrtcperf-js script not found: ${filePath}`)\n }\n log.debug(`loading @vpalmisano/webrtcperf-js script from: ${filePath}`)\n await page.evaluateOnNewDocument(fs.readFileSync(filePath, 'utf8'))\n }\n\n // Execute external script(s).\n if (this.scriptPath) {\n if (this.scriptPath.startsWith('base64:gzip:')) {\n const data = Buffer.from(this.scriptPath.replace('base64:gzip:', ''), 'base64')\n const code = gunzipSync(data).toString()\n log.debug(`loading script from ${code.length} bytes`)\n await page.evaluateOnNewDocument(code)\n } else {\n for (const filePath of this.scriptPath.split(',')) {\n if (!filePath.trim()) {\n continue\n }\n if (filePath.startsWith('http')) {\n log.debug(`loading custom script from url: ${filePath}`)\n const res = await downloadUrl(filePath)\n if (!res?.data) {\n throw new Error(`Failed to download script from: ${filePath}`)\n }\n await page.evaluateOnNewDocument(res.data)\n } else {\n if (!fs.existsSync(filePath)) {\n log.warn(`custom script not found: ${filePath}`)\n continue\n }\n log.debug(`loading custom script from file: ${filePath}`)\n await page.evaluateOnNewDocument(fs.readFileSync(filePath, 'utf8'))\n }\n }\n }\n }\n\n log.debug(`Page ${index + 1} \"${url}\" loading`)\n const pageLoadTime = Date.now()\n\n // open the page url\n try {\n await page.goto(url, {\n waitUntil: 'domcontentloaded',\n timeout: 60 * 1000,\n })\n } catch (error) {\n log.error(`Page ${index + 1} \"${url}\" load error: ${(error as Error).stack}`)\n await page.close()\n return\n }\n\n // add to pages map\n this.pages.set(index, page)\n\n log.debug(`Page ${index + 1} \"${url}\" loaded in ${(Date.now() - pageLoadTime) / 1000}s`)\n\n for (let i = 0; i < this.evaluateAfter.length; i++) {\n await page.evaluate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.evaluateAfter[i].pageFunction as any,\n ...this.evaluateAfter[i].args,\n )\n }\n }\n\n private async getNewPage(tabIndex: number): Promise<Page> {\n log.debug(`getNewPage ${tabIndex}`)\n assert(this.context, 'NoBrowserContextCreated')\n return await this.context.newPage()\n }\n\n private async onPageMessage(\n index: number,\n type: PageLogColorsKey,\n text: string,\n saveFile?: fs.promises.FileHandle,\n ): Promise<void> {\n if (text.endsWith('net::ERR_BLOCKED_BY_CLIENT.Inspector')) {\n return\n }\n const isBlocked = this.blockedUrls.some(\n blockedUrl => (type === 'requestfailed' || text.search('FetchError') !== -1) && text.search(blockedUrl) !== -1,\n )\n if (isBlocked) {\n return\n }\n const color = PageLogColors[type] || 'grey'\n const filter = this.pageLogFilter ? new RegExp(this.pageLogFilter, 'ig') : null\n if (!filter || text.match(filter)) {\n const errorOrWarning = ['error', 'warning'].includes(type)\n const isWebrtcPerf = text.startsWith('[webrtcperf')\n if (saveFile) {\n if (!errorOrWarning && !isWebrtcPerf && text.length > 1024) {\n text = text.slice(0, 1024) + `... +${text.length - 1024} bytes`\n }\n await saveFile.write(`${new Date().toISOString()} [page ${index}] (${type}) ${text}\\n`)\n }\n if (this.showPageLog) {\n if (!errorOrWarning && !isWebrtcPerf && text.length > 256) {\n text = text.slice(0, 256) + `... +${text.length - 256} bytes`\n }\n console.log(chalk`{bold [page ${index}]} {${color} (${type}) ${text}}`)\n }\n if (type === 'error') {\n this.pageErrors += 1\n } else if (type === 'warn') {\n this.pageWarnings += 1\n }\n }\n }\n\n /**\n * updateStats\n */\n async updateStats(): Promise<SessionStats> {\n if (!this.browser) {\n this.stats = {}\n return this.stats\n }\n\n const collectedStats: SessionStats = {}\n\n try {\n const processStats = await getProcessStats()\n Object.assign(collectedStats, {\n nodeCpu: processStats.cpu,\n nodeMemory: processStats.memory,\n })\n } catch (err) {\n log.error(`node getProcessStats error: ${(err as Error).stack}`)\n }\n\n try {\n const systemStats = getSystemStats()\n if (systemStats) {\n collectedStats.usedCpu = systemStats.usedCpu\n collectedStats.usedMemory = systemStats.usedMemory\n collectedStats.usedGpu = systemStats.usedGpu\n if (collectedStats.usedCpu > 80) {\n log.warn(`High system CPU usage: ${collectedStats.usedCpu.toFixed(2)}%`)\n }\n if (collectedStats.usedMemory > 80) {\n log.warn(`High system memory usage: ${collectedStats.usedMemory.toFixed(2)}%`)\n }\n }\n } catch (err) {\n log.error(`node getSystemStats error: ${(err as Error).stack}`)\n }\n\n const browserProcess = this.browser.process()\n if (browserProcess) {\n try {\n const processStats = await getProcessStats(browserProcess.pid, true)\n Object.assign(collectedStats, processStats)\n } catch (err) {\n log.error(`getProcessStats error: ${(err as Error).stack}`)\n }\n }\n\n const pages: Record<string, number> = {}\n const peerConnections: Record<string, number> = {}\n const peerConnectionConnectionTime: Record<string, number> = {}\n const peerConnectionDisconnectionTime: Record<string, number> = {}\n const peerConnectionsCreated: Record<string, number> = {}\n const peerConnectionsClosed: Record<string, number> = {}\n const peerConnectionsConnected: Record<string, number> = {}\n const peerConnectionsDisconnected: Record<string, number> = {}\n const peerConnectionsFailed: Record<string, number> = {}\n const peerConnectionsDelay: Record<string, number> = {}\n const audioEndToEndDelayStats: Record<string, number> = {}\n const audioStartFrameDelayStats: Record<string, number> = {}\n const videoEndToEndDelayStats: Record<string, number> = {}\n const screenEndToEndDelayStats: Record<string, number> = {}\n const videoStartFrameDelayStats: Record<string, number> = {}\n const screenStartFrameDelayStats: Record<string, number> = {}\n const httpSentBytesStats: Record<string, number> = {}\n const httpRecvBytesStats: Record<string, number> = {}\n const httpRecvLatencyStats: Record<string, number> = {}\n const wsSentBytesStats: Record<string, number> = {}\n const wsRecvBytesStats: Record<string, number> = {}\n const wsRecvLatencyStats: Record<string, number> = {}\n const pageCpu: Record<string, number> = {}\n const pageMemory: Record<string, number> = {}\n const cpuPressureStats: Record<string, number> = {}\n\n const videoWidth: Record<string, number> = {}\n const videoHeight: Record<string, number> = {}\n const videoBufferedTime: Record<string, number> = {}\n const videoPlayingTime: Record<string, number> = {}\n const videoBufferingTime: Record<string, number> = {}\n const videoBufferingEvents: Record<string, number> = {}\n\n const throttleUpValuesRate: Record<string, number> = {}\n const throttleUpValuesDelay: Record<string, number> = {}\n const throttleUpValuesLoss: Record<string, number> = {}\n const throttleUpValuesQueue: Record<string, number> = {}\n const throttleDownValuesRate: Record<string, number> = {}\n const throttleDownValuesDelay: Record<string, number> = {}\n const throttleDownValuesLoss: Record<string, number> = {}\n const throttleDownValuesQueue: Record<string, number> = {}\n\n const customStats: Record<string, Record<string, number | string>> = {}\n\n await Promise.allSettled(\n [...this.pages.entries()].map(async ([pageIndex, page]) => {\n try {\n // Collect stats from the page.\n const {\n peerConnectionStats,\n audioEndToEndDelay,\n videoEndToEndDelay,\n cpuPressure,\n videoStats,\n customMetrics,\n } = await page.evaluate(async () => ({\n peerConnectionStats: await webrtcperf.collectPeerConnectionStats(),\n audioEndToEndDelay: webrtcperf.collectAudioEndToEndStats(),\n videoEndToEndDelay: webrtcperf.collectVideoEndToEndStats(),\n cpuPressure: webrtcperf.collectCpuPressure(),\n videoStats: webrtcperf.collectVideoStats(),\n customMetrics: 'collectCustomMetrics' in window ? collectCustomMetrics() : null,\n }))\n const { participantName } = peerConnectionStats\n\n const httpResourcesStats = this.httpResourcesStats.get(pageIndex)\n\n // Get host from the first collected remote address.\n if (!peerConnectionStats.signalingHost && peerConnectionStats.stats.length) {\n const values = Object.values(peerConnectionStats.stats[0])\n if (values.length) {\n peerConnectionStats.signalingHost = await resolveIP(values[0].remoteAddress as string)\n }\n }\n const { stats, activePeerConnections, signalingHost } = peerConnectionStats\n\n // Calculate stats keys.\n const hostKey = rtcStatKey({\n hostName: signalingHost,\n participantName,\n })\n const pageKey = rtcStatKey({\n pageIndex,\n hostName: signalingHost,\n participantName,\n })\n\n // Set pages counter.\n increaseKey(pages, hostKey, 1)\n\n // Set peerConnections counters.\n increaseKey(peerConnections, pageKey, activePeerConnections)\n increaseKey(peerConnectionConnectionTime, pageKey, peerConnectionStats.peerConnectionConnectionTime)\n increaseKey(peerConnectionDisconnectionTime, pageKey, peerConnectionStats.peerConnectionDisconnectionTime)\n increaseKey(peerConnectionsCreated, pageKey, peerConnectionStats.peerConnectionsCreated)\n increaseKey(peerConnectionsClosed, pageKey, peerConnectionStats.peerConnectionsClosed)\n increaseKey(peerConnectionsConnected, pageKey, peerConnectionStats.peerConnectionsConnected)\n increaseKey(peerConnectionsDisconnected, pageKey, peerConnectionStats.peerConnectionsDisconnected)\n increaseKey(peerConnectionsFailed, pageKey, peerConnectionStats.peerConnectionsFailed)\n increaseKey(peerConnectionsDelay, pageKey, peerConnectionStats.peerConnectionsDelay)\n\n // E2E stats.\n if (audioEndToEndDelay) {\n audioEndToEndDelayStats[pageKey] = audioEndToEndDelay.delay\n audioStartFrameDelayStats[pageKey] = audioEndToEndDelay.startFrameDelay\n }\n if (videoEndToEndDelay) {\n videoEndToEndDelayStats[pageKey] = videoEndToEndDelay.videoDelay\n videoStartFrameDelayStats[pageKey] = videoEndToEndDelay.videoStartFrameDelay\n screenEndToEndDelayStats[pageKey] = videoEndToEndDelay.screenDelay\n screenStartFrameDelayStats[pageKey] = videoEndToEndDelay.screenStartFrameDelay\n }\n\n // HTTP stats.\n if (httpResourcesStats) {\n if (httpResourcesStats.sentBytes > 0) httpSentBytesStats[pageKey] = httpResourcesStats.sentBytes\n if (httpResourcesStats.recvBytes > 0) httpRecvBytesStats[pageKey] = httpResourcesStats.recvBytes\n if (httpResourcesStats.recvLatency.length)\n httpRecvLatencyStats[pageKey] = httpResourcesStats.recvLatency.amean()\n if (httpResourcesStats.wsSentBytes > 0) wsSentBytesStats[pageKey] = httpResourcesStats.wsSentBytes\n if (httpResourcesStats.wsRecvBytes > 0) wsRecvBytesStats[pageKey] = httpResourcesStats.wsRecvBytes\n if (httpResourcesStats.wsRecvLatency.length)\n wsRecvLatencyStats[pageKey] = httpResourcesStats.wsRecvLatency.amean()\n }\n\n if (cpuPressure !== undefined) cpuPressureStats[pageKey] = cpuPressure\n if (videoStats) {\n videoWidth[pageKey] = videoStats.width\n videoHeight[pageKey] = videoStats.height\n videoBufferedTime[pageKey] = videoStats.bufferedTime\n videoPlayingTime[pageKey] = videoStats.playingTime\n videoBufferingTime[pageKey] = videoStats.bufferingTime\n videoBufferingEvents[pageKey] = videoStats.bufferingEvents\n }\n\n // Collect RTC stats.\n for (const s of stats) {\n for (const [trackId, value] of Object.entries(s)) {\n try {\n updateRtcStats(collectedStats as RtcStats, pageIndex, trackId, value, signalingHost, participantName)\n } catch (err) {\n log.error(`updateRtcStats error for ${trackId}: ${(err as Error).stack}`, err)\n }\n }\n }\n\n // Collect custom metrics.\n if (customMetrics) {\n for (const [name, value] of Object.entries(customMetrics)) {\n if (!customStats[name]) {\n customStats[name] = {}\n }\n customStats[name][pageKey] = value\n }\n }\n\n // Collect page metrics\n /* const metrics = await page.metrics()\n if (metrics.Timestamp) {\n const lastMetrics = this.pagesMetrics.get(pageIndex)\n if (lastMetrics?.Timestamp) {\n const elapsedTime = metrics.Timestamp - lastMetrics.Timestamp\n if (elapsedTime > 10) {\n const durationDiff =\n metricsTotalDuration(metrics) -\n metricsTotalDuration(lastMetrics)\n const usage = (100 * durationDiff) / elapsedTime\n pageCpu[pageKey] = usage\n pageMemory[pageKey] = (metrics.JSHeapUsedSize || 0) / 1e6\n this.pagesMetrics.set(pageIndex, metrics)\n }\n } else {\n this.pagesMetrics.set(pageIndex, metrics)\n }\n } */\n pageCpu[pageKey] = (collectedStats.cpu as number) / this.tabsPerSession\n pageMemory[pageKey] = (collectedStats.memory as number) / this.tabsPerSession\n\n // Collect throttle metrics\n const throttleUpValues = getSessionThrottleValues(this.throttleIndex, 'up')\n throttleUpValuesRate[pageKey] = throttleUpValues.rate || 0\n throttleUpValuesDelay[pageKey] = throttleUpValues.delay || 0\n throttleUpValuesLoss[pageKey] = throttleUpValues.loss || 0\n throttleUpValuesQueue[pageKey] = throttleUpValues.queue || 0\n\n const throttleDownValues = getSessionThrottleValues(this.throttleIndex, 'down')\n throttleDownValuesRate[pageKey] = throttleDownValues.rate || 0\n throttleDownValuesDelay[pageKey] = throttleDownValues.delay || 0\n throttleDownValuesLoss[pageKey] = throttleDownValues.loss || 0\n throttleDownValuesQueue[pageKey] = throttleDownValues.queue || 0\n } catch (err) {\n const error = err as Error\n if (error.message.includes('Execution context was destroyed, most likely because of a navigation.')) {\n log.warn(`collectPeerConnectionStats for page ${pageIndex} error: ${error.message}`)\n } else {\n log.error(`collectPeerConnectionStats for page ${pageIndex} error: ${error.stack}`)\n }\n }\n }),\n )\n\n Object.assign(collectedStats, {\n pages,\n errors: this.pageErrors,\n warnings: this.pageWarnings,\n peerConnections,\n peerConnectionConnectionTime,\n peerConnectionDisconnectionTime,\n peerConnectionsConnected,\n peerConnectionsCreated,\n peerConnectionsClosed,\n peerConnectionsDisconnected,\n peerConnectionsFailed,\n peerConnectionsDelay,\n audioEndToEndDelay: audioEndToEndDelayStats,\n audioStartFrameDelay: audioStartFrameDelayStats,\n videoEndToEndDelay: videoEndToEndDelayStats,\n videoStartFrameDelay: videoStartFrameDelayStats,\n screenEndToEndDelay: screenEndToEndDelayStats,\n screenStartFrameDelay: screenStartFrameDelayStats,\n httpSentBytes: httpSentBytesStats,\n httpRecvBytes: httpRecvBytesStats,\n httpRecvLatency: httpRecvLatencyStats,\n wsSentBytes: wsSentBytesStats,\n wsRecvBytes: wsRecvBytesStats,\n wsRecvLatency: wsRecvLatencyStats,\n cpuPressure: cpuPressureStats,\n videoWidth,\n videoHeight,\n videoBufferedTime,\n videoPlayingTime,\n videoBufferingTime,\n videoBufferingEvents,\n pageCpu,\n pageMemory,\n throttleUpRate: throttleUpValuesRate,\n throttleUpDelay: throttleUpValuesDelay,\n throttleUpLoss: throttleUpValuesLoss,\n throttleUpQueue: throttleUpValuesQueue,\n throttleDownRate: throttleDownValuesRate,\n throttleDownDelay: throttleDownValuesDelay,\n throttleDownLoss: throttleDownValuesLoss,\n throttleDownQueue: throttleDownValuesQueue,\n ...customStats,\n })\n\n if (pages.size < this.pages.size) {\n log.warn(`updateStats collected pages ${pages.size} < ${this.pages.size}`)\n }\n\n this.stats = collectedStats\n return this.stats\n }\n\n /**\n * stop\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return\n }\n this.running = false\n log.debug(`${this.id} stop`)\n\n if (this.stopPortForwarder) {\n this.stopPortForwarder()\n }\n\n if (this.browser) {\n // close the opened tabs\n log.debug(`${this.id} closing ${this.pages.size} pages`)\n await Promise.allSettled(\n [...this.pages.values()].map(page => {\n return page.close({ runBeforeUnload: true })\n }),\n )\n if (this.pages.size > 0) {\n const now = Date.now()\n const maxWaitTime = 1000 * this.pages.size\n while (this.pages.size > 0 && Date.now() - now < maxWaitTime) {\n log.debug(`${this.id} waiting for ${this.pages.size} pages to close`)\n await sleep(200)\n }\n if (this.pages.size > 0) {\n log.warn(`${this.id} timeout closing ${this.pages.size} pages`)\n }\n }\n\n if (this.screensharePage) {\n await this.screensharePage.close()\n this.screensharePage = undefined\n }\n\n this.browser.removeAllListeners()\n if (this.chromiumUrl) {\n log.debug(`${this.id} disconnect from browser`)\n try {\n await this.browser.disconnect()\n } catch (err) {\n log.warn(`${this.id} browser disconnect error: ${(err as Error).message}`)\n }\n } else {\n const pid = this.browser.process()?.pid\n if (pid) {\n log.debug(`${this.id} closing browser (pid: ${pid})`)\n try {\n await this.browser.close()\n } catch (err) {\n log.error(`${this.id} browser close error: ${(err as Error).stack}`)\n }\n await waitStopProcess(pid, 5000)\n }\n }\n this.pages.clear()\n this.pagesMetrics.clear()\n this.browser = undefined\n }\n\n this.emit('stop', this.id)\n }\n\n /**\n * pageScreenshot\n * @param {number} pageIndex\n * @param {String} format The image format (png|jpeg|webp).\n * @return {String}\n */\n async pageScreenshot(pageIndex = 0, format = 'webp'): Promise<string> {\n log.debug(`pageScreenshot ${this.id}-${pageIndex}`)\n const index = this.id + pageIndex\n const page = this.pages.get(index)\n if (!page) {\n throw new Error(`Page ${index} not found`)\n }\n const filePath = `/tmp/screenshot-${index}.${format}` as `${string}.${ImageFormat}`\n await page.screenshot({\n path: filePath,\n fullPage: true,\n })\n return filePath\n }\n}\n"]}
|