Skip to content
Snippets Groups Projects
Select Git revision
  • c6e5e17517b7f6bf4542c8b5db987d86552312aa
  • 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

NetworkFollowerStatus.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)")
      )
    }