-
Notifications
You must be signed in to change notification settings - Fork 1
/
CloudProxyView.swift
111 lines (95 loc) · 3.35 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
import SwiftUI
import AgoraRtm
public class CloudProxyManager: GetStartedSignalingManager {
let proxyServer: String
let proxyPort: UInt16
let proxyAccount: String?
let proxyPassword: String?
public override func setupEngine() -> RtmClientKit {
let config = RtmClientConfig(appId: self.appId, userId: self.userId)
let proxyConfig = RtmProxyConfig(
proxyType: .http,
server: proxyServer,
port: proxyPort
)
proxyConfig.account = self.proxyAccount
proxyConfig.password = self.proxyPassword
config.proxyConfig = proxyConfig
guard let eng = try? RtmClientKit(
config: config, delegate: self
) else {
fatalError("could not create client engine: check parameters")
}
self.engine = eng
return eng
}
public func rtmKit(
_ rtmClient: RtmClientKit, channel: String,
connectionChangedToState state: RtmClientConnectionState,
reason: RtmClientConnectionChangeReason
) {
guard reason == .settingProxyServer else { return }
switch state {
case .disconnected: print("proxy disconnected")
case .connecting: print("proxy connecting")
case .connected: print("proxy connected")
case .reconnecting: print("proxy reconnecting")
case .failed: print("proxy failed")
default: break
}
}
init(
appId: String, userId: String,
proxyServer: String, proxyPort: UInt16,
proxyAccount: String?, proxyPassword: String?
) {
self.proxyServer = proxyServer
self.proxyPort = proxyPort
self.proxyAccount = proxyAccount
self.proxyPassword = proxyPassword
super.init(appId: appId, userId: userId)
}
}
struct CloudProxyView: View {
@ObservedObject var signalingManager: CloudProxyManager
let channelId: String
var body: some View {
ZStack {
VStack {
MessagesListView(
messages: $signalingManager.messages,
localUser: signalingManager.userId
).padding()
MessageInputView(publish: publish(message:))
}
ToastView(message: $signalingManager.label)
}.onAppear {
await signalingManager.loginAndSub(
to: self.channelId, with: DocsAppConfig.shared.token
)
}.onDisappear { try? await signalingManager.destroy()
}
}
// MARK: - Helpers and Setup
func publish(message: String) async {
await self.signalingManager.publishAndRecord(
message: message, to: self.channelId
)
}
init(
channelId: String, userId: String,
proxyServer: String, proxyPort: UInt16,
proxyAccount: String?, proxyPassword: String?
) {
DocsAppConfig.shared.channel = channelId
DocsAppConfig.shared.uid = userId
self.channelId = channelId
self.signalingManager = CloudProxyManager(
appId: DocsAppConfig.shared.appId, userId: userId,
proxyServer: proxyServer, proxyPort: proxyPort,
proxyAccount: proxyAccount, proxyPassword: proxyPassword
)
}
static var docPath: String = "cloud-proxy"
static var docTitle: String = "Connect through restricted networks with Cloud Proxy"
}