@observertc/client-monitor-js
Version:
ObserveRTC Client Integration Javascript Library
1 lines • 3.11 kB
JavaScript
import{ClientEventTypes as e}from"../schema/ClientEventTypes";export class CaptureFailureDetector{trackMonitor;static ENDED_ISSUE_TYPE="capture-track-ended";static SILENT_ISSUE_TYPE="silent-audio-source";name="capture-failure-detector";disabled=!1;_endedIssueKey;_silentIssueKey;_endedReported=!1;_lastMuted;_silentSince;_silentOn=!1;_silentStartedAt;constructor(e){this.trackMonitor=e,this._endedIssueKey=`${CaptureFailureDetector.ENDED_ISSUE_TYPE}-track-${e.track.id}`,this._silentIssueKey=`${CaptureFailureDetector.SILENT_ISSUE_TYPE}-track-${e.track.id}`}get config(){return this.peerConnection.parent.config.captureFailureDetector}get peerConnection(){return this.trackMonitor.getPeerConnection()}update(){this.disabled||(this._checkEnded(),this._checkMuted(),this._checkSilence())}_checkEnded(){const t=this.trackMonitor.track;if("ended"!==t.readyState)return;if(this._endedReported)return;this._endedReported=!0;const i=this.peerConnection.parent;i.emit("capture-track-ended",{clientMonitor:i,trackMonitor:this.trackMonitor}),i.raiseIssue(this._endedIssueKey,{type:CaptureFailureDetector.ENDED_ISSUE_TYPE,payload:{peerConnectionId:this.peerConnection.peerConnectionId,trackId:t.id,kind:t.kind,deviceLabel:t.label}}),!1!==this.config.createEvent&&i.addEvent({type:e.CAPTURE_TRACK_ENDED,payload:{peerConnectionId:this.peerConnection.peerConnectionId,trackId:t.id,kind:t.kind,deviceLabel:t.label}})}_checkMuted(){const t=this.trackMonitor.track,i=!0===t.muted;if(this._lastMuted===i)return;const n=void 0!==this._lastMuted;if(this._lastMuted=i,!n||!i)return;const r=this.peerConnection.parent;r.emit("capture-track-muted",{clientMonitor:r,trackMonitor:this.trackMonitor}),!1!==this.config.createEvent&&r.addEvent({type:e.CAPTURE_TRACK_MUTED,payload:{peerConnectionId:this.peerConnection.peerConnectionId,trackId:t.id,kind:t.kind,deviceLabel:t.label}})}_checkSilence(){if("audio"!==this.trackMonitor.kind)return;const e=this.trackMonitor.track,t=this.trackMonitor.getMediaSource();if("live"!==e.readyState||e.muted||!e.enabled)return this._clearSilence("track not capturing");const i=t?.rmsAudioLevel;if(void 0===i)return;if(this.config.silenceRmsThreshold<i)return this._clearSilence("audio detected");const n=Date.now();this._silentSince??=n;const r=n-this._silentSince;if(this._silentOn)return;if(r<this.config.silenceThresholdInMs)return;this._silentOn=!0,this._silentStartedAt=n;const s=this.peerConnection.parent;s.emit("silent-audio-source",{clientMonitor:s,trackMonitor:this.trackMonitor,silentForInMs:r}),s.raiseIssue(this._silentIssueKey,{type:CaptureFailureDetector.SILENT_ISSUE_TYPE,payload:{peerConnectionId:this.peerConnection.peerConnectionId,trackId:e.id,rmsAudioLevel:i,silentForInMs:r,deviceLabel:e.label}})}_clearSilence(e){if(this._silentSince=void 0,!this._silentOn)return;this._silentOn=!1;const t=this.peerConnection.parent,i=t.activeIssues.get(this._silentIssueKey);let n;i&&(n={...i.payload,durationInMs:this._silentStartedAt?Date.now()-this._silentStartedAt:void 0}),t.resolveIssue(this._silentIssueKey,{comment:e,payload:n,resolvedAt:Date.now()}),this._silentStartedAt=void 0}}