open-wether / Sources /App /Helper /Download /TransferAmountTracker.swift
soiz1's picture
Migrated from GitHub
6ee917b verified
import Vapor
/// Same as above, but not an actor
final class TransferAmountTracker {
var transfered = 0
var transferedLastPrint = 0
let printDelta: Double = 20
let startTime = Date()
var lastPrint = Date()
let logger: Logger
let totalSize: Int?
let name: String
public init(logger: Logger, totalSize: Int?, name: String = "Transfer") {
self.logger = logger
self.totalSize = totalSize
self.name = name
}
/// Print status from time to time
func set(_ bytes: Int) {
transfered = bytes
let deltaT = Date().timeIntervalSince(lastPrint)
if deltaT > printDelta {
let timeElapsed = Date().timeIntervalSince(startTime).asSecondsPrettyPrint
let rate = (transfered - transferedLastPrint) / Int(deltaT)
if let totalSize {
let percent = Int(round(Float(transfered) / Float(totalSize) * 100))
let remainingTime = Double(totalSize - transfered) / (Double(transfered - transferedLastPrint) / deltaT)
logger.info("\(name) \(percent)% \(transfered.bytesHumanReadable) / \(totalSize.bytesHumanReadable) in \(timeElapsed), \(rate.bytesHumanReadable)/s remaining \(remainingTime.asSecondsPrettyPrint)")
} else {
logger.info("\(name) \(transfered.bytesHumanReadable) in \(timeElapsed), \(rate.bytesHumanReadable)/s")
}
lastPrint = Date()
transferedLastPrint = transfered
}
}
/// Print status from time to time
func add(_ bytes: Int) {
set(bytes + transfered)
}
/// Print end statistics
func finish() {
guard transfered > 0 else {
return
}
let timeElapsed = Date().timeIntervalSince(startTime)
let rate = Int(Double(transfered) / timeElapsed)
logger.info("\(name) completed \(transfered.bytesHumanReadable) in \(timeElapsed.asSecondsPrettyPrint). Average speed \(rate.bytesHumanReadable)/s")
}
}