@vpalmisano/webrtcperf 4.4.6 → 4.4.7
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/app.min.js +1 -1
- package/build/src/app.js +4 -1
- package/build/src/app.js.map +1 -1
- package/build/src/utils.d.ts +18 -18
- package/build/src/utils.js +67 -33
- package/build/src/utils.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/app.ts +4 -1
- package/src/utils.ts +88 -47
package/build/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Browser,\n computeExecutablePath,\n getInstalledBrowsers,\n getVersionComparator,\n install,\n} from '@puppeteer/browsers'\nimport { spawn } from 'child_process'\nimport axios from 'axios'\nimport { createHash } from 'crypto'\nimport * as dns from 'dns'\nimport FormData from 'form-data'\nimport fs, { WriteStream, createWriteStream } from 'fs'\nimport { Agent } from 'https'\nimport * as ipaddrJs from 'ipaddr.js'\nimport net from 'net'\nimport NodeCache from 'node-cache'\nimport * as OSUtils from 'node-os-utils'\nimport os, { networkInterfaces } from 'os'\nimport path, { dirname } from 'path'\nimport pidtree from 'pidtree'\nimport pidusage from 'pidusage'\nimport puppeteer, { ImageFormat, Page } from 'puppeteer-core'\n\nimport { Session } from './session'\n\n// eslint-disable-next-line\nconst ps = require('pidusage/lib/ps')\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nexport const { Log } = require('debug-level')\n\ninterface Logger {\n error: (...args: unknown[]) => void\n warn: (...args: unknown[]) => void\n info: (...args: unknown[]) => void\n debug: (...args: unknown[]) => void\n log: (...args: unknown[]) => void\n}\n\nexport function logger(name: string, options = {}): Logger {\n return new Log(name, { splitLine: false, ...options })\n}\n\nexport class LoggerInterface {\n name?: string\n\n private logInit(args: unknown[]): void {\n if (this.name) {\n args.unshift(`[${this.name}]`)\n }\n }\n\n debug(...args: unknown[]): void {\n this.logInit(args)\n log.debug(...args)\n }\n\n info(...args: unknown[]): void {\n this.logInit(args)\n log.info(...args)\n }\n\n warn(...args: unknown[]): void {\n this.logInit(args)\n log.warn(...args)\n }\n\n error(...args: unknown[]): void {\n this.logInit(args)\n log.error(...args)\n }\n\n log(...args: unknown[]): void {\n this.logInit(args)\n log.log(...args)\n }\n}\n\nconst log = logger('webrtcperf:utils')\n\n/**\n * Resolves the absolute path from the package installation directory.\n * @param relativePath The relative path.\n * @returns The absolute path.\n */\nexport function resolvePackagePath(relativePath: string): string {\n if ('__nexe' in process) {\n log.debug('resolvePackagePath (nexe)', relativePath)\n return relativePath\n }\n if (process.env.WEBPACK) {\n const p = path.normalize(path.join(path.dirname(__filename), relativePath))\n log.debug('resolvePackagePath (webpack)', p)\n return p\n }\n for (const d of ['.', '..', '../..']) {\n const p = path.normalize(path.join(__dirname, d, relativePath))\n if (fs.existsSync(p)) {\n log.debug(`resolvePackagePath (dirname: ${__dirname})`, p)\n return p\n }\n }\n throw new Error(`resolvePackagePath: ${relativePath} not found (dirname: ${__dirname})`)\n}\n\n/**\n * Calculates the sha256 sum.\n * @param data The string input\n */\nexport function sha256(data: string): string {\n return createHash('sha256').update(data).digest('hex')\n}\n\nconst ProcessStatsCache = new NodeCache({ stdTTL: 5, checkperiod: 10 })\nconst ProcessChildrenCache = new NodeCache({ stdTTL: 15, checkperiod: 15 })\n\ninterface ProcessStat {\n cpu: number\n memory: number\n}\n\n/**\n * Returns the process stats.\n * @param pid The process pid\n * @param children If process children should be taken into account.\n * @returns\n */\nexport async function getProcessStats(pid = 0, children = false): Promise<ProcessStat> {\n const processPid = pid || process.pid\n let stat: ProcessStat | undefined = ProcessStatsCache.get(processPid)\n if (stat) {\n return stat\n }\n\n const pidStats = await pidusage(processPid)\n if (pidStats) {\n stat = {\n cpu: pidStats.cpu,\n memory: pidStats.memory / 1e6,\n }\n } else {\n stat = { cpu: 0, memory: 0 }\n }\n\n if (children) {\n try {\n let childrenPids: number[] | undefined = ProcessChildrenCache.get(processPid)\n if (!childrenPids?.length) {\n childrenPids = await pidtree(processPid)\n if (childrenPids?.length) {\n ProcessChildrenCache.set(processPid, childrenPids)\n }\n }\n if (childrenPids?.length) {\n const pidStats = await pidusage(childrenPids)\n for (const p of childrenPids) {\n if (pidStats[p]) {\n stat.cpu += pidStats[p].cpu\n stat.memory += pidStats[p].memory / 1e6\n }\n }\n }\n } catch (err) {\n log.error(`getProcessStats children error: ${(err as Error).stack}`)\n }\n }\n ProcessStatsCache.set(processPid, stat)\n return stat\n}\n\n// Socket stats.\ninterface SocketStat {\n recvBytes: number\n sendBytes: number\n}\n\nexport async function getSocketStats(processPid: number): Promise<SocketStat> {\n const stats: SocketStat = { recvBytes: 0, sendBytes: 0 }\n try {\n const { stdout } = await runShellCommand(`ss -nOHpti | { grep pid=${processPid} || true; }`)\n for (const { groups } of stdout.matchAll(/bytes_sent:(?<sendBytes>\\d+).+bytes_received:(?<recvBytes>\\d+)/g)) {\n if (!groups) continue\n const recvBytes = parseInt(groups.recvBytes)\n const sendBytes = parseInt(groups.sendBytes)\n stats.recvBytes += recvBytes\n stats.sendBytes += sendBytes\n }\n } catch (err) {\n log.error(`socketStats error: ${(err as Error).stack}`)\n }\n return stats\n}\n\n// System stats.\nconst SystemStatsCache = new NodeCache({ stdTTL: 30, checkperiod: 60 })\n\nexport interface SystemStats {\n usedCpu: number\n usedMemory: number\n usedGpu: number\n usedGpuMemory: number\n}\n\nasync function updateSystemStats(): Promise<void> {\n const [cpu, memInfo, gpuStats] = await Promise.all([OSUtils.cpu.free(10000), OSUtils.mem.info(), systemGpuStats()])\n const stat = {\n usedCpu: 100 - cpu,\n usedMemory: 100 - memInfo.freeMemPercentage,\n usedGpu: gpuStats.gpu,\n usedGpuMemory: gpuStats.mem,\n }\n SystemStatsCache.set('default', stat)\n}\n\nlet systemStatsInterval: NodeJS.Timeout | null = null\n\nexport function getSystemStats(): SystemStats | undefined {\n if (!systemStatsInterval) {\n startUpdateSystemStats()\n }\n return SystemStatsCache.get<SystemStats>('default')\n}\n\nexport function startUpdateSystemStats(): void {\n if (systemStatsInterval) {\n return\n }\n systemStatsInterval = setInterval(updateSystemStats, 5000)\n}\n\nexport function stopTimers(): void {\n if (systemStatsInterval) {\n clearInterval(systemStatsInterval)\n systemStatsInterval = null\n }\n}\n\n/**\n * Sleeps for the specified amount of time.\n * @param ms\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(() => resolve(), ms))\n}\n\ndeclare global {\n let publisherSetMuted: (muted: boolean) => Promise<void>\n}\n\nlet randomActivateAudioTimeoutId: NodeJS.Timeout | null = null\nlet randomActivateAudioRunning = false\n\nexport function startRandomActivateAudio(\n sessions: Map<number, Session>,\n randomAudioPeriod: number,\n randomAudioProbability: number,\n randomAudioRange: string,\n): void {\n if (randomActivateAudioRunning) return\n randomActivateAudioRunning = true\n void randomActivateAudio(sessions, randomAudioPeriod, randomAudioProbability, randomAudioRange)\n}\n\nexport function stopRandomActivateAudio(): void {\n randomActivateAudioRunning = false\n if (randomActivateAudioTimeoutId) clearTimeout(randomActivateAudioTimeoutId)\n}\n\n/**\n * Randomly activate audio from one tab at time.\n * @param sessions The sessions Map\n * @param randomAudioPeriod If set, the function will be called in loop\n * @param randomAudioProbability The activation probability\n * @param randomAudioRange The page indexes to include into the automation\n */\nexport async function randomActivateAudio(\n sessions: Map<number, Session>,\n randomAudioPeriod: number,\n randomAudioProbability: number,\n randomAudioRange: string,\n): Promise<void> {\n if (!randomAudioPeriod || !randomActivateAudioRunning) {\n return\n }\n try {\n let pages: (Page | null)[] = []\n for (const session of sessions.values()) {\n const sessionPages = [...session.pages.values()]\n if (enabledForSession(session.id, randomAudioRange)) {\n pages = pages.concat(sessionPages)\n }\n }\n for (const [i, page] of pages.entries()) {\n if (!page) {\n continue\n }\n let active = 0\n try {\n active = await page.evaluate(() => webrtcperf.getActiveAudioTracks().length)\n } catch (err) {\n log.error(`randomActivateAudio error: ${(err as Error).stack}`)\n }\n if (!active) {\n pages[i] = null\n }\n }\n const pagesWithAudio: Page[] = pages.filter(p => !!p)\n const index = Math.floor(Math.random() * pagesWithAudio.length)\n const enable = Math.round(100 * Math.random()) <= randomAudioProbability\n for (const [i, page] of pagesWithAudio.entries()) {\n try {\n if (i === index) {\n log.debug(`Changing audio in page ${i + 1}/${pagesWithAudio.length} (enable: ${enable})`)\n await page.evaluate(async enable => {\n if (typeof publisherSetMuted !== 'undefined') {\n await publisherSetMuted(!enable)\n } else {\n webrtcperf.getActiveAudioTracks().forEach(track => {\n track.enabled = enable\n // track.dispatchEvent(new Event('custom-enabled'));\n })\n }\n }, enable)\n } else {\n await page.evaluate(async () => {\n if (typeof publisherSetMuted !== 'undefined') {\n await publisherSetMuted(true)\n } else {\n webrtcperf.getActiveAudioTracks().forEach(track => {\n track.enabled = false\n // track.dispatchEvent(new Event('custom-enabled'));\n })\n }\n })\n }\n } catch (err) {\n log.error(`randomActivateAudio in page ${i + 1}/${pagesWithAudio.length} error: ${(err as Error).stack}`)\n }\n }\n } catch (err) {\n log.error(`randomActivateAudio error: ${(err as Error).stack}`)\n } finally {\n if (randomActivateAudioRunning) {\n const nextTime = randomAudioPeriod * (1 + Math.random())\n if (randomActivateAudioTimeoutId) clearTimeout(randomActivateAudioTimeoutId)\n randomActivateAudioTimeoutId = setTimeout(\n randomActivateAudio,\n nextTime * 1000,\n sessions,\n randomAudioPeriod,\n randomAudioProbability,\n randomAudioRange,\n )\n }\n }\n}\n\n/**\n * The {@link downloadUrl} output.\n */\nexport interface DownloadData {\n /** Download data. */\n data: string\n /** Start byte range. */\n start: number\n /** End byte range. */\n end: number\n /** Total returned size. */\n total: number\n /** Content type. */\n contentType: string\n}\n\n/**\n * Downloads the specified `url` to a local file or returning the file content\n * as {@link DownloadData} object.\n * @param url The remote url to download.\n * @param auth The basic authentication (`user:password`).\n * @param outputLocationPath The file output. If not specified, the download\n * content will be returned as {@link DownloadData} instance.\n * @param range The HTTP byte range to download (e.g. `10-100`).\n * @param timeout The download timeout in milliseconds.\n */\nexport async function downloadUrl(\n url: string,\n auth?: string,\n outputLocationPath?: string,\n range?: string,\n timeout = 60000,\n): Promise<void | DownloadData> {\n log.debug(`downloadUrl url=${url} ${outputLocationPath}`)\n const authParts = auth?.split(':')\n let writer: WriteStream | null = null\n if (outputLocationPath) {\n await fs.promises.mkdir(dirname(outputLocationPath), {\n recursive: true,\n })\n writer = createWriteStream(outputLocationPath)\n }\n const response = await axios({\n method: 'get',\n url,\n auth: authParts\n ? {\n username: authParts[0],\n password: authParts[1],\n }\n : undefined,\n headers: range\n ? {\n Range: `bytes=${range}`,\n }\n : undefined,\n timeout,\n onDownloadProgress: event => {\n log.debug(`downloadUrl fileUrl=${url} progress=${event.progress || event.bytes}`)\n },\n httpsAgent: new Agent({\n rejectUnauthorized: false,\n }),\n responseType: writer ? 'stream' : 'text',\n })\n if (writer) {\n return new Promise((resolve, reject) => {\n if (!writer) {\n return\n }\n response.data.pipe(writer)\n let error: Error | null = null\n writer.once('error', err => {\n error = err\n if (writer) writer.close()\n reject(err)\n })\n writer.once('close', () => {\n if (!error) {\n resolve()\n }\n })\n })\n } else {\n /* log.debug(`downloadUrl ${response.data.length} bytes, headers=${\n JSON.stringify(response.headers)}`); */\n const contentType = response.headers['content-type']\n let start = 0\n let end = 0\n let total = 0\n if (response.headers['content-range']) {\n const contentRange = response.headers['content-range'].split('/')\n log.debug(`downloadUrl ${response.data.length} bytes, contentType=${contentType}, contentRange=${contentRange}`)\n const rangeParts = contentRange[0].split('-')\n total = parseInt(contentRange[1])\n if (rangeParts.length === 2) {\n start = parseInt(rangeParts[0])\n end = parseInt(rangeParts[1])\n } else if (contentRange[0].startsWith('-')) {\n end = parseInt(rangeParts[0])\n } else if (contentRange[0].endsWith('-')) {\n start = parseInt(rangeParts[0])\n end = total\n }\n }\n return {\n data: response.data,\n start,\n end,\n total,\n contentType,\n }\n }\n}\n\n/**\n * Uploads the file to the specified `url`.\n * @param filePath The file path to upload.\n * @param url The remote url to upload.\n * @param auth The basic authentication (`user:password`).\n */\nexport async function uploadUrl(filePath: string, url: string, auth?: string): Promise<string> {\n log.debug(`uploadUrl ${filePath} to ${url}`)\n const authParts = auth?.split(':')\n const formData = new FormData()\n formData.append('file', fs.createReadStream(filePath))\n const response = await axios({\n method: 'post',\n url,\n auth: authParts\n ? {\n username: authParts[0],\n password: authParts[1],\n }\n : undefined,\n headers: formData.getHeaders(),\n timeout: 3600 * 1000,\n httpsAgent: new Agent({\n rejectUnauthorized: false,\n }),\n responseType: 'text',\n data: formData,\n })\n return response.data as string\n}\n\nconst HideAuthRegExp = new RegExp('(http[s]{0,1}://)(.+?:.+?@)', 'g')\n\n/**\n * Hides the authentication part from an HTTP url.\n * @param data\n */\nexport function hideAuth(data: string): string {\n if (!data) {\n return data\n }\n return data.replace(HideAuthRegExp, '$1')\n}\n\n/** Exit handler callback. */\nexport type ExitHandler = (signal?: string) => Promise<void>\n\nconst exitHandlers = new Set<ExitHandler>()\n\n/**\n * Register an {@link ExitHandler} callback that will be executed at the\n * nodejs process exit.\n * @param exitHandler\n */\nexport function registerExitHandler(exitHandler: ExitHandler): void {\n exitHandlers.add(exitHandler)\n}\n\n/**\n * Un-registers the {@link ExitHandler} callback.\n * @param exitHandler\n */\nexport function unregisterExitHandler(exitHandler: ExitHandler): void {\n exitHandlers.delete(exitHandler)\n}\n\nconst runExitHandlers = async (signal?: string): Promise<void> => {\n let i = 0\n for (const exitHandler of exitHandlers.values()) {\n const id = `${i + 1}/${exitHandlers.size}`\n log.debug(`running exitHandler ${id}`)\n try {\n await exitHandler(signal)\n log.debug(` exitHandler ${id} done`)\n } catch (err) {\n log.error(`exitHandler ${id} error: ${err}`)\n }\n i++\n }\n exitHandlers.clear()\n}\n\nlet runExitHandlersPromise: Promise<void> | null = null\n\n/**\n * Runs the registered exit handlers immediately.\n * @param signal The process exit signal.\n */\nexport async function runExitHandlersNow(signal?: string): Promise<void> {\n if (!runExitHandlersPromise) {\n runExitHandlersPromise = runExitHandlers(signal)\n }\n await runExitHandlersPromise\n stopTimers()\n}\n\nconst SIGNALS = [\n 'beforeExit',\n 'uncaughtException',\n 'unhandledRejection',\n 'SIGHUP',\n 'SIGINT',\n 'SIGQUIT',\n 'SIGILL',\n 'SIGTRAP',\n 'SIGABRT',\n 'SIGBUS',\n 'SIGFPE',\n 'SIGUSR1',\n 'SIGSEGV',\n 'SIGUSR2',\n 'SIGTERM',\n]\nprocess.setMaxListeners(process.getMaxListeners() + SIGNALS.length)\nSIGNALS.forEach(event =>\n process.once(event, async signal => {\n if (signal instanceof Error) {\n log.error(`Exit on error: ${signal.stack || signal.message}`)\n } else {\n log.debug(`Exit on signal: ${signal}`)\n }\n await runExitHandlersNow(signal)\n process.exit(0)\n }),\n)\n\n/**\n * Downloads the configured chrome executable if it doesn't exists into the\n * `$HOME/.webrtcperf/chrome` directory.\n * @returns The revision info.\n */\nexport async function checkChromeExecutable(): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { loadConfig } = require('./config')\n const configs = await loadConfig()\n const config = configs[0]\n const cacheDir = path.join(os.homedir(), '.webrtcperf/chrome')\n\n const fixSemVer = (v: string) => v.split('.').slice(0, 3).join('.')\n\n const browsers = await getInstalledBrowsers({ cacheDir })\n const revisions = browsers.map(b => fixSemVer(b.buildId))\n const browser = Browser.CHROME\n revisions.sort(getVersionComparator(browser))\n log.debug(`Available chrome versions: ${revisions}`)\n const requiredRevision = config.chromiumVersion\n if (!requiredRevision) throw new Error('Chromium version not set')\n if (!revisions.includes(fixSemVer(requiredRevision))) {\n log.info(`Downloading chrome ${requiredRevision}...`)\n let progress = 0\n await install({\n browser,\n buildId: requiredRevision,\n cacheDir,\n downloadProgressCallback: (downloadedBytes, totalBytes) => {\n const cur = Math.round((100 * downloadedBytes) / totalBytes)\n if (cur - progress > 1) {\n progress = cur\n log.info(` ${progress}%`)\n }\n },\n })\n log.info(`Downloading chrome ${requiredRevision} done.`)\n }\n return computeExecutablePath({\n browser,\n cacheDir,\n buildId: requiredRevision,\n })\n}\n\nexport function clampMinMax(value: number, min: number, max: number): number {\n return Math.max(Math.min(value, max), min)\n}\n\n/** Runs the shell command asynchronously. */\nexport async function runShellCommand(\n cmd: string,\n verbose = false,\n maxBuffer = 1024 * 1024,\n { provideStdin = false, returnStdout = true, returnStderr = true } = {},\n): Promise<{ stdout: string; stderr: string }> {\n if (verbose) log.debug(`runShellCommand cmd: ${cmd}`)\n return new Promise((resolve, reject) => {\n const p = spawn(cmd, {\n shell: true,\n stdio: [\n provideStdin ? 'inherit' : 'ignore',\n returnStdout ? 'pipe' : 'inherit',\n returnStderr ? 'pipe' : 'inherit',\n ],\n detached: true,\n })\n let stdout = ''\n let stderr = ''\n if (returnStdout) {\n p.stdout?.on('data', data => {\n if (maxBuffer && stdout.length > maxBuffer) {\n stdout = stdout.slice(data.length)\n }\n stdout += data\n })\n }\n if (returnStderr) {\n p.stderr?.on('data', data => {\n if (maxBuffer && stderr.length > maxBuffer) {\n stderr = stderr.slice(data.length)\n }\n stderr += data\n })\n }\n p.once('error', err => reject(err))\n p.once('close', code => {\n if (code !== 0) {\n reject(new Error(`runShellCommand cmd: ${cmd} failed with code ${code}: ${stderr}`))\n } else {\n if (verbose) log.debug(`runShellCommand cmd: ${cmd} done`, { stdout, stderr })\n resolve({ stdout, stderr })\n }\n })\n })\n}\n\n//\nconst ipCache = new Map<string, { host: string; timestamp: number }>()\n\n/**\n * Resolves the IP address hostname.\n * @param ip The IP address.\n * @param cacheTime The number of milliseconds to keep the resolved hostname\n * into the memory cache.\n * @returns The IP address hostname.\n */\nexport async function resolveIP(ip: string, cacheTime = 60 * 60 * 1000): Promise<string> {\n if (!ip) return ''\n if (ipaddrJs.parse(ip).range() === 'private') {\n return ip\n }\n const timestamp = Date.now()\n const ret = ipCache.get(ip)\n if (!ret || timestamp - ret.timestamp > cacheTime) {\n const host = await Promise.race([\n sleep(1000),\n dns.promises\n .reverse(ip)\n .then(hosts => {\n if (hosts.length) {\n log.debug(`resolveIP ${ip} -> ${hosts.join(', ')}`)\n ipCache.set(ip, {\n host: hosts[0],\n // Keep the value for 10 min.\n timestamp: timestamp + 10 * cacheTime,\n })\n return hosts[0]\n } else {\n ipCache.set(ip, { host: ip, timestamp })\n return ip\n }\n })\n .catch(err => {\n log.debug(`resolveIP error: ${(err as Error).stack}`)\n ipCache.set(ip, { host: ip, timestamp })\n }),\n ])\n return host || ip\n }\n return ret?.host || ip\n}\n\n/**\n * Strips the console logs characters from the provided string.\n * @param str The input string.\n * @returns The strippped string.\n */\nexport function stripColors(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1B[[(?);]{0,2}(;?\\d)*./g, '')\n}\n\nconst nvidiaGpuPresent = fs.existsSync('/usr/bin/nvidia-smi') && fs.existsSync('/dev/dri')\n\nconst macOS = process.platform === 'darwin' && fs.existsSync('/usr/sbin/ioreg')\n\n/**\n * Returns the GPU usage.\n *\n * On Linux, the `nvidia-smi` should be installed if Nvidia card is used.\n * @returns The GPU usage.\n */\nexport async function systemGpuStats(): Promise<{ gpu: number; mem: number }> {\n try {\n if (nvidiaGpuPresent) {\n const { stdout } = await runShellCommand('nvidia-smi --query-gpu=utilization.gpu,utilization.memory --format=csv')\n const line = stdout.split('\\n')[1].trim()\n const [gpu, mem] = line.split(',').map(s => parseFloat(s.replace(' %', '')))\n return { gpu, mem }\n } else if (macOS) {\n const { stdout } = await runShellCommand('ioreg -r -d 1 -w 0 -c IOAccelerator | grep PerformanceStatistics\\\\\"')\n const stats = JSON.parse(stdout.trim().split(' = ')[1].replace(/=/g, ':'))\n const gpu = stats['Device Utilization %'] || stats['GPU Activity(%)'] || 0\n return { gpu, mem: 0 }\n }\n } catch (err) {\n log.debug(`systemGpuStats error: ${(err as Error).stack}`)\n }\n return { gpu: 0, mem: 0 }\n}\n\n/**\n * Schedules a function call at the specified time interval.\n */\nexport class Scheduler {\n private readonly name: string\n private readonly interval: number\n private readonly callback: (now: number) => Promise<void>\n private readonly verbose: boolean\n\n private running = false\n private last = 0\n private errorSum = 0\n private statsTimeoutId?: NodeJS.Timeout\n\n /**\n * Scheduler.\n * @param name Logging name.\n * @param interval Update interval in seconds.\n * @param callback Callback function.\n * @param verbose Verbose logging.\n */\n constructor(name: string, interval: number, callback: (now: number) => Promise<void>, verbose = false) {\n this.name = name\n this.interval = interval * 1000\n this.callback = callback\n this.verbose = verbose\n log.debug(`[${this.name}-scheduler] constructor interval=${this.interval}ms`)\n }\n\n start() {\n log.debug(`[${this.name}-scheduler] start`)\n this.running = true\n this.scheduleNext()\n }\n\n async stop() {\n log.debug(`[${this.name}-scheduler] stop`)\n this.running = false\n if (this.statsTimeoutId) {\n clearTimeout(this.statsTimeoutId)\n }\n try {\n await this.callback(Date.now())\n } catch (err) {\n log.error(`[${this.name}-scheduler] stop callback error: ${(err as Error).stack}`, err)\n }\n }\n\n private scheduleNext() {\n if (!this.running) {\n return\n }\n const now = Date.now()\n if (this.last) {\n this.errorSum += clampMinMax(now - this.last - this.interval, -this.interval, this.interval)\n if (this.verbose) {\n log.debug(`[${this.name}-scheduler] last=${now - this.last}ms drift=${this.errorSum}ms`)\n }\n }\n this.last = now\n this.statsTimeoutId = setTimeout(\n async () => {\n try {\n const now = Date.now()\n await this.callback(now)\n const elapsed = Date.now() - now\n if (elapsed > this.interval) {\n log.warn(`[${this.name}-scheduler] callback elapsed=${elapsed}ms > ${this.interval}ms`)\n } else if (this.verbose) {\n log.debug(`[${this.name}-scheduler] callback elapsed=${elapsed}ms`)\n }\n } catch (err) {\n log.error(`[${this.name}-scheduler] callback error: ${(err as Error).stack}`, err)\n } finally {\n this.scheduleNext()\n }\n },\n this.interval - this.errorSum / 2,\n )\n }\n}\n\n//\nexport class PeerConnectionExternal {\n public id: number\n private process\n private static cache = new Map<number, PeerConnectionExternal>()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(options?: any) {\n this.process = spawn('sleep', ['600'])\n this.id = this.process.pid || -1\n log.debug(`PeerConnectionExternal contructor: ${this.id}`, options)\n PeerConnectionExternal.cache.set(this.id, this)\n\n this.process.stdout.on('data', data => {\n log.debug(`PeerConnectionExternal stdout: ${data}`)\n })\n\n this.process.stderr.on('data', data => {\n log.debug(`PeerConnectionExternal stderr: ${data}`)\n })\n\n this.process.on('close', code => {\n log.debug(`PeerConnectionExternal process exited with code ${code}`)\n PeerConnectionExternal.cache.delete(this.id)\n })\n }\n\n static get(id: number): PeerConnectionExternal | undefined {\n return PeerConnectionExternal.cache.get(id)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async createOffer(options: any) {\n log.debug(`PeerConnectionExternal createOffer`, { options })\n return {}\n }\n\n setLocalDescription(description: string) {\n log.debug(`PeerConnectionExternal setLocalDescription`, description)\n }\n\n setRemoteDescription(description: string) {\n log.debug(`PeerConnectionExternal setRemoteDescription`, description)\n }\n}\n\nexport type PeerConnectionExternalMethod = 'createOffer' | 'setLocalDescription' | 'setRemoteDescription'\n\nexport function toTitleCase(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport async function getFiles(dir: string, ext: string): Promise<string[]> {\n const dirs = await fs.promises.readdir(dir, { withFileTypes: true })\n const files = await Promise.all(\n dirs.map(entry => {\n const res = path.resolve(dir, entry.name)\n return entry.isDirectory() ? getFiles(res, ext) : res\n }),\n )\n return Array.prototype.concat(...files).filter(f => f.endsWith(ext))\n}\n\n/**\n * Format number to the specified precision.\n * @param value value to format\n * @param precision precision\n */\nexport function toPrecision(value: number, precision = 3): string {\n return (Math.round(value * 10 ** precision) / 10 ** precision).toFixed(precision)\n}\n\nexport async function getDefaultNetworkInterface(): Promise<string> {\n const { stdout } = await runShellCommand(`ip route | awk '/default/ {print $5; exit}' | tr -d ''`)\n return stdout.trim()\n}\n\nexport async function checkNetworkInterface(device: string): Promise<void> {\n await runShellCommand(`ip route | grep -q \"dev ${device}\"`)\n}\n\nexport async function portForwarder(port: number, listenInterface?: string) {\n if (!listenInterface) {\n listenInterface = await getDefaultNetworkInterface()\n }\n const controller = new AbortController()\n Object.entries(networkInterfaces()).forEach(([iface, nets]) => {\n if (listenInterface !== '0.0.0.0' && iface !== listenInterface) return\n if (!nets) return\n for (const n of nets) {\n if (n.internal || n.address === '127.0.0.1' || n.family !== 'IPv4') {\n continue\n }\n const msg = `portForwarder on ${iface} (${n.address}:${port})`\n const server = net\n .createServer(from => {\n const to = net.createConnection({ host: '127.0.0.1', port })\n from.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n to.destroy()\n })\n to.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n from.destroy()\n })\n from.pipe(to)\n to.pipe(from)\n })\n .listen({ port, host: n.address, signal: controller.signal })\n server.on('listening', () => {\n log.debug(`${msg} listening`)\n })\n server.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n })\n }\n })\n\n return () => {\n log.debug(`portForwarder on port ${port} stop`)\n controller.abort()\n }\n}\n\nexport async function pageScreenshot(\n url: string,\n filePath: string,\n width = 1920,\n height = 1024,\n selector = 'body',\n headers?: Record<string, string>,\n extraCss?: string,\n): Promise<void> {\n log.debug(`pageScreenshot ${url} -> ${filePath}`)\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true })\n let executablePath = process.env.CHROMIUM_PATH\n if (!executablePath || !fs.existsSync(executablePath)) {\n executablePath = await checkChromeExecutable()\n }\n const browser = await puppeteer.launch({\n headless: true,\n executablePath,\n defaultViewport: {\n width,\n height,\n deviceScaleFactor: 1,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n //'--remote-debugging-port=9222',\n ],\n })\n const page = await browser.newPage()\n if (headers) {\n await page.setExtraHTTPHeaders(headers)\n }\n if (extraCss) {\n await page.evaluateOnNewDocument((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 document.head.appendChild(style)\n })\n }, extraCss)\n }\n await page.goto(url, {\n waitUntil: ['domcontentloaded', 'networkidle0'],\n timeout: 60 * 1000,\n })\n try {\n const element = await page.waitForSelector(selector, {\n visible: true,\n timeout: 15 * 1000,\n })\n if (!element) {\n throw new Error(`pageScreenshot selector \"${selector}\" not found`)\n }\n const path = filePath as `${string}.${ImageFormat}`\n await element.screenshot({ path })\n } catch (err) {\n log.error(`pageScreenshot error: ${(err as Error).message}`)\n } finally {\n await page.close()\n await browser.close()\n }\n}\n\nexport function enabledForSession(index: number, value: boolean | string | number): boolean {\n if (value === true || value === 'true') {\n return true\n } else if (value === false || value === 'false' || value === undefined) {\n return false\n } else if (typeof value === 'string') {\n if (value.includes('-')) {\n const [start, end] = value.split('-').map(s => parseInt(s))\n if (isFinite(start) && index < start) {\n return false\n }\n if (isFinite(end) && index > end) {\n return false\n }\n return true\n } else {\n const indexes = value\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n .map(s => parseInt(s))\n return indexes.includes(index)\n }\n } else if (index === value) {\n return true\n }\n return false\n}\n\nexport function increaseKey(o: Record<string, number>, key: string, value?: number): void {\n if (value === undefined || !isFinite(value)) return\n if (o[key] === undefined) {\n o[key] = 0\n }\n o[key] += value\n}\n\nexport async function chunkedPromiseAll<T, R>(\n items: T[],\n f: (v: T, index: number) => Promise<R>,\n chunkSize = 1,\n): Promise<R[]> {\n const results = Array<R>(items.length)\n for (let index = 0; index < items.length; index += chunkSize) {\n await Promise.allSettled(\n items.slice(index, index + chunkSize).map(async (item, i) => {\n const res = await f(item, index + i)\n if (res !== undefined) results[index + i] = res\n }),\n )\n }\n return results\n}\n\nexport function maybeNumber(s: string): string | number {\n const n = parseFloat(s)\n return !isNaN(n) ? n : s\n}\n\nexport enum FFProbeProcess {\n Skip = 'skip',\n Stop = 'stop',\n}\n\n/**\n * It runs the ffprobe command to extract the video/video frames.\n * @param fpath The file path.\n * @param kind The kind of the media (video or audio).\n * @param entries Which entries to show.\n * @param filters Apply filters.\n * @param frameProcess A function to process the frame. The function return value could be:\n * - the modified frame object\n * - `FFProbeProcess.Skip` to skip the frame from the output\n * - `FFProbeProcess.Stop` to stop processing and immediately return the collected frames.\n */\nexport async function ffprobe(\n fpath: string,\n kind = 'video',\n entries = '',\n filters = '',\n frameProcess?: (_frame: Record<string, string>) => Record<string, string> | FFProbeProcess,\n): Promise<Record<string, string>[]> {\n const cmd = `\\\nexec ffprobe -loglevel error ${kind === 'video' ? '-select_streams v' : ''} -show_frames -print_format compact \\\n${entries ? `-show_entries ${entries}` : ''} \\\n-f lavfi -i '${kind === 'video' ? '' : 'a'}movie=${fpath}${filters ? `,${filters}` : ''}'`\n const frames = [] as Record<string, string>[]\n let stderr = ''\n let stopProcessing = false\n return new Promise((resolve, reject) => {\n const p = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n p.stdout.on('data', data => {\n if (stopProcessing) return\n const frame = data\n .toString()\n .split('|')\n .reduce(\n (prev: Record<string, string>, cur: string) => {\n const [key, value] = cur.split('=')\n if (value && !key.startsWith('side_datum')) {\n prev[key.replace(/[:.]/g, '_')] = value\n }\n return prev\n },\n {} as Record<string, string>,\n )\n if (frameProcess) {\n const newFrame = frameProcess(frame)\n if (newFrame === FFProbeProcess.Skip) {\n // Skip the frame.\n } else if (newFrame === FFProbeProcess.Stop) {\n stopProcessing = true\n p.kill('SIGINT')\n } else {\n frames.push(newFrame)\n }\n } else {\n frames.push(frame)\n }\n })\n p.stderr.on('data', data => {\n stderr += data\n })\n p.once('error', err => reject(err))\n p.once('close', code => {\n if (code !== 0 && !stopProcessing) {\n reject(new Error(`${cmd} failed with code ${code}: ${stderr}`))\n } else {\n resolve(frames)\n }\n })\n })\n}\n\nexport function buildIvfHeader(width = 1920, height = 1080, frameRate = 30, fourcc = 'MJPG') {\n const buffer = Buffer.alloc(32)\n buffer.write('DKIF', 0, 'utf8')\n buffer.writeUint16LE(0, 4) // version\n buffer.writeUint16LE(32, 6) // header size\n buffer.write(fourcc, 8, 'utf8')\n buffer.writeUint16LE(width, 12)\n buffer.writeUint16LE(height, 14)\n buffer.writeUint32LE(frameRate, 16)\n buffer.writeUint32LE(1, 20)\n buffer.writeUint32LE(0, 24) // frame count\n buffer.writeUint32LE(0, 28) // unused\n return buffer\n}\n\nexport async function ffmpeg(command = 'video', processFn: (_frame: Buffer) => void): Promise<void> {\n const port = 10000 + Math.floor(Math.random() * 10000)\n const cmd = `exec ffmpeg -hide_banner -loglevel warning ${command} zmq:tcp://127.0.0.1:${port}`\n log.debug(`${cmd}`)\n let stderr = ''\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const zmq = require('zeromq')\n const sub = new zmq.Subscriber()\n const p = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n p.stderr.on('data', data => {\n stderr += data\n })\n p.once('error', err => {\n sub.close()\n throw err\n })\n p.once('close', code => {\n sub.close()\n if (code !== 0) {\n throw new Error(`${cmd} failed with code ${code}: ${stderr}`)\n }\n })\n sub.connect(`tcp://127.0.0.1:${port}`)\n sub.subscribe('')\n for await (const [msg] of sub) {\n await processFn(msg)\n }\n sub.close()\n}\n\nexport async function analyzeColors(fpath: string) {\n let Y = 0\n let U = 0\n let V = 0\n let SAT = 0\n let HUE = 0\n let count = 0\n await ffprobe(\n fpath,\n 'video',\n 'frame=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG,lavfi.signalstats.SATAVG,lavfi.signalstats.HUEAVG',\n 'signalstats',\n frame => {\n Y += parseFloat(frame.tag_lavfi_signalstats_YAVG)\n U += parseFloat(frame.tag_lavfi_signalstats_UAVG)\n V += parseFloat(frame.tag_lavfi_signalstats_VAVG)\n SAT += parseFloat(frame.tag_lavfi_signalstats_SATAVG)\n HUE += parseFloat(frame.tag_lavfi_signalstats_HUEAVG)\n count++\n return FFProbeProcess.Skip\n },\n )\n return { YAvg: Y / count, UAvg: U / count, VAvg: V / count, SatAvg: SAT / count, HueAvg: HUE / count }\n}\n\n/**\n * Wait for the process to stop or kill it after the timeout.\n * @param pid The process pid\n * @param timeout The maximum wait time in milliseconds\n * @returns `true` if the process stopped, `false` if the process was killed.\n */\nexport async function waitStopProcess(pid: number, timeout = 5000): Promise<boolean> {\n log.debug(`waitStopProcess pid: ${pid} timeout: ${timeout}`)\n const now = Date.now()\n while (Date.now() - now < timeout) {\n try {\n process.kill(pid, 0)\n await sleep(Math.max(timeout / 10, 200))\n } catch {\n return true\n }\n }\n log.warn(`waitStopProcess pid: ${pid} timeout`)\n try {\n process.kill(pid, 'SIGKILL')\n } catch {\n return true\n }\n return false\n}\n\nexport async function getDockerLogsPath(): Promise<string> {\n const containerId = await fs.promises.readFile(`${os.homedir()}/.webrtcperf/docker.id`, 'utf-8')\n const logPath = `/var/lib/docker/containers/${containerId}/${containerId}-json.log`\n if (!fs.existsSync(logPath)) {\n throw new Error(`docker logs path ${logPath} not found`)\n }\n return logPath\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Browser,\n computeExecutablePath,\n getInstalledBrowsers,\n getVersionComparator,\n install,\n} from '@puppeteer/browsers'\nimport { spawn } from 'child_process'\nimport axios from 'axios'\nimport { createHash } from 'crypto'\nimport * as dns from 'dns'\nimport FormData from 'form-data'\nimport fs, { WriteStream, createWriteStream } from 'fs'\nimport { Agent } from 'https'\nimport * as ipaddrJs from 'ipaddr.js'\nimport net from 'net'\nimport NodeCache from 'node-cache'\nimport * as OSUtils from 'node-os-utils'\nimport os, { networkInterfaces } from 'os'\nimport path, { dirname } from 'path'\nimport pidtree from 'pidtree'\nimport pidusage from 'pidusage'\nimport puppeteer, { ImageFormat, Page } from 'puppeteer-core'\n\nimport { Session } from './session'\nimport { FastStats } from './stats'\n\n// eslint-disable-next-line\nconst ps = require('pidusage/lib/ps')\n\nexport function logger(name: string, options = {}) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Log } = require('debug-level')\n return new Log(name, { splitLine: false, ...options })\n}\n\nconst log = logger('webrtcperf:utils')\n\n/**\n * Resolves the absolute path from the package installation directory.\n * @param relativePath The relative path.\n * @returns The absolute path.\n */\nexport function resolvePackagePath(relativePath: string): string {\n if ('__nexe' in process) {\n log.debug('resolvePackagePath (nexe)', relativePath)\n return relativePath\n }\n if (process.env.WEBPACK) {\n const p = path.normalize(path.join(path.dirname(__filename), relativePath))\n log.debug('resolvePackagePath (webpack)', p)\n return p\n }\n for (const d of ['.', '..', '../..']) {\n const p = path.normalize(path.join(__dirname, d, relativePath))\n if (fs.existsSync(p)) {\n log.debug(`resolvePackagePath (dirname: ${__dirname})`, p)\n return p\n }\n }\n throw new Error(`resolvePackagePath: ${relativePath} not found (dirname: ${__dirname})`)\n}\n\n/**\n * Calculates the sha256 sum.\n * @param data The string input\n */\nexport function sha256(data: string): string {\n return createHash('sha256').update(data).digest('hex')\n}\n\nconst ProcessStatsCache = new NodeCache({ stdTTL: 5, checkperiod: 10 })\nconst ProcessChildrenCache = new NodeCache({ stdTTL: 15, checkperiod: 15 })\n\ninterface ProcessStat {\n cpu: number\n memory: number\n}\n\n/**\n * Returns the process stats.\n * @param pid The process pid\n * @param children If process children should be taken into account.\n * @returns\n */\nexport async function getProcessStats(pid = 0, children = false): Promise<ProcessStat> {\n const processPid = pid || process.pid\n let stat: ProcessStat | undefined = ProcessStatsCache.get(processPid)\n if (stat) {\n return stat\n }\n\n const pidStats = await pidusage(processPid)\n if (pidStats) {\n stat = {\n cpu: pidStats.cpu,\n memory: pidStats.memory / 1e6,\n }\n } else {\n stat = { cpu: 0, memory: 0 }\n }\n\n if (children) {\n try {\n let childrenPids: number[] | undefined = ProcessChildrenCache.get(processPid)\n if (!childrenPids?.length) {\n childrenPids = await pidtree(processPid)\n if (childrenPids?.length) {\n ProcessChildrenCache.set(processPid, childrenPids)\n }\n }\n if (childrenPids?.length) {\n const pidStats = await pidusage(childrenPids)\n for (const p of childrenPids) {\n if (pidStats[p]) {\n stat.cpu += pidStats[p].cpu\n stat.memory += pidStats[p].memory / 1e6\n }\n }\n }\n } catch (err) {\n log.error(`getProcessStats children error: ${(err as Error).stack}`)\n }\n }\n ProcessStatsCache.set(processPid, stat)\n return stat\n}\n\n// Socket stats.\ninterface SocketStat {\n recvBytes: number\n sendBytes: number\n}\n\nexport async function getSocketStats(processPid: number): Promise<SocketStat> {\n const stats: SocketStat = { recvBytes: 0, sendBytes: 0 }\n try {\n const { stdout } = await runShellCommand(`ss -nOHpti | { grep pid=${processPid} || true; }`)\n for (const { groups } of stdout.matchAll(/bytes_sent:(?<sendBytes>\\d+).+bytes_received:(?<recvBytes>\\d+)/g)) {\n if (!groups) continue\n const recvBytes = parseInt(groups.recvBytes)\n const sendBytes = parseInt(groups.sendBytes)\n stats.recvBytes += recvBytes\n stats.sendBytes += sendBytes\n }\n } catch (err) {\n log.error(`socketStats error: ${(err as Error).stack}`)\n }\n return stats\n}\n\n// System stats.\nconst SystemStatsCache = new NodeCache({ stdTTL: 30, checkperiod: 60 })\n\nexport interface SystemStats {\n usedCpu: number\n usedMemory: number\n usedGpu: number\n usedGpuMemory: number\n}\n\nasync function updateSystemStats(): Promise<void> {\n const [cpu, memInfo, gpuStats] = await Promise.all([OSUtils.cpu.free(10000), OSUtils.mem.info(), systemGpuStats()])\n const stat = {\n usedCpu: 100 - cpu,\n usedMemory: 100 - memInfo.freeMemPercentage,\n usedGpu: gpuStats.gpu,\n usedGpuMemory: gpuStats.mem,\n }\n SystemStatsCache.set('default', stat)\n}\n\nlet systemStatsInterval: NodeJS.Timeout | null = null\n\nexport function getSystemStats(): SystemStats | undefined {\n if (!systemStatsInterval) {\n startUpdateSystemStats()\n }\n return SystemStatsCache.get<SystemStats>('default')\n}\n\nexport function startUpdateSystemStats(): void {\n if (systemStatsInterval) {\n return\n }\n systemStatsInterval = setInterval(updateSystemStats, 5000)\n}\n\nexport function stopTimers(): void {\n if (systemStatsInterval) {\n clearInterval(systemStatsInterval)\n systemStatsInterval = null\n }\n}\n\n/**\n * Sleeps for the specified amount of time.\n * @param ms\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(() => resolve(), ms))\n}\n\ndeclare global {\n let publisherSetMuted: (muted: boolean) => Promise<void>\n}\n\nlet randomActivateAudioTimeoutId: NodeJS.Timeout | null = null\nlet randomActivateAudioRunning = false\n\nexport function startRandomActivateAudio(\n sessions: Map<number, Session>,\n randomAudioPeriod: number,\n randomAudioProbability: number,\n randomAudioRange: string,\n): void {\n if (randomActivateAudioRunning) return\n randomActivateAudioRunning = true\n void randomActivateAudio(sessions, randomAudioPeriod, randomAudioProbability, randomAudioRange)\n}\n\nexport function stopRandomActivateAudio(): void {\n randomActivateAudioRunning = false\n if (randomActivateAudioTimeoutId) clearTimeout(randomActivateAudioTimeoutId)\n}\n\n/**\n * Randomly activate audio from one tab at time.\n * @param sessions The sessions Map\n * @param randomAudioPeriod If set, the function will be called in loop\n * @param randomAudioProbability The activation probability\n * @param randomAudioRange The page indexes to include into the automation\n */\nexport async function randomActivateAudio(\n sessions: Map<number, Session>,\n randomAudioPeriod: number,\n randomAudioProbability: number,\n randomAudioRange: string,\n): Promise<void> {\n if (!randomAudioPeriod || !randomActivateAudioRunning) {\n return\n }\n try {\n let pages: (Page | null)[] = []\n for (const session of sessions.values()) {\n const sessionPages = [...session.pages.values()]\n if (enabledForSession(session.id, randomAudioRange)) {\n pages = pages.concat(sessionPages)\n }\n }\n for (const [i, page] of pages.entries()) {\n if (!page) {\n continue\n }\n let active = 0\n try {\n active = await page.evaluate(() => webrtcperf.getActiveAudioTracks().length)\n } catch (err) {\n log.error(`randomActivateAudio error: ${(err as Error).stack}`)\n }\n if (!active) {\n pages[i] = null\n }\n }\n const pagesWithAudio: Page[] = pages.filter(p => !!p)\n const index = Math.floor(Math.random() * pagesWithAudio.length)\n const enable = Math.round(100 * Math.random()) <= randomAudioProbability\n for (const [i, page] of pagesWithAudio.entries()) {\n try {\n if (i === index) {\n log.debug(`Changing audio in page ${i + 1}/${pagesWithAudio.length} (enable: ${enable})`)\n await page.evaluate(async enable => {\n if (typeof publisherSetMuted !== 'undefined') {\n await publisherSetMuted(!enable)\n } else {\n webrtcperf.getActiveAudioTracks().forEach(track => {\n track.enabled = enable\n // track.dispatchEvent(new Event('custom-enabled'));\n })\n }\n }, enable)\n } else {\n await page.evaluate(async () => {\n if (typeof publisherSetMuted !== 'undefined') {\n await publisherSetMuted(true)\n } else {\n webrtcperf.getActiveAudioTracks().forEach(track => {\n track.enabled = false\n // track.dispatchEvent(new Event('custom-enabled'));\n })\n }\n })\n }\n } catch (err) {\n log.error(`randomActivateAudio in page ${i + 1}/${pagesWithAudio.length} error: ${(err as Error).stack}`)\n }\n }\n } catch (err) {\n log.error(`randomActivateAudio error: ${(err as Error).stack}`)\n } finally {\n if (randomActivateAudioRunning) {\n const nextTime = randomAudioPeriod * (1 + Math.random())\n if (randomActivateAudioTimeoutId) clearTimeout(randomActivateAudioTimeoutId)\n randomActivateAudioTimeoutId = setTimeout(\n randomActivateAudio,\n nextTime * 1000,\n sessions,\n randomAudioPeriod,\n randomAudioProbability,\n randomAudioRange,\n )\n }\n }\n}\n\n/**\n * The {@link downloadUrl} output.\n */\nexport interface DownloadData {\n /** Download data. */\n data: string\n /** Start byte range. */\n start: number\n /** End byte range. */\n end: number\n /** Total returned size. */\n total: number\n /** Content type. */\n contentType: string\n}\n\n/**\n * Downloads the specified `url` to a local file or returning the file content\n * as {@link DownloadData} object.\n * @param url The remote url to download.\n * @param auth The basic authentication (`user:password`).\n * @param outputLocationPath The file output. If not specified, the download\n * content will be returned as {@link DownloadData} instance.\n * @param range The HTTP byte range to download (e.g. `10-100`).\n * @param timeout The download timeout in milliseconds.\n */\nexport async function downloadUrl(\n url: string,\n auth?: string,\n outputLocationPath?: string,\n range?: string,\n timeout = 60000,\n): Promise<void | DownloadData> {\n log.debug(`downloadUrl url=${url} ${outputLocationPath}`)\n const authParts = auth?.split(':')\n let writer: WriteStream | null = null\n if (outputLocationPath) {\n await fs.promises.mkdir(dirname(outputLocationPath), {\n recursive: true,\n })\n writer = createWriteStream(outputLocationPath)\n }\n const response = await axios({\n method: 'get',\n url,\n auth: authParts\n ? {\n username: authParts[0],\n password: authParts[1],\n }\n : undefined,\n headers: range\n ? {\n Range: `bytes=${range}`,\n }\n : undefined,\n timeout,\n onDownloadProgress: event => {\n log.debug(`downloadUrl fileUrl=${url} progress=${event.progress || event.bytes}`)\n },\n httpsAgent: new Agent({\n rejectUnauthorized: false,\n }),\n responseType: writer ? 'stream' : 'text',\n })\n if (writer) {\n return new Promise((resolve, reject) => {\n if (!writer) {\n return\n }\n response.data.pipe(writer)\n let error: Error | null = null\n writer.once('error', err => {\n error = err\n if (writer) writer.close()\n reject(err)\n })\n writer.once('close', () => {\n if (!error) {\n resolve()\n }\n })\n })\n } else {\n /* log.debug(`downloadUrl ${response.data.length} bytes, headers=${\n JSON.stringify(response.headers)}`); */\n const contentType = response.headers['content-type']\n let start = 0\n let end = 0\n let total = 0\n if (response.headers['content-range']) {\n const contentRange = response.headers['content-range'].split('/')\n log.debug(`downloadUrl ${response.data.length} bytes, contentType=${contentType}, contentRange=${contentRange}`)\n const rangeParts = contentRange[0].split('-')\n total = parseInt(contentRange[1])\n if (rangeParts.length === 2) {\n start = parseInt(rangeParts[0])\n end = parseInt(rangeParts[1])\n } else if (contentRange[0].startsWith('-')) {\n end = parseInt(rangeParts[0])\n } else if (contentRange[0].endsWith('-')) {\n start = parseInt(rangeParts[0])\n end = total\n }\n }\n return {\n data: response.data,\n start,\n end,\n total,\n contentType,\n }\n }\n}\n\n/**\n * Uploads the file to the specified `url`.\n * @param filePath The file path to upload.\n * @param url The remote url to upload.\n * @param auth The basic authentication (`user:password`).\n */\nexport async function uploadUrl(filePath: string, url: string, auth?: string): Promise<string> {\n log.debug(`uploadUrl ${filePath} to ${url}`)\n const authParts = auth?.split(':')\n const formData = new FormData()\n formData.append('file', fs.createReadStream(filePath))\n const response = await axios({\n method: 'post',\n url,\n auth: authParts\n ? {\n username: authParts[0],\n password: authParts[1],\n }\n : undefined,\n headers: formData.getHeaders(),\n timeout: 3600 * 1000,\n httpsAgent: new Agent({\n rejectUnauthorized: false,\n }),\n responseType: 'text',\n data: formData,\n })\n return response.data as string\n}\n\nconst HideAuthRegExp = new RegExp('(http[s]{0,1}://)(.+?:.+?@)', 'g')\n\n/**\n * Hides the authentication part from an HTTP url.\n * @param data\n */\nexport function hideAuth(data: string): string {\n if (!data) {\n return data\n }\n return data.replace(HideAuthRegExp, '$1')\n}\n\n/** Exit handler callback. */\nexport type ExitHandler = (signal?: string) => Promise<void>\n\nconst exitHandlers = new Set<ExitHandler>()\n\n/**\n * Register an {@link ExitHandler} callback that will be executed at the\n * nodejs process exit.\n * @param exitHandler\n */\nexport function registerExitHandler(exitHandler: ExitHandler): void {\n exitHandlers.add(exitHandler)\n}\n\n/**\n * Un-registers the {@link ExitHandler} callback.\n * @param exitHandler\n */\nexport function unregisterExitHandler(exitHandler: ExitHandler): void {\n exitHandlers.delete(exitHandler)\n}\n\nconst runExitHandlers = async (signal?: string): Promise<void> => {\n let i = 0\n for (const exitHandler of exitHandlers.values()) {\n const id = `${i + 1}/${exitHandlers.size}`\n log.debug(`running exitHandler ${id}`)\n try {\n await exitHandler(signal)\n log.debug(` exitHandler ${id} done`)\n } catch (err) {\n log.error(`exitHandler ${id} error: ${err}`)\n }\n i++\n }\n exitHandlers.clear()\n}\n\nlet runExitHandlersPromise: Promise<void> | null = null\n\n/**\n * Runs the registered exit handlers immediately.\n * @param signal The process exit signal.\n */\nexport async function runExitHandlersNow(signal?: string): Promise<void> {\n if (!runExitHandlersPromise) {\n runExitHandlersPromise = runExitHandlers(signal)\n }\n await runExitHandlersPromise\n stopTimers()\n}\n\nconst SIGNALS = [\n 'beforeExit',\n 'uncaughtException',\n 'unhandledRejection',\n 'SIGHUP',\n 'SIGINT',\n 'SIGQUIT',\n 'SIGILL',\n 'SIGTRAP',\n 'SIGABRT',\n 'SIGBUS',\n 'SIGFPE',\n 'SIGUSR1',\n 'SIGSEGV',\n 'SIGUSR2',\n 'SIGTERM',\n]\nprocess.setMaxListeners(process.getMaxListeners() + SIGNALS.length)\nSIGNALS.forEach(event =>\n process.once(event, async signal => {\n if (signal instanceof Error) {\n log.error(`Exit on error: ${signal.stack || signal.message}`)\n } else {\n log.debug(`Exit on signal: ${signal}`)\n }\n await runExitHandlersNow(signal)\n process.exit(0)\n }),\n)\n\n/**\n * Downloads the configured chrome executable if it doesn't exists into the\n * `$HOME/.webrtcperf/chrome` directory.\n * @returns The revision info.\n */\nexport async function checkChromeExecutable(): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { loadConfig } = require('./config')\n const configs = await loadConfig()\n const config = configs[0]\n const cacheDir = path.join(os.homedir(), '.webrtcperf/chrome')\n\n const fixSemVer = (v: string) => v.split('.').slice(0, 3).join('.')\n\n const browsers = await getInstalledBrowsers({ cacheDir })\n const revisions = browsers.map(b => fixSemVer(b.buildId))\n const browser = Browser.CHROME\n revisions.sort(getVersionComparator(browser))\n log.debug(`Available chrome versions: ${revisions}`)\n const requiredRevision = config.chromiumVersion\n if (!requiredRevision) throw new Error('Chromium version not set')\n if (!revisions.includes(fixSemVer(requiredRevision))) {\n log.info(`Downloading chrome ${requiredRevision}...`)\n let progress = 0\n await install({\n browser,\n buildId: requiredRevision,\n cacheDir,\n downloadProgressCallback: (downloadedBytes, totalBytes) => {\n const cur = Math.round((100 * downloadedBytes) / totalBytes)\n if (cur - progress > 1) {\n progress = cur\n log.info(` ${progress}%`)\n }\n },\n })\n log.info(`Downloading chrome ${requiredRevision} done.`)\n }\n return computeExecutablePath({\n browser,\n cacheDir,\n buildId: requiredRevision,\n })\n}\n\nexport function clampMinMax(value: number, min: number, max: number): number {\n return Math.max(Math.min(value, max), min)\n}\n\n/** Runs the shell command asynchronously. */\nexport async function runShellCommand(\n cmd: string,\n verbose = false,\n maxBuffer = 1024 * 1024,\n { provideStdin = false, returnStdout = true, returnStderr = true } = {},\n): Promise<{ stdout: string; stderr: string }> {\n if (verbose) log.debug(`runShellCommand cmd: ${cmd}`)\n return new Promise((resolve, reject) => {\n const p = spawn(cmd, {\n shell: true,\n stdio: [\n provideStdin ? 'inherit' : 'ignore',\n returnStdout ? 'pipe' : 'inherit',\n returnStderr ? 'pipe' : 'inherit',\n ],\n detached: true,\n })\n let stdout = ''\n let stderr = ''\n if (returnStdout) {\n p.stdout?.on('data', data => {\n if (maxBuffer && stdout.length > maxBuffer) {\n stdout = stdout.slice(data.length)\n }\n stdout += data\n })\n }\n if (returnStderr) {\n p.stderr?.on('data', data => {\n if (maxBuffer && stderr.length > maxBuffer) {\n stderr = stderr.slice(data.length)\n }\n stderr += data\n })\n }\n p.once('error', err => reject(err))\n p.once('close', code => {\n if (code !== 0) {\n reject(new Error(`runShellCommand cmd: ${cmd} failed with code ${code}: ${stderr}`))\n } else {\n if (verbose) log.debug(`runShellCommand cmd: ${cmd} done`, { stdout, stderr })\n resolve({ stdout, stderr })\n }\n })\n })\n}\n\n//\nconst ipCache = new Map<string, { host: string; timestamp: number }>()\n\n/**\n * Resolves the IP address hostname.\n * @param ip The IP address.\n * @param cacheTime The number of milliseconds to keep the resolved hostname\n * into the memory cache.\n * @returns The IP address hostname.\n */\nexport async function resolveIP(ip: string, cacheTime = 60 * 60 * 1000): Promise<string> {\n if (!ip) return ''\n if (ipaddrJs.parse(ip).range() === 'private') {\n return ip\n }\n const timestamp = Date.now()\n const ret = ipCache.get(ip)\n if (!ret || timestamp - ret.timestamp > cacheTime) {\n const host = await Promise.race([\n sleep(1000),\n dns.promises\n .reverse(ip)\n .then(hosts => {\n if (hosts.length) {\n log.debug(`resolveIP ${ip} -> ${hosts.join(', ')}`)\n ipCache.set(ip, {\n host: hosts[0],\n // Keep the value for 10 min.\n timestamp: timestamp + 10 * cacheTime,\n })\n return hosts[0]\n } else {\n ipCache.set(ip, { host: ip, timestamp })\n return ip\n }\n })\n .catch(err => {\n log.debug(`resolveIP error: ${(err as Error).stack}`)\n ipCache.set(ip, { host: ip, timestamp })\n }),\n ])\n return host || ip\n }\n return ret?.host || ip\n}\n\n/**\n * Strips the console logs characters from the provided string.\n * @param str The input string.\n * @returns The strippped string.\n */\nexport function stripColors(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1B[[(?);]{0,2}(;?\\d)*./g, '')\n}\n\nconst nvidiaGpuPresent = fs.existsSync('/usr/bin/nvidia-smi') && fs.existsSync('/dev/dri')\n\nconst macOS = process.platform === 'darwin' && fs.existsSync('/usr/sbin/ioreg')\n\n/**\n * Returns the GPU usage.\n *\n * On Linux, the `nvidia-smi` should be installed if Nvidia card is used.\n * @returns The GPU usage.\n */\nexport async function systemGpuStats(): Promise<{ gpu: number; mem: number }> {\n try {\n if (nvidiaGpuPresent) {\n const { stdout } = await runShellCommand('nvidia-smi --query-gpu=utilization.gpu,utilization.memory --format=csv')\n const line = stdout.split('\\n')[1].trim()\n const [gpu, mem] = line.split(',').map(s => parseFloat(s.replace(' %', '')))\n return { gpu, mem }\n } else if (macOS) {\n const { stdout } = await runShellCommand('ioreg -r -d 1 -w 0 -c IOAccelerator | grep PerformanceStatistics\\\\\"')\n const stats = JSON.parse(stdout.trim().split(' = ')[1].replace(/=/g, ':'))\n const gpu = stats['Device Utilization %'] || stats['GPU Activity(%)'] || 0\n return { gpu, mem: 0 }\n }\n } catch (err) {\n log.debug(`systemGpuStats error: ${(err as Error).stack}`)\n }\n return { gpu: 0, mem: 0 }\n}\n\n/**\n * Schedules a function call at the specified time interval.\n */\nexport class Scheduler {\n private readonly name: string\n private readonly interval: number\n private readonly callback: (now: number) => Promise<void>\n private readonly verbose: boolean\n\n private running = false\n private last = 0\n private errorSum = 0\n private statsTimeoutId?: NodeJS.Timeout\n\n /**\n * Scheduler.\n * @param name Logging name.\n * @param interval Update interval in seconds.\n * @param callback Callback function.\n * @param verbose Verbose logging.\n */\n constructor(name: string, interval: number, callback: (now: number) => Promise<void>, verbose = false) {\n this.name = name\n this.interval = interval * 1000\n this.callback = callback\n this.verbose = verbose\n log.debug(`[${this.name}-scheduler] constructor interval=${this.interval}ms`)\n }\n\n start() {\n log.debug(`[${this.name}-scheduler] start`)\n this.running = true\n this.scheduleNext()\n }\n\n async stop() {\n log.debug(`[${this.name}-scheduler] stop`)\n this.running = false\n if (this.statsTimeoutId) {\n clearTimeout(this.statsTimeoutId)\n }\n try {\n await this.callback(Date.now())\n } catch (err) {\n log.error(`[${this.name}-scheduler] stop callback error: ${(err as Error).stack}`, err)\n }\n }\n\n private scheduleNext() {\n if (!this.running) {\n return\n }\n const now = Date.now()\n if (this.last) {\n this.errorSum += clampMinMax(now - this.last - this.interval, -this.interval, this.interval)\n if (this.verbose) {\n log.debug(`[${this.name}-scheduler] last=${now - this.last}ms drift=${this.errorSum}ms`)\n }\n }\n this.last = now\n this.statsTimeoutId = setTimeout(\n async () => {\n try {\n const now = Date.now()\n await this.callback(now)\n const elapsed = Date.now() - now\n if (elapsed > this.interval) {\n log.warn(`[${this.name}-scheduler] callback elapsed=${elapsed}ms > ${this.interval}ms`)\n } else if (this.verbose) {\n log.debug(`[${this.name}-scheduler] callback elapsed=${elapsed}ms`)\n }\n } catch (err) {\n log.error(`[${this.name}-scheduler] callback error: ${(err as Error).stack}`, err)\n } finally {\n this.scheduleNext()\n }\n },\n this.interval - this.errorSum / 2,\n )\n }\n}\n\n//\nexport class PeerConnectionExternal {\n public id: number\n private process\n private static cache = new Map<number, PeerConnectionExternal>()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(options?: any) {\n this.process = spawn('sleep', ['600'])\n this.id = this.process.pid || -1\n log.debug(`PeerConnectionExternal contructor: ${this.id}`, options)\n PeerConnectionExternal.cache.set(this.id, this)\n\n this.process.stdout.on('data', data => {\n log.debug(`PeerConnectionExternal stdout: ${data}`)\n })\n\n this.process.stderr.on('data', data => {\n log.debug(`PeerConnectionExternal stderr: ${data}`)\n })\n\n this.process.on('close', code => {\n log.debug(`PeerConnectionExternal process exited with code ${code}`)\n PeerConnectionExternal.cache.delete(this.id)\n })\n }\n\n static get(id: number): PeerConnectionExternal | undefined {\n return PeerConnectionExternal.cache.get(id)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async createOffer(options: any) {\n log.debug(`PeerConnectionExternal createOffer`, { options })\n return {}\n }\n\n setLocalDescription(description: string) {\n log.debug(`PeerConnectionExternal setLocalDescription`, description)\n }\n\n setRemoteDescription(description: string) {\n log.debug(`PeerConnectionExternal setRemoteDescription`, description)\n }\n}\n\nexport type PeerConnectionExternalMethod = 'createOffer' | 'setLocalDescription' | 'setRemoteDescription'\n\nexport function toTitleCase(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport async function getFiles(dir: string, ext: string): Promise<string[]> {\n const dirs = await fs.promises.readdir(dir, { withFileTypes: true })\n const files = await Promise.all(\n dirs.map(entry => {\n const res = path.resolve(dir, entry.name)\n return entry.isDirectory() ? getFiles(res, ext) : res\n }),\n )\n return Array.prototype.concat(...files).filter(f => f.endsWith(ext))\n}\n\n/**\n * Format number to the specified precision.\n * @param value value to format\n * @param precision precision\n */\nexport function toPrecision(value: number, precision = 3): string {\n return (Math.round(value * 10 ** precision) / 10 ** precision).toFixed(precision)\n}\n\nexport async function getDefaultNetworkInterface(): Promise<string> {\n const { stdout } = await runShellCommand(`ip route | awk '/default/ {print $5; exit}' | tr -d ''`)\n return stdout.trim()\n}\n\nexport async function checkNetworkInterface(device: string): Promise<void> {\n await runShellCommand(`ip route | grep -q \"dev ${device}\"`)\n}\n\nexport async function portForwarder(port: number, listenInterface?: string) {\n if (!listenInterface) {\n listenInterface = await getDefaultNetworkInterface()\n }\n const controller = new AbortController()\n Object.entries(networkInterfaces()).forEach(([iface, nets]) => {\n if (listenInterface !== '0.0.0.0' && iface !== listenInterface) return\n if (!nets) return\n for (const n of nets) {\n if (n.internal || n.address === '127.0.0.1' || n.family !== 'IPv4') {\n continue\n }\n const msg = `portForwarder on ${iface} (${n.address}:${port})`\n const server = net\n .createServer(from => {\n const to = net.createConnection({ host: '127.0.0.1', port })\n from.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n to.destroy()\n })\n to.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n from.destroy()\n })\n from.pipe(to)\n to.pipe(from)\n })\n .listen({ port, host: n.address, signal: controller.signal })\n server.on('listening', () => {\n log.debug(`${msg} listening`)\n })\n server.once('error', err => {\n log.error(`${msg} error: ${err.stack}`)\n })\n }\n })\n\n return () => {\n log.debug(`portForwarder on port ${port} stop`)\n controller.abort()\n }\n}\n\nexport async function pageScreenshot(\n url: string,\n filePath: string,\n width = 1920,\n height = 1024,\n selector = 'body',\n headers?: Record<string, string>,\n extraCss?: string,\n): Promise<void> {\n log.debug(`pageScreenshot ${url} -> ${filePath}`)\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true })\n let executablePath = process.env.CHROMIUM_PATH\n if (!executablePath || !fs.existsSync(executablePath)) {\n executablePath = await checkChromeExecutable()\n }\n const browser = await puppeteer.launch({\n headless: true,\n executablePath,\n defaultViewport: {\n width,\n height,\n deviceScaleFactor: 1,\n isMobile: false,\n hasTouch: false,\n isLandscape: false,\n },\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n //'--remote-debugging-port=9222',\n ],\n })\n const page = await browser.newPage()\n if (headers) {\n await page.setExtraHTTPHeaders(headers)\n }\n if (extraCss) {\n await page.evaluateOnNewDocument((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 document.head.appendChild(style)\n })\n }, extraCss)\n }\n await page.goto(url, {\n waitUntil: ['domcontentloaded', 'networkidle0'],\n timeout: 60 * 1000,\n })\n try {\n const element = await page.waitForSelector(selector, {\n visible: true,\n timeout: 15 * 1000,\n })\n if (!element) {\n throw new Error(`pageScreenshot selector \"${selector}\" not found`)\n }\n const path = filePath as `${string}.${ImageFormat}`\n await element.screenshot({ path })\n } catch (err) {\n log.error(`pageScreenshot error: ${(err as Error).message}`)\n } finally {\n await page.close()\n await browser.close()\n }\n}\n\nexport function enabledForSession(index: number, value: boolean | string | number): boolean {\n if (value === true || value === 'true') {\n return true\n } else if (value === false || value === 'false' || value === undefined) {\n return false\n } else if (typeof value === 'string') {\n if (value.includes('-')) {\n const [start, end] = value.split('-').map(s => parseInt(s))\n if (isFinite(start) && index < start) {\n return false\n }\n if (isFinite(end) && index > end) {\n return false\n }\n return true\n } else {\n const indexes = value\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length)\n .map(s => parseInt(s))\n return indexes.includes(index)\n }\n } else if (index === value) {\n return true\n }\n return false\n}\n\nexport function increaseKey(o: Record<string, number>, key: string, value?: number): void {\n if (value === undefined || !isFinite(value)) return\n if (o[key] === undefined) {\n o[key] = 0\n }\n o[key] += value\n}\n\nexport async function chunkedPromiseAll<T, R>(\n items: T[],\n f: (v: T, index: number) => Promise<R>,\n chunkSize = 1,\n): Promise<R[]> {\n const results = Array<R>(items.length)\n for (let index = 0; index < items.length; index += chunkSize) {\n await Promise.allSettled(\n items.slice(index, index + chunkSize).map(async (item, i) => {\n const res = await f(item, index + i)\n if (res !== undefined) results[index + i] = res\n }),\n )\n }\n return results\n}\n\nexport function maybeNumber(s: string): string | number {\n const n = parseFloat(s)\n return !isNaN(n) ? n : s\n}\n\nexport enum FFProbeProcess {\n Skip = 'skip',\n Stop = 'stop',\n}\n\n/**\n * It runs the ffprobe command to extract the video/video frames.\n * @param fpath The file path.\n * @param kind The kind of the media (video or audio).\n * @param entries Which entries to show.\n * @param filters Apply filters.\n * @param frameProcess A function to process the frame. The function return value could be:\n * - the modified frame object\n * - `FFProbeProcess.Skip` to skip the frame from the output\n * - `FFProbeProcess.Stop` to stop processing and immediately return the collected frames.\n */\nexport async function ffprobe(\n fpath: string,\n kind = 'video',\n entries = '',\n filters = '',\n frameProcess?: (_frame: Record<string, string>) => Record<string, string> | FFProbeProcess,\n): Promise<Record<string, string>[]> {\n const cmd = `\\\nexec ffprobe -loglevel error ${kind === 'video' ? '-select_streams v' : ''} -show_frames -print_format compact \\\n${entries ? `-show_entries ${entries}` : ''} \\\n-f lavfi -i '${kind === 'video' ? '' : 'a'}movie=${fpath}${filters ? `,${filters}` : ''}'`\n const frames = [] as Record<string, string>[]\n let stderr = ''\n let stopProcessing = false\n return new Promise((resolve, reject) => {\n const p = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n p.stdout.on('data', data => {\n if (stopProcessing) return\n const frame = data\n .toString()\n .split('|')\n .reduce(\n (prev: Record<string, string>, cur: string) => {\n const [key, value] = cur.split('=')\n if (value && !key.startsWith('side_datum')) {\n prev[key.replace(/[:.]/g, '_')] = value\n }\n return prev\n },\n {} as Record<string, string>,\n )\n if (frameProcess) {\n const newFrame = frameProcess(frame)\n if (newFrame === FFProbeProcess.Skip) {\n // Skip the frame.\n } else if (newFrame === FFProbeProcess.Stop) {\n stopProcessing = true\n p.kill('SIGINT')\n } else {\n frames.push(newFrame)\n }\n } else {\n frames.push(frame)\n }\n })\n p.stderr.on('data', data => {\n stderr += data\n })\n p.once('error', err => reject(err))\n p.once('close', code => {\n if (code !== 0 && !stopProcessing) {\n reject(new Error(`${cmd} failed with code ${code}: ${stderr}`))\n } else {\n resolve(frames)\n }\n })\n })\n}\n\nexport function buildIvfHeader(width = 1920, height = 1080, frameRate = 30, fourcc = 'MJPG') {\n const buffer = Buffer.alloc(32)\n buffer.write('DKIF', 0, 'utf8')\n buffer.writeUint16LE(0, 4) // version\n buffer.writeUint16LE(32, 6) // header size\n buffer.write(fourcc, 8, 'utf8')\n buffer.writeUint16LE(width, 12)\n buffer.writeUint16LE(height, 14)\n buffer.writeUint32LE(frameRate, 16)\n buffer.writeUint32LE(1, 20)\n buffer.writeUint32LE(0, 24) // frame count\n buffer.writeUint32LE(0, 28) // unused\n return buffer\n}\n\nexport async function ffmpeg(command = 'video', processFn: (_frame: Buffer) => void): Promise<void> {\n const port = 10000 + Math.floor(Math.random() * 10000)\n const cmd = `exec ffmpeg -hide_banner -loglevel warning ${command} zmq:tcp://127.0.0.1:${port}`\n log.debug(`${cmd}`)\n let stderr = ''\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const zmq = require('zeromq')\n const sub = new zmq.Subscriber()\n const p = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n p.stderr.on('data', data => {\n stderr += data\n })\n p.once('error', err => {\n sub.close()\n throw err\n })\n p.once('close', code => {\n sub.close()\n if (code !== 0) {\n throw new Error(`${cmd} failed with code ${code}: ${stderr}`)\n }\n })\n sub.connect(`tcp://127.0.0.1:${port}`)\n sub.subscribe('')\n for await (const [msg] of sub) {\n await processFn(msg)\n }\n sub.close()\n}\n\nexport async function analyzeColors(fpath: string) {\n let Y = 0\n let U = 0\n let V = 0\n let SAT = 0\n let HUE = 0\n let count = 0\n await ffprobe(\n fpath,\n 'video',\n 'frame=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG,lavfi.signalstats.SATAVG,lavfi.signalstats.HUEAVG',\n 'signalstats',\n frame => {\n Y += parseFloat(frame.tag_lavfi_signalstats_YAVG)\n U += parseFloat(frame.tag_lavfi_signalstats_UAVG)\n V += parseFloat(frame.tag_lavfi_signalstats_VAVG)\n SAT += parseFloat(frame.tag_lavfi_signalstats_SATAVG)\n HUE += parseFloat(frame.tag_lavfi_signalstats_HUEAVG)\n count++\n return FFProbeProcess.Skip\n },\n )\n return { YAvg: Y / count, UAvg: U / count, VAvg: V / count, SatAvg: SAT / count, HueAvg: HUE / count }\n}\n\n/**\n * Wait for the process to stop or kill it after the timeout.\n * @param pid The process pid\n * @param timeout The maximum wait time in milliseconds\n * @returns `true` if the process stopped, `false` if the process was killed.\n */\nexport async function waitStopProcess(pid: number, timeout = 5000): Promise<boolean> {\n log.debug(`waitStopProcess pid: ${pid} timeout: ${timeout}`)\n const now = Date.now()\n while (Date.now() - now < timeout) {\n try {\n process.kill(pid, 0)\n await sleep(Math.max(timeout / 10, 200))\n } catch {\n return true\n }\n }\n log.warn(`waitStopProcess pid: ${pid} timeout`)\n try {\n process.kill(pid, 'SIGKILL')\n } catch {\n return true\n }\n return false\n}\n\nexport async function getDockerLogsPath(): Promise<string> {\n const containerId = await fs.promises.readFile(`${os.homedir()}/.webrtcperf/docker.id`, 'utf-8')\n const logPath = `/var/lib/docker/containers/${containerId}/${containerId}-json.log`\n if (!fs.existsSync(logPath)) {\n throw new Error(`docker logs path ${logPath} not found`)\n }\n return logPath\n}\n\nexport async function parseStatsFile(filePath: string) {\n const fileData = await fs.promises.readFile(filePath, 'utf-8')\n const lines = fileData.split('\\n')\n const headers = lines[0].split(',')\n const data = lines.slice(1).map(line =>\n line.split(',').reduce(\n (acc, value, index) => {\n if (value !== '') {\n acc[headers[index]] = isNaN(Number(value)) ? value : Number(value)\n }\n return acc\n },\n {} as Record<string, string | number>,\n ),\n )\n return data\n}\n\nexport async function aggregateStatsSummary({\n dirPath = 'logs',\n senderParticipantName = 'Participant-000001',\n receiverParticipantName = 'Participant-000000',\n nameParser = (name: string) => {\n const [destination, scenario] = name.split('_')\n return { destination, scenario }\n },\n}) {\n const stats = {} as Record<\n string,\n {\n destination: string\n scenario: string\n videoRecvBitratePerPixel: FastStats\n videoRecvFps: FastStats\n videoSentFps: FastStats\n }\n >\n const results = await fs.promises.readdir(dirPath)\n for (const test of results) {\n const filePath = path.join(dirPath, test, 'detailed-stats-summary.csv')\n if (!fs.existsSync(filePath)) continue\n const data = await parseStatsFile(filePath)\n\n const aggregated = {} as Record<string, number>\n data.forEach(v => {\n const { participantName, trackId } = v as { participantName: string; trackId: string }\n const metrics = v as Record<string, number>\n if (participantName === receiverParticipantName) {\n if (trackId?.endsWith('-v') && metrics.videoRecvFrames > 0) {\n const videoRecvBitratePerPixel =\n metrics.videoRecvBitrates / (metrics.videoRecvWidth * metrics.videoRecvHeight)\n aggregated.videoRecvBitratePerPixel = Math.max(\n aggregated.videoRecvBitratePerPixel || 0,\n videoRecvBitratePerPixel,\n )\n aggregated.videoRecvFps = Math.max(aggregated.videoRecvFps || 0, metrics.videoRecvFps)\n }\n } else if (participantName === senderParticipantName) {\n if (trackId?.endsWith('-v') && metrics.videoSentFrames > 0) {\n aggregated.videoSentFps = Math.max(aggregated.videoSentFps || 0, metrics.videoSentFps)\n }\n }\n })\n if (Object.keys(aggregated).length === 0) continue\n\n const { destination, scenario, ...args } = nameParser(test)\n const key = `${destination}|${scenario}`\n if (!stats[key]) {\n stats[key] = {\n destination,\n scenario,\n ...args,\n videoRecvBitratePerPixel: new FastStats(),\n videoRecvFps: new FastStats(),\n videoSentFps: new FastStats(),\n }\n }\n stats[key].videoRecvBitratePerPixel.push(aggregated.videoRecvBitratePerPixel)\n stats[key].videoRecvFps.push(aggregated.videoRecvFps)\n stats[key].videoSentFps.push(aggregated.videoSentFps)\n }\n return Object.values(stats).sort((a, b) => a.scenario.localeCompare(b.scenario))\n}\n"]}
|