Skip to content

Commit 8463ffe

Browse files
committed
chore: handle waking from device sleep
1 parent 84d6ad3 commit 8463ffe

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

Coder Desktop/VPN/PacketTunnelProvider.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
4747
options _: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void
4848
) {
4949
logger.info("startTunnel called")
50+
start(completionHandler)
51+
}
52+
53+
// called by `startTunnel` and on `wake`
54+
func start(_ completionHandler: @escaping (Error?) -> Void ) {
5055
guard manager == nil else {
5156
logger.error("startTunnel called with non-nil Manager")
5257
completionHandler(makeNSError(suffix: "PTP", desc: "Already running"))
@@ -95,8 +100,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
95100
with _: NEProviderStopReason, completionHandler: @escaping () -> Void
96101
) {
97102
logger.debug("stopTunnel called")
103+
teardown(completionHandler)
104+
}
105+
106+
// called by `stopTunnel` and `sleep`
107+
func teardown(_ completionHandler: @escaping () -> Void) {
98108
guard let manager else {
99-
logger.error("stopTunnel called with nil Manager")
109+
logger.error("teardown called with nil Manager")
100110
completionHandler()
101111
return
102112
}
@@ -121,15 +131,25 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
121131
}
122132
}
123133

134+
// sleep and wake reference: https://developer.apple.com/forums/thread/95988
124135
override func sleep(completionHandler: @escaping () -> Void) {
125-
// Add code here to get ready to sleep.
126136
logger.debug("sleep called")
127-
completionHandler()
137+
teardown(completionHandler)
128138
}
129139

130140
override func wake() {
131-
// Add code here to wake up.
132141
logger.debug("wake called")
142+
self.reasserting = true
143+
self.currentSettings = .init(tunnelRemoteAddress: "127.0.0.1")
144+
self.setTunnelNetworkSettings(nil)
145+
start { error in
146+
if let error {
147+
self.logger.error("error starting tunnel after wake: \(error.localizedDescription)")
148+
self.cancelTunnelWithError(error)
149+
} else {
150+
self.reasserting = false
151+
}
152+
}
133153
}
134154

135155
// Wrapper around `setTunnelNetworkSettings` that supports merging updates

Coder Desktop/VPNLib/Download.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,13 @@ public func download(src: URL, dest: URL) async throws(DownloadError) {
109109
}
110110
}
111111
// TODO: Add Content-Length headers to coderd, add download progress delegate
112+
let sessionConfig = URLSessionConfiguration.default
113+
sessionConfig.waitsForConnectivity = true
114+
let session = URLSession(configuration: sessionConfig)
112115
let tempURL: URL
113116
let response: URLResponse
114117
do {
115-
(tempURL, response) = try await URLSession.shared.download(for: req)
118+
(tempURL, response) = try await session.download(for: req)
116119
} catch {
117120
throw .networkError(error)
118121
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy