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