1
1
import CoderSDK
2
2
import NetworkExtension
3
- import os
4
3
import VPNLib
4
+ import XPCHub
5
5
import VPNXPC
6
+ import os
6
7
7
8
actor Manager {
8
9
let ptp : PacketTunnelProvider
@@ -69,6 +70,7 @@ actor Manager {
69
70
} catch {
70
71
fatalError ( " openTunnelTask must only throw TunnelHandleError " )
71
72
}
73
+
72
74
readLoop = Task { try await run ( ) }
73
75
}
74
76
@@ -85,17 +87,15 @@ actor Manager {
85
87
} catch {
86
88
logger. error ( " tunnel read loop failed: \( error) " )
87
89
try await tunnelHandle. close ( )
88
- if let connection = globalXPCListenerDelegate. getActiveConnection ( ) {
89
- let client = connection. remoteObjectProxy as? VPNXPCClientCallbackProtocol
90
- client? . onError ( error as NSError )
90
+ if let conn = globalXPCListenerDelegate. getActiveConnection ( ) {
91
+ conn. onError ( error as NSError )
91
92
}
92
93
return
93
94
}
94
95
logger. info ( " tunnel read loop exited " )
95
96
try await tunnelHandle. close ( )
96
- if let connection = globalXPCListenerDelegate. getActiveConnection ( ) {
97
- let client = connection. remoteObjectProxy as? VPNXPCClientCallbackProtocol
98
- client? . onStop ( )
97
+ if let conn = globalXPCListenerDelegate. getActiveConnection ( ) {
98
+ conn. onStop ( )
99
99
}
100
100
}
101
101
@@ -106,12 +106,10 @@ actor Manager {
106
106
}
107
107
switch msgType {
108
108
case . peerUpdate:
109
- if let connection = globalXPCListenerDelegate. getActiveConnection ( ) {
110
- // We can call back to the client
109
+ if let conn = globalXPCListenerDelegate. getActiveConnection ( ) {
111
110
do {
112
- let client = connection. remoteObjectProxy as? VPNXPCClientCallbackProtocol
113
111
let data = try msg. peerUpdate. serializedData ( )
114
- client! . onPeerUpdate ( data)
112
+ conn . onPeerUpdate ( data)
115
113
} catch {
116
114
logger. error ( " failed to send peer update to client: \( error) " )
117
115
}
@@ -140,35 +138,42 @@ actor Manager {
140
138
func startVPN( ) async throws ( ManagerError) {
141
139
logger. info ( " sending start rpc " )
142
140
guard let tunFd = ptp. tunnelFileDescriptor else {
141
+ logger. error ( " no fd " )
143
142
throw . noTunnelFileDescriptor
144
143
}
145
144
let resp : Vpn_TunnelMessage
146
145
do {
147
- resp = try await speaker. unaryRPC ( . with { msg in
148
- msg. start = . with { req in
149
- req. tunnelFileDescriptor = tunFd
150
- req. apiToken = cfg. apiToken
151
- req. coderURL = cfg. serverUrl. absoluteString
152
- }
153
- } )
146
+ resp = try await speaker. unaryRPC (
147
+ . with { msg in
148
+ msg. start = . with { req in
149
+ req. tunnelFileDescriptor = tunFd
150
+ req. apiToken = cfg. apiToken
151
+ req. coderURL = cfg. serverUrl. absoluteString
152
+ }
153
+ } )
154
154
} catch {
155
+ logger. error ( " rpc failed \( error) " )
155
156
throw . failedRPC( error)
156
157
}
157
158
guard case let . start( startResp) = resp. msg else {
159
+ logger. error ( " incorrect response " )
158
160
throw . incorrectResponse( resp)
159
161
}
160
162
if !startResp. success {
163
+ logger. error ( " no success " )
161
164
throw . errorResponse( msg: startResp. errorMessage)
162
165
}
166
+ logger. info ( " startVPN done " )
163
167
}
164
168
165
169
func stopVPN( ) async throws ( ManagerError) {
166
170
logger. info ( " sending stop rpc " )
167
171
let resp : Vpn_TunnelMessage
168
172
do {
169
- resp = try await speaker. unaryRPC ( . with { msg in
170
- msg. stop = . init( )
171
- } )
173
+ resp = try await speaker. unaryRPC (
174
+ . with { msg in
175
+ msg. stop = . init( )
176
+ } )
172
177
} catch {
173
178
throw . failedRPC( error)
174
179
}
@@ -186,9 +191,10 @@ actor Manager {
186
191
logger. info ( " sending peer state request " )
187
192
let resp : Vpn_TunnelMessage
188
193
do {
189
- resp = try await speaker. unaryRPC ( . with { msg in
190
- msg. getPeerUpdate = . init( )
191
- } )
194
+ resp = try await speaker. unaryRPC (
195
+ . with { msg in
196
+ msg. getPeerUpdate = . init( )
197
+ } )
192
198
} catch {
193
199
throw . failedRPC( error)
194
200
}
@@ -240,17 +246,18 @@ enum ManagerError: Error {
240
246
}
241
247
242
248
func writeVpnLog( _ log: Vpn_Log ) {
243
- let level : OSLogType = switch log. level {
244
- case . info: . info
245
- case . debug: . debug
246
- // warn == error
247
- case . warn: . error
248
- case . error: . error
249
- // critical == fatal == fault
250
- case . critical: . fault
251
- case . fatal: . fault
252
- case . UNRECOGNIZED: . info
253
- }
249
+ let level : OSLogType =
250
+ switch log. level {
251
+ case . info: . info
252
+ case . debug: . debug
253
+ // warn == error
254
+ case . warn: . error
255
+ case . error: . error
256
+ // critical == fatal == fault
257
+ case . critical: . fault
258
+ case . fatal: . fault
259
+ case . UNRECOGNIZED: . info
260
+ }
254
261
let logger = Logger (
255
262
subsystem: " \( Bundle . main. bundleIdentifier!) .dylib " ,
256
263
category: log. loggerNames. joined ( separator: " . " )
0 commit comments