Skip to content

Commit 6c77279

Browse files
committed
core: update JS local/remote descriptions to match internal state
Specifically here is how we are updating them now: - localDescription: - after calling setLocalDescription - with any gathered ICE candidate - when ICE gathering state transitions to completed - remoteDescription: - after calling setRemoteDescription - when calling addICECandidate - before onaddstream / onremovestream are emitted Closes: react-native-webrtc#787
1 parent 1fbe7e1 commit 6c77279

File tree

5 files changed

+175
-90
lines changed

5 files changed

+175
-90
lines changed

RTCPeerConnection.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
165165
this._peerConnectionId,
166166
(successful, data) => {
167167
if (successful) {
168-
this.localDescription = sessionDescription;
168+
this.localDescription = new RTCSessionDescription(data);
169169
resolve();
170170
} else {
171171
reject(data);
@@ -181,7 +181,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
181181
this._peerConnectionId,
182182
(successful, data) => {
183183
if (successful) {
184-
this.remoteDescription = sessionDescription;
184+
this.remoteDescription = new RTCSessionDescription(data);
185185
resolve();
186186
} else {
187187
reject(data);
@@ -191,13 +191,18 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
191191
}
192192

193193
addIceCandidate(candidate) {
194+
if (!candidate || !candidate.candidate) {
195+
// TODO: support end-of-candidates, native crashes at this time.
196+
return Promise.resolve();
197+
}
194198
return new Promise((resolve, reject) => {
195199
WebRTCModule.peerConnectionAddICECandidate(
196200
candidate.toJSON ? candidate.toJSON() : candidate,
197201
this._peerConnectionId,
198-
(successful) => {
202+
(successful, data) => {
199203
if (successful) {
200-
resolve()
204+
this.remoteDescription = new RTCSessionDescription(data);
205+
resolve();
201206
} else {
202207
// XXX: This should be OperationError
203208
reject(new Error('Failed to add ICE candidate'));
@@ -292,6 +297,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
292297
}
293298
const stream = new MediaStream(ev);
294299
this._remoteStreams.push(stream);
300+
this.remoteDescription = new RTCSessionDescription(ev.sdp);
295301
this.dispatchEvent(new MediaStreamEvent('addstream', {stream}));
296302
}),
297303
EventEmitter.addListener('peerConnectionRemovedStream', ev => {
@@ -305,6 +311,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
305311
this._remoteStreams.splice(index, 1);
306312
}
307313
}
314+
this.remoteDescription = new RTCSessionDescription(ev.sdp);
308315
this.dispatchEvent(new MediaStreamEvent('removestream', {stream}));
309316
}),
310317
EventEmitter.addListener('mediaStreamTrackMuteChanged', ev => {
@@ -322,6 +329,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
322329
if (ev.id !== this._peerConnectionId) {
323330
return;
324331
}
332+
this.localDescription = new RTCSessionDescription(ev.sdp);
325333
const candidate = new RTCIceCandidate(ev.candidate);
326334
const event = new RTCIceCandidateEvent('icecandidate', {candidate});
327335
this.dispatchEvent(event);
@@ -333,6 +341,7 @@ export default class RTCPeerConnection extends EventTarget(PEER_CONNECTION_EVENT
333341
this.iceGatheringState = ev.iceGatheringState;
334342

335343
if (this.iceGatheringState === 'complete') {
344+
this.localDescription = new RTCSessionDescription(ev.sdp);
336345
this.dispatchEvent(new RTCIceCandidateEvent('icecandidate', null));
337346
}
338347

RTCSessionDescription.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,19 @@ export default class RTCSessionDescription {
55
type: string;
66

77
constructor(info = {type: null, sdp: ''}) {
8-
this.sdp = info.sdp;
9-
this.type = info.type;
8+
this._sdp = info.sdp;
9+
this._type = info.type;
1010
}
11+
12+
get sdp() {
13+
return this._sdp;
14+
}
15+
16+
get type() {
17+
return this._type;
18+
}
19+
1120
toJSON() {
12-
return {sdp: this.sdp, type: this.type};
21+
return {sdp: this._sdp, type: this._type};
1322
}
1423
}

android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.webrtc.MediaStreamTrack;
2020
import org.webrtc.PeerConnection;
2121
import org.webrtc.RtpReceiver;
22+
import org.webrtc.SessionDescription;
2223
import org.webrtc.VideoTrack;
2324

2425
import java.io.UnsupportedEncodingException;
@@ -242,6 +243,11 @@ public void onIceCandidate(final IceCandidate candidate) {
242243
candidateParams.putString("sdpMid", candidate.sdpMid);
243244
candidateParams.putString("candidate", candidate.sdp);
244245
params.putMap("candidate", candidateParams);
246+
SessionDescription newSdp = peerConnection.getLocalDescription();
247+
WritableMap newSdpMap = Arguments.createMap();
248+
newSdpMap.putString("type", newSdp.type.canonicalForm());
249+
newSdpMap.putString("sdp", newSdp.description);
250+
params.putMap("sdp", newSdpMap);
245251

246252
webRTCModule.sendEvent("peerConnectionGotICECandidate", params);
247253
}
@@ -256,7 +262,6 @@ public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectio
256262
WritableMap params = Arguments.createMap();
257263
params.putInt("id", id);
258264
params.putString("iceConnectionState", iceConnectionStateString(iceConnectionState));
259-
260265
webRTCModule.sendEvent("peerConnectionIceConnectionChanged", params);
261266
}
262267

@@ -279,6 +284,13 @@ public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringSt
279284
WritableMap params = Arguments.createMap();
280285
params.putInt("id", id);
281286
params.putString("iceGatheringState", iceGatheringStateString(iceGatheringState));
287+
if (iceGatheringState == PeerConnection.IceGatheringState.COMPLETE) {
288+
SessionDescription newSdp = peerConnection.getLocalDescription();
289+
WritableMap newSdpMap = Arguments.createMap();
290+
newSdpMap.putString("type", newSdp.type.canonicalForm());
291+
newSdpMap.putString("sdp", newSdp.description);
292+
params.putMap("sdp", newSdpMap);
293+
}
282294
webRTCModule.sendEvent("peerConnectionIceGatheringChanged", params);
283295
}
284296

@@ -356,16 +368,20 @@ public void onAddStream(MediaStream mediaStream) {
356368
}
357369
params.putArray("tracks", tracks);
358370

371+
SessionDescription newSdp = peerConnection.getRemoteDescription();
372+
WritableMap newSdpMap = Arguments.createMap();
373+
newSdpMap.putString("type", newSdp.type.canonicalForm());
374+
newSdpMap.putString("sdp", newSdp.description);
375+
params.putMap("sdp", newSdpMap);
376+
359377
webRTCModule.sendEvent("peerConnectionAddedStream", params);
360378
}
361379

362380
@Override
363381
public void onRemoveStream(MediaStream mediaStream) {
364382
String streamReactTag = getReactTagForStream(mediaStream);
365383
if (streamReactTag == null) {
366-
Log.w(TAG,
367-
"onRemoveStream - no remote stream for id: "
368-
+ mediaStream.getId());
384+
Log.w(TAG, "onRemoveStream - no remote stream for id: " + mediaStream.getId());
369385
return;
370386
}
371387

@@ -382,6 +398,13 @@ public void onRemoveStream(MediaStream mediaStream) {
382398
WritableMap params = Arguments.createMap();
383399
params.putInt("id", id);
384400
params.putString("streamId", streamReactTag);
401+
402+
SessionDescription newSdp = peerConnection.getRemoteDescription();
403+
WritableMap newSdpMap = Arguments.createMap();
404+
newSdpMap.putString("type", newSdp.type.canonicalForm());
405+
newSdpMap.putString("sdp", newSdp.description);
406+
params.putMap("sdp", newSdpMap);
407+
385408
webRTCModule.sendEvent("peerConnectionRemovedStream", params);
386409
}
387410

android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java

Lines changed: 76 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashMap;
2424
import java.util.List;
2525
import java.util.Map;
26+
import java.util.Objects;
2627
import java.util.concurrent.Callable;
2728
import java.util.concurrent.ExecutionException;
2829

@@ -773,38 +774,40 @@ private void peerConnectionSetLocalDescriptionAsync(ReadableMap sdpMap,
773774
int id,
774775
final Callback callback) {
775776
PeerConnection peerConnection = getPeerConnection(id);
777+
if (peerConnection == null) {
778+
Log.d(TAG, "peerConnectionSetLocalDescription() peerConnection is null");
779+
callback.invoke(false, "peerConnection is null");
780+
return;
781+
}
776782

777-
Log.d(TAG, "peerConnectionSetLocalDescription() start");
778-
if (peerConnection != null) {
779-
SessionDescription sdp = new SessionDescription(
780-
SessionDescription.Type.fromCanonicalForm(sdpMap.getString("type")),
781-
sdpMap.getString("sdp")
782-
);
783+
SessionDescription sdp = new SessionDescription(
784+
SessionDescription.Type.fromCanonicalForm(Objects.requireNonNull(sdpMap.getString("type"))),
785+
sdpMap.getString("sdp")
786+
);
783787

784-
peerConnection.setLocalDescription(new SdpObserver() {
785-
@Override
786-
public void onCreateSuccess(SessionDescription sdp) {
787-
}
788+
peerConnection.setLocalDescription(new SdpObserver() {
789+
@Override
790+
public void onCreateSuccess(SessionDescription sdp) {
791+
}
788792

789-
@Override
790-
public void onSetSuccess() {
791-
callback.invoke(true);
792-
}
793+
@Override
794+
public void onSetSuccess() {
795+
SessionDescription newSdp = peerConnection.getLocalDescription();
796+
WritableMap newSdpMap = Arguments.createMap();
797+
newSdpMap.putString("type", newSdp.type.canonicalForm());
798+
newSdpMap.putString("sdp", newSdp.description);
799+
callback.invoke(true, newSdpMap);
800+
}
793801

794-
@Override
795-
public void onCreateFailure(String s) {
796-
}
802+
@Override
803+
public void onCreateFailure(String s) {
804+
}
797805

798-
@Override
799-
public void onSetFailure(String s) {
800-
callback.invoke(false, s);
801-
}
802-
}, sdp);
803-
} else {
804-
Log.d(TAG, "peerConnectionSetLocalDescription() peerConnection is null");
805-
callback.invoke(false, "peerConnection is null");
806-
}
807-
Log.d(TAG, "peerConnectionSetLocalDescription() end");
806+
@Override
807+
public void onSetFailure(String s) {
808+
callback.invoke(false, s);
809+
}
810+
}, sdp);
808811
}
809812

810813
@ReactMethod
@@ -819,66 +822,69 @@ private void peerConnectionSetRemoteDescriptionAsync(ReadableMap sdpMap,
819822
int id,
820823
final Callback callback) {
821824
PeerConnection peerConnection = getPeerConnection(id);
825+
if (peerConnection == null) {
826+
Log.d(TAG, "peerConnectionSetRemoteDescription() peerConnection is null");
827+
callback.invoke(false, "peerConnection is null");
828+
return;
829+
}
822830

823-
Log.d(TAG, "peerConnectionSetRemoteDescription() start");
824-
if (peerConnection != null) {
825-
SessionDescription sdp = new SessionDescription(
826-
SessionDescription.Type.fromCanonicalForm(sdpMap.getString("type")),
827-
sdpMap.getString("sdp")
828-
);
831+
SessionDescription sdp = new SessionDescription(
832+
SessionDescription.Type.fromCanonicalForm(sdpMap.getString("type")),
833+
sdpMap.getString("sdp")
834+
);
829835

830-
peerConnection.setRemoteDescription(new SdpObserver() {
831-
@Override
832-
public void onCreateSuccess(final SessionDescription sdp) {
833-
}
836+
peerConnection.setRemoteDescription(new SdpObserver() {
837+
@Override
838+
public void onCreateSuccess(final SessionDescription sdp) {
839+
}
834840

835-
@Override
836-
public void onSetSuccess() {
837-
callback.invoke(true);
838-
}
841+
@Override
842+
public void onSetSuccess() {
843+
SessionDescription newSdp = peerConnection.getRemoteDescription();
844+
WritableMap newSdpMap = Arguments.createMap();
845+
newSdpMap.putString("type", newSdp.type.canonicalForm());
846+
newSdpMap.putString("sdp", newSdp.description);
847+
callback.invoke(true, newSdpMap);
848+
}
839849

840-
@Override
841-
public void onCreateFailure(String s) {
842-
}
850+
@Override
851+
public void onCreateFailure(String s) {
852+
}
843853

844-
@Override
845-
public void onSetFailure(String s) {
846-
callback.invoke(false, s);
847-
}
848-
}, sdp);
849-
} else {
850-
Log.d(TAG, "peerConnectionSetRemoteDescription() peerConnection is null");
851-
callback.invoke(false, "peerConnection is null");
852-
}
853-
Log.d(TAG, "peerConnectionSetRemoteDescription() end");
854+
@Override
855+
public void onSetFailure(String s) {
856+
callback.invoke(false, s);
857+
}
858+
}, sdp);
854859
}
855860

856861
@ReactMethod
857862
public void peerConnectionAddICECandidate(ReadableMap candidateMap,
858863
int id,
859864
Callback callback) {
860-
ThreadUtils.runOnExecutor(() ->
861-
peerConnectionAddICECandidateAsync(candidateMap, id, callback));
862-
}
865+
ThreadUtils.runOnExecutor(() -> {
866+
PeerConnection peerConnection = getPeerConnection(id);
867+
if (peerConnection == null) {
868+
Log.d(TAG, "peerConnectionAddICECandidate() peerConnection is null");
869+
callback.invoke(false);
870+
return;
871+
}
863872

864-
private void peerConnectionAddICECandidateAsync(ReadableMap candidateMap,
865-
int id,
866-
Callback callback) {
867-
boolean result = false;
868-
PeerConnection peerConnection = getPeerConnection(id);
869-
Log.d(TAG, "peerConnectionAddICECandidate() start");
870-
if (peerConnection != null) {
871873
IceCandidate candidate = new IceCandidate(
872874
candidateMap.getString("sdpMid"),
873875
candidateMap.getInt("sdpMLineIndex"),
874876
candidateMap.getString("candidate")
875877
);
876-
result = peerConnection.addIceCandidate(candidate);
877-
} else {
878-
Log.d(TAG, "peerConnectionAddICECandidate() peerConnection is null");
879-
}
880-
callback.invoke(result);
881-
Log.d(TAG, "peerConnectionAddICECandidate() end");
878+
879+
boolean success = peerConnection.addIceCandidate(candidate);
880+
WritableMap newSdpMap = Arguments.createMap();
881+
if (success) {
882+
SessionDescription newSdp = peerConnection.getRemoteDescription();
883+
newSdpMap.putString("type", newSdp.type.canonicalForm());
884+
newSdpMap.putString("sdp", newSdp.description);
885+
}
886+
callback.invoke(success, newSdpMap);
887+
});
882888
}
883889

884890
@ReactMethod

0 commit comments

Comments
 (0)