diff --git a/Tun/Super/SDLSuperService.swift b/Tun/Super/SDLSuperService.swift index 19d7dd3..f2b5127 100644 --- a/Tun/Super/SDLSuperService.swift +++ b/Tun/Super/SDLSuperService.swift @@ -11,6 +11,7 @@ actor SDLSuperService { private var generation: UInt64 = 0 private var isRunning = false private var isStopping = false + private var needsImmediateRestart = false private let retryDelay: Duration init(serverEndpoint: SDLConfiguration.ResolvedServerEndpoint, port: UInt16 = 1443, retryDelay: Duration = .seconds(5)) { @@ -60,9 +61,19 @@ actor SDLSuperService { } catch { self.clearCurrent(session, generation: generation) await session.stop() + + guard !self.isStopping else { + break + } + SDLLogger.log("[SDLSuperService] session failed: \(error.localizedDescription), will restart", category: .super) } + if self.consumeImmediateRestartRequest() { + SDLLogger.log("[SDLSuperService] session invalidated after wakeup, will restart immediately", category: .super) + continue + } + try await Task.sleep(for: self.retryDelay) } } @@ -77,6 +88,7 @@ actor SDLSuperService { return } + self.needsImmediateRestart = true await self.invalidateCurrentSession() } @@ -98,6 +110,12 @@ actor SDLSuperService { await session?.stop() } + private func consumeImmediateRestartRequest() -> Bool { + let needsImmediateRestart = self.needsImmediateRestart + self.needsImmediateRestart = false + return needsImmediateRestart + } + private func clearCurrent(_ session: SDLSuperSession, generation: UInt64) { guard self.generation == generation else { return