class PacketTunnelProvider: NEPacketTunnelProvider {
- private lazy var adapter = WireGuardAdapter(with: self)
+ private lazy var adapter: WireGuardAdapter = {
+ return WireGuardAdapter(with: self) { logLevel, message in
+ wg_log(logLevel.osLogLevel, message: message)
+ }
+ }()
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
let activationAttemptId = options?["activationAttemptId"] as? String
return
}
- // Setup WireGuard logger
- adapter.setLogHandler { logLevel, message in
- wg_log(logLevel.osLogLevel, message: message)
- }
-
// Start the tunnel
adapter.start(tunnelConfiguration: tunnelConfiguration) { adapterError in
guard let adapterError = adapterError else {
private weak var packetTunnelProvider: NEPacketTunnelProvider?
/// Log handler closure.
- private var logHandler: LogHandler?
+ private let logHandler: LogHandler
/// WireGuard internal handle returned by `wgTurnOn` that's used to associate the calls
/// with the specific WireGuard tunnel.
/// Designated initializer.
/// - Parameter packetTunnelProvider: an instance of `NEPacketTunnelProvider`. Internally stored
/// as a weak reference.
- public init(with packetTunnelProvider: NEPacketTunnelProvider) {
+ /// - Parameter logHandler: a log handler closure.
+ public init(with packetTunnelProvider: NEPacketTunnelProvider, logHandler: @escaping LogHandler) {
self.packetTunnelProvider = packetTunnelProvider
+ self.logHandler = logHandler
+
+ setupLogHandler()
}
deinit {
- // Force deactivate logger to make sure that no further calls to the instance of this class
+ // Force remove logger to make sure that no further calls to the instance of this class
// can happen after deallocation.
- deactivateLogHandler()
+ wgSetLogger(nil, nil)
// Cancel network monitor
networkMonitor?.cancel()
}
}
- /// Set log handler.
- /// - Parameter logHandler: log handler closure
- public func setLogHandler(_ logHandler: LogHandler?) {
- workQueue.async {
- self.logHandler = logHandler
- }
-
- if logHandler == nil {
- deactivateLogHandler()
- } else {
- activateLogHandler()
- }
- }
-
/// Start the tunnel tunnel.
/// - Parameters:
/// - tunnelConfiguration: tunnel configuration.
// MARK: - Private methods
- /// Install WireGuard log handler.
- private func activateLogHandler() {
+ /// Setup WireGuard log handler.
+ private func setupLogHandler() {
let context = Unmanaged.passUnretained(self).toOpaque()
wgSetLogger(context) { (context, logLevel, message) in
guard let context = context, let message = message else { return }
}
}
- /// Uninstall WireGuard log handler.
- private func deactivateLogHandler() {
- wgSetLogger(nil, nil)
- }
-
/// Resolve endpoints and update network configuration.
/// - Parameters:
/// - tunnelConfiguration: tunnel configuration