Skip to content

Commit e77ea5a

Browse files
committed
chore: handle waking from device sleep
1 parent d2ed4a9 commit e77ea5a

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

Coder Desktop/Coder Desktop/XPCInterface.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,13 @@ import VPNLib
5959
}
6060
}
6161

62-
func onPeerUpdate(_ data: Data) {
62+
func onPeerUpdate(_ data: Data, isState: Bool) {
6363
Task { @MainActor in
64-
svc.onExtensionPeerUpdate(data)
64+
if isState {
65+
svc.onExtensionPeerState(data)
66+
} else {
67+
svc.onExtensionPeerUpdate(data)
68+
}
6569
}
6670
}
6771

Coder Desktop/VPN/Manager.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ actor Manager {
111111
if let conn = globalXPCListenerDelegate.conn {
112112
do {
113113
let data = try msg.peerUpdate.serializedData()
114-
conn.onPeerUpdate(data)
114+
conn.onPeerUpdate(data, isState: false)
115115
} catch {
116116
logger.error("failed to send peer update to client: \(error)")
117117
}
@@ -218,6 +218,15 @@ actor Manager {
218218
}
219219
return resp.peerUpdate
220220
}
221+
222+
func forcePushPeerState() async throws {
223+
let state = try await getPeerState().serializedData()
224+
guard let conn = globalXPCListenerDelegate.conn else {
225+
logger.info("app was not running on wake, not pushing state")
226+
return
227+
}
228+
conn.onPeerUpdate(state, isState: true)
229+
}
221230
}
222231

223232
struct ManagerConfig {

Coder Desktop/VPN/PacketTunnelProvider.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,24 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
122122
}
123123

124124
override func sleep(completionHandler: @escaping () -> Void) {
125-
// Add code here to get ready to sleep.
125+
// Nothing we need to do on sleep right now
126126
logger.debug("sleep called")
127127
completionHandler()
128128
}
129129

130130
override func wake() {
131-
// Add code here to wake up.
132131
logger.debug("wake called")
132+
guard let manager else {
133+
logger.error("wake called with nil Manager")
134+
return
135+
}
136+
Task {
137+
do {
138+
try await manager.forcePushPeerState()
139+
} catch {
140+
logger.error("error pushing peer state: \(error, privacy: .public)")
141+
}
142+
}
133143
}
134144

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

Coder Desktop/VPNLib/XPC.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Foundation
99
@preconcurrency
1010
@objc public protocol VPNXPCClientCallbackProtocol {
1111
// data is a serialized `Vpn_PeerUpdate`
12-
func onPeerUpdate(_ data: Data)
12+
// If `isState` is true, the update should replace the current state.
13+
func onPeerUpdate(_ data: Data, isState: Bool)
1314
func removeQuarantine(path: String, reply: @escaping (Bool) -> Void)
1415
}

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