diff --git a/lib/helpers/events_helper.dart b/lib/helpers/events_helper.dart index 4ab2320..62b0740 100644 --- a/lib/helpers/events_helper.dart +++ b/lib/helpers/events_helper.dart @@ -3,6 +3,8 @@ import 'dart:async'; import 'package:comunic/models/comment.dart'; import 'package:comunic/models/conversation_message.dart'; import 'package:event_bus/event_bus.dart'; +import 'package:flutter_webrtc/rtc_ice_candidate.dart'; +import 'package:flutter_webrtc/rtc_session_description.dart'; /// Events helper /// @@ -86,6 +88,23 @@ class UserLeftCallEvent { UserLeftCallEvent(this.callID, this.userID); } +/// New call signal event +class NewCallSignalEvent { + final int callID; + final int peerID; + final RTCSessionDescription sessionDescription; + final RTCIceCandidate candidate; + + const NewCallSignalEvent({ + this.callID, + this.peerID, + this.sessionDescription, + this.candidate, + }) : assert(callID != null), + assert(peerID != null), + assert(sessionDescription != null || candidate != null); +} + /// Call peer ready event class CallPeerReadyEvent { final int callID; diff --git a/lib/helpers/websocket_helper.dart b/lib/helpers/websocket_helper.dart index 409a902..8b1c244 100644 --- a/lib/helpers/websocket_helper.dart +++ b/lib/helpers/websocket_helper.dart @@ -7,6 +7,8 @@ import 'package:comunic/helpers/events_helper.dart'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/config.dart'; import 'package:comunic/models/ws_message.dart'; +import 'package:flutter_webrtc/rtc_ice_candidate.dart'; +import 'package:flutter_webrtc/rtc_session_description.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; /// User web socket helper @@ -172,6 +174,21 @@ class WebSocketHelper { UserLeftCallEvent(msg.data["callID"], msg.data["userID"])); break; + // Got new call signal + case "new_call_signal": + Map signalData = msg.data["data"]; + EventsHelper.emit(NewCallSignalEvent( + callID: msg.data["callID"], + peerID: msg.data["peerID"], + candidate: signalData.containsKey("candidate") + ? RTCIceCandidate( + signalData["candidate"], null, signalData["sdpMLineIndex"]) + : null, + sessionDescription: signalData.containsKey("type") + ? RTCSessionDescription(signalData["sdp"], signalData["type"]) + : null)); + break; + // Call peer ready event case "call_peer_ready": EventsHelper.emit( diff --git a/lib/ui/screens/call_screen.dart b/lib/ui/screens/call_screen.dart index 49d9672..a999c27 100644 --- a/lib/ui/screens/call_screen.dart +++ b/lib/ui/screens/call_screen.dart @@ -90,6 +90,10 @@ class _CallScreenState extends SafeState { if (e.callID == convID) _removeMember(e.userID); }); + this.listen((e) { + if (e.callID == convID) _newSignal(e); + }); + this.listen((e) { if (e.callID == convID) _memberReady(e.peerID); }); @@ -145,6 +149,12 @@ class _CallScreenState extends SafeState { } } + /// Call this method each time we get a new signal + void _newSignal(NewCallSignalEvent ev) { + print( + "${ev.peerID} - ${ev.sessionDescription != null ? ev.sessionDescription.toMap() : ev.candidate.toMap()}"); + } + /// Call this when a user has interrupted streaming void _removeRemotePeerConnection(int memberID) { _membersList.getUser(memberID).status = MemberStatus.JOINED;