@@ -70,8 +70,6 @@ final class CoderVPNService: NSObject, VPNService {
7070Task {
7171await loadNetworkExtensionConfig ( )
7272}
73- xpc. connect ( )
74- xpc. getPeerState ( )
7573NotificationCenter . default. addObserver (
7674self ,
7775 selector: #selector( vpnDidUpdate ( _: ) ) ,
@@ -93,8 +91,6 @@ final class CoderVPNService: NSObject, VPNService {
9391}
9492
9593await startTunnel ( )
96- xpc. connect ( )
97- xpc. ping ( )
9894 logger. debug ( " network extension enabled " )
9995}
10096
@@ -162,6 +158,7 @@ final class CoderVPNService: NSObject, VPNService {
162158}
163159
164160extension CoderVPNService {
161+ // swiftlint:disable:next cyclomatic_complexity
165162@objc private func vpnDidUpdate( _ notification: Notification ) {
166163guard let connection= notification. objectas? NETunnelProviderSession else {
167164return
@@ -176,9 +173,21 @@ extension CoderVPNService {
176173}
177174}
178175case . connecting:
179- tunnelState= . connecting
176+ // If transitioning to 'connecting' from any other state,
177+ // then the network extension is running, and we can connect over XPC
178+ if tunnelState!= . connecting{
179+ xpc. connect ( )
180+ xpc. ping ( )
181+ tunnelState= . connecting
182+ }
180183case . connected:
181- tunnelState= . connected
184+ // If transitioning to 'connected' from any other state, the tunnel has
185+ // finished starting, and we can learn the peer state
186+ if tunnelState!= . connected{
187+ xpc. connect ( )
188+ xpc. getPeerState ( )
189+ tunnelState= . connected
190+ }
182191case . reasserting:
183192 tunnelState= . connecting
184193case . disconnecting: