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