TM-SGNL-iOS/SignalUI/Calls/CallLinkFetcher.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

57 lines
1.8 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import LibSignalClient
public import SignalRingRTC
public import SignalServiceKit
public struct CallLinkNotFoundError: Error {}
public class CallLinkFetcherImpl {
private let sfuClient: SFUClient
// Even though we never use this, we need to retain it to ensure
// `sfuClient` continues to work properly.
private let sfuClientHttpClient: AnyObject
public init() {
let httpClient = CallHTTPClient()
self.sfuClient = SignalRingRTC.SFUClient(httpClient: httpClient.ringRtcHttpClient)
self.sfuClientHttpClient = httpClient
}
public func readCallLink(
_ rootKey: CallLinkRootKey,
authCredential: SignalServiceKit.CallLinkAuthCredential
) async throws -> SignalServiceKit.CallLinkState {
let sfuUrl = DebugFlags.callingUseTestSFU.get() ? TSConstants.sfuTestURL : TSConstants.sfuURL
let secretParams = CallLinkSecretParams.deriveFromRootKey(rootKey.bytes)
let authCredentialPresentation = authCredential.present(callLinkParams: secretParams)
do {
return try await SignalServiceKit.CallLinkState(self.sfuClient.readCallLink(
sfuUrl: sfuUrl,
authCredentialPresentation: authCredentialPresentation.serialize(),
linkRootKey: rootKey
).unwrap())
} catch where error.rawValue == 404 {
throw CallLinkNotFoundError()
}
}
}
public struct SFUError: Error {
let rawValue: UInt16
}
extension SFUResult {
public func unwrap() throws(SFUError) -> Value {
switch self {
case .success(let value):
return value
case .failure(let errorCode):
throw SFUError(rawValue: errorCode)
}
}
}