@@ -22,7 +22,8 @@ enum SignalingState {
2222typedef void SignalingStateCallback (SignalingState state);
2323typedef void StreamStateCallback (MediaStream stream);
2424typedef void OtherEventCallback (dynamic event);
25- typedef void DataChannelMessageCallback (RTCDataChannel dc, RTCDataChannelMessage data);
25+ typedef void DataChannelMessageCallback (
26+ RTCDataChannel dc, RTCDataChannelMessage data);
2627typedef void DataChannelCallback (RTCDataChannel dc);
2728
2829class Signaling {
@@ -34,6 +35,8 @@ class Signaling {
3435 var _displayName;
3536 var _peerConnections = new Map <String , RTCPeerConnection >();
3637 var _dataChannels = new Map <String , RTCDataChannel >();
38+ var _remoteCandidates = [];
39+
3740 MediaStream _localStream;
3841 List <MediaStream > _remoteStreams;
3942 SignalingStateCallback onStateChange;
@@ -152,12 +155,17 @@ class Signaling {
152155 this .onStateChange (SignalingState .CallStateNew );
153156 }
154157
155- _createPeerConnection (id, media, false ).then ((pc) {
156- _peerConnections[id] = pc;
157- pc.setRemoteDescription (new RTCSessionDescription (
158- description['sdp' ], description['type' ]));
159- _createAnswer (id, pc, media);
160- });
158+ var pc = await _createPeerConnection (id, media, false );
159+ _peerConnections[id] = pc;
160+ await pc.setRemoteDescription (new RTCSessionDescription (
161+ description['sdp' ], description['type' ]));
162+ await _createAnswer (id, pc, media);
163+ if (this ._remoteCandidates.length > 0 ) {
164+ _remoteCandidates.forEach ((candidate) async {
165+ await pc.addCandidate (candidate);
166+ });
167+ _remoteCandidates.clear ();
168+ }
161169 }
162170 break ;
163171 case 'answer' :
@@ -167,7 +175,7 @@ class Signaling {
167175
168176 var pc = _peerConnections[id];
169177 if (pc != null ) {
170- pc.setRemoteDescription (new RTCSessionDescription (
178+ await pc.setRemoteDescription (new RTCSessionDescription (
171179 description['sdp' ], description['type' ]));
172180 }
173181 }
@@ -177,13 +185,14 @@ class Signaling {
177185 var id = data['from' ];
178186 var candidateMap = data['candidate' ];
179187 var pc = _peerConnections[id];
180-
188+ RTCIceCandidate candidate = new RTCIceCandidate (
189+ candidateMap['candidate' ],
190+ candidateMap['sdpMid' ],
191+ candidateMap['sdpMLineIndex' ]);
181192 if (pc != null ) {
182- RTCIceCandidate candidate = new RTCIceCandidate (
183- candidateMap['candidate' ],
184- candidateMap['sdpMid' ],
185- candidateMap['sdpMLineIndex' ]);
186- pc.addCandidate (candidate);
193+ await pc.addCandidate (candidate);
194+ } else {
195+ _remoteCandidates.add (candidate);
187196 }
188197 }
189198 break ;
@@ -278,7 +287,7 @@ class Signaling {
278287 );
279288
280289 return webSocket;
281- }catch (e){
290+ } catch (e) {
282291 throw e;
283292 }
284293 }
0 commit comments