UNPKG

@observertc/client-monitor-js

Version:

ObserveRTC Client Integration Javascript Library

1 lines 2.5 kB
export class CongestionDetector{peerConnection;name="congestion-detector";_maxAvailableIncomingBitrate=0;_maxReceivingBitrate=0;_maxAvailableOutgoingBitrate=0;_maxSendingBitrate=0;constructor(t){this.peerConnection=t}get config(){return this.peerConnection.parent.config.congestionDetector}update(){if(this.config.disabled)return;let t=!1;for(const e of this.peerConnection.outboundRtps)t||="bandwidth"===e.qualityLimitationReason;let e=0;void 0!==this.peerConnection.avgRttInSec&&void 0!==this.peerConnection.ewmaRttInSec&&(e=Math.abs(this.peerConnection.avgRttInSec-this.peerConnection.ewmaRttInSec));let i=!1;switch(this.config.sensitivity){case"high":i=t;break;case"medium":{if(!this.peerConnection.ewmaRttInSec)break;const n=Math.min(.15,Math.max(.05,.33*this.peerConnection.ewmaRttInSec));i=t&&e>n;break}case"low":if(!this.peerConnection.ewmaRttInSec||!this.peerConnection.outboundFractionLost)break;i=t&&this.peerConnection.outboundFractionLost>.05}const n=this.peerConnection.totalAvailableIncomingBitrate,a=this.peerConnection.totalAvailableOutgoingBitrate;if(!i)return this.peerConnection.congested&&(this.peerConnection.congested=!1),this._maxAvailableIncomingBitrate=Math.max(this._maxAvailableIncomingBitrate,n),this._maxAvailableOutgoingBitrate=Math.max(this._maxAvailableOutgoingBitrate,a),this._maxReceivingBitrate=Math.max(this._maxReceivingBitrate,this.peerConnection.receivingBitrate),void(this._maxSendingBitrate=Math.max(this._maxSendingBitrate,this.peerConnection.sendingBitrate));this.peerConnection.congested||(this.peerConnection.congested=!0,this.peerConnection.parent.emit("congestion",{clientMonitor:this.peerConnection.parent,peerConnectionMonitor:this.peerConnection,availableIncomingBitrate:n,availableOutgoingBitrate:a,maxAvailableIncomingBitrate:this._maxAvailableIncomingBitrate,maxAvailableOutgoingBitrate:this._maxAvailableOutgoingBitrate,maxReceivingBitrate:this._maxSendingBitrate,maxSendingBitrate:this._maxSendingBitrate}),this.config.createIssue&&this.peerConnection.parent.addIssue({type:"congestion",payload:{peerConnectionId:this.peerConnection.peerConnectionId,availableIncomingBitrate:n,availableOutgoingBitrate:a,maxAvailableIncomingBitrate:this._maxAvailableIncomingBitrate,maxAvailableOutgoingBitrate:this._maxAvailableOutgoingBitrate,maxReceivingBitrate:this._maxReceivingBitrate,maxSendingBitrate:this._maxSendingBitrate}}),this._maxAvailableIncomingBitrate=0,this._maxAvailableOutgoingBitrate=0,this._maxReceivingBitrate=0,this._maxSendingBitrate=0)}}