@observertc/client-monitor-js
Version:
ObserveRTC Client Integration Javascript Library
1 lines • 3.05 kB
JavaScript
export class CongestionDetector{peerConnection;static ISSUE_TYPE="congestion";name="congestion-detector";disabled=!1;_maxAvailableIncomingBitrate=0;_maxReceivingBitrate=0;_maxAvailableOutgoingBitrate=0;_maxSendingBitrate=0;issueKey;_startedCongestionAt;constructor(t){this.peerConnection=t,this.issueKey=`${CongestionDetector.ISSUE_TYPE}-pc-${t.peerConnectionId}`}get config(){return this.peerConnection.parent.config.congestionDetector}update(){if(this.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._resolve("congestion ended")),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._maxReceivingBitrate,maxSendingBitrate:this._maxSendingBitrate}),this._raise({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)}_raise(t){this._startedCongestionAt=Date.now(),this.peerConnection.parent.raiseIssue(this.issueKey,{type:CongestionDetector.ISSUE_TYPE,payload:t})}_resolve(t){const e=this.peerConnection.parent,i=e.activeIssues.get(this.issueKey);let n;i&&(n={...i.payload,durationInMs:this._startedCongestionAt?Date.now()-this._startedCongestionAt:void 0}),e.resolveIssue(this.issueKey,{comment:t,payload:n,resolvedAt:Date.now()}),this._startedCongestionAt=void 0}}