offerCall method

dynamic offerCall({
  1. required CallType callType,
  2. required String callee,
  3. RTCVideoRenderer? localRenderer,
  4. RTCVideoRenderer? remoteRenderer,
})

Implementation

offerCall(
    {required CallType callType,
    required String callee,
    RTCVideoRenderer? localRenderer,
    RTCVideoRenderer? remoteRenderer}) async {
  Completer completer = Completer();
  if (remoteRenderer != null) {
    _remoteRenderer = remoteRenderer;
    await _remoteRenderer.initialize();
  }

  try {
    if (_state != CallState.sessionState) {
      completer.completeError({
        'error': 'The state that cannot make an offer call, state $_state'
      });
      return;
    }
    if (_userId == null) {
      completer.completeError({'error': "Invalid user id that cannot make an offer call : $_userId"});
    }

    if (callee.length > 128 || callee.isEmpty) {
      completer.completeError({'error': 'Invalid callee'});
      return;
    }

    if (callee == _userId) {
      completer.completeError({'error': 'Cannot offer call to yourself'});
      return;
    }

    if (callType == CallType.unknown) {
      completer.completeError({'error': 'Invalid call type'});
      return;
    }

    if (callType == CallType.videocall &&
        (localRenderer == null || remoteRenderer == null)) {
      completer.completeError(
          {'error': 'Invalid parameter. Video call type needs renderers'});
      return;
    }

    var offerCallResult = await _ws.requestOfferCall(
        callType, _userId!, callee, false);

    if (offerCallResult['room_id'] != null) {
      _roomId = offerCallResult['room_id'];
    } else {
      RoomType roomType;
      switch (callType) {
        case CallType.audiocall:
          roomType = RoomType.audiocall;
          break;
        case CallType.videocall:
          roomType = RoomType.videocall;
          break;
        case CallType.sipcall:
          roomType = RoomType.sipcall;
          break;
        default:
          roomType = RoomType.audiocall;
      }

      var createRoomResult = await createRoom(roomType: roomType);
      _roomId = createRoomResult['room_id'];
    }

    await joinRoom(roomId: _roomId!);

    if (callType == CallType.videocall) {
      await _videoPublisher?.publish(localRenderer!);
      _videoPublishFlag = true;
    }
    var userResult = IResponseOfferCall(offerCallResult).toMap();
    completer.complete(userResult);
    return completer.future;
  } catch (error) {
    completer.completeError(error);
  }
}