package im.rosetta.executors; import java.util.HashSet; import im.rosetta.Failures; import im.rosetta.database.repository.DeviceRepository; import im.rosetta.packet.Packet27WebRTC; import im.rosetta.packet.runtime.NetworkWebRTCType; import im.rosetta.service.services.DeviceService; import im.rosetta.service.services.ForwardUnitService; import io.g365sfu.Room; import io.orprotocol.ProtocolException; import io.orprotocol.client.Client; import io.orprotocol.packet.PacketExecutor; public class Executor27WebRTC extends PacketExecutor { private ForwardUnitService fus; private final DeviceRepository deviceRepository = new DeviceRepository(); private final DeviceService deviceService = new DeviceService(deviceRepository); public Executor27WebRTC(ForwardUnitService fus) { this.fus = fus; } @Override public void onPacketReceived(Packet27WebRTC packet, Client client) throws Exception, ProtocolException { String publicKey = packet.getPublicKey(); String deviceId = packet.getDeviceId(); HashSet publicKeys = this.deviceService.getPublicKeysByDeviceId(deviceId); if(!publicKeys.contains(publicKey)) { /** * Если публичный ключ, который отправил пакет, не связан с deviceId, с которого был отправлен пакет, то отключаем клиента от сервера, так как это может быть попыткой подделки пакета */ client.disconnect(Failures.DATA_MISSMATCH); return; } /** * Так как в комнатах Participants это публичные ключи пользователей, то мы можем * найти комнату, в которой находится пользователь, по его публичному ключу */ Room room = this.fus.getRoomByParticipantId(publicKey); if(room == 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()); } } }