handleMessage method

  1. @override
Future<void> handleMessage(
  1. SignalingMessage message
)
override

Implementation

@override
Future<void> handleMessage(SignalingMessage message) async {
  final payload = message.payload['payload'];

  switch (message.type) {
    case SignalingMessageType.offer:
      if (isOfferer ||
          pc != null &&
              (await pc!.getSignalingState()) != SignalingState.stable) {
        print("Ignoring redundant offer or offer during active negotiation.");
        return;
      }
      if (pc == null) await initialize();
      await pc!.setRemoteDescription(
        SessionDescription(sdp: payload['sdp'], type: SdpType.offer),
      );
      hasRemoteDescription = true;

      // Process pending candidates
      for (var cand in _pendingCandidates) {
        await pc!.addIceCandidate(
          IceCandidate(
            candidate: cand['candidate'],
            sdpMid: cand['sdpMid'],
            sdpMLineIndex: cand['sdpMLineIndex'],
          ),
        );
      }
      _pendingCandidates.clear();

      final answer = await pc!.createAnswer();
      await pc!.setLocalDescription(answer);
      sendSignal(SignalingMessageType.answer, {
        'sdp': answer.sdp,
        'type': answer.type.name,
      });
      break;
    case SignalingMessageType.answer:
      await pc!.setRemoteDescription(
        SessionDescription(sdp: payload['sdp'], type: SdpType.answer),
      );
      hasRemoteDescription = true;

      // Process pending candidates
      for (var cand in _pendingCandidates) {
        await pc!.addIceCandidate(
          IceCandidate(
            candidate: cand['candidate'],
            sdpMid: cand['sdpMid'],
            sdpMLineIndex: cand['sdpMLineIndex'],
          ),
        );
      }
      _pendingCandidates.clear();
      break;
    case SignalingMessageType.candidate:
      if (!hasRemoteDescription || pc == null) {
        _pendingCandidates.add(payload);
      } else {
        await pc!.addIceCandidate(
          IceCandidate(
            candidate: payload['candidate'],
            sdpMid: payload['sdpMid'],
            sdpMLineIndex: payload['sdpMLineIndex'],
          ),
        );
      }
      break;
    default:
      break;
  }
}