Skip to content
Snippets Groups Projects
MessengerWaitForNodes.swift 1.35 KiB
Newer Older
import Foundation
import XXClient
import XCTestDynamicOverlay

Dariusz Rybicki's avatar
Dariusz Rybicki committed
public struct MessengerWaitForNodes {
  public typealias Progress = (NodeRegistrationReport) -> Void

  public enum Error: Swift.Error {
    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)
Dariusz Rybicki's avatar
Dariusz Rybicki committed
extension MessengerWaitForNodes {
  public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNodes {
    MessengerWaitForNodes { targetRatio, sleepInterval, retries, onProgress in
Dariusz Rybicki's avatar
Dariusz Rybicki committed
      guard let cMix = env.cMix() else {
        throw Error.notLoaded
      }

      var report = try cMix.getNodeRegistrationStatus()
      var retries = retries

      while report.ratio < targetRatio && retries > 0 {
        env.sleep(sleepInterval)
        report = try cMix.getNodeRegistrationStatus()
        retries -= 1
        onProgress(report)
      }

      if report.ratio < targetRatio {
        throw Error.timeout
      }
    }
  }
}

Dariusz Rybicki's avatar
Dariusz Rybicki committed
extension MessengerWaitForNodes {
  public static let unimplemented = MessengerWaitForNodes(
    run: XCTUnimplemented("\(Self.self)")
  )
}