infobip-rtc
Version:
Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation
53 lines • 2.22 kB
JavaScript
import { NetworkQualityStatistics } from "../../../log/monitor/media/NetworkQualityStatistics";
import * as log from "loglevel";
export class NetworkQualityMonitor {
constructor() {
this.OBSERVE_INTERVAL = 5;
this.previousQuality = NetworkQualityStatistics.forMos(5);
this.currentQuality = NetworkQualityStatistics.forMos(5);
this.qualityMeasurementsBuffer = [];
}
observe(networkQualityStatistics) {
let newMos = networkQualityStatistics.mos;
if (newMos == null || newMos <= 0 || newMos > 5) {
return log.warn(`Invalid MOS value: ${newMos} for statistics: ${JSON.stringify(networkQualityStatistics)}`);
}
if (this.isQualityMeasurementsBufferFull()) {
this.qualityMeasurementsBuffer = [];
}
this.qualityMeasurementsBuffer.push(networkQualityStatistics);
if (this.isQualityMeasurementsBufferFull()) {
this.previousQuality = this.currentQuality;
this.currentQuality = NetworkQualityStatistics.forMos(this.getCurrentMos());
}
}
current() {
return this.currentQuality;
}
localNetworkChanged() {
if (this.observationInProgress()) {
return false;
}
return this.previousQuality.networkQuality !== this.currentQuality.networkQuality;
}
remoteNetworkChanged() {
if (this.observationInProgress()) {
return false;
}
return (this.currentQuality.mos <= 3.6 && this.previousQuality.mos > 3.6) ||
(this.currentQuality.mos > 3.6 && this.previousQuality.mos <= 3.6);
}
isQualityMeasurementsBufferFull() {
return this.qualityMeasurementsBuffer.length === this.OBSERVE_INTERVAL;
}
getCurrentMos() {
let allIntervalsMosSum = this.qualityMeasurementsBuffer
.map(networkQualityStatistic => networkQualityStatistic.mos)
.reduce((a, b) => a + b);
return Math.round((allIntervalsMosSum / this.OBSERVE_INTERVAL + Number.EPSILON) * 100) / 100;
}
observationInProgress() {
return this.qualityMeasurementsBuffer.length < this.OBSERVE_INTERVAL;
}
}
//# sourceMappingURL=NetworkQualityMonitor.js.map