UNPKG

@twilio/voice-sdk

Version:
67 lines 4.03 kB
/** * @packageDocumentation * @module Voice * @internalapi */ const r0 = 94.768; // Constant used in computing "rFactor". /** * Calculate the mos score of a stats object * @param {number} rtt * @param {number} jitter * @param {number} fractionLost - The fraction of packets that have been lost. * Calculated by packetsLost / totalPackets * @return {number | null} mos - Calculated MOS, `1.0` through roughly `4.5`. * Returns `null` when any of the input parameters are not a `non-negative` * number. */ export function calculate(rtt, jitter, fractionLost) { if (typeof rtt !== 'number' || typeof jitter !== 'number' || typeof fractionLost !== 'number' || !isNonNegativeNumber(rtt) || !isNonNegativeNumber(jitter) || !isNonNegativeNumber(fractionLost)) { return null; } // Compute the effective latency. const effectiveLatency = rtt + (jitter * 2) + 10; // Compute the initial "rFactor" from effective latency. let rFactor = 0; switch (true) { case effectiveLatency < 160: rFactor = r0 - (effectiveLatency / 40); break; case effectiveLatency < 1000: rFactor = r0 - ((effectiveLatency - 120) / 10); break; } // Adjust "rFactor" with the fraction of packets lost. switch (true) { case fractionLost <= (rFactor / 2.5): rFactor = Math.max(rFactor - fractionLost * 2.5, 6.52); break; default: rFactor = 0; break; } // Compute MOS from "rFactor". const mos = 1 + (0.035 * rFactor) + (0.000007 * rFactor) * (rFactor - 60) * (100 - rFactor); return mos; } /** * Returns true if and only if the parameter passed is a number, is not `NaN`, * is finite, and is greater than or equal to `0`. * @param n */ export function isNonNegativeNumber(n) { return typeof n === 'number' && !isNaN(n) && isFinite(n) && n >= 0; } export default { calculate, isNonNegativeNumber, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3R3aWxpby9ydGMvbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyx3Q0FBd0M7QUFFM0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsR0FBUSxFQUNSLE1BQVcsRUFDWCxZQUFpQjtJQUVqQixJQUNFLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFDdkIsT0FBTyxNQUFNLEtBQUssUUFBUTtRQUMxQixPQUFPLFlBQVksS0FBSyxRQUFRO1FBQ2hDLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1FBQ3pCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQzVCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQ2xDO1FBQ0EsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELGlDQUFpQztJQUNqQyxNQUFNLGdCQUFnQixHQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFekQsd0RBQXdEO0lBQ3hELElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztJQUN4QixRQUFRLElBQUksRUFBRTtRQUNaLEtBQUssZ0JBQWdCLEdBQUcsR0FBRztZQUN6QixPQUFPLEdBQUcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTTtRQUNSLEtBQUssZ0JBQWdCLEdBQUcsSUFBSTtZQUMxQixPQUFPLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvQyxNQUFNO0tBQ1Q7SUFFRCxzREFBc0Q7SUFDdEQsUUFBUSxJQUFJLEVBQUU7UUFDWixLQUFLLFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDbEMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLFlBQVksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsTUFBTTtRQUNSO1lBQ0UsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNaLE1BQU07S0FDVDtJQUVELDhCQUE4QjtJQUM5QixNQUFNLEdBQUcsR0FBVyxDQUFDO1FBQ25CLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztRQUNqQixDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDcEIsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2QsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFFbEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxDQUFNO0lBQ3hDLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxlQUFlO0lBQ2IsU0FBUztJQUNULG1CQUFtQjtDQUNwQixDQUFDIn0=