package im.rosetta.executors; import im.rosetta.Failures; import im.rosetta.client.ClientManager; import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.packet.Packet26SignalPeer; import im.rosetta.packet.runtime.NetworkSignalType; import im.rosetta.service.services.ForwardUnitService; import io.g365sfu.Room; import io.orprotocol.ProtocolException; import io.orprotocol.client.Client; import io.orprotocol.packet.PacketExecutor; /** * Используется в Peer To Peer звонках, в групповых звонках другой сигналинг */ public class Executor26SignalPeer extends PacketExecutor { private ClientManager clientManager; private ForwardUnitService fus; public Executor26SignalPeer(ClientManager clientManager, ForwardUnitService fus) { this.clientManager = clientManager; this.fus = fus; } @Override public void onPacketReceived(Packet26SignalPeer packet, Client client) throws Exception, ProtocolException { ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class); if (eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) { /** * Если клиент не авторизован, то мы не будем обрабатывать его сигналы на анициализацию звонка * и просто отключим его от сервера. */ client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED); return; } NetworkSignalType type = packet.getSignalType(); if(type == NetworkSignalType.CALL) { /** * Инициируется звонок от src к dst, проверяем, что dst не занят другим звонком, если занят, то отправляем сигнал END_CALL_BECAUSE_BUSY обратно src */ Room room = this.fus.getRoomByParticipantId(packet.getDst()); if(room != null) { /** * Получатель сигнала уже находится в другой комнате, значит он занят другим звонком, отправляем сигнал END_CALL_BECAUSE_BUSY обратно src */ Packet26SignalPeer responsePacket = new Packet26SignalPeer(); responsePacket.setSignalType(NetworkSignalType.END_CALL_BECAUSE_BUSY); this.clientManager.sendPacketToAuthorizedPK(packet.getSrc(), responsePacket); return; } } if(type == NetworkSignalType.CREATE_ROOM){ /** * Создается комната для звонка */ Room room = this.fus.createRoom(); room.addParticipant(packet.getSrc()); room.addParticipant(packet.getDst()); packet.setRoomId(room.getRoomId()); /** * Результат создания комнаты транслируем обоим участникам, чтобы они могли начать обмен WebRTC SDP, и тд */ this.clientManager.sendPacketToAuthorizedPK(packet.getSrc(), packet); this.clientManager.sendPacketToAuthorizedPK(packet.getDst(), packet); return; } /** * TODO: Проверка на существование получателя */ this.clientManager.sendPacketToAuthorizedPK(packet.getDst(), packet); /** * TODO: Высокоприоритетный пуш для сигналов звонков, чтобы мобильные устройства могли показать * интерфейс входящего звонка, даже если приложение находится в фоне */ } }