@@ -39,6 +39,7 @@ actor Manager {
3939 } catch {
4040 throw . download( error)
4141 }
42+ pushProgress ( msg: " Fetching server version... " )
4243 let client = Client ( url: cfg. serverUrl)
4344 let buildInfo : BuildInfoResponse
4445 do {
@@ -49,6 +50,7 @@ actor Manager {
4950 guard let semver = buildInfo. semver else {
5051 throw . serverInfo( " invalid version: \( buildInfo. version) " )
5152 }
53+ pushProgress ( msg: " Validating library... " )
5254 do {
5355 try SignatureValidator . validate ( path: dest, expectedVersion: semver)
5456 } catch {
@@ -59,11 +61,13 @@ actor Manager {
5961 // so it's safe to execute. However, the SE must be sandboxed, so we defer to the app.
6062 try await removeQuarantine ( dest)
6163
64+ pushProgress ( msg: " Opening library... " )
6265 do {
6366 try tunnelHandle = TunnelHandle ( dylibPath: dest)
6467 } catch {
6568 throw . tunnelSetup( error)
6669 }
70+ pushProgress ( msg: " Setting up tunnel... " )
6771 speaker = await Speaker < Vpn_ManagerMessage , Vpn_TunnelMessage > (
6872 writeFD: tunnelHandle. writeHandle,
6973 readFD: tunnelHandle. readHandle
@@ -158,6 +162,7 @@ actor Manager {
158162 }
159163
160164 func startVPN( ) async throws ( ManagerError) {
165+ pushProgress ( msg: nil )
161166 logger. info ( " sending start rpc " )
162167 guard let tunFd = ptp. tunnelFileDescriptor else {
163168 logger. error ( " no fd " )
@@ -234,6 +239,15 @@ actor Manager {
234239 }
235240}
236241
242+ func pushProgress( msg: String ? ) {
243+ guard let conn = globalXPCListenerDelegate. conn else {
244+ logger. error ( " couldn't send progress message to app: no connection " )
245+ return
246+ }
247+ logger. info ( " sending progress message to app: \( msg ?? " nil " ) " )
248+ conn. onProgress ( msg: msg)
249+ }
250+
237251struct ManagerConfig {
238252 let apiToken : String
239253 let serverUrl : URL
@@ -312,6 +326,7 @@ private func removeQuarantine(_ dest: URL) async throws(ManagerError) {
312326 let file = NSURL ( fileURLWithPath: dest. path)
313327 try ? file. getResourceValue ( & flag, forKey: kCFURLQuarantinePropertiesKey as URLResourceKey )
314328 if flag != nil {
329+ pushProgress ( msg: " Unquarantining download... " )
315330 // Try the privileged helper first (it may not even be registered)
316331 if await globalHelperXPCSpeaker. tryRemoveQuarantine ( path: dest. path) {
317332 // Success!
0 commit comments