From 488c90cbaa0ee622104ffbef02ff444ec3982591 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 23 Apr 2022 00:16:10 +0400 Subject: [PATCH] Custom reflectors --- .../Sources/OngoingCallContext.swift | 57 ++++++++++--------- .../OngoingCallThreadLocalContext.h | 4 +- .../Sources/OngoingCallThreadLocalContext.mm | 6 +- submodules/TgVoipWebrtc/tgcalls | 2 +- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/submodules/TelegramVoip/Sources/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift index 7117f3395c..5f4cc7d69e 100644 --- a/submodules/TelegramVoip/Sources/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -8,7 +8,7 @@ import TgVoip import TgVoipWebrtc private let debugUseLegacyVersionForReflectors: Bool = { - #if DEBUG + #if DEBUG && false return true #else return false @@ -72,28 +72,27 @@ private func callConnectionDescription(_ connection: CallSessionConnection) -> O } } -private func callConnectionDescriptionsWebrtc(_ connection: CallSessionConnection) -> [OngoingCallConnectionDescriptionWebrtc] { +private func callConnectionDescriptionsWebrtc(_ connection: CallSessionConnection, idMapping: [Int64: UInt8]) -> [OngoingCallConnectionDescriptionWebrtc] { switch connection { case let .reflector(reflector): - #if DEBUG + guard let id = idMapping[reflector.id] else { + return [] + } var result: [OngoingCallConnectionDescriptionWebrtc] = [] if !reflector.ip.isEmpty { - result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: false, hasTurn: true, ip: reflector.ip, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) + result.append(OngoingCallConnectionDescriptionWebrtc(reflectorId: id, hasStun: false, hasTurn: true, ip: reflector.ip, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) } if !reflector.ipv6.isEmpty { - result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: false, hasTurn: true, ip: reflector.ipv6, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) + result.append(OngoingCallConnectionDescriptionWebrtc(reflectorId: id, hasStun: false, hasTurn: true, ip: reflector.ipv6, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) } return result - #else - return [] - #endif case let .webRtcReflector(reflector): var result: [OngoingCallConnectionDescriptionWebrtc] = [] if !reflector.ip.isEmpty { - result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: reflector.hasStun, hasTurn: reflector.hasTurn, ip: reflector.ip, port: reflector.port, username: reflector.username, password: reflector.password)) + result.append(OngoingCallConnectionDescriptionWebrtc(reflectorId: 0, hasStun: reflector.hasStun, hasTurn: reflector.hasTurn, ip: reflector.ip, port: reflector.port, username: reflector.username, password: reflector.password)) } if !reflector.ipv6.isEmpty { - result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: reflector.hasStun, hasTurn: reflector.hasTurn, ip: reflector.ipv6, port: reflector.port, username: reflector.username, password: reflector.password)) + result.append(OngoingCallConnectionDescriptionWebrtc(reflectorId: 0, hasStun: reflector.hasStun, hasTurn: reflector.hasTurn, ip: reflector.ipv6, port: reflector.port, username: reflector.username, password: reflector.password)) } return result } @@ -777,9 +776,11 @@ public final class OngoingCallContext { if let strongSelf = self { var useModernImplementation = true var version = version + var allowP2P = allowP2P if debugUseLegacyVersionForReflectors { useModernImplementation = true - version = "4.0.1" + version = "3.0.0" + allowP2P = false } else { useModernImplementation = version != OngoingCallThreadLocalContext.version() } @@ -796,6 +797,24 @@ public final class OngoingCallContext { } let unfilteredConnections = [connections.primary] + connections.alternatives + + var reflectorIdList: [Int64] = [] + for connection in unfilteredConnections { + switch connection { + case let .reflector(reflector): + reflectorIdList.append(reflector.id) + case .webRtcReflector: + break + } + } + + reflectorIdList.sort() + + var reflectorIdMapping: [Int64: UInt8] = [:] + for i in 0 ..< reflectorIdList.count { + reflectorIdMapping[reflectorIdList[i]] = UInt8(i + 1) + } + var processedConnections: [CallSessionConnection] = [] var filteredConnections: [OngoingCallConnectionDescriptionWebrtc] = [] for connection in unfilteredConnections { @@ -803,23 +822,9 @@ public final class OngoingCallContext { continue } processedConnections.append(connection) - filteredConnections.append(contentsOf: callConnectionDescriptionsWebrtc(connection)) + filteredConnections.append(contentsOf: callConnectionDescriptionsWebrtc(connection, idMapping: reflectorIdMapping)) } - /*#if DEBUG - for connection in filteredConnections { - if connection.username == "reflector" { - filteredConnections = [OngoingCallConnectionDescriptionWebrtc( - connectionId: 1, - hasStun: false, - hasTurn: true, - ip: "192.168.1.110", port: 1200, - username: "reflector", password: connection.password - )] - } - } - #endif*/ - let context = OngoingCallThreadLocalContextWebrtc(version: version, queue: OngoingCallThreadLocalContextQueueImpl(queue: queue), proxy: voipProxyServer, networkType: ongoingNetworkTypeForTypeWebrtc(initialNetworkType), dataSaving: ongoingDataSavingForTypeWebrtc(dataSaving), derivedState: derivedState.data, key: key, isOutgoing: isOutgoing, connections: filteredConnections, maxLayer: maxLayer, allowP2P: allowP2P, allowTCP: enableTCP, enableStunMarking: enableStunMarking, logPath: tempLogPath, statsLogPath: tempStatsLogPath, sendSignalingData: { [weak callSessionManager] data in callSessionManager?.sendSignalingData(internalId: internalId, data: data) }, videoCapturer: video?.impl, preferredVideoCodec: preferredVideoCodec, audioInputDeviceId: "") diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 5736fdaa25..91a49f1865 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -13,7 +13,7 @@ @interface OngoingCallConnectionDescriptionWebrtc : NSObject -@property (nonatomic, readonly) int64_t connectionId; +@property (nonatomic, readonly) uint8_t reflectorId; @property (nonatomic, readonly) bool hasStun; @property (nonatomic, readonly) bool hasTurn; @property (nonatomic, strong, readonly) NSString * _Nonnull ip; @@ -21,7 +21,7 @@ @property (nonatomic, strong, readonly) NSString * _Nonnull username; @property (nonatomic, strong, readonly) NSString * _Nonnull password; -- (instancetype _Nonnull)initWithConnectionId:(int64_t)connectionId hasStun:(bool)hasStun hasTurn:(bool)hasTurn ip:(NSString * _Nonnull)ip port:(int32_t)port username:(NSString * _Nonnull)username password:(NSString * _Nonnull)password; +- (instancetype _Nonnull)initWithReflectorId:(uint8_t)reflectorId hasStun:(bool)hasStun hasTurn:(bool)hasTurn ip:(NSString * _Nonnull)ip port:(int32_t)port username:(NSString * _Nonnull)username password:(NSString * _Nonnull)password; @end diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 290fbe744d..a693b4a065 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -41,10 +41,10 @@ @implementation OngoingCallConnectionDescriptionWebrtc -- (instancetype _Nonnull)initWithConnectionId:(int64_t)connectionId hasStun:(bool)hasStun hasTurn:(bool)hasTurn ip:(NSString * _Nonnull)ip port:(int32_t)port username:(NSString * _Nonnull)username password:(NSString * _Nonnull)password { +- (instancetype _Nonnull)initWithReflectorId:(uint8_t)reflectorId hasStun:(bool)hasStun hasTurn:(bool)hasTurn ip:(NSString * _Nonnull)ip port:(int32_t)port username:(NSString * _Nonnull)username password:(NSString * _Nonnull)password { self = [super init]; if (self != nil) { - _connectionId = connectionId; + _reflectorId = reflectorId; _hasStun = hasStun; _hasTurn = hasTurn; _ip = ip; @@ -882,6 +882,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; for (OngoingCallConnectionDescriptionWebrtc *connection in connections) { if (connection.hasStun) { parsedRtcServers.push_back((tgcalls::RtcServer){ + .id = 0, .host = connection.ip.UTF8String, .port = (uint16_t)connection.port, .login = "", @@ -891,6 +892,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; } if (connection.hasTurn) { parsedRtcServers.push_back((tgcalls::RtcServer){ + .id = connection.reflectorId, .host = connection.ip.UTF8String, .port = (uint16_t)connection.port, .login = connection.username.UTF8String, diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index 3ce2c38805..16591fbfbd 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit 3ce2c38805ea5af7a05b8fe93a26becaf9e76bd3 +Subproject commit 16591fbfbd3afc0b4a5a89040cae63563c0a33d0