UNPKG

@observertc/client-monitor-js

Version:

ObserveRTC Client Integration Javascript Library

1 lines 1.6 kB
export class AudioDesyncDetector{trackMonitor;static ISSUE_TYPE="audio-desync";name="audio-desync-detector";disabled=!1;issueKey;constructor(e){this.trackMonitor=e,this.issueKey=`${AudioDesyncDetector.ISSUE_TYPE}-track-${e.track.id}`}_startedDesyncAt;_prevCorrectedSamples=0;get config(){return this.peerConnection.parent.config.audioDesyncDetector}get peerConnection(){return this.trackMonitor.getPeerConnection()}update(){if(this.disabled)return;const e=this.trackMonitor.getInboundRtp();if(!e||"audio"!==e.kind)return;const t=(e.insertedSamplesForDeceleration??0)+(e.removedSamplesForAcceleration??0)-this._prevCorrectedSamples;if(t<1||(e.receivingAudioSamples??0)<1)return;const o=t/(t+(e.receivingAudioSamples??0)),r=e.desync;e.desync?o<this.config.fractionalCorrectionAlertOffThreshold&&(e.desync=!1):e.desync=this.config.fractionalCorrectionAlertOnThreshold<o,e.desync?r||this._raise({peerConnectionId:this.peerConnection.peerConnectionId,trackId:this.trackMonitor.track.id,dCorrectedSamples:t,fractionalCorrection:o}):r&&this._resolve("Audio desync resolved after ")}_raise(e){this._startedDesyncAt=Date.now();const t=this.peerConnection.parent;t.emit("audio-desync-track",{clientMonitor:t,trackMonitor:this.trackMonitor}),t.raiseIssue(this.issueKey,{type:AudioDesyncDetector.ISSUE_TYPE,payload:e})}_resolve(e){const t=this.peerConnection.parent,o=t.activeIssues.get(this.issueKey);let r;o&&(r={...o.payload,durationInMs:this._startedDesyncAt?Date.now()-this._startedDesyncAt:void 0}),t.resolveIssue(this.issueKey,{comment:e,payload:r,resolvedAt:Date.now()}),this._startedDesyncAt=void 0}}