From 7f0b4034682181e3b9ed780b5b20475d1828ca22 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Thu, 2 Jun 2022 13:42:06 +0200 Subject: [PATCH] Add NetworkHealthListener --- Sources/ElixxirDAppsSDK/Cancellable.swift | 11 +++++ Sources/ElixxirDAppsSDK/Client.swift | 7 +++- .../NetworkHealthListener.swift | 42 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 Sources/ElixxirDAppsSDK/Cancellable.swift create mode 100644 Sources/ElixxirDAppsSDK/NetworkHealthListener.swift diff --git a/Sources/ElixxirDAppsSDK/Cancellable.swift b/Sources/ElixxirDAppsSDK/Cancellable.swift new file mode 100644 index 00000000..1984e3f1 --- /dev/null +++ b/Sources/ElixxirDAppsSDK/Cancellable.swift @@ -0,0 +1,11 @@ +public final class Cancellable { + public init(cancel: @escaping () -> Void) { + self.cancel = cancel + } + + deinit { + cancel() + } + + public let cancel: () -> Void +} diff --git a/Sources/ElixxirDAppsSDK/Client.swift b/Sources/ElixxirDAppsSDK/Client.swift index 1ceef52c..01c50419 100644 --- a/Sources/ElixxirDAppsSDK/Client.swift +++ b/Sources/ElixxirDAppsSDK/Client.swift @@ -6,6 +6,7 @@ public struct Client { public var makeIdentity: IdentityMaker public var connect: ConnectionMaker public var waitForDelivery: MessageDeliveryWaiter + public var networkHealth: NetworkHealthListener } extension Client { @@ -15,7 +16,8 @@ extension Client { waitForNetwork: .live(bindingsClient: bindingsClient), makeIdentity: .live(bindingsClient: bindingsClient), connect: .live(bindingsClient: bindingsClient), - waitForDelivery: .live(bindingsClient: bindingsClient) + waitForDelivery: .live(bindingsClient: bindingsClient), + networkHealth: .live(bindingsClient: bindingsClient) ) } } @@ -27,7 +29,8 @@ extension Client { waitForNetwork: .failing, makeIdentity: .failing, connect: .failing, - waitForDelivery: .failing + waitForDelivery: .failing, + networkHealth: .failing ) } #endif diff --git a/Sources/ElixxirDAppsSDK/NetworkHealthListener.swift b/Sources/ElixxirDAppsSDK/NetworkHealthListener.swift new file mode 100644 index 00000000..69419b2e --- /dev/null +++ b/Sources/ElixxirDAppsSDK/NetworkHealthListener.swift @@ -0,0 +1,42 @@ +import Bindings + +public struct NetworkHealthListener { + public var listen: (@escaping (Bool) -> Void) -> Cancellable + + public func callAsFunction(callback: @escaping (Bool) -> Void) -> Cancellable { + listen(callback) + } +} + +extension NetworkHealthListener { + public static func live(bindingsClient: BindingsClient) -> NetworkHealthListener { + NetworkHealthListener { callback in + let listener = Listener(onCallback: callback) + let id = bindingsClient.registerNetworkHealthCB(listener) + return Cancellable { + bindingsClient.unregisterNetworkHealthCB(id) + } + } + } +} + +private final class Listener: NSObject, BindingsNetworkHealthCallbackProtocol { + init(onCallback: @escaping (Bool) -> Void) { + self.onCallback = onCallback + super.init() + } + + let onCallback: (Bool) -> Void + + func callback(_ p0: Bool) { + onCallback(p0) + } +} + +#if DEBUG +extension NetworkHealthListener { + public static let failing = NetworkHealthListener { _ in + fatalError("Not implemented") + } +} +#endif -- GitLab