From 4c2e297f3197dbfd5ddad6602e927e4b4aadacd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Thu, 20 Oct 2022 12:11:04 +0200 Subject: [PATCH] pc: make removeTrack a blocking method Matches the web API and we already implement addTrack as a blocking method. --- .../com/oney/WebRTCModule/WebRTCModule.java | 51 ++++++++----------- .../WebRTCModule+RTCPeerConnection.m | 48 +++++++---------- ios/RCTWebRTC/WebRTCModule.h | 1 - ios/RCTWebRTC/WebRTCModule.m | 1 - src/RTCPeerConnection.ts | 39 ++++++-------- 5 files changed, 54 insertions(+), 86 deletions(-) diff --git a/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java b/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java index 74ab3b9a0..a8dc181b1 100644 --- a/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +++ b/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java @@ -591,38 +591,27 @@ public WritableMap peerConnectionAddTrack(int id, } } - @ReactMethod - public void peerConnectionRemoveTrack(int id, String senderId) { - ThreadUtils.runOnExecutor(() -> { - WritableMap params = Arguments.createMap(); - params.putInt("pcId", id); - - try { - PeerConnectionObserver pco = mPeerConnectionObservers.get(id); - if (pco == null) { - Log.d(TAG, "peerConnectionRemoveTrack() peerConnection is null"); - sendError("peerConnectionOnError", "removeTrack", "Peer Connection is not initialized", null); - return; - } - RtpSender sender = pco.getSender(senderId); - if (sender == null) { - Log.w(TAG, "peerConnectionRemoveTrack() sender is null"); - sendError("peerConnectionOnError", "removeTrack", "Sender is null", null); - return; - } - - boolean successful = pco.getPeerConnection().removeTrack(sender); - if (successful) { - params.putString("senderId", senderId); - sendEvent("peerConnectionOnRemoveTrackSuccessful", params); - return; - } - sendError("peerConnectionOnError", "removeTrack", "Internal Error", params); - } catch (Exception e) { - Log.d(TAG, "peerConnectionRemoveTrack() " + e.getMessage()); - sendError("peerConnectionOnError", "removeTrack", e.getMessage(), params); + @ReactMethod(isBlockingSynchronousMethod = true) + public boolean peerConnectionRemoveTrack(int id, String senderId) { + try { + return (boolean) ThreadUtils.submitToExecutor((Callable) () -> { + PeerConnectionObserver pco = mPeerConnectionObservers.get(id); + if (pco == null) { + Log.d(TAG, "peerConnectionRemoveTrack() peerConnection is null"); + return false; } - }); + RtpSender sender = pco.getSender(senderId); + if (sender == null) { + Log.w(TAG, "peerConnectionRemoveTrack() sender is null"); + return false; + } + + return pco.getPeerConnection().removeTrack(sender); + }).get(); + } catch (InterruptedException | ExecutionException e) { + Log.d(TAG, "peerConnectionRemoveTrack() " + e.getMessage()); + return false; + } } @ReactMethod diff --git a/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m b/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m index b5287c4fc..ff27f241c 100644 --- a/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +++ b/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m @@ -482,46 +482,36 @@ @implementation WebRTCModule (RTCPeerConnection) return params; } -RCT_EXPORT_METHOD(peerConnectionRemoveTrack:(nonnull NSNumber *)objectID - senderId:(nonnull NSString *)senderId) +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(peerConnectionRemoveTrack:(nonnull NSNumber *)objectID + senderId:(nonnull NSString *)senderId) { + __block BOOL ret = NO; + + dispatch_sync(self.workerQueue, ^{ RTCPeerConnection *peerConnection = self.peerConnections[objectID]; if (!peerConnection) { RCTLogWarn(@"PeerConnection %@ not found in peerConnectionRemoveTrack()", objectID); - [self sendErrorWithEventName: kEventPeerConnectionOnError - funcName: @"removeTrack" - message: @"Peer Connection is not initialized" - info: nil]; return; } - - RTCRtpTransceiver *transceiver = nil; - - for (RTCRtpTransceiver *t in peerConnection.transceivers) { - if ([t.sender.senderId isEqual: senderId]) { - transceiver = t; + + RTCRtpSender *sender = nil; + + for (RTCRtpSender *s in peerConnection.senders) { + if ([s.senderId isEqual: senderId]) { + sender = s; break; } } - - if (!transceiver) { - RCTLogWarn(@"Transceiver not found in peerConnectionRemoveTrack()"); + + if (!sender) { + RCTLogWarn(@"Sender not found in peerConnectionRemoveTrack()"); return; } - - NSMutableDictionary *identifier = [NSMutableDictionary new]; - identifier[@"peerConnectionId"] = objectID; - identifier[@"senderId"] = senderId; - - if ([peerConnection removeTrack: transceiver.sender]) { - [self sendEventWithName: kEventPeerConnectionOnRemoveTrackSuccessful - body: identifier]; - } else { - [self sendErrorWithEventName: kEventPeerConnectionOnError - funcName: @"removeTrack" - message: @"Cannot remove track" - info: identifier]; - } + + ret = [peerConnection removeTrack: sender]; + }); + + return ret; } // TODO: move these below to some SerializeUrils file diff --git a/ios/RCTWebRTC/WebRTCModule.h b/ios/RCTWebRTC/WebRTCModule.h index f54f9e0b7..bff85eafc 100644 --- a/ios/RCTWebRTC/WebRTCModule.h +++ b/ios/RCTWebRTC/WebRTCModule.h @@ -33,7 +33,6 @@ static NSString *const kEventMediaStreamTrackMuteChanged = @"mediaStreamTrackMut static NSString *const kEventTransceiverStopSuccessful = @"transceiverStopSuccessful"; static NSString *const kEventTransceiverOnError = @"transceiverOnError"; static NSString *const kEventPeerConnectionOnRemoveTrack = @"peerConnectionOnRemoveTrack"; -static NSString *const kEventPeerConnectionOnRemoveTrackSuccessful = @"peerConnectionOnRemoveTrackSuccessful"; static NSString *const kEventPeerConnectionOnTrack = @"peerConnectionOnTrack"; static NSString *const kEventPeerConnectionOnError = @"peerConnectionOnError"; diff --git a/ios/RCTWebRTC/WebRTCModule.m b/ios/RCTWebRTC/WebRTCModule.m index 36331135d..9fcd5fbda 100644 --- a/ios/RCTWebRTC/WebRTCModule.m +++ b/ios/RCTWebRTC/WebRTCModule.m @@ -132,7 +132,6 @@ - (dispatch_queue_t)methodQueue kEventTransceiverStopSuccessful, kEventTransceiverOnError, kEventPeerConnectionOnRemoveTrack, - kEventPeerConnectionOnRemoveTrackSuccessful, kEventPeerConnectionOnTrack, kEventPeerConnectionOnError ]; diff --git a/src/RTCPeerConnection.ts b/src/RTCPeerConnection.ts index 7b8129519..ad0fa30ad 100644 --- a/src/RTCPeerConnection.ts +++ b/src/RTCPeerConnection.ts @@ -367,7 +367,22 @@ export default class RTCPeerConnection extends defineCustomEventTarget(...PEER_C return; } + // Blocking! WebRTCModule.peerConnectionRemoveTrack(this._pcId, sender.id); + + const oldTrack = existingSender._track; + + if (oldTrack) { + oldTrack._muted = true; + } + + existingSender._track = null; + + const [ existingTransceiver ] = this + .getTransceivers() + .filter(t => t.sender.id === existingSender.id); + + existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive'; } getStats() { @@ -550,30 +565,6 @@ export default class RTCPeerConnection extends defineCustomEventTarget(...PEER_C } }); - addListener(this, 'peerConnectionOnRemoveTrackSuccessful', (ev: any) => { - if (ev.pcId !== this._pcId) { - return; - } - - const [ existingSender ] = this - .getSenders() - .filter(s => s.id === ev.senderId); - - const oldTrack = existingSender._track; - - if (oldTrack) { - oldTrack._muted = true; - } - - existingSender._track = null; - - const [ existingTransceiver ] = this - .getTransceivers() - .filter(t => t.sender.id === existingSender.id); - - existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive'; - }); - addListener(this, 'peerConnectionGotICECandidate', (ev: any) => { if (ev.pcId !== this._pcId) { return;