Динамический запрос ICE серверов
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
import { Call } from "@/app/components/Call/Call";
|
||||
import { useConsoleLogger } from "@/app/hooks/useConsoleLogger";
|
||||
import { createContext, useRef, useState } from "react";
|
||||
import { createContext, useEffect, useRef, useState } from "react";
|
||||
import nacl from 'tweetnacl';
|
||||
import { useSender } from "../ProtocolProvider/useSender";
|
||||
import { PacketSignalPeer, SignalType } from "../ProtocolProvider/protocol/packets/packet.signal.peer";
|
||||
import { usePacket } from "../ProtocolProvider/usePacket";
|
||||
import { usePublicKey } from "../AccountProvider/usePublicKey";
|
||||
import { PacketWebRTC, WebRTCSignalType } from "../ProtocolProvider/protocol/packets/packet.webrtc";
|
||||
import { PacketIceServers } from "../ProtocolProvider/protocol/packets/packet.ice.servers";
|
||||
|
||||
|
||||
export interface CallContextValue {
|
||||
@@ -69,6 +70,40 @@ export function CallProvider(props : CallProviderProps) {
|
||||
|
||||
const roleRef = useRef<CallRole | null>(null);
|
||||
const [sharedSecret, setSharedSecret] = useState<string>("");
|
||||
const iceServersRef = useRef<RTCIceServer[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
/**
|
||||
* Нам нужно получить ICE серверы для установки соединения из разных сетей
|
||||
* Получаем их от сервера
|
||||
*/
|
||||
let packet = new PacketIceServers();
|
||||
send(packet);
|
||||
}, []);
|
||||
|
||||
usePacket(28, async (packet: PacketIceServers) => {
|
||||
let iceServers = packet.getIceServers();
|
||||
/**
|
||||
* ICE серверы получены, теперь нужно привести их к форматку клиента и добавить udp и tcp варианты
|
||||
*/
|
||||
let formattedIceServers: RTCIceServer[] = [];
|
||||
for(let i = 0; i < iceServers.length; i++){
|
||||
let server = iceServers[i];
|
||||
formattedIceServers.push({
|
||||
urls: "trun:" + server.urls + "?transport=udp",
|
||||
username: server.username,
|
||||
credential: server.credential
|
||||
});
|
||||
formattedIceServers.push({
|
||||
urls: "trun:" + server.urls + "?transport=tcp",
|
||||
username: server.username,
|
||||
credential: server.credential
|
||||
});
|
||||
}
|
||||
console.info("ICE SERVERS RECEIVED: ", formattedIceServers);
|
||||
iceServersRef.current = formattedIceServers;
|
||||
info("Received ICE servers from server, count: " + formattedIceServers.length);
|
||||
}, []);
|
||||
|
||||
usePacket(27, async (packet: PacketWebRTC) => {
|
||||
if(!activeCall || callState != CallState.WEB_RTC_EXCHANGE){
|
||||
@@ -213,10 +248,7 @@ export function CallProvider(props : CallProviderProps) {
|
||||
* Нужно отправить свой SDP оффер другой стороне, чтобы установить WebRTC соединение
|
||||
*/
|
||||
peerConnectionRef.current = new RTCPeerConnection({
|
||||
//Experemental
|
||||
iceServers: [
|
||||
{ urls: 'stun:stun.l.google.com:19302' }
|
||||
]
|
||||
iceServers: iceServersRef.current
|
||||
});
|
||||
/**
|
||||
* Подписываемся на ICE кандидат
|
||||
|
||||
Reference in New Issue
Block a user