diff --git a/Sources/ElixxirDAppsSDK/Connection.swift b/Sources/ElixxirDAppsSDK/Connection.swift index 04d10312ccae7dd2fab28da6e1090e70bd759c78..0ae7cf3261117edade698e6a385263e6a1a9fa76 100644 --- a/Sources/ElixxirDAppsSDK/Connection.swift +++ b/Sources/ElixxirDAppsSDK/Connection.swift @@ -4,6 +4,7 @@ public struct Connection { public var isAuthenticated: ConnectionIsAuthenticated public var getId: ConnectionGetId public var getPartner: ConnectionGetPartner + public var registerListener: ConnectionRegisterListener public var send: ConnectionSend public var close: ConnectionClose } @@ -14,6 +15,7 @@ extension Connection { isAuthenticated: .live(bindingsConnection), getId: .live(bindingsConnection), getPartner: .live(bindingsConnection), + registerListener: .live(bindingsConnection), send: .live(bindingsConnection), close: .live(bindingsConnection) ) @@ -24,6 +26,7 @@ extension Connection { isAuthenticated: .live(bindingsConnection), getId: .live(bindingsConnection), getPartner: .live(bindingsConnection), + registerListener: .live(bindingsConnection), send: .live(bindingsConnection), close: .live(bindingsConnection) ) @@ -35,6 +38,7 @@ extension Connection { isAuthenticated: .unimplemented, getId: .unimplemented, getPartner: .unimplemented, + registerListener: .unimplemented, send: .unimplemented, close: .unimplemented ) diff --git a/Sources/ElixxirDAppsSDK/ConnectionRegisterListener.swift b/Sources/ElixxirDAppsSDK/ConnectionRegisterListener.swift new file mode 100644 index 0000000000000000000000000000000000000000..b92186749169d84e4707aa93e8592e4897b42a37 --- /dev/null +++ b/Sources/ElixxirDAppsSDK/ConnectionRegisterListener.swift @@ -0,0 +1,39 @@ +import Bindings +import XCTestDynamicOverlay + +public struct ConnectionRegisterListener { + public var run: (Int, MessageListener) throws -> Void + + public func callAsFunction( + messageType: Int, + listener: MessageListener + ) throws { + try run(messageType, listener) + } +} + +extension ConnectionRegisterListener { + public static func live(_ bindingsConnection: BindingsConnection) -> ConnectionRegisterListener { + ConnectionRegisterListener { messageType, listener in + try bindingsConnection.registerListener( + messageType, + newListener: listener.makeBindingsListener() + ) + } + } + + public static func live(_ bindingsConnection: BindingsAuthenticatedConnection) -> ConnectionRegisterListener { + ConnectionRegisterListener { messageType, listener in + try bindingsConnection.registerListener( + messageType, + newListener: listener.makeBindingsListener() + ) + } + } +} + +extension ConnectionRegisterListener { + public static let unimplemented = ConnectionRegisterListener( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/ElixxirDAppsSDK/Legacy/Message.swift b/Sources/ElixxirDAppsSDK/Message.swift similarity index 85% rename from Sources/ElixxirDAppsSDK/Legacy/Message.swift rename to Sources/ElixxirDAppsSDK/Message.swift index b6fc6c4c205d3e7299804dbaac3b9f3f0fdb782a..b2c13b7d4d7e19cac79ee01950b62ec63d74d11a 100644 --- a/Sources/ElixxirDAppsSDK/Legacy/Message.swift +++ b/Sources/ElixxirDAppsSDK/Message.swift @@ -46,4 +46,12 @@ extension Message: Codable { case encrypted = "Encrypted" case roundId = "RoundId" } + + static func decode(_ data: Data) throws -> Message { + try JSONDecoder().decode(Self.self, from: data) + } + + func encode() throws -> Data { + try JSONEncoder().encode(self) + } } diff --git a/Sources/ElixxirDAppsSDK/Legacy/MessageListener.swift b/Sources/ElixxirDAppsSDK/MessageListener.swift similarity index 53% rename from Sources/ElixxirDAppsSDK/Legacy/MessageListener.swift rename to Sources/ElixxirDAppsSDK/MessageListener.swift index f36171dc1af1c2e1457fa0222a5efa5a72f5739f..a95b1018d836163ce4493bde6905fa142e9cd111 100644 --- a/Sources/ElixxirDAppsSDK/Legacy/MessageListener.swift +++ b/Sources/ElixxirDAppsSDK/MessageListener.swift @@ -1,4 +1,54 @@ -//import Bindings +import Bindings +import XCTestDynamicOverlay + +public struct MessageListener { + public init( + name: String = "MessageListener", + handle: @escaping (Message) -> Void + ) { + self.name = name + self.handle = handle + } + + public var name: String + public var handle: (Message) -> Void +} + +extension MessageListener { + public static let unimplemented = MessageListener( + handle: XCTUnimplemented("\(Self.self)") + ) +} + +extension MessageListener { + func makeBindingsListener() -> BindingsListenerProtocol { + class Listener: NSObject, BindingsListenerProtocol { + init(_ listener: MessageListener) { + self.listener = listener + } + + let listener: MessageListener + + func hear(_ item: Data?) { + guard let item = item else { + fatalError("BindingsListener.hear received `nil`") + } + do { + listener.handle(try Message.decode(item)) + } catch { + fatalError("BindingsListener.hear message decoding failed with error: \(error)") + } + } + + func name() -> String { + listener.name + } + } + + return Listener(self) + } +} + // //public struct MessageListener { // public var listen: (Int, String, @escaping (Message) -> Void) -> Void @@ -38,32 +88,6 @@ // } //} // -//private class Listener: NSObject, BindingsListenerProtocol { -// init(listenerName: String, onHear: @escaping (Message) -> Void) { -// self.listenerName = listenerName -// self.onHear = onHear -// super.init() -// } -// -// let listenerName: String -// let onHear: (Message) -> Void -// let decoder = JSONDecoder() -// -// func hear(_ item: Data?) { -// guard let item = item else { -// fatalError("BindingsListenerProtocol.hear received `nil`") -// } -// do { -// onHear(try decoder.decode(Message.self, from: item)) -// } catch { -// fatalError("Message decoding failed with error: \(error)") -// } -// } -// -// func name() -> String { -// listenerName -// } -//} // //#if DEBUG //extension MessageListener {