diff --git a/Sources/ElixxirDAppsSDK/Callbacks/BroadcastListener.swift b/Sources/ElixxirDAppsSDK/Callbacks/BroadcastListener.swift new file mode 100644 index 0000000000000000000000000000000000000000..2b610491b1264ca5785222436458bffe8efe9c4a --- /dev/null +++ b/Sources/ElixxirDAppsSDK/Callbacks/BroadcastListener.swift @@ -0,0 +1,44 @@ +import Bindings +import XCTestDynamicOverlay + +public struct BroadcastListener { + public init(handle: @escaping (Result<BroadcastMessage, NSError>) -> Void) { + self.handle = handle + } + + public var handle: (Result<BroadcastMessage, NSError>) -> Void +} + +extension BroadcastListener { + public static let unimplemented = BroadcastListener( + handle: XCTUnimplemented("\(Self.self)") + ) +} + +extension BroadcastListener { + func makeBindingsBroadcastListener() -> BindingsBroadcastListenerProtocol { + class CallbackObject: NSObject, BindingsBroadcastListenerProtocol { + init(_ callback: BroadcastListener) { + self.callback = callback + } + + let callback: BroadcastListener + + func callback(_ p0: Data?, p1: Error?) { + if let error = p1 { + callback.handle(.failure(error as NSError)) + } else if let data = p0 { + do { + callback.handle(.success(try BroadcastMessage.decode(data))) + } catch { + callback.handle(.failure(error as NSError)) + } + } else { + fatalError("BindingsBroadcastListener received `nil` data and `nil` error") + } + } + } + + return CallbackObject(self) + } +}