Skip to content

Commit bf25d77

Browse files
committed
Fixed an issue caused by sdp/candidate reception timing issues.
1 parent d145eb0 commit bf25d77

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

lib/src/call_sample/signaling.dart

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ enum SignalingState {
2222
typedef void SignalingStateCallback(SignalingState state);
2323
typedef void StreamStateCallback(MediaStream stream);
2424
typedef void OtherEventCallback(dynamic event);
25-
typedef void DataChannelMessageCallback(RTCDataChannel dc, RTCDataChannelMessage data);
25+
typedef void DataChannelMessageCallback(
26+
RTCDataChannel dc, RTCDataChannelMessage data);
2627
typedef void DataChannelCallback(RTCDataChannel dc);
2728

2829
class 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

Comments
 (0)