diff --git a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift index b7cee7e7a6..1786c459a7 100644 --- a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift +++ b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift @@ -51,8 +51,7 @@ class ConversationConfigurationSyncOperation: OWSOperation { } private func reportAssertionError(description: String) { - let error: NSError = ColorSyncOperationError.assertionError(description: description) as NSError - error.isRetryable = false + let error = ColorSyncOperationError.assertionError(description: description).asRetryableError self.reportError(error) } diff --git a/SignalMessaging/groups/GroupsV2Impl+RestoreGroups.swift b/SignalMessaging/groups/GroupsV2Impl+RestoreGroups.swift index 71840a56c5..e95c20fb9e 100644 --- a/SignalMessaging/groups/GroupsV2Impl+RestoreGroups.swift +++ b/SignalMessaging/groups/GroupsV2Impl+RestoreGroups.swift @@ -259,9 +259,7 @@ public extension GroupsV2Impl { }.catch(on: .global()) { (error) in // tryToRestoreNextGroup() should never fail. owsFailDebug("Group restore failed: \(error)") - let nsError: NSError = error as NSError - nsError.isRetryable = false - self.reportError(nsError) + self.reportError(error.asUnretryableError) } } diff --git a/SignalMessaging/profiles/OWSProfileManager.swift b/SignalMessaging/profiles/OWSProfileManager.swift index 6f8fffadc4..f98f747f52 100644 --- a/SignalMessaging/profiles/OWSProfileManager.swift +++ b/SignalMessaging/profiles/OWSProfileManager.swift @@ -568,8 +568,7 @@ public extension OWSProfileManager { error: &requestError) if let error = requestError { owsFailDebug("Could not create request failed: \(error)") - error.isRetryable = false - throw error + throw error.asUnretryableError } let (promise, resolver) = Promise.pending() @@ -583,9 +582,7 @@ public extension OWSProfileManager { completionHandler: { (_, completionUrl, error) in if let error = error { Logger.warn("Download failed: \(error)") - let errorCopy = error as NSError - errorCopy.isRetryable = error.isNetworkFailureOrTimeout - return resolver.reject(errorCopy) + return resolver.reject(error.withDefaultRetry) } guard completionUrl == tempFileURL else { return resolver.reject(OWSAssertionError("Unexpected file URL.")) @@ -594,11 +591,10 @@ public extension OWSProfileManager { do { let data = try Data(contentsOf: tempFileURL) resolver.fulfill(data) - } catch let error as NSError { + } catch { owsFailDebug("Could not load data failed: \(error)") // Fail immediately; do not retry. - error.isRetryable = false - return resolver.reject(error) + return resolver.reject(error.asUnretryableError) } }) task.resume() diff --git a/SignalServiceKit/src/Contacts/Discovery/LegacyContactDiscoveryOperation.swift b/SignalServiceKit/src/Contacts/Discovery/LegacyContactDiscoveryOperation.swift index a9381ade45..b012f67af7 100644 --- a/SignalServiceKit/src/Contacts/Discovery/LegacyContactDiscoveryOperation.swift +++ b/SignalServiceKit/src/Contacts/Discovery/LegacyContactDiscoveryOperation.swift @@ -60,16 +60,14 @@ class LegacyContactDiscoveryOperation: ContactDiscovering { if IsNetworkConnectivityFailure(error) { responseResolver.reject(error) } else { - let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError - responseError.isRetryable = true + let responseError = OWSErrorMakeUnableToProcessServerResponseError().asRetryableError responseResolver.reject(responseError) } return } guard response.statusCode != 413 else { - let nsError = OWSErrorWithCodeDescription(OWSErrorCode.contactDiscoveryRateLimit, "Contacts Intersection Rate Limit") as NSError - nsError.isRetryable = false + let nsError = OWSErrorWithCodeDescription(OWSErrorCode.contactDiscoveryRateLimit, "Contacts Intersection Rate Limit").asUnretryableError responseResolver.reject(nsError) return } @@ -80,17 +78,11 @@ class LegacyContactDiscoveryOperation: ContactDiscovering { private func parse(response: Any?, phoneNumbersByHashes: [String: String]) throws -> Set { guard let responseDict = response as? [String: AnyObject] else { - let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError - responseError.isRetryable = true - - throw responseError + throw OWSErrorMakeUnableToProcessServerResponseError().asRetryableError } guard let contactDicts = responseDict["contacts"] as? [[String: AnyObject]] else { - let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError - responseError.isRetryable = true - - throw responseError + throw OWSErrorMakeUnableToProcessServerResponseError().asRetryableError } var registeredRecipientIds: Set = Set() diff --git a/SignalServiceKit/src/Messages/Stickers/CDNDownloadOperation.swift b/SignalServiceKit/src/Messages/Stickers/CDNDownloadOperation.swift index 25a1d34b4f..fd7d758fc1 100644 --- a/SignalServiceKit/src/Messages/Stickers/CDNDownloadOperation.swift +++ b/SignalServiceKit/src/Messages/Stickers/CDNDownloadOperation.swift @@ -58,8 +58,7 @@ open class CDNDownloadOperation: OWSOperation { error: &requestError) if let error = requestError { owsFailDebug("Could not create request failed: \(error)") - error.isRetryable = false - throw error + throw error.asUnretryableError } request.setValue(OWSMimeTypeApplicationOctetStream, forHTTPHeaderField: "Content-Type") @@ -165,12 +164,10 @@ open class CDNDownloadOperation: OWSOperation { do { let data = try Data(contentsOf: tempFileURL) resolver.fulfill(data) - } catch let error as NSError { + } catch { owsFailDebug("Could not load data failed: \(error)") - // Fail immediately; do not retry. - error.isRetryable = false - return resolver.reject(error) + return resolver.reject(error.asUnretryableError) } }) self.task = task diff --git a/SignalServiceKit/src/Messages/Stickers/DownloadStickerOperation.swift b/SignalServiceKit/src/Messages/Stickers/DownloadStickerOperation.swift index c73c9b87bd..c32e69a57e 100644 --- a/SignalServiceKit/src/Messages/Stickers/DownloadStickerOperation.swift +++ b/SignalServiceKit/src/Messages/Stickers/DownloadStickerOperation.swift @@ -92,14 +92,13 @@ class DownloadStickerOperation: CDNDownloadOperation { self.success(plaintext) self.reportSuccess() - } catch let error as NSError { + } catch { owsFailDebug("Decryption failed: \(error)") self.markUrlPathAsCorrupt(urlPath) // Fail immediately; do not retry. - error.isRetryable = false - return self.reportError(error) + return self.reportError(error.asUnretryableError) } }.catch(on: DispatchQueue.global()) { [weak self] error in guard let self = self else { diff --git a/SignalServiceKit/src/Messages/Stickers/DownloadStickerPackOperation.swift b/SignalServiceKit/src/Messages/Stickers/DownloadStickerPackOperation.swift index 67c6c14b39..c2f69429f5 100644 --- a/SignalServiceKit/src/Messages/Stickers/DownloadStickerPackOperation.swift +++ b/SignalServiceKit/src/Messages/Stickers/DownloadStickerPackOperation.swift @@ -53,14 +53,13 @@ class DownloadStickerPackOperation: CDNDownloadOperation { self.success(stickerPack) self.reportSuccess() - } catch let error as NSError { + } catch { owsFailDebug("Decryption failed: \(error)") self.markUrlPathAsCorrupt(urlPath) // Fail immediately; do not retry. - error.isRetryable = false - return self.reportError(error) + return self.reportError(error.asUnretryableError) } }.catch(on: DispatchQueue.global()) { [weak self] error in guard let self = self else { diff --git a/SignalServiceKit/src/Util/Profiles/ProfileFetcherJob.swift b/SignalServiceKit/src/Util/Profiles/ProfileFetcherJob.swift index b1c3a4d70c..a5009979ea 100644 --- a/SignalServiceKit/src/Util/Profiles/ProfileFetcherJob.swift +++ b/SignalServiceKit/src/Util/Profiles/ProfileFetcherJob.swift @@ -496,9 +496,7 @@ public class ProfileFetcherJob: NSObject { // To avoid these conflicts we treat "partial" // profile fetches (where we download the profile // but not the associated avatar) as failures. - let nsError = error as NSError - nsError.isRetryable = false - throw nsError + throw error.asUnretryableError } } else { // This should be very rare. It might reflect: