Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions FirebaseMLModelDownloader.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,9 @@ Pod::Spec.new do |s|
s.dependency 'FirebaseCore', '~> 12.8.0'
s.dependency 'FirebaseCoreExtension', '~> 12.8.0'
s.dependency 'FirebaseInstallations', '~> 12.8.0'
s.dependency 'GoogleDataTransport', '~> 10.1'
s.dependency 'GoogleUtilities/UserDefaults', '~> 8.1'
s.dependency 'SwiftProtobuf', '~> 1.19'

s.pod_target_xcconfig = {
'GCC_PREPROCESSOR_DEFINITIONS' => 'FIRMLModelDownloader_VERSION=' + s.version.to_s,
'OTHER_CFLAGS' => '-fno-autolink',
}

Expand Down
2 changes: 2 additions & 0 deletions FirebaseMLModelDownloader/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# 12.8.0
- [fixed] Remove unused legacy telemetry along with the large swift-protobuf dependency.
120 changes: 1 addition & 119 deletions FirebaseMLModelDownloader/Sources/ModelDownloadTask.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ class ModelDownloadTask {
/// Downloader instance.
private let downloader: FileDownloader

/// Telemetry logger.
private let telemetryLogger: TelemetryLogger?

/// Download progress handler.
typealias ProgressHandler = (Float) -> Void
private var progressHandler: ProgressHandler?
Expand All @@ -52,15 +49,13 @@ class ModelDownloadTask {
defaults: GULUserDefaults,
downloader: FileDownloader,
progressHandler: ProgressHandler? = nil,
completion: @escaping Completion,
telemetryLogger: TelemetryLogger? = nil) {
completion: @escaping Completion) {
self.remoteModelInfo = remoteModelInfo
self.appName = appName
self.defaults = defaults
self.downloader = downloader
self.progressHandler = progressHandler
self.completion = completion
self.telemetryLogger = telemetryLogger
}
}

Expand Down Expand Up @@ -96,23 +91,9 @@ extension ModelDownloadTask {
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.
Expand Down Expand Up @@ -141,45 +122,18 @@ extension ModelDownloadTask {
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))
}
Expand All @@ -197,75 +151,30 @@ extension ModelDownloadTask {
message: ModelDownloadTask.ErrorDescription
.invalidArgument(remoteModelInfo.name),
messageCode: .invalidArgument)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .httpError(code: response.statusCode)
)
completion(.failure(.invalidArgument))
return
}
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.ErrorDescription.expiredModelInfo,
messageCode: .expiredModelInfo)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .urlExpired
)
completion(.failure(.expiredDownloadURL))
case 401, 403:
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.ErrorDescription.permissionDenied,
messageCode: .permissionDenied)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .httpError(code: response.statusCode)
)
completion(.failure(.permissionDenied))
case 404:
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.ErrorDescription
.modelNotFound(remoteModelInfo.name),
messageCode: .modelNotFound)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .httpError(code: response.statusCode)
)
completion(.failure(.notFound))
default:
let description = ModelDownloadTask.ErrorDescription
.modelDownloadFailed(response.statusCode)
DeviceLogger.logEvent(level: .debug,
message: description,
messageCode: .modelDownloadError)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .httpError(code: response.statusCode)
)
completion(.failure(.internalError(description: description)))
}
return
Expand All @@ -282,13 +191,6 @@ extension ModelDownloadTask {
message: description,
messageCode: .downloadedModelSaveError)
// Downloading the file succeeding but saving failed.
telemetryLogger?.logModelDownloadEvent(eventName: .modelDownload,
status: .succeeded,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed)
completion(.failure(.internalError(description: description)))
return
}
Expand Down Expand Up @@ -325,12 +227,6 @@ extension ModelDownloadTask {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.DebugDescription.modelDownloaded,
messageCode: .modelDownloaded)
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .succeeded,
model: model,
downloadErrorCode: .noError
)
completion(.success(model))
} catch let error as DownloadError {
if error == .notEnoughSpace {
Expand All @@ -343,27 +239,13 @@ extension ModelDownloadTask {
messageCode: .downloadedModelSaveError)
}
// Downloading the file succeeding but saving failed.
telemetryLogger?.logModelDownloadEvent(eventName: .modelDownload,
status: .succeeded,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed)
completion(.failure(error))
return
} catch {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloadTask.ErrorDescription.modelSaveError,
messageCode: .downloadedModelSaveError)
// Downloading the file succeeding but saving failed.
telemetryLogger?.logModelDownloadEvent(eventName: .modelDownload,
status: .succeeded,
model: CustomModel(name: remoteModelInfo.name,
size: remoteModelInfo.size,
path: "",
hash: remoteModelInfo.modelHash),
downloadErrorCode: .downloadFailed)
completion(.failure(.internalError(description: error.localizedDescription)))
return
}
Expand Down
43 changes: 3 additions & 40 deletions FirebaseMLModelDownloader/Sources/ModelDownloader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,6 @@ public class ModelDownloader {
/// User defaults for model info.
private let userDefaults: GULUserDefaults

/// Telemetry logger tied to this instance of model downloader.
let telemetryLogger: TelemetryLogger?

/// Number of retries in case of model download URL expiry.
var numberOfRetries: Int = 1

Expand All @@ -77,8 +74,6 @@ public class ModelDownloader {
options = app.options
installations = Installations.installations(app: app)
userDefaults = defaults
// Respect Firebase-wide data collection setting.
telemetryLogger = TelemetryLogger(app: app)
// Notification of app deletion.
let notificationName = "FIRAppDeleteNotification"
NotificationCenter.default.addObserver(
Expand Down Expand Up @@ -170,12 +165,6 @@ public class ModelDownloader {
message: ModelDownloader.DebugDescription.localModelFound,
messageCode: .localModelFound)
asyncOnMainQueue(completion(.success(localModel)))
telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .scheduled,
model: CustomModel(name: modelName, size: 0, path: "", hash: ""),
downloadErrorCode: .noError
)
// Update local model in the background.
DispatchQueue.global(qos: .utility).async { [weak self] in
self?.getRemoteModel(
Expand All @@ -184,28 +173,16 @@ public class ModelDownloader {
progressHandler: nil,
completion: { result in
switch result {
case let .success(model):
case .success:
DeviceLogger.logEvent(level: .debug,
message: ModelDownloader.DebugDescription
.backgroundModelDownloaded,
messageCode: .backgroundModelDownloaded)
self?.telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .succeeded,
model: model,
downloadErrorCode: .noError
)
case .failure:
DeviceLogger.logEvent(level: .debug,
message: ModelDownloader.ErrorDescription
.backgroundModelDownload,
messageCode: .backgroundDownloadError)
self?.telemetryLogger?.logModelDownloadEvent(
eventName: .modelDownload,
status: .failed,
model: CustomModel(name: modelName, size: 0, path: "", hash: ""),
downloadErrorCode: .downloadFailed
)
}
}
)
Expand Down Expand Up @@ -323,28 +300,16 @@ public class ModelDownloader {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloader.DebugDescription.modelDeleted,
messageCode: .modelDeleted)
telemetryLogger?.logModelDeletedEvent(
eventName: .remoteModelDeleteOnDevice,
isSuccessful: true
)
asyncOnMainQueue(completion(.success(())))
} catch let error as DownloadedModelError {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloader.ErrorDescription.modelDeletionFailed(error),
messageCode: .modelDeletionFailed)
telemetryLogger?.logModelDeletedEvent(
eventName: .remoteModelDeleteOnDevice,
isSuccessful: false
)
asyncOnMainQueue(completion(.failure(error)))
} catch {
DeviceLogger.logEvent(level: .debug,
message: ModelDownloader.ErrorDescription.modelDeletionFailed(error),
messageCode: .modelDeletionFailed)
telemetryLogger?.logModelDeletedEvent(
eventName: .remoteModelDeleteOnDevice,
isSuccessful: false
)
asyncOnMainQueue(completion(.failure(.internalError(description: error
.localizedDescription))))
}
Expand Down Expand Up @@ -408,8 +373,7 @@ extension ModelDownloader {
projectID: projectID,
apiKey: apiKey,
appName: appName, installations: installations,
localModelInfo: localModelInfo,
telemetryLogger: telemetryLogger
localModelInfo: localModelInfo
)
let downloader = ModelFileDownloader(conditions: conditions)
downloadInfoAndModel(
Expand Down Expand Up @@ -512,8 +476,7 @@ extension ModelDownloader {
defaults: self.userDefaults,
downloader: downloader,
progressHandler: taskProgressHandler,
completion: taskCompletion,
telemetryLogger: self.telemetryLogger
completion: taskCompletion
)
// Keep track of current download task to allow for merging duplicate requests.
self.currentDownloadTask[modelName] = downloadTask
Expand Down
Loading
Loading