Skip to content
Snippets Groups Projects
Select Git revision
  • a36dbf142ebc185f8f14d1780ac14e20b18d59e4
  • main default protected
  • dev protected
  • hotfixes-oct-2022
  • refactor/avatar-cell
  • 1.1.5
  • 1.1.4
  • 1.1.3
  • 1.1
  • 1.0.8
  • 1.0.7
  • 1.0.6
12 results

FeedbackPlayer.swift

Blame
  • MessengerWaitForNodes.swift 1.36 KiB
    import Foundation
    import XXClient
    import XCTestDynamicOverlay
    
    public struct MessengerWaitForNodes {
      public typealias Progress = (NodeRegistrationReport) -> Void
    
      public enum Error: Swift.Error, Equatable {
        case notLoaded
        case timeout
      }
    
      public var run: (Double, TimeInterval, Int, @escaping Progress) throws -> Void
    
      public func callAsFunction(
        targetRatio: Double = 0.8,
        sleepInterval: TimeInterval = 1,
        retries: Int = 10,
        onProgress: @escaping Progress = { _ in }
      ) throws {
        try run(targetRatio, sleepInterval, retries, onProgress)
      }
    }
    
    extension MessengerWaitForNodes {
      public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNodes {
        MessengerWaitForNodes { targetRatio, sleepInterval, retries, onProgress in
          guard let cMix = env.cMix() else {
            throw Error.notLoaded
          }
    
          var report = try cMix.getNodeRegistrationStatus()
          var retries = retries
          onProgress(report)
    
          while report.ratio < targetRatio && retries > 0 {
            env.sleep(sleepInterval)
            report = try cMix.getNodeRegistrationStatus()
            retries -= 1
            onProgress(report)
          }
    
          if report.ratio < targetRatio {
            throw Error.timeout
          }
        }
      }
    }
    
    extension MessengerWaitForNodes {
      public static let unimplemented = MessengerWaitForNodes(
        run: XCTUnimplemented("\(Self.self)")
      )
    }