| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2024-10-22 19:28:38 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2024-10-22 19:28:38 UTC |
| parent | 32598f6d7726a78be52827920c0085dd81f7a891 |
| 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(); }); }