diff --git a/Sources/DDGSync/DDGSync.swift b/Sources/DDGSync/DDGSync.swift index 92c90b6be..47b01c063 100644 --- a/Sources/DDGSync/DDGSync.swift +++ b/Sources/DDGSync/DDGSync.swift @@ -54,8 +54,8 @@ public class DDGSync: DDGSyncing { public weak var dataProvidersSource: DataProvidersSource? /// This is the constructor intended for use by app clients. - public convenience init(dataProvidersSource: DataProvidersSource, log: @escaping @autoclosure () -> OSLog = .disabled) { - let dependencies = ProductionDependencies(baseUrl: Constants.baseUrl, log: log()) + public convenience init(dataProvidersSource: DataProvidersSource, errorEvents: EventMapping, log: @escaping @autoclosure () -> OSLog = .disabled) { + let dependencies = ProductionDependencies(baseUrl: Constants.baseUrl, errorEvents: errorEvents, log: log()) self.init(dataProvidersSource: dataProvidersSource, dependencies: dependencies) } @@ -255,8 +255,12 @@ public class DDGSync: DDGSyncing { do { try updateAccount(nil) + dependencies.errorEvents.fire(syncError) } catch { os_log(.error, log: dependencies.log, "Failed to delete account upon unauthenticated server response: %{public}s", error.localizedDescription) + if let syncError = error as? SyncError { + dependencies.errorEvents.fire(syncError) + } } } diff --git a/Sources/DDGSync/internal/ProductionDependencies.swift b/Sources/DDGSync/internal/ProductionDependencies.swift index 7af4eea1a..bd2c93189 100644 --- a/Sources/DDGSync/internal/ProductionDependencies.swift +++ b/Sources/DDGSync/internal/ProductionDependencies.swift @@ -28,17 +28,19 @@ struct ProductionDependencies: SyncDependencies { let secureStore: SecureStoring let crypter: CryptingInternal let scheduler: SchedulingInternal + let errorEvents: EventMapping var log: OSLog { getLog() } private let getLog: () -> OSLog - init(baseUrl: URL, log: @escaping @autoclosure () -> OSLog = .disabled) { + init(baseUrl: URL, errorEvents: EventMapping, log: @escaping @autoclosure () -> OSLog = .disabled) { self.init(fileStorageUrl: FileManager.default.applicationSupportDirectoryForComponent(named: "Sync"), baseUrl: baseUrl, secureStore: SecureStorage(), + errorEvents: errorEvents, log: log()) } @@ -46,11 +48,13 @@ struct ProductionDependencies: SyncDependencies { fileStorageUrl: URL, baseUrl: URL, secureStore: SecureStoring, + errorEvents: EventMapping, log: @escaping @autoclosure () -> OSLog = .disabled ) { self.fileStorageUrl = fileStorageUrl self.endpoints = Endpoints(baseUrl: baseUrl) self.secureStore = secureStore + self.errorEvents = errorEvents self.getLog = log api = RemoteAPIRequestCreator(log: log()) diff --git a/Sources/DDGSync/internal/SyncDependencies.swift b/Sources/DDGSync/internal/SyncDependencies.swift index becbed63b..800018dd0 100644 --- a/Sources/DDGSync/internal/SyncDependencies.swift +++ b/Sources/DDGSync/internal/SyncDependencies.swift @@ -28,6 +28,7 @@ protocol SyncDependencies { var secureStore: SecureStoring { get } var crypter: CryptingInternal { get } var scheduler: SchedulingInternal { get } + var errorEvents: EventMapping { get } var log: OSLog { get } func createRemoteConnector(_ connectInfo: ConnectInfo) throws -> RemoteConnecting