Skip to content
Snippets Groups Projects

Messenger - send & receive messages

Merged Dariusz Rybicki requested to merge feature/messenger-send-receive into development
3 files
+ 323
2
Compare changes
  • Side-by-side
  • Inline
Files
3
 
import Foundation
 
import XCTestDynamicOverlay
 
import XXClient
 
 
public struct MessengerSendMessage {
 
public struct DeliveryReport: Equatable {
 
public enum Result: Equatable {
 
case delivered
 
case notDelivered(timedOut: Bool)
 
case failure(NSError)
 
}
 
 
public init(
 
report: E2ESendReport,
 
result: Result
 
) {
 
self.report = report
 
self.result = result
 
}
 
 
public var report: E2ESendReport
 
public var result: Result
 
}
 
 
public typealias DeliveryCallback = (DeliveryReport) -> Void
 
 
public enum Error: Swift.Error, Equatable {
 
case notLoaded
 
case notConnected
 
}
 
 
public var run: (Data, Data, DeliveryCallback?) throws -> E2ESendReport
 
 
public func callAsFunction(
 
recipientId: Data,
 
payload: Data,
 
deliveryCallback: DeliveryCallback?
 
) throws -> E2ESendReport {
 
try run(recipientId, payload, deliveryCallback)
 
}
 
}
 
 
extension MessengerSendMessage {
 
public static func live(_ env: MessengerEnvironment) -> MessengerSendMessage {
 
MessengerSendMessage { recipientId, payload, deliveryCallback in
 
guard let cMix = env.cMix() else {
 
throw Error.notLoaded
 
}
 
guard let e2e = env.e2e() else {
 
throw Error.notConnected
 
}
 
let report = try e2e.send(
 
messageType: 2,
 
recipientId: recipientId,
 
payload: payload,
 
e2eParams: env.getE2EParams()
 
)
 
if let deliveryCallback = deliveryCallback {
 
do {
 
try cMix.waitForRoundResult(
 
roundList: try report.encode(),
 
timeoutMS: 30_000,
 
callback: .init { result in
 
switch result {
 
case .delivered(_):
 
deliveryCallback(.init(report: report, result: .delivered))
 
case .notDelivered(let timedOut):
 
deliveryCallback(.init(report: report, result: .notDelivered(timedOut: timedOut)))
 
}
 
}
 
)
 
} catch {
 
deliveryCallback(.init(report: report, result: .failure(error as NSError)))
 
}
 
}
 
return report
 
}
 
}
 
}
 
 
extension MessengerSendMessage {
 
public static let unimplemented = MessengerSendMessage(
 
run: XCTUnimplemented("\(Self.self)")
 
)
 
}
Loading