11import CoderSDK
22import NetworkExtension
3- import os
43import VPNLib
4+ import XPCHub
55import VPNXPC
6+ import os
67
78actor Manager {
89 let ptp : PacketTunnelProvider
@@ -69,6 +70,7 @@ actor Manager {
6970 } catch {
7071 fatalError ( " openTunnelTask must only throw TunnelHandleError " )
7172 }
73+
7274 readLoop = Task { try await run ( ) }
7375 }
7476
@@ -85,17 +87,15 @@ actor Manager {
8587 } catch {
8688 logger. error ( " tunnel read loop failed: \( error) " )
8789 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 )
9192 }
9293 return
9394 }
9495 logger. info ( " tunnel read loop exited " )
9596 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 ( )
9999 }
100100 }
101101
@@ -106,12 +106,10 @@ actor Manager {
106106 }
107107 switch msgType {
108108 case . peerUpdate:
109- if let connection = globalXPCListenerDelegate. getActiveConnection ( ) {
110- // We can call back to the client
109+ if let conn = globalXPCListenerDelegate. getActiveConnection ( ) {
111110 do {
112- let client = connection. remoteObjectProxy as? VPNXPCClientCallbackProtocol
113111 let data = try msg. peerUpdate. serializedData ( )
114- client! . onPeerUpdate ( data)
112+ conn . onPeerUpdate ( data)
115113 } catch {
116114 logger. error ( " failed to send peer update to client: \( error) " )
117115 }
@@ -140,35 +138,42 @@ actor Manager {
140138 func startVPN( ) async throws ( ManagerError) {
141139 logger. info ( " sending start rpc " )
142140 guard let tunFd = ptp. tunnelFileDescriptor else {
141+ logger. error ( " no fd " )
143142 throw . noTunnelFileDescriptor
144143 }
145144 let resp : Vpn_TunnelMessage
146145 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+ } )
154154 } catch {
155+ logger. error ( " rpc failed \( error) " )
155156 throw . failedRPC( error)
156157 }
157158 guard case let . start( startResp) = resp. msg else {
159+ logger. error ( " incorrect response " )
158160 throw . incorrectResponse( resp)
159161 }
160162 if !startResp. success {
163+ logger. error ( " no success " )
161164 throw . errorResponse( msg: startResp. errorMessage)
162165 }
166+ logger. info ( " startVPN done " )
163167 }
164168
165169 func stopVPN( ) async throws ( ManagerError) {
166170 logger. info ( " sending stop rpc " )
167171 let resp : Vpn_TunnelMessage
168172 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+ } )
172177 } catch {
173178 throw . failedRPC( error)
174179 }
@@ -186,9 +191,10 @@ actor Manager {
186191 logger. info ( " sending peer state request " )
187192 let resp : Vpn_TunnelMessage
188193 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+ } )
192198 } catch {
193199 throw . failedRPC( error)
194200 }
@@ -240,17 +246,18 @@ enum ManagerError: Error {
240246}
241247
242248func 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+ }
254261 let logger = Logger (
255262 subsystem: " \( Bundle . main. bundleIdentifier!) .dylib " ,
256263 category: log. loggerNames. joined ( separator: " . " )
0 commit comments