Spaces:
Sleeping
Sleeping
| 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") | |
| } | |
| } | |