| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2024-12-08 19:13:46 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2024-12-08 19:14:17 UTC |
| parent | 1028cd3f41c58cab0c53d199ad13df5d6f2e4f2d |
| snikket/jingle/PeerConnection.cpp.hx | +13 | -8 |
| snikket/jingle/Session.hx | +5 | -6 |
diff --git a/snikket/jingle/PeerConnection.cpp.hx b/snikket/jingle/PeerConnection.cpp.hx index bb89969..ccc5b43 100644 --- a/snikket/jingle/PeerConnection.cpp.hx +++ b/snikket/jingle/PeerConnection.cpp.hx @@ -778,7 +778,8 @@ class PeerConnection { final stateChangeListeners = []; final mainLoop: sys.thread.EventLoop; var hasLocal = false; - var pendingTracks = []; + var hasRemote = false; + var pendingTracks: Array<MediaStreamTrack> = []; public function new(?configuration : Configuration, ?constraints : Dynamic) { if (Sys.getEnv("SNIKKET_WEBRTC_DEBUG") != null) { @@ -812,6 +813,7 @@ class PeerConnection { private function onLocalDescription() { untyped __cpp__("int base = 0; hx::SetTopOfStack(&base, true);"); // allow running haxe code on foreign thread mainLoop.run(() -> { + addPendingTracks(); if (waitingOnLocal != null) waitingOnLocal(null); waitingOnLocal = null; }); @@ -821,13 +823,6 @@ class PeerConnection { private function onLocalCandidate(candidate: Candidate) { untyped __cpp__("int base = 0; hx::SetTopOfStack(&base, true);"); // allow running haxe code on foreign thread mainLoop.run(() -> { - if (!hasLocal) { - hasLocal = true; - var track; - while ((track = pendingTracks.shift()) != null) { - addTrack(track, null); - } - } for (cb in localCandidateListeners) { cb({ candidate: { candidate: (candidate.candidate() : String), @@ -897,12 +892,14 @@ class PeerConnection { public function setLocalDescription(sdpType: Null<SdpType>): Promise<Any> { return new Promise((resolve, reject) -> { waitingOnLocal = resolve; + if (!hasRemote) addPendingTracks(); pc.ref.setLocalDescription(sdpType ?? SdpType.UNSPEC); }); } public function setRemoteDescription(description : SessionDescriptionInit): Promise<Any> { pc.ref.setRemoteDescription(new Description(cpp.StdString.ofString(description.sdp), description.type)); + hasRemote = true; return Promise.resolve(null); } @@ -911,6 +908,14 @@ class PeerConnection { return Promise.resolve(null); } + private function addPendingTracks() { + hasLocal = true; + var track; + while ((track = pendingTracks.shift()) != null) { + addTrack(track, null); + } + } + public function addTrack(track : MediaStreamTrack, stream : MediaStream) { if (hasLocal) { track.track = pc.ref.addTrack(track.media.value()); diff --git a/snikket/jingle/Session.hx b/snikket/jingle/Session.hx index 69271ab..1483c9b 100644 --- a/snikket/jingle/Session.hx +++ b/snikket/jingle/Session.hx @@ -552,7 +552,7 @@ class InitiatedSession implements Session { }); } - private function setupLocalDescription(type: String, ?filterMedia: Array<String>, ?filterOut: Bool = false, ?beforeSend: (SessionDescription)->Void) { + private function setupLocalDescription(type: String, ?filterMedia: Array<String>, ?filterOut: Bool = false, ?beforeSend: (SessionDescription)->Void): Promise<Any> { return pc.setLocalDescription(null).then((_) -> { final caps = client.getDirectChat(counterpart.asBare().asString()).getResourceCaps(counterpart.resource); return if ((type == "session-initiate" || type == "session-accept") && caps.features.contains("urn:ietf:rfc:3264")) { @@ -595,18 +595,17 @@ class InitiatedSession implements Session { }); } - private function onPeerConnection() { + private function onPeerConnection(): Promise<Any> { return pc.setRemoteDescription({ type: SdpType.OFFER, sdp: remoteDescription.toSdp() }) .then((_) -> { final inboundTransportInfo = queuedInboundTransportInfo.copy(); queuedInboundTransportInfo.resize(0); return inboundTransportInfo.map(transportInfo); }) - .then((_) -> { - setupLocalDescription("session-accept"); - }).then((x) -> { + .then((_) -> + setupLocalDescription("session-accept") + ).then((_) -> { peerDtlsSetup = localDescription.getDtlsSetup() == "active" ? "passive" : "active"; - return; }); } }