@vpalmisano/webrtcperf 4.1.5 → 4.1.9

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.
@@ -287,7 +287,7 @@ function stopRandomActivateAudio() {
287
287
  * @param sessions The sessions Map
288
288
  * @param randomAudioPeriod If set, the function will be called in loop
289
289
  * @param randomAudioProbability The activation probability
290
- * @param randomAudioRange The number of pages to include into the automation
290
+ * @param randomAudioRange The page indexes to include into the automation
291
291
  */
292
292
  async function randomActivateAudio(sessions, randomAudioPeriod, randomAudioProbability, randomAudioRange) {
293
293
  if (!randomAudioPeriod || !randomActivateAudioRunning) {
@@ -297,13 +297,9 @@ async function randomActivateAudio(sessions, randomAudioPeriod, randomAudioProba
297
297
  let pages = [];
298
298
  for (const session of sessions.values()) {
299
299
  const sessionPages = [...session.pages.values()];
300
- if (randomAudioRange) {
301
- if (session.id > randomAudioRange) {
302
- break;
303
- }
304
- sessionPages.splice(randomAudioRange - session.id);
300
+ if (enabledForSession(session.id, randomAudioRange)) {
301
+ pages = pages.concat(sessionPages);
305
302
  }
306
- pages = pages.concat(sessionPages);
307
303
  }
308
304
  // Remove pages with no audio tracks.
309
305
  for (const [i, page] of pages.entries()) {
@@ -980,7 +976,8 @@ async function pageScreenshot(url, filePath, width = 1920, height = 1024, select
980
976
  if (!element) {
981
977
  throw new Error(`pageScreenshot selector "${selector}" not found`);
982
978
  }
983
- await element.screenshot({ path: filePath });
979
+ const path = filePath;
980
+ await element.screenshot({ path });
984
981
  }
985
982
  catch (err) {
986
983
  log.error(`pageScreenshot error: ${err.message}`);
@@ -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, { 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: number,\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 number of pages to include into the automation\n */\nexport async function randomActivateAudio(\n sessions: Map<number, Session>,\n randomAudioPeriod: number,\n randomAudioProbability: number,\n randomAudioRange: number,\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 (randomAudioRange) {\n if (session.id > randomAudioRange) {\n break\n }\n sessionPages.splice(randomAudioRange - session.id)\n }\n pages = pages.concat(sessionPages)\n }\n // Remove pages with no audio tracks.\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 //\n const index = Math.floor(Math.random() * pagesWithAudio.length)\n const enable = Math.round(100 * Math.random()) <= randomAudioProbability\n log.debug('randomActivateAudio %j', {\n pages: pagesWithAudio.length,\n randomAudioProbability,\n index,\n enable,\n })\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}\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 let start = 0\n let end = 0\n let total = 0\n if (response.headers['content-range']) {\n log.debug(`downloadUrl ${response.data.length} bytes, content-range=${response.headers['content-range']}`)\n const contentRange = response.headers['content-range'].split('/')\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 }\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 config = loadConfig()\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): 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: ['ignore', 'pipe', 'pipe'],\n detached: true,\n })\n let stdout = ''\n let stderr = ''\n p.stdout.on('data', data => {\n if (maxBuffer && stdout.length > maxBuffer) {\n stdout = stdout.slice(data.length)\n }\n stdout += data\n })\n p.stderr.on('data', data => {\n if (maxBuffer && stderr.length > maxBuffer) {\n stderr = stderr.slice(data.length)\n }\n stderr += data\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(): void {\n log.debug(`[${this.name}-scheduler] start`)\n this.running = true\n this.scheduleNext()\n }\n\n stop(): void {\n log.debug(`[${this.name}-scheduler] stop`)\n this.running = false\n if (this.statsTimeoutId) {\n clearTimeout(this.statsTimeoutId)\n }\n }\n\n private scheduleNext(): void {\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 await element.screenshot({ path: filePath })\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'\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 // Remove pages with no audio tracks.\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 //\n const index = Math.floor(Math.random() * pagesWithAudio.length)\n const enable = Math.round(100 * Math.random()) <= randomAudioProbability\n log.debug('randomActivateAudio %j', {\n pages: pagesWithAudio.length,\n randomAudioProbability,\n index,\n enable,\n })\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}\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 let start = 0\n let end = 0\n let total = 0\n if (response.headers['content-range']) {\n log.debug(`downloadUrl ${response.data.length} bytes, content-range=${response.headers['content-range']}`)\n const contentRange = response.headers['content-range'].split('/')\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 }\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 config = loadConfig()\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): 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: ['ignore', 'pipe', 'pipe'],\n detached: true,\n })\n let stdout = ''\n let stderr = ''\n p.stdout.on('data', data => {\n if (maxBuffer && stdout.length > maxBuffer) {\n stdout = stdout.slice(data.length)\n }\n stdout += data\n })\n p.stderr.on('data', data => {\n if (maxBuffer && stderr.length > maxBuffer) {\n stderr = stderr.slice(data.length)\n }\n stderr += data\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(): void {\n log.debug(`[${this.name}-scheduler] start`)\n this.running = true\n this.scheduleNext()\n }\n\n stop(): void {\n log.debug(`[${this.name}-scheduler] stop`)\n this.running = false\n if (this.statsTimeoutId) {\n clearTimeout(this.statsTimeoutId)\n }\n }\n\n private scheduleNext(): void {\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"]}
package/build/src/vmaf.js CHANGED
@@ -380,7 +380,7 @@ async function runVmaf(referencePath, degradedPath, preview, cropConfig = {}, cr
380
380
  const comparisonPath = path_1.default.join(comparisonDir, comparisonName, 'comparison.mp4');
381
381
  const sender = path_1.default.basename(referencePath).replace('.ivf', '');
382
382
  const receiver = path_1.default.basename(degradedPath).replace('.ivf', '').split('_recv-by_')[1];
383
- const { frameRate: refFrameRate, frames: refFrames } = await parseIvf(referencePath, false);
383
+ const { width: refWidth, height: refHeight, frameRate: refFrameRate, frames: refFrames, } = await parseIvf(referencePath, false);
384
384
  const { width: degWidth, height: degHeight, frameRate: degFrameRate, frames: degFrames, } = await parseIvf(degradedPath, false);
385
385
  const textHeight = cropTimeOverlay ? '(ih/15)' : '';
386
386
  if (textHeight) {
@@ -418,13 +418,19 @@ async function runVmaf(referencePath, degradedPath, preview, cropConfig = {}, cr
418
418
  -i ${degradedPath} \
419
419
  -i ${referencePath} \
420
420
  `;
421
+ let cropWidth = 0;
422
+ const refFactor = refWidth / refHeight;
423
+ const degFactor = degWidth / degHeight;
424
+ if (refFactor > degFactor) {
425
+ cropWidth = Math.round(degFactor * refHeight);
426
+ }
421
427
  const filter = `\
422
428
  [0:v]\
423
- scale=w=-1:h=${degHeight}:flags=bicubic,\
429
+ scale=w=-1:h=${refHeight}:flags=bicubic,${cropWidth ? `crop=w=${cropWidth}:x=(iw-${cropWidth})/2,` : ''}\
424
430
  ${cropFilter(crop.deg, 0, ',')}\
425
431
  ${splitFilter(['deg_vmaf', 'deg_psnr', preview ? 'deg_preview' : ''])};\
426
432
  [1:v]\
427
- scale=w=-1:h=${degHeight}:flags=bicubic,crop=w=${degWidth}:x=(iw-${degWidth})/2,\
433
+ scale=w=-1:h=${refHeight}:flags=bicubic,\
428
434
  ${cropFilter(crop.ref, 0, ',')}\
429
435
  ${splitFilter(['ref_vmaf', 'ref_psnr', preview ? 'ref_preview' : ''])};\
430
436
  [deg_vmaf][ref_vmaf]libvmaf=model='path=/usr/share/model/vmaf_v0.6.1.json':log_fmt=json:log_path=${vmafLogPath}:n_subsample=1:n_threads=${cpus}:shortest=1[vmaf];\
@@ -470,8 +476,11 @@ ${splitFilter(['ref_vmaf', 'ref_psnr', preview ? 'ref_preview' : ''])};\
470
476
  }
471
477
  }
472
478
  async function writeGraph(vmafLogPath) {
479
+ const { CategoryScale, Chart, LinearScale, LineController, LineElement, PointElement, Legend, Title,
480
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
481
+ } = require('chart.js');
473
482
  // eslint-disable-next-line @typescript-eslint/no-require-imports
474
- const { ChartJSNodeCanvas } = require('chartjs-node-canvas');
483
+ const { Canvas } = require('skia-canvas');
475
484
  const vmafLog = JSON.parse(await fs_1.default.promises.readFile(vmafLogPath, 'utf-8'));
476
485
  const { min, max, mean } = vmafLog.pooled_metrics.vmaf;
477
486
  const fpath = vmafLogPath.replace('.json', '.png');
@@ -494,12 +503,9 @@ async function writeGraph(vmafLogPath) {
494
503
  return prev;
495
504
  }, [])
496
505
  .map(d => ({ x: d.x, y: d.y / d.count }));
497
- const chartJSNodeCanvas = new ChartJSNodeCanvas({
498
- width: 1280,
499
- height: 720,
500
- backgroundColour: 'white',
501
- });
502
- const buffer = await chartJSNodeCanvas.renderToBuffer({
506
+ Chart.register([CategoryScale, LineController, LineElement, LinearScale, PointElement, Legend, Title]);
507
+ const canvas = new Canvas(1280, 720);
508
+ const chart = new Chart(canvas, {
503
509
  type: 'line',
504
510
  data: {
505
511
  labels: data.map(d => d.x),
@@ -518,7 +524,7 @@ async function writeGraph(vmafLogPath) {
518
524
  plugins: {
519
525
  title: {
520
526
  display: true,
521
- text: path_1.default.basename(vmafLogPath).replace('.vmaf.json', '').replace(/_/g, ' '),
527
+ text: path_1.default.basename(path_1.default.dirname(vmafLogPath)).replace(/_/g, ' '),
522
528
  },
523
529
  },
524
530
  scales: {
@@ -529,7 +535,8 @@ async function writeGraph(vmafLogPath) {
529
535
  },
530
536
  },
531
537
  });
532
- await fs_1.default.promises.writeFile(fpath, buffer);
538
+ await canvas.saveAs(fpath, { format: 'png', matte: 'white' });
539
+ chart.destroy();
533
540
  }
534
541
  const fixCrop = (c) => {
535
542
  return {