@@ -43,47 +43,73 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
43
43
return nil
44
44
}
45
45
46
+ // swiftlint:disable:next function_body_length
46
47
override func startTunnel(
47
48
options _: [ String : NSObject ] ? , completionHandler: @escaping ( Error ? ) -> Void
48
49
) {
49
50
logger. info ( " startTunnel called " )
50
51
guard manager == nil else {
51
52
logger. error ( " startTunnel called with non-nil Manager " )
52
- completionHandler ( PTPError . alreadyRunning)
53
+ completionHandler (
54
+ NSError (
55
+ domain: " \( Bundle . main. bundleIdentifier!) .PTP " ,
56
+ code: - 1 ,
57
+ userInfo: [ NSLocalizedDescriptionKey: " Already running " ]
58
+ )
59
+ )
53
60
return
54
61
}
55
62
guard let proto = protocolConfiguration as? NETunnelProviderProtocol ,
56
63
let baseAccessURL = proto. serverAddress
57
64
else {
58
65
logger. error ( " startTunnel called with nil protocolConfiguration " )
59
- completionHandler ( PTPError . missingConfiguration)
66
+ completionHandler (
67
+ NSError (
68
+ domain: " \( Bundle . main. bundleIdentifier!) .PTP " ,
69
+ code: - 1 ,
70
+ userInfo: [ NSLocalizedDescriptionKey: " Missing Configuration " ]
71
+ )
72
+ )
60
73
return
61
74
}
62
75
// HACK: We can't write to the system keychain, and the NE can't read the user keychain.
63
76
guard let token = proto. providerConfiguration ? [ " token " ] as? String else {
64
77
logger. error ( " startTunnel called with nil token " )
65
- completionHandler ( PTPError . missingToken)
78
+ completionHandler (
79
+ NSError (
80
+ domain: " \( Bundle . main. bundleIdentifier!) .PTP " ,
81
+ code: - 1 ,
82
+ userInfo: [ NSLocalizedDescriptionKey: " Missing Token " ]
83
+ )
84
+ )
66
85
return
67
86
}
68
87
logger. debug ( " retrieved token & access URL " )
69
88
let completionHandler = CallbackWrapper ( completionHandler)
70
89
Task {
71
90
do throws ( ManagerError) {
72
91
logger. debug ( " creating manager " )
73
- manager = try await Manager (
92
+ let manager = try await Manager (
74
93
with: self ,
75
94
cfg: . init(
76
95
apiToken: token, serverUrl: . init( string: baseAccessURL) !
77
96
)
78
97
)
79
98
globalXPCListenerDelegate. vpnXPCInterface. manager = manager
80
99
logger. debug ( " starting vpn " )
81
- try await manager! . startVPN ( )
100
+ try await manager. startVPN ( )
82
101
logger. info ( " vpn started " )
102
+ self . manager = manager
83
103
completionHandler ( nil )
84
104
} catch {
85
105
logger. error ( " error starting manager: \( error. description, privacy: . public) " )
86
- completionHandler ( error as NSError )
106
+ completionHandler (
107
+ NSError (
108
+ domain: " \( Bundle . main. bundleIdentifier!) .Manager " ,
109
+ code: - 1 ,
110
+ userInfo: [ NSLocalizedDescriptionKey: error. description]
111
+ )
112
+ )
87
113
}
88
114
}
89
115
}
@@ -152,9 +178,3 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
152
178
try await setTunnelNetworkSettings ( currentSettings)
153
179
}
154
180
}
155
-
156
- enum PTPError : Error {
157
- case alreadyRunning
158
- case missingConfiguration
159
- case missingToken
160
- }
0 commit comments