git » sdk » commit 5089e9b

Finish the call when connection fails

author Stephen Paul Weber
2024-10-22 19:28:38 UTC
committer Stephen Paul Weber
2024-10-22 19:28:38 UTC
parent 32598f6d7726a78be52827920c0085dd81f7a891

Finish the call when connection fails

snikket/jingle/PeerConnection.cpp.hx +31 -0
snikket/jingle/PeerConnection.js.hx +5 -1
snikket/jingle/Session.hx +5 -0

diff --git a/snikket/jingle/PeerConnection.cpp.hx b/snikket/jingle/PeerConnection.cpp.hx
index acf5c5d..c02cbdf 100644
--- a/snikket/jingle/PeerConnection.cpp.hx
+++ b/snikket/jingle/PeerConnection.cpp.hx
@@ -697,6 +697,24 @@ extern class PCConfiguration {
 	public var iceServers: StdVector<PCIceServer>;
 }
 
+@:native("rtc::PeerConnection::State")
+extern class NativePCState {}
+
+extern enum abstract PCState(NativePCState) {
+	@:native("rtc::PeerConnection::State::New")
+	var New;
+	@:native("rtc::PeerConnection::State::Connecting")
+	var Connecting;
+	@:native("rtc::PeerConnection::State::Connected")
+	var Connected;
+	@:native("rtc::PeerConnection::State::Disconnected")
+	var Disconnected;
+	@:native("rtc::PeerConnection::State::Failed")
+	var Failed;
+	@:native("rtc::PeerConnection::State::Closed")
+	var Closed;
+}
+
 @:buildXml("
 <target id='haxe'>
   <lib name='-ldatachannel'/>
@@ -718,10 +736,12 @@ extern class PC {
 	public function onTrack(callback: cpp.Callable<SharedPtr<Track>->Void>):Void;
 	public function onLocalCandidate(callback: cpp.Callable<Candidate->Void>):Void;
 	public function close():Void;
+	public function state():PCState;
 }
 
 class PeerConnection {
 	public var localDescription(get, null): { sdp: Null<String> };
+	public var connectionState(get, null): String;
 
 	var _pc: SharedPtr<PC>;
 	var pc: cpp.Pointer<PC>;
@@ -793,6 +813,17 @@ class PeerConnection {
 		untyped __cpp__("hx::SetTopOfStack((int*)0, true);"); // unregister with GC
 	}
 
+	public function get_connectionState() {
+		return switch (pc.ref.state()) {
+			case New: "new";
+			case Connecting: "connecting";
+			case Connected: "connected";
+			case Disconnected: "disconnected";
+			case Failed: "failed";
+			case Closed: "closed";
+		}
+	}
+
 	public function get_localDescription() {
 		final desc = pc.ref.localDescription();
 		if (desc.has_value()) {
diff --git a/snikket/jingle/PeerConnection.js.hx b/snikket/jingle/PeerConnection.js.hx
index d9ea12d..d6773d7 100644
--- a/snikket/jingle/PeerConnection.js.hx
+++ b/snikket/jingle/PeerConnection.js.hx
@@ -2,7 +2,11 @@ package snikket.jingle;
 
 import js.html.rtc.PeerConnection;
 
-typedef PeerConnection = js.html.rtc.PeerConnection;
+@:native("RTCPeerConnection")
+extern class PeerConnection extends js.html.rtc.PeerConnection {
+	final connectionState: String;
+}
+
 typedef SdpType = js.html.rtc.SdpType;
 typedef Promise<T> = js.lib.Promise<T>;
 typedef MediaStream = js.html.MediaStream;
diff --git a/snikket/jingle/Session.hx b/snikket/jingle/Session.hx
index 54543d7..a6f6d63 100644
--- a/snikket/jingle/Session.hx
+++ b/snikket/jingle/Session.hx
@@ -485,6 +485,11 @@ class InitiatedSession implements Session {
 			pc.addEventListener("icecandidate", (event) -> {
 				sendIceCandidate(event.candidate);
 			});
+			pc.addEventListener("connectionstatechange", (event) -> {
+				if (pc.connectionState == "closed" || pc.connectionState == "failed") {
+					terminate();
+				}
+			});
 			callback();
 		});
 	}