Skip to content
Snippets Groups Projects
Select Git revision
  • b63f86c406fca9b9df3604ebb1b337bf60a3f8b3
  • main default protected
  • development
  • integration
  • v1.1.5
  • v1.1.4
  • v1.1.3
  • v1.1.2
  • v1.1.1
  • v1.1.0
  • v1.0.0
11 results

MessengerSendFile.swift

Blame
  • MessengerSendFile.swift 2.62 KiB
    import Foundation
    import XCTestDynamicOverlay
    import XXClient
    
    public struct MessengerSendFile {
      public struct Params: Equatable {
        public init(
          file: FileSend,
          recipientId: Data,
          retry: Int = 3,
          callbackIntervalMS: Int = 250
        ) {
          self.file = file
          self.recipientId = recipientId
          self.retry = retry
          self.callbackIntervalMS = callbackIntervalMS
        }
    
        public var file: FileSend
        public var recipientId: Data
        public var retry: Int
        public var callbackIntervalMS: Int
      }
    
      public enum CallbackInfo: Equatable {
        public enum Failure: Equatable {
          case callback(NSError)
          case close(NSError)
        }
    
        case progress(id: Data, transmitted: Int, total: Int)
        case finished(id: Data)
        case failed(id: Data, Failure)
      }
    
      public typealias Callback = (CallbackInfo) -> Void
    
      public enum Error: Swift.Error, Equatable {
        case fileTransferNotStarted
      }
    
      public var run: (Params, @escaping Callback) throws -> Data
    
      public func callAsFunction(
        _ params: Params,
        callback: @escaping Callback
      ) throws -> Data {
        try run(params, callback)
      }
    }
    
    extension MessengerSendFile {
      public static func live(_ env: MessengerEnvironment) -> MessengerSendFile {
        MessengerSendFile { params, callback in
          guard let fileTransfer = env.fileTransfer() else {
            throw Error.fileTransferNotStarted
          }
          func close(id: Data) {
            do {
              try fileTransfer.closeSend(transferId: id)
            } catch {
              callback(.failed(id: id, .close(error as NSError)))
            }
          }
          let transferId = try fileTransfer.send(
            params: FileTransferSend.Params(
              payload: params.file,
              recipientId: params.recipientId,
              retry: Float(params.retry),
              period: params.callbackIntervalMS