From 77a900a35fe61e6590158ea03228b7cb88aeca25 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Thu, 28 May 2026 17:36:36 +0300 Subject: [PATCH] desc --- .env.example | 6 ++++++ internal/config/config.js | 3 +++ internal/protocol/messages.js | 2 +- internal/ws/hub.js | 23 +++++++++++++++++++++-- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 8bf0ffd..8187d57 100644 --- a/.env.example +++ b/.env.example @@ -15,3 +15,9 @@ DB_DATABASE=callDB DB_USERNAME=callDbUser DB_PASSWORD=replace_with_db_password +# Coturn TURN server settings +TURN_URL=turn:turn.intaleqapp.com:3478 +TURN_USERNAME=intaleq_call_user +TURN_CREDENTIAL=intaleq_call_password_secret + + diff --git a/internal/config/config.js b/internal/config/config.js index 4495143..bad89f1 100644 --- a/internal/config/config.js +++ b/internal/config/config.js @@ -42,4 +42,7 @@ export const config = { dbDatabase: process.env.DB_DATABASE || 'callDB', dbUsername: process.env.DB_USERNAME || '', dbPassword: process.env.DB_PASSWORD || '', + turnUrl: process.env.TURN_URL || '', + turnUsername: process.env.TURN_USERNAME || '', + turnCredential: process.env.TURN_CREDENTIAL || '', }; diff --git a/internal/protocol/messages.js b/internal/protocol/messages.js index e02f221..dfba403 100644 --- a/internal/protocol/messages.js +++ b/internal/protocol/messages.js @@ -33,7 +33,7 @@ export const ErrPayloadTooLarge = 'payload_too_large'; export const ErrRateLimited = 'rate_limited'; // Helper constructors for encoding server messages -export const newAuthenticated = (userID) => JSON.stringify({ type: TypeAuthenticated, user_id: userID }); +export const newAuthenticated = (userID, iceServers) => JSON.stringify({ type: TypeAuthenticated, user_id: userID, ice_servers: iceServers }); export const newSessionCreated = (sessionID, rideID, expiresIn) => JSON.stringify({ type: TypeSessionCreated, session_id: sessionID, ride_id: rideID, expires_in: expiresIn }); export const newSessionJoined = (sessionID, rideID) => JSON.stringify({ type: TypeSessionJoined, session_id: sessionID, ride_id: rideID }); export const newParticipantJoined = (role) => JSON.stringify({ type: TypeParticipantJoined, role }); diff --git a/internal/ws/hub.js b/internal/ws/hub.js index ea56b17..950d821 100644 --- a/internal/ws/hub.js +++ b/internal/ws/hub.js @@ -1,6 +1,7 @@ import { logger } from '../logger/logger.js'; import * as protocol from '../protocol/messages.js'; import { logSessionActive, logSessionInitiator, logSessionEnded } from '../db/db.js'; +import { config } from '../config/config.js'; /** * Hub is the central coordinator for all active call sessions and client sockets. @@ -303,8 +304,26 @@ export class Hub { remote_ip: connectionIP }); - // Confirm successful authentication to the client - client.send(protocol.newAuthenticated(client.userID)); + // Prepare ICE servers configuration dynamically + const iceServers = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' } + ]; + if (config.turnUrl) { + iceServers.push({ + urls: `${config.turnUrl}?transport=udp`, + username: config.turnUsername, + credential: config.turnCredential + }); + iceServers.push({ + urls: `${config.turnUrl}?transport=tcp`, + username: config.turnUsername, + credential: config.turnCredential + }); + } + + // Confirm successful authentication to the client with the dynamic ICE servers configuration + client.send(protocol.newAuthenticated(client.userID, iceServers)); // Trigger WebRTC active session joined if both are connected if (sess.driverConn && sess.passengerConn) {