@@ -61,11 +61,30 @@ final class CoderVPNService: NSObject, VPNService {
6161 if tunnelState == . connecting {
6262 progress = . init ( stage : . initial , downloadProgress : nil )
6363 }
64+ if case let . failed ( tunnelError ) = tunnelState , tunnelState != oldValue ,
65+ tunnelError != . networkExtensionError ( . unconfigured )
66+ {
67+ onFailure ? ( tunnelError )
68+ }
69+ }
70+ }
71+
72+ @ Published var sysExtnState : SystemExtensionState = . uninstalled {
73+ didSet {
74+ if case . failed = sysExtnState , sysExtnState != oldValue {
75+ onFailure ? ( . systemExtensionError ( sysExtnState ) )
76+ }
77+ }
78+ }
79+
80+ @ Published var neState : NetworkExtensionState = . unconfigured {
81+ didSet {
82+ if case . failed = neState , neState != oldValue {
83+ onFailure ? ( . networkExtensionError ( neState ) )
84+ }
6485 }
6586 }
6687
67- @ Published var sysExtnState : SystemExtensionState = . uninstalled
68- @ Published var neState : NetworkExtensionState = . unconfigured
6988 var state : VPNServiceState {
7089 guard sysExtnState == . installed else {
7190 return . failed ( . systemExtensionError ( sysExtnState ) )
@@ -87,6 +106,7 @@ final class CoderVPNService: NSObject, VPNService {
87106 // Whether the VPN should start as soon as possible
88107 var startWhenReady : Bool = false
89108 var onStart : ( ( ) -> Void ) ?
109+ var onFailure : ( ( VPNServiceError ) -> Void ) ?
90110
91111 // systemExtnDelegate holds a reference to the SystemExtensionDelegate so that it doesn't get
92112 // garbage collected while the OSSystemExtensionRequest is in flight, since the OS framework
0 commit comments