UNPKG

browsertime

Version:

Get performance metrics from your web page using Browsertime.

107 lines (100 loc) 2.96 kB
import get from 'lodash.get'; import intel from 'intel'; import { start as throttleStart, stop as throttleStop } from '@sitespeed.io/throttle'; const log = intel.getLogger('browsertime.connectivity'); import { Humble } from './humble.js'; import { parseTrafficShapeConfig } from './trafficShapeParser.js'; let humble; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } export async function addConnectivity(options) { const profile = parseTrafficShapeConfig(options); if (!profile) { return; } const connectivity = options.connectivity; switch (connectivity.engine) { case 'external': { return; } case 'throttle': { if (options.docker) { if (options.connectivity && options.connectivity.profile) { log.info( 'Setting connectivity profile %s', options.connectivity.profile ); } } else { // The log message is confusing if you run in Docker since // there's nothing you can do about it if (options.connectivity && options.connectivity.profile) { log.info( 'Changing network interfaces needs sudo rights. Setting connectivity profile %s', options.connectivity.profile ); } else { log.info('Changing network interfaces needs sudo rights.'); } } const setOnLocalHost = get(connectivity, 'throttle.localhost', false); const rtt = profile.variance ? getRandomIntInclusive( profile.rtt, Math.ceil(profile.rtt * (profile.variance / 100 + 1)) ) : profile.rtt; if (profile.variance) { log.info( 'Using random variance %s% setting the latency to %s (configured %s)', profile.variance, rtt, profile.rtt ); } return setOnLocalHost ? throttleStart({ localhost: true, rtt }) : throttleStart({ up: profile.up, down: profile.down, rtt }); } case 'humble': { humble = new Humble(options); return humble.start(profile); } } } export function getConnectivitySettings(options) { return parseTrafficShapeConfig(options); } export async function removeConnectivity(options) { const profile = parseTrafficShapeConfig(options); if (!profile) { return; } const connectivity = options.connectivity; switch (connectivity.engine) { case 'external': { return; } case 'throttle': { const setOnLocalHost = get(connectivity, 'throttle.localhost', false); return throttleStop({ localhost: setOnLocalHost }); } case 'humble': { return humble.stop(); } } }