async checkAudioConnectivity()

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;
  }