Files
rosetta-wss/src/main/java/im/rosetta/executors/Executor27WebRTC.java
RoyceDa 76a007ff42
All checks were successful
Build rosetta-wss / build (push) Successful in 3m30s
Фикс киков с сервера
2026-04-04 18:49:39 +02:00

81 lines
4.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package im.rosetta.executors;
import im.rosetta.Failures;
import im.rosetta.calls.CallManager;
import im.rosetta.calls.CallSession;
import im.rosetta.packet.Packet27WebRTC;
import im.rosetta.packet.runtime.NetworkWebRTCType;
import io.g365sfu.Room;
import io.orprotocol.ProtocolException;
import io.orprotocol.client.Client;
import io.orprotocol.packet.PacketExecutor;
public class Executor27WebRTC extends PacketExecutor<Packet27WebRTC> {
private CallManager callManager;
public Executor27WebRTC(CallManager callManager) {
this.callManager = callManager;
}
@Override
public void onPacketReceived(Packet27WebRTC packet, Client client) throws Exception, ProtocolException {
/**
* Получаем, в какой сессии находится этот сокет
*/
CallSession session = this.callManager.getCallSession(client);
if(session == null) {
/**
* Если сессия не найдена, то мы не будем обрабатывать сигналы для звонка
*/
return;
}
Room room = session.getRoom();
if(room == null) {
/**
* Звонок еще не активен, а значит комнаты еще нет. Нельзя обменяться WebRTC сигналами пока комнаты еще нет.
*/
return;
}
/**
* Получаем публичный ключ, которым представился клиент, в рамках сессии звонка.
* Мы не делаем это через ECIAuthentificate, так как в рамках звонка клиент может не быть авторизован, но при этом он уже находится в сессии звонка, и мы можем идентифицировать его по публичному ключу,
* который он указал при присоединении к звонку используя joinToken.
* Так что, несмотря на то, что клиент может быть не авторизован, мы все равно можем достоверно знать его публичный ключ
*/
String publicKey = session.getPublicKey(client);
if(publicKey == null) {
/**
* Избыточная проверка, так как если клиент находится в сессии, то он должен быть в списке клиентов сессии,
* но на всякий случай проверим это, чтобы избежать возможных ошибок
*/
client.disconnect(Failures.DATA_MISSMATCH);
return;
}
NetworkWebRTCType type = packet.getType();
if(type == NetworkWebRTCType.OFFER) {
/**
* Если это OFFER, то отправляем OFFER на сервер SFU,
* который отвечает за эту комнату, чтобы он транслировал его всем участникам комнаты, кроме отправителя
*/
room.sdpOffer(publicKey, packet.getSdpOrCandidate());
}
if(type == NetworkWebRTCType.ICE_CANDIDATE) {
/**
* Если это ICE кандидат, то отправляем его на сервер SFU,
* который отвечает за эту комнату, чтобы он транслировал его всем участникам комнаты, кроме отправителя
*/
room.iceCandidate(publicKey, packet.getSdpOrCandidate());
}
if(type == NetworkWebRTCType.ANSWER) {
/**
* Если это ANSWER, то отправляем его на сервер SFU,
* который отвечает за эту комнату, чтобы он транслировал его всем участникам комнаты, кроме отправителя
*/
room.sdpAnswer(publicKey, packet.getSdpOrCandidate());
}
}
}