From e79282755b49d5b1d4ad3c220427631ebb89067f Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Wed, 11 Mar 2026 17:22:29 +0200 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BE=D0=B1=D0=BC=D0=B5=D0=BD=20=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B0=D0=BC=D0=B8=20=D1=88=D0=B8=D1=84=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F,=20=D0=B2=D1=81=D0=B5=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20WebRTC=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/providers/CallProvider/CallProvider.tsx | 33 ++++++++++++++++++- .../protocol/packets/packet.signal.ts | 2 +- app/servers.ts | 6 ++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/providers/CallProvider/CallProvider.tsx b/app/providers/CallProvider/CallProvider.tsx index ff726de..b153a51 100644 --- a/app/providers/CallProvider/CallProvider.tsx +++ b/app/providers/CallProvider/CallProvider.tsx @@ -26,6 +26,10 @@ export interface CallContextValue { export enum CallState { CONNECTING, KEY_EXCHANGE, + /** + * Финальная стадия сигналинга, на которой обе стороны обменялись ключами и теперь устанавливают защищенный канал связи для звонка, + * через WebRTC, и готовятся к активному звонку. + */ WEB_RTC_EXCHANGE, ACTIVE, ENDED, @@ -59,6 +63,7 @@ export function CallProvider(props : CallProviderProps) { const [sessionKeys, setSessionKeys] = useState(null); const send = useSender(); const publicKey = usePublicKey(); + const peerConnectionRef = useRef(null); const roleRef = useRef(null); const [sharedSecret, setSharedSecret] = useState(""); @@ -74,10 +79,24 @@ export function CallProvider(props : CallProviderProps) { * У нас уже есть активный звонок, игнорируем все сигналы, кроме сигналов от текущего звонка */ if(packet.getSrc() != activeCall){ + console.info("Received signal from " + packet.getSrc() + " but active call is with " + activeCall + ", ignoring"); info("Received signal for another call, ignoring"); return; } } + if(signalType == SignalType.END_CALL){ + /** + * Сбросили звонок + */ + setActiveCall(""); + setCallState(CallState.ENDED); + setShowCallView(false); + setSessionKeys(null); + setSharedSecret(""); + setDuration(0); + roleRef.current = null; + return; + } if(signalType == SignalType.CALL){ /** * Нам поступает звонок @@ -87,6 +106,7 @@ export function CallProvider(props : CallProviderProps) { setShowCallView(true); } if(signalType == SignalType.KEY_EXCHANGE && roleRef.current == CallRole.CALLER){ + console.info("EXCHANGE SIGNAL RECEIVED, CALLER ROLE"); /** * Другая сторона сгенерировала ключи для сессии и отправила нам публичную часть, * теперь мы можем создать общую секретную сессию для шифрования звонка @@ -105,12 +125,14 @@ export function CallProvider(props : CallProviderProps) { */ const signalPacket = new PacketSignal(); signalPacket.setSrc(publicKey); - signalPacket.setDst(packet.getDst()); + signalPacket.setDst(packet.getSrc()); signalPacket.setSignalType(SignalType.KEY_EXCHANGE); signalPacket.setSharedPublic(Buffer.from(sessionKeys.publicKey).toString('hex')); send(signalPacket); + setCallState(CallState.WEB_RTC_EXCHANGE); } if(signalType == SignalType.KEY_EXCHANGE && roleRef.current == CallRole.CALLEE){ + console.info("EXCHANGE SIGNAL RECEIVED, CALLEE ROLE"); /** * Мы отправили свою публичную часть ключа другой стороне, * теперь мы получили ее публичную часть и можем создать общую @@ -128,6 +150,7 @@ export function CallProvider(props : CallProviderProps) { const computedSharedSecret = nacl.box.before(Buffer.from(sharedPublic, 'hex'), sessionKeys.secretKey); info("Generated shared secret for call session: " + Buffer.from(computedSharedSecret).toString('hex')); setSharedSecret(Buffer.from(computedSharedSecret).toString('hex')); + setCallState(CallState.WEB_RTC_EXCHANGE); } }, [activeCall, sessionKeys]); @@ -143,6 +166,7 @@ export function CallProvider(props : CallProviderProps) { setCallState(CallState.CONNECTING); setShowCallView(true); const signalPacket = new PacketSignal(); + signalPacket.setSrc(publicKey); signalPacket.setDst(dialog); signalPacket.setSignalType(SignalType.CALL); send(signalPacket); @@ -150,6 +174,12 @@ export function CallProvider(props : CallProviderProps) { } const close = () => { + const packetSignal = new PacketSignal(); + packetSignal.setSrc(publicKey); + packetSignal.setDst(activeCall); + packetSignal.setSignalType(SignalType.END_CALL); + send(packetSignal); + peerConnectionRef.current = null; setActiveCall(""); setCallState(CallState.ENDED); setShowCallView(false); @@ -170,6 +200,7 @@ export function CallProvider(props : CallProviderProps) { */ const keys = generateSessionKeys(); const signalPacket = new PacketSignal(); + signalPacket.setSrc(publicKey); signalPacket.setDst(activeCall); signalPacket.setSignalType(SignalType.KEY_EXCHANGE); signalPacket.setSharedPublic(Buffer.from(keys.publicKey).toString('hex')); diff --git a/app/providers/ProtocolProvider/protocol/packets/packet.signal.ts b/app/providers/ProtocolProvider/protocol/packets/packet.signal.ts index b57dd9d..54c86b2 100644 --- a/app/providers/ProtocolProvider/protocol/packets/packet.signal.ts +++ b/app/providers/ProtocolProvider/protocol/packets/packet.signal.ts @@ -5,7 +5,7 @@ export enum SignalType { CALL = 0, KEY_EXCHANGE = 1, ACTIVE_CALL = 2, - END_CALL = 3 + END_CALL = 3 } /** diff --git a/app/servers.ts b/app/servers.ts index aa52cbb..8a5bd15 100644 --- a/app/servers.ts +++ b/app/servers.ts @@ -1,10 +1,10 @@ export const SERVERS = [ //'wss://cdn.rosetta-im.com', //'ws://10.211.55.2:3000', - //'ws://127.0.0.1:3000', - 'wss://wss.rosetta.im' + 'ws://127.0.0.1:3000', + //'wss://wss.rosetta.im' ]; - + export function selectServer(): string { const idx = Math.floor(Math.random() * SERVERS.length); return SERVERS[idx];