From 4664aa9482b8d7de074670e1aa403ef098365da0 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Mon, 23 Mar 2026 03:01:54 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82=D1=8B=20=D0=B7=D0=B2=D0=BE=D0=BD=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=20desktop/wss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messenger/network/PacketSignalPeer.kt | 3 +- .../rosetta/messenger/network/PacketWebRTC.kt | 3 +- .../messenger/network/ProtocolManager.kt | 91 +++++++++++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/network/PacketSignalPeer.kt b/app/src/main/java/com/rosetta/messenger/network/PacketSignalPeer.kt index 4b2aee9..26eb1dd 100644 --- a/app/src/main/java/com/rosetta/messenger/network/PacketSignalPeer.kt +++ b/app/src/main/java/com/rosetta/messenger/network/PacketSignalPeer.kt @@ -11,7 +11,8 @@ enum class SignalType(val value: Int) { companion object { fun fromValue(value: Int): SignalType = - entries.firstOrNull { it.value == value } ?: CALL + entries.firstOrNull { it.value == value } + ?: throw IllegalArgumentException("Unknown SignalType code: $value") } } diff --git a/app/src/main/java/com/rosetta/messenger/network/PacketWebRTC.kt b/app/src/main/java/com/rosetta/messenger/network/PacketWebRTC.kt index 809ac62..6589fc1 100644 --- a/app/src/main/java/com/rosetta/messenger/network/PacketWebRTC.kt +++ b/app/src/main/java/com/rosetta/messenger/network/PacketWebRTC.kt @@ -7,7 +7,8 @@ enum class WebRTCSignalType(val value: Int) { companion object { fun fromValue(value: Int): WebRTCSignalType = - entries.firstOrNull { it.value == value } ?: OFFER + entries.firstOrNull { it.value == value } + ?: throw IllegalArgumentException("Unknown WebRTCSignalType code: $value") } } diff --git a/app/src/main/java/com/rosetta/messenger/network/ProtocolManager.kt b/app/src/main/java/com/rosetta/messenger/network/ProtocolManager.kt index ec7047c..3a160b9 100644 --- a/app/src/main/java/com/rosetta/messenger/network/ProtocolManager.kt +++ b/app/src/main/java/com/rosetta/messenger/network/ProtocolManager.kt @@ -31,6 +31,9 @@ object ProtocolManager { private const val MAX_DEBUG_LOGS = 600 private const val DEBUG_LOG_FLUSH_DELAY_MS = 60L private const val TYPING_INDICATOR_TIMEOUT_MS = 3_000L + private const val PACKET_SIGNAL_PEER = 0x1A + private const val PACKET_WEB_RTC = 0x1B + private const val PACKET_ICE_SERVERS = 0x1C // Desktop parity: use the same primary WebSocket endpoint as desktop client. private const val SERVER_ADDRESS = "wss://wss.rosetta.im" @@ -1281,6 +1284,94 @@ object ProtocolManager { fun sendPacket(packet: Packet) { send(packet) } + + /** + * Send call signaling packet (0x1A). + */ + fun sendCallSignal( + signalType: SignalType, + src: String = "", + dst: String = "", + sharedPublic: String = "", + roomId: String = "" + ) { + send( + PacketSignalPeer().apply { + this.signalType = signalType + this.src = src + this.dst = dst + this.sharedPublic = sharedPublic + this.roomId = roomId + } + ) + } + + /** + * Send WebRTC signaling packet (0x1B). + */ + fun sendWebRtcSignal(signalType: WebRTCSignalType, sdpOrCandidate: String) { + send( + PacketWebRTC().apply { + this.signalType = signalType + this.sdpOrCandidate = sdpOrCandidate + } + ) + } + + /** + * Request ICE servers from server (0x1C). + */ + fun requestIceServers() { + send(PacketIceServers()) + } + + /** + * Typed subscribe for call signaling packets (0x1A). + * Returns wrapper callback for subsequent unwait. + */ + fun waitCallSignal(callback: (PacketSignalPeer) -> Unit): (Packet) -> Unit { + val wrapper: (Packet) -> Unit = { packet -> + (packet as? PacketSignalPeer)?.let(callback) + } + waitPacket(PACKET_SIGNAL_PEER, wrapper) + return wrapper + } + + fun unwaitCallSignal(callback: (Packet) -> Unit) { + unwaitPacket(PACKET_SIGNAL_PEER, callback) + } + + /** + * Typed subscribe for WebRTC packets (0x1B). + * Returns wrapper callback for subsequent unwait. + */ + fun waitWebRtcSignal(callback: (PacketWebRTC) -> Unit): (Packet) -> Unit { + val wrapper: (Packet) -> Unit = { packet -> + (packet as? PacketWebRTC)?.let(callback) + } + waitPacket(PACKET_WEB_RTC, wrapper) + return wrapper + } + + fun unwaitWebRtcSignal(callback: (Packet) -> Unit) { + unwaitPacket(PACKET_WEB_RTC, callback) + } + + /** + * Typed subscribe for ICE servers packet (0x1C). + * Returns wrapper callback for subsequent unwait. + */ + fun waitIceServers(callback: (PacketIceServers) -> Unit): (Packet) -> Unit { + val wrapper: (Packet) -> Unit = { packet -> + (packet as? PacketIceServers)?.let(callback) + } + waitPacket(PACKET_ICE_SERVERS, wrapper) + return wrapper + } + + fun unwaitIceServers(callback: (Packet) -> Unit) { + unwaitPacket(PACKET_ICE_SERVERS, callback) + } /** * Register packet handler