-
Notifications
You must be signed in to change notification settings - Fork 0
/
CloudProxyView.swift
121 lines (103 loc) · 3.63 KB
/
CloudProxyView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//
// TokenAuthenticationView.swift
// Docs-Examples
//
// Created by Max Cobb on 21/06/2023.
//
import SwiftUI
import AgoraRtcKit
class CloudProxyManager: AgoraManager {
@Published var proxyState: AgoraProxyType?
@Published var proxyResponse: Int32 = 0
// MARK: - Agora Engine Functions
func setCloudProxy(to proxyType: AgoraCloudProxyType) {
proxyResponse = self.agoraEngine.setCloudProxy(proxyType)
if proxyType == .noneProxy { proxyState = .noneProxyType }
}
// MARK: - Delegate Methods
// swiftlint:disable:next function_parameter_count
func rtcEngine(
_ engine: AgoraRtcEngineKit, didProxyConnected channel: String,
withUid uid: UInt, proxyType: AgoraProxyType,
localProxyIp: String, elapsed: Int
) {
proxyState = proxyType
}
func rtcEngine(
_ engine: AgoraRtcEngineKit,
connectionChangedTo state: AgoraConnectionState,
reason: AgoraConnectionChangedReason
) {
if state == .failed, reason == .reasonJoinFailed {
// connection failed, try connect with proxy
}
}
// MARK: - Other Setup
init(appId: String, role: AgoraClientRole = .audience, proxyType: AgoraCloudProxyType) {
super.init(appId: appId, role: role)
self.setCloudProxy(to: proxyType)
}
}
// MARK: - Property Helpers
extension AgoraProxyType {
var humanReadableString: String {
switch self {
case .localProxyType:
return "Local Proxy Connected"
case .tcpProxyType:
return "TCP Proxy Connected"
case .udpProxyType:
return "UDP Proxy Connected"
case .tcpProxyAutoFallbackType:
return "TCP Fallback Proxy Connected"
case .noneProxyType:
return "No Proxy Connected"
case .httpProxyType:
return "HTTP Proxy Connected"
case .httpsProxyType:
return "HTTPS Proxy Connected"
@unknown default:
return "Unknown Proxy State"
}
}
}
// MARK: - UI
/// A view that authenticates the user with a token and joins them to a channel using Agora SDK.
struct CloudProxyView: View {
/// The Agora SDK manager.
@ObservedObject var agoraManager: CloudProxyManager
/// Initializes a new ``CloudProxyView``.
///
/// - Parameters:
/// - channelId: The channel ID to join.
/// - proxyType: Type of proxy to be used.
public init(channelId: String, proxyType: AgoraCloudProxyType) {
DocsAppConfig.shared.channel = channelId
self.agoraManager = CloudProxyManager(
appId: DocsAppConfig.shared.appId,
role: .broadcaster, proxyType: proxyType
)
}
var body: some View {
ZStack {
self.basicScrollingVideos
VStack {
let text = agoraManager.proxyResponse < 0 ?
"Connection Error \(agoraManager.proxyResponse)" :
"Connecting"
Text(agoraManager.proxyState == nil ? text : agoraManager.proxyState!.humanReadableString
).padding().background(.tertiary).cornerRadius(25).padding()
Spacer()
}.padding()
ToastView(message: $agoraManager.label)
}.onAppear { await agoraManager.joinChannel(DocsAppConfig.shared.channel)
}.onDisappear { agoraManager.leaveChannel() }
}
static let docPath = getFolderName(from: #file)
static let docTitle = LocalizedStringKey("cloud-proxy-title")
}
struct CloudProxyView_Previews: PreviewProvider {
static var previews: some View {
CloudProxyView(channelId: "test", proxyType: .noneProxy)
}
}