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

+24-4
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

+4-1
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)