Реализация запросов ICE серверов (TURN)

This commit is contained in:
RoyceDa
2026-03-14 22:57:59 +02:00
parent 8aab1b19b0
commit 312cc5df0f
3 changed files with 101 additions and 2 deletions

8
.env
View File

@@ -8,9 +8,9 @@ PORT=3000 # Порт, на котором будет работать серве
# Список серверов CDN и SDU. Разделяются запятой если их несколько # Список серверов CDN и SDU. Разделяются запятой если их несколько
# Без пробелов # Без пробелов
CDN_SERVERS=http://10.211.55.2:7789 CDN_SERVERS=http://192.168.6.82:7789
#SDU - Server Delivery Updates #SDU - Server Delivery Updates
SDU_SERVERS=http://10.211.55.2:7777 SDU_SERVERS=http://192.168.6.82:7777
#Firebase Credentials #Firebase Credentials
FIREBASE_CREDENTIALS_PATH=serviceAccount.json FIREBASE_CREDENTIALS_PATH=serviceAccount.json
@@ -21,3 +21,7 @@ BUFFER_CLEANUP_DAYS=7
#SFU Сервера #SFU Сервера
SFU_SERVERS=127.0.0.1:1001@SFU_TEST_SECRET SFU_SERVERS=127.0.0.1:1001@SFU_TEST_SECRET
#TURN Сервера (должны поддерживать TCP и UDP протоколы)
# Формат: host:port@username:password через запятую если их несколько, без пробелов
TURN_SERVERS=192.168.6.82:3478@user:pass

View File

@@ -0,0 +1,39 @@
package im.rosetta.executors;
import java.util.ArrayList;
import im.rosetta.Failures;
import im.rosetta.client.tags.ECIAuthentificate;
import im.rosetta.packet.Packet28IceServers;
import im.rosetta.service.services.ForwardUnitService;
import io.orprotocol.ProtocolException;
import io.orprotocol.client.Client;
import io.orprotocol.packet.PacketExecutor;
public class Executor28IceServers extends PacketExecutor<Packet28IceServers> {
private ForwardUnitService fus;
public Executor28IceServers(ForwardUnitService fus) {
this.fus = fus;
}
@Override
public void onPacketReceived(Packet28IceServers packet, Client client) throws Exception, ProtocolException {
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) {
/**
* Если клиент не авторизован, то мы не будем обрабатывать его запрос на получение ICE серверов
* и просто отключим его от сервера.
*/
client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED);
return;
}
/**
* Берем TURN сервера и отправляем их клиенту
*/
packet.setIceServers(new ArrayList<>(this.fus.getTurnServers()));
client.send(packet);
}
}

View File

@@ -0,0 +1,56 @@
package im.rosetta.packet;
import java.util.ArrayList;
import java.util.List;
import io.g365sfu.webrtc.RTCIceServer;
import io.orprotocol.Stream;
import io.orprotocol.packet.Packet;
public class Packet28IceServers extends Packet {
private List<RTCIceServer> iceServers;
@Override
public void read(Stream stream) {
int count = stream.readInt16();
this.iceServers = new ArrayList<>();
for (int i = 0; i < count; i++) {
String url = stream.readString();
String username = stream.readString();
String credential = stream.readString();
RTCIceServer iceServer = new RTCIceServer(url, username, credential);
iceServers.add(iceServer);
}
}
@Override
public Stream write() {
Stream stream = new Stream();
stream.writeInt16(this.packetId);
stream.writeInt16(iceServers.size());
for (RTCIceServer iceServer : iceServers) {
stream.writeString(iceServer.getUrl());
stream.writeString(iceServer.getUsername());
stream.writeString(iceServer.getCredential());
}
return stream;
}
/**
* Получить список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
* @return список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
*/
public List<RTCIceServer> getIceServers() {
return iceServers;
}
/**
* Установить список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
* @param iceServers список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
*/
public void setIceServers(List<RTCIceServer> iceServers) {
this.iceServers = iceServers;
}
}