in FirebaseMLModelDownloader/Sources/ModelDownloadTask.swift [88:182]
func resume() {
// Prevent multiple concurrent downloads.
guard downloadStatus != .downloading else {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.ErrorDescription.anotherDownloadInProgress,
messageCode: .anotherDownloadInProgressError)
telemetryLogger?.logModelDownloadEvent(eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed)
return
}
downloadStatus = .downloading
telemetryLogger?.logModelDownloadEvent(eventName: .modelDownload,
status: .downloading,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .noError)
downloader.downloadFile(with: remoteModelInfo.downloadURL,
progressHandler: { downloadedBytes, totalBytes in
/// Fraction of model file downloaded.
let calculatedProgress = Float(downloadedBytes) / Float(totalBytes)
self.progressHandler?(calculatedProgress)
}) { result in
self.downloadStatus = .complete
switch result {
case let .success(response):
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.DebugDescription
.receivedServerResponse,
messageCode: .validHTTPResponse)
self.handleResponse(
response: response.urlResponse,
tempURL: response.fileURL,
completion: self.completion
)
case let .failure(error):
var downloadError: DownloadError
switch error {
case let FileDownloaderError.networkError(error):
let description = ModelDownloadTask.ErrorDescription
.invalidHostName(error.localizedDescription)
downloadError = .failedPrecondition
DeviceLogger.logEvent(level: .debug,
message: description,
messageCode: .hostnameError)
self.telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: self.remoteModelInfo.name,
size: self.remoteModelInfo.size,
path: "",
hash: self.remoteModelInfo.modelHash),
downloadErrorCode: .noConnection
)
case FileDownloaderError.unexpectedResponseType:
let description = ModelDownloadTask.ErrorDescription.invalidHTTPResponse
downloadError = .internalError(description: description)
DeviceLogger.logEvent(level: .debug,
message: description,
messageCode: .invalidHTTPResponse)
self.telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: self.remoteModelInfo.name,
size: self.remoteModelInfo.size,
path: "",
hash: self.remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed
)
default:
let description = ModelDownloadTask.ErrorDescription.unknownDownloadError
downloadError = .internalError(description: description)
DeviceLogger.logEvent(level: .debug,
message: description,
messageCode: .modelDownloadError)
self.telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: self.remoteModelInfo.name,
size: self.remoteModelInfo.size,
path: "",
hash: self.remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed
)
}
self.completion(.failure(downloadError))
}
}
}