in src/meetingreadinesschecker/DefaultMeetingReadinessChecker.ts [271:333]
async checkAudioConnectivity(audioInputDevice: Device): Promise<CheckAudioConnectivityFeedback> {
let audioPresence = false;
const audioConnectivityMetrics = {
packetsReceived: 0,
};
const audioVideo = this.meetingSession.audioVideo;
const checkAudioConnectivityMetricsObserver: AudioVideoObserver = {
metricsDidReceive(clientMetricReport: ClientMetricReport) {
clientMetricReport.getRTCStatsReport().forEach(report => {
// TODO: remove mediaType in next version as it is deprecated
// mediaType was deprecated and replaced with kind
if (
report.type === 'inbound-rtp' &&
(report.mediaType === 'audio' || report.kind === 'audio')
) {
audioConnectivityMetrics.packetsReceived = report.packetsReceived;
}
});
},
};
const attendeePresenceHandler = (
attendeeId: string,
present: boolean,
_externalUserId: string,
_dropped: boolean
): void => {
if (attendeeId === this.meetingSession.configuration.credentials.attendeeId && present) {
audioPresence = true;
}
};
try {
await audioVideo.startAudioInput(audioInputDevice);
} catch (error) {
this.logger.error(
`MeetingReadinessChecker: Failed to get audio input device with error ${error}`
);
if (error instanceof PermissionDeniedError) {
return CheckAudioConnectivityFeedback.AudioInputPermissionDenied;
}
return CheckAudioConnectivityFeedback.AudioInputRequestFailed;
}
audioVideo.realtimeSubscribeToAttendeeIdPresence(attendeePresenceHandler);
audioVideo.addObserver(checkAudioConnectivityMetricsObserver);
if (!(await this.startMeeting())) {
audioVideo.removeObserver(checkAudioConnectivityMetricsObserver);
audioVideo.realtimeUnsubscribeToAttendeeIdPresence(attendeePresenceHandler);
await this.meetingSession.audioVideo.stopAudioInput();
return CheckAudioConnectivityFeedback.ConnectionFailed;
}
await this.executeTimeoutTask(async () => {
return this.isAudioConnectionSuccessful(audioPresence, audioConnectivityMetrics);
});
audioVideo.removeObserver(checkAudioConnectivityMetricsObserver);
audioVideo.realtimeUnsubscribeToAttendeeIdPresence(attendeePresenceHandler);
await this.stopMeeting();
await this.meetingSession.audioVideo.stopAudioInput();
return this.isAudioConnectionSuccessful(audioPresence, audioConnectivityMetrics)
? CheckAudioConnectivityFeedback.Succeeded
: CheckAudioConnectivityFeedback.AudioNotReceived;
}