diff --git a/Coder-Desktop/VPN/Manager.swift b/Coder-Desktop/VPN/Manager.swift index adff143..b957381 100644 --- a/Coder-Desktop/VPN/Manager.swift +++ b/Coder-Desktop/VPN/Manager.swift @@ -32,10 +32,9 @@ actor Manager { let sessionConfig = URLSessionConfiguration.default // The tunnel might be asked to start before the network interfaces have woken up from sleep sessionConfig.waitsForConnectivity = true - // URLSession's waiting for connectivity sometimes hangs even when - // the network is up so this is deliberately short (30s) to avoid a - // poor UX where it appears stuck. - sessionConfig.timeoutIntervalForResource = 30 + // Timeout after 5 minutes, or if there's no data for 60 seconds + sessionConfig.timeoutIntervalForRequest = 60 + sessionConfig.timeoutIntervalForResource = 300 try await download(src: dylibPath, dest: dest, urlSession: URLSession(configuration: sessionConfig)) } catch { throw .download(error) diff --git a/Coder-Desktop/VPN/PacketTunnelProvider.swift b/Coder-Desktop/VPN/PacketTunnelProvider.swift index a5bfb15..140cb5c 100644 --- a/Coder-Desktop/VPN/PacketTunnelProvider.swift +++ b/Coder-Desktop/VPN/PacketTunnelProvider.swift @@ -57,7 +57,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable { start(completionHandler) } - // called by `startTunnel` and on `wake` + // called by `startTunnel` func start(_ completionHandler: @escaping (Error?) -> Void) { guard let proto = protocolConfiguration as? NETunnelProviderProtocol, let baseAccessURL = proto.serverAddress @@ -108,7 +108,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable { teardown(completionHandler) } - // called by `stopTunnel` and `sleep` + // called by `stopTunnel` func teardown(_ completionHandler: @escaping () -> Void) { guard let manager else { logger.error("teardown called with nil Manager") @@ -138,34 +138,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable { } } - // sleep and wake reference: https://developer.apple.com/forums/thread/95988 - override func sleep(completionHandler: @escaping () -> Void) { - logger.debug("sleep called") - teardown(completionHandler) - } - - override func wake() { - // It's possible the tunnel is still starting up, if it is, wake should - // be a no-op. - guard !reasserting else { return } - guard manager == nil else { - logger.error("wake called with non-nil Manager") - return - } - logger.debug("wake called") - reasserting = true - currentSettings = .init(tunnelRemoteAddress: "127.0.0.1") - setTunnelNetworkSettings(nil) - start { error in - if let error { - self.logger.error("error starting tunnel after wake: \(error.localizedDescription)") - self.cancelTunnelWithError(error) - } else { - self.reasserting = false - } - } - } - // Wrapper around `setTunnelNetworkSettings` that supports merging updates func applyTunnelNetworkSettings(_ diff: Vpn_NetworkSettingsRequest) async throws { logger.debug("applying settings diff: \(diff.debugDescription, privacy: .public)")