Skip to content
Snippets Groups Projects
MessageSender.swift 1.15 KiB
import Bindings

public struct MessageSender {
  public var send: (Int, Data) throws -> MessageSendReport

  public func callAsFunction(
    messageType: Int,
    payload: Data
  ) throws -> MessageSendReport {
    try send(messageType, payload)
  }
}

extension MessageSender {
  public static func live(
    bindingsConnection: BindingsConnection
  ) -> MessageSender {
    MessageSender.live(sendE2E: bindingsConnection.sendE2E(_:payload:))
  }

  public static func live(
    bindingsAuthenticatedConnection: BindingsAuthenticatedConnection
  ) -> MessageSender {
    MessageSender.live(sendE2E: bindingsAuthenticatedConnection.sendE2E(_:payload:))
  }

  private static func live(
    sendE2E: @escaping (Int, Data) throws -> Data
  ) -> MessageSender {
    MessageSender { messageType, payload in
      let reportData = try sendE2E(messageType, payload)
      let decoder = JSONDecoder()
      let report = try decoder.decode(MessageSendReport.self, from: reportData)
      return report
    }
  }
}

#if DEBUG
extension MessageSender {
  public static let failing = MessageSender { _, _ in
    struct NotImplemented: Error {}
    throw NotImplemented()
  }
}
#endif