@@ -43,47 +43,73 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
4343 return nil
4444 }
4545
46+ // swiftlint:disable:next function_body_length
4647 override func startTunnel(
4748 options _: [ String : NSObject ] ? , completionHandler: @escaping ( Error ? ) -> Void
4849 ) {
4950 logger. info ( " startTunnel called " )
5051 guard manager == nil else {
5152 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+ )
5360 return
5461 }
5562 guard let proto = protocolConfiguration as? NETunnelProviderProtocol ,
5663 let baseAccessURL = proto. serverAddress
5764 else {
5865 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+ )
6073 return
6174 }
6275 // HACK: We can't write to the system keychain, and the NE can't read the user keychain.
6376 guard let token = proto. providerConfiguration ? [ " token " ] as? String else {
6477 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+ )
6685 return
6786 }
6887 logger. debug ( " retrieved token & access URL " )
6988 let completionHandler = CallbackWrapper ( completionHandler)
7089 Task {
7190 do throws ( ManagerError) {
7291 logger. debug ( " creating manager " )
73- manager = try await Manager (
92+ let manager = try await Manager (
7493 with: self ,
7594 cfg: . init(
7695 apiToken: token, serverUrl: . init( string: baseAccessURL) !
7796 )
7897 )
7998 globalXPCListenerDelegate. vpnXPCInterface. manager = manager
8099 logger. debug ( " starting vpn " )
81- try await manager! . startVPN ( )
100+ try await manager. startVPN ( )
82101 logger. info ( " vpn started " )
102+ self . manager = manager
83103 completionHandler ( nil )
84104 } catch {
85105 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+ )
87113 }
88114 }
89115 }
@@ -152,9 +178,3 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
152178 try await setTunnelNetworkSettings ( currentSettings)
153179 }
154180}
155-
156- enum PTPError : Error {
157- case alreadyRunning
158- case missingConfiguration
159- case missingToken
160- }
0 commit comments