46 lines
1.8 KiB
Swift
46 lines
1.8 KiB
Swift
#if os(macOS)
|
|
|
|
import Foundation
|
|
|
|
public enum PKGDownloader {
|
|
public static func download(
|
|
from url: String,
|
|
expectedSize: Int64,
|
|
progress: @escaping (Double) -> Void
|
|
) async throws -> URL {
|
|
let updatesDir = FilePath.cacheDirectory.appendingPathComponent("updates", isDirectory: true)
|
|
try FileManager.default.createDirectory(at: updatesDir, withIntermediateDirectories: true)
|
|
|
|
let filename = URL(string: url)!.lastPathComponent
|
|
let destination = updatesDir.appendingPathComponent(filename)
|
|
|
|
if let attrs = try? FileManager.default.attributesOfItem(atPath: destination.path),
|
|
let fileSize = attrs[.size] as? Int64,
|
|
expectedSize > 0, fileSize == expectedSize
|
|
{
|
|
progress(1.0)
|
|
return destination
|
|
}
|
|
|
|
// Clean old PKG files
|
|
if let contents = try? FileManager.default.contentsOfDirectory(at: updatesDir, includingPropertiesForKeys: nil) {
|
|
for file in contents where file.pathExtension == "pkg" && file.lastPathComponent != filename {
|
|
try? FileManager.default.removeItem(at: file)
|
|
}
|
|
}
|
|
|
|
try? FileManager.default.removeItem(at: destination)
|
|
var lastReported = 0.0
|
|
try await HTTPClient.writeToAsync(url, path: destination.path) { bytesWritten, totalBytes in
|
|
guard totalBytes > 0 else { return }
|
|
let current = Double(bytesWritten) / Double(totalBytes)
|
|
guard current - lastReported >= 0.01 || current >= 1.0 else { return }
|
|
lastReported = current
|
|
progress(current)
|
|
}
|
|
return destination
|
|
}
|
|
}
|
|
|
|
#endif
|