@@ -40,12 +40,13 @@ actor Manager {
40
40
dest: dest,
41
41
urlSession: URLSession ( configuration: sessionConfig)
42
42
) { progressin
43
- pushProgress ( msg: " Downloading library... \n \( progress. description) " )
43
+ // TODO: Debounce, somehow
44
+ pushProgress ( stage: . downloading, downloadProgress: progress)
44
45
}
45
46
} catch {
46
47
throw . download( error)
47
48
}
48
- pushProgress ( msg : " Fetching server version... " )
49
+ pushProgress ( stage : . validating )
49
50
let client = Client ( url: cfg. serverUrl)
50
51
let buildInfo : BuildInfoResponse
51
52
do {
@@ -56,7 +57,6 @@ actor Manager {
56
57
guard let semver= buildInfo. semverelse {
57
58
throw . serverInfo( " invalid version: \( buildInfo. version) " )
58
59
}
59
- pushProgress ( msg: " Validating library... " )
60
60
do {
61
61
try SignatureValidator . validate ( path: dest, expectedVersion: semver)
62
62
} catch {
@@ -67,13 +67,13 @@ actor Manager {
67
67
// so it's safe to execute. However, the SE must be sandboxed, so we defer to the app.
68
68
try await removeQuarantine ( dest)
69
69
70
- pushProgress ( msg : " Opening library... " )
70
+ pushProgress ( stage : . opening )
71
71
do {
72
72
try tunnelHandle= TunnelHandle ( dylibPath: dest)
73
73
} catch {
74
74
throw . tunnelSetup( error)
75
75
}
76
- pushProgress ( msg : " Setting up tunnel... " )
76
+ pushProgress ( stage : . settingUpTunnel )
77
77
speaker= await Speaker < Vpn_ManagerMessage , Vpn_TunnelMessage > (
78
78
writeFD: tunnelHandle. writeHandle,
79
79
readFD: tunnelHandle. readHandle
@@ -168,8 +168,7 @@ actor Manager {
168
168
}
169
169
170
170
func startVPN( ) async throws ( ManagerError) {
171
- // Clear progress message
172
- pushProgress ( msg: nil )
171
+ pushProgress ( stage: . startingTunnel)
173
172
logger. info ( " sending start rpc " )
174
173
guard let tunFd= ptp. tunnelFileDescriptorelse {
175
174
logger. error ( " no fd " )
@@ -246,13 +245,13 @@ actor Manager {
246
245
}
247
246
}
248
247
249
- func pushProgress( msg : String ? ) {
248
+ func pushProgress( stage : ProgressStage , downloadProgress : DownloadProgress ? = nil ) {
250
249
guard let conn= globalXPCListenerDelegate. connelse {
251
250
logger. warning ( " couldn't send progress message to app: no connection " )
252
251
return
253
252
}
254
- logger. debug ( " sending progress message to app: \( msg ?? " nil " ) " )
255
- conn. onProgress ( msg : msg )
253
+ logger. debug ( " sending progress message to app " )
254
+ conn. onProgress ( stage : stage , downloadProgress : downloadProgress )
256
255
}
257
256
258
257
struct ManagerConfig {
@@ -333,7 +332,7 @@ private func removeQuarantine(_ dest: URL) async throws(ManagerError) {
333
332
let file = NSURL ( fileURLWithPath: dest. path)
334
333
try ? file. getResourceValue ( & flag, forKey: kCFURLQuarantinePropertiesKeyas URLResourceKey )
335
334
if flag!= nil {
336
- pushProgress ( msg : " Unquarantining download... " )
335
+ pushProgress ( stage : . removingQuarantine )
337
336
// Try the privileged helper first (it may not even be registered)
338
337
if await globalHelperXPCSpeaker. tryRemoveQuarantine ( path: dest. path) {
339
338
// Success!