joinRoom method

Future<void> joinRoom()

Implementation

Future<void> joinRoom() async {
  try {
    _mediaDevice = Device();

    dynamic routerRtpCapabilities =
        await _webSocket!.socket.request("getRouterRtpCapabilities", {});
    final rtpCapabilities = RtpCapabilities.fromMap(routerRtpCapabilities);
    rtpCapabilities.headerExtensions
        .removeWhere((element) => element.uri == "urn:3gpp:video-orientation");
    await _mediaDevice!.load(routerRtpCapabilities: rtpCapabilities);

    if (_mediaDevice!.canProduce(RTCRtpMediaType.RTCRtpMediaTypeVideo) ||
        _mediaDevice!.canProduce(RTCRtpMediaType.RTCRtpMediaTypeAudio)) _canProduce = true;

    if (_canProduce) {
      Map transportInfo = await _webSocket!.socket.request("createWebRtcTransport", {
        "forceTcp": false,
        "producing": true,
        "consuming": false,
        "sctpCapabilities": _mediaDevice!.sctpCapabilities.toMap(),
      });

      _sendTransport = _mediaDevice!
          .createSendTransportFromMap(transportInfo, producerCallback: _producerCallback);

      // sendTransport event
      _sendTransport!.on("connect", (Map data) {
        _webSocket!.socket
            .request("connectWebRtcTransport", {
              "transportId": _sendTransport!.id,
              "dtlsParameters": data["dtlsParameters"].toMap(),
            })
            .then(data["callback"])
            .catchError(data["errback"]);
      });

      _sendTransport!.on("produce", (Map data) async {
        try {
          Map response = await _webSocket!.socket.request("produce", {
            "transportId": _sendTransport!.id,
            "kind": data["kind"],
            "rtpParameters": data["rtpParameters"].toMap(),
            if (data['appData'] != null) "appData": Map<String, dynamic>.from(data["appData"])
          });
          data["callback"](response["id"]);
        } catch (error) {
          data["errback"](error);
        }
      });

      _sendTransport!.on("producedata", (Map data) async {
        try {
          Map response = await _webSocket!.socket.request("produceData", {
            "transportId": _sendTransport!.id,
            "sctpStreamParameters": data["sctpStreamParameters"].toMap(),
            "label": data["label"],
            "protocol": data["protocol"],
            "appData": data["appData"],
          });
          data["callback"](response["id"]);
        } catch (error) {
          data["errback"](error);
        }
      });
    }

    if (_canConsume) {
      Map transportInfo = await _webSocket!.socket.request(
        "createWebRtcTransport",
        {
          "forceTcp": false,
          "producing": false,
          "consuming": true,
          "sctpCapabilities": _mediaDevice!.sctpCapabilities.toMap(),
        },
      );

      _recvTransport = _mediaDevice!
          .createRecvTransportFromMap(transportInfo, consumerCallback: _consumerCallback);

      _recvTransport!.on("connect", (Map data) {
        _webSocket!.socket
            .request("connectWebRtcTransport", {
              "transportId": _recvTransport!.id,
              "dtlsParameters": data["dtlsParameters"].toMap()
            })
            .then(data["callback"])
            .catchError(data["errback"]);
      });
    }

    Map response = await _webSocket!.socket.request("join", {
      "displayName": peerName,
      "device": {"name": "Flutter", "flag": "flutter", "version": "0.8.0"},
      "rtpCapabilities": _mediaDevice!.rtpCapabilities.toMap(),
      "sctpCapabilities": _mediaDevice!.sctpCapabilities.toMap(),
    });

    response["peers"].forEach((value) {
      peersDataHolder!.peerAdd(value);
    });

    // if(_canProduce) {
    //   enableWebCam();
    //   enableMic();
    // }
  } catch (error) {
    rethrow;
  }
}