@@ -290,6 +290,7 @@ public final class TorManager: ObservableObject {
290290
291291 public func ensureRunningOnForeground( ) {
292292 if !allowAutoStart { return }
293+ SecureLogger . debug ( " TorManager: ensureRunningOnForeground() started " , category: . session)
293294 Task . detached ( priority: . userInitiated) { [ weak self] in
294295 guard let self = self else { return }
295296 let claimed : Bool = await MainActor . run {
@@ -299,54 +300,28 @@ public final class TorManager: ObservableObject {
299300 }
300301 if !claimed { return }
301302
302- // Try to wake if dormant
303- if await self . wakeFromDormant ( ) {
304- await MainActor . run { self . restarting = false }
305- return
306- }
307-
308303 // Check if already ready
309304 let alreadyReady = await MainActor . run { self . isReady }
310305 if alreadyReady {
311306 await MainActor . run { self . restarting = false }
312307 return
313308 }
314309
315- // Restart
310+ // Arti doesn't support dormant/wake (it's a no-op stub), so always do full restart
316311 await self . restartArti ( )
317312 await MainActor . run { self . restarting = false }
318313 }
319314 }
320315
321316 public func goDormantOnBackground( ) {
317+ // Arti doesn't support real dormant mode, so just mark as not ready.
318+ // iOS will suspend the runtime anyway. On foreground we do a full restart.
319+ // Clear isStarting so foreground recovery can proceed if bootstrap was interrupted.
322320 SecureLogger . debug ( " TorManager: goDormantOnBackground() called " , category: . session)
323- Task . detached { [ weak self] in
324- guard let self = self else { return }
325- let result = arti_go_dormant ( )
326- if result == 0 {
327- SecureLogger . info ( " TorManager: signalled DORMANT " , category: . session)
328- await MainActor . run {
329- self . isDormant = true
330- self . isReady = false
331- self . socksReady = false
332- self . isStarting = false
333- }
334- } else {
335- // Dormant not supported, do full shutdown
336- SecureLogger . warning ( " TorManager: DORMANT failed; shutting down " , category: . session)
337- _ = arti_stop ( )
338- await MainActor . run {
339- self . isDormant = false
340- self . isReady = false
341- self . socksReady = false
342- self . bootstrapProgress = 0
343- self . bootstrapSummary = " "
344- self . isStarting = false
345- self . didStart = false
346- self . bootstrapMonitorStarted = false
347- // Note: Don't clear startedAt - it will be set fresh on next start
348- }
349- }
321+ Task { @MainActor in
322+ self . isReady = false
323+ self . socksReady = false
324+ self . isStarting = false
350325 }
351326 }
352327
@@ -379,31 +354,6 @@ public final class TorManager: ObservableObject {
379354 }
380355 }
381356
382- private func wakeFromDormant( ) async -> Bool {
383- let wasDormant = await MainActor . run { self . isDormant }
384- if !wasDormant { return false }
385-
386- let result = arti_wake ( )
387- if result != 0 { return false }
388-
389- await MainActor . run {
390- self . isDormant = false
391- self . isStarting = true
392- self . socksReady = false
393- }
394-
395- let ready = await waitForSocksReady ( timeout: 12.0 )
396- await MainActor . run {
397- self . socksReady = ready
398- self . isStarting = !ready
399- }
400-
401- if ready {
402- SecureLogger . info ( " TorManager: woke from dormant " , category: . session)
403- }
404- return ready
405- }
406-
407357 private func restartArti( ) async {
408358 SecureLogger . debug ( " TorManager: restartArti() starting " , category: . session)
409359 await MainActor . run {
0 commit comments