connect method

Future<void> connect()

Implementation

Future<void> connect() async {
  try {
    setState(WhipState.kConnecting);
    var desc = await pc!.createOffer({});

    if (mode == WhipMode.kSend && videoCodec != null) {
      setPreferredCodec(desc, videoCodec: videoCodec!);
    }

    await pc!.setLocalDescription(desc);

    var offer = await pc!.getLocalDescription();
    final sdp = offer!.sdp;
    log.debug('Sending offer: $sdp');
    var respose = await httpPost(Uri.parse(url),
        headers: {
          'Content-Type': 'application/sdp',
          if (headers != null) ...headers!
        },
        body: sdp);

    if (respose.statusCode != 200 && respose.statusCode != 201) {
      throw Exception('Failed to send offer: ${respose.statusCode}');
    }

    log.debug('Resource URL: $resourceURL');
    final answer = RTCSessionDescription(respose.body, 'answer');
    log.debug('Received answer: ${answer.sdp}');
    await pc!.setRemoteDescription(answer);
    setState(WhipState.kConnected);

    resourceURL = respose.headers['location'];
    if (resourceURL == null) {
      resourceURL = url;
      log.warn('Resource url not found, use $url as resource url!');
    } else {
      if (resourceURL!.startsWith('/')) {
        var uri = Uri.parse(url);
        resourceURL = '${uri.origin}$resourceURL';
      }
    }
  } catch (e) {
    log.error('connect error: $e');
    setState(WhipState.kFailure);
    lastError = e;
  }
}