TM-SGNL-iOS/SignalServiceKit/Util/OWSError.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

145 lines
5.6 KiB
Swift

//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public enum OWSErrorCode: Int {
case invalidMethodParameters = 11
case obsolete12 = 12
case failedToDecodeJson = 13
case failedToEncodeJson = 14
case failedToDecodeQR = 15
case privacyVerificationFailure = 20
case untrustedIdentity = 777427
case invalidKeySignature = 777428
case obsolete30 = 30
case assertionFailure = 31
case genericFailure = 32
case failedToDecryptMessage = 100
case failedToDecryptUDMessage = 101
case failedToEncryptMessage = 110
case failedToEncryptUDMessage = 111
case messageSendUnauthorized = 1001
case signalServiceRateLimited = 1010
case userError = 2001
case noSuchSignalRecipient = 777404
case messageSendDisabledDueToPreKeyUpdateFailures = 777405
case messageSendFailedToBlockList = 777406
case messageSendNoValidRecipients = 777407
case couldNotWriteAttachmentData = 777409
case messageDeletedBeforeSent = 777410
case databaseConversionFatalError = 777411
case moveFileToSharedDataContainerError = 777412
case debugLogUploadFailed = 777414
// A non-recoverable error occurred while exporting a backup.
case exportBackupFailed = 777415
// A possibly recoverable error occurred while exporting a backup.
case exportBackupError = 777416
// A non-recoverable error occurred while importing a backup.
case importBackupFailed = 777417
// A possibly recoverable error occurred while importing a backup.
case importBackupError = 777418
// A non-recoverable while importing or exporting a backup.
case backupFailure = 777419
case localAuthenticationError = 777420
case obsolete777421 = 777421
case obsolete777422 = 777422
case invalidMessage = 777423
case profileUpdateFailed = 777424
case avatarWriteFailed = 777425
case avatarUploadFailed = 777426
case invalidStickerData = 777429
case attachmentDownloadFailed = 777430
case appExpired = 777431
case missingLocalThread = 777432
case contactSyncFailed = 777433
case appDeregistered = 777434
case registrationTransferAvailable = 777435
case failedToDecryptDuplicateMessage = 777436
case serverRejectedSuspectedSpam = 777437
case senderKeyEphemeralFailure = 777438
case senderKeyUnavailable = 777439
case messageSendEncryptionFailure = 777440
case noSessionForTransientMessage = 777441 // NOTE: This value does not match the value before conversion to objc due to duplication of the raw value (was 777427 same as untrustedIdentity)
case uploadFailed = 777442 // NOTE: This value does not match the value before conversion to objc due to duplication of the raw value (was 777428 same as invalidKeySignature)
}
@objc
public class OWSError: NSObject, CustomNSError, IsRetryableProvider, UserErrorDescriptionProvider {
public let errorCode: Int
private let customLocalizedDescription: String
private let customIsRetryable: Bool
private var customUserInfo: [String: Any]?
public init(errorCode: Int,
description customLocalizedDescription: String,
isRetryable customIsRetryable: Bool,
userInfo customUserInfo: [String: Any]? = nil) {
self.errorCode = errorCode
self.customLocalizedDescription = customLocalizedDescription
self.customIsRetryable = customIsRetryable
self.customUserInfo = customUserInfo
}
public init(error: OWSErrorCode,
description customLocalizedDescription: String,
isRetryable customIsRetryable: Bool,
userInfo customUserInfo: [String: Any]? = nil) {
self.errorCode = error.rawValue
self.customLocalizedDescription = customLocalizedDescription
self.customIsRetryable = customIsRetryable
self.customUserInfo = customUserInfo
}
public override var description: String {
var result = "[OWSError code: \(errorCode), description: \(customLocalizedDescription)"
if let customUserInfo = self.customUserInfo,
!customUserInfo.isEmpty {
result += ", userInfo: \(customUserInfo)"
}
result += "]"
return result
}
// MARK: - CustomNSError
// NSError bridging: the domain of the error.
public static let errorDomain = "OWSSignalServiceKitErrorDomain"
// NSError bridging: the error code within the given domain.
public var errorUserInfo: [String: Any] {
var result: [String: Any] = customUserInfo ?? [:]
result[NSLocalizedDescriptionKey] = customLocalizedDescription
return result
}
public var localizedDescription: String { customLocalizedDescription }
// MARK: - IsRetryableProvider
public var isRetryableProvider: Bool { customIsRetryable }
// MARK: - Old OWSError.h functions
@available(swift, obsoleted: 1)
@objc
public static func makeAssertionError(_ description: String) -> NSError {
owsFailDebug("Assertion failed: \(description)")
return makeAssertionError() as Error as NSError
}
@inlinable
public static func genericErrorDescription() -> String {
OWSLocalizedString("ERROR_DESCRIPTION_UNKNOWN_ERROR", comment: "Worst case generic error message")
}
public static func makeAssertionError() -> OWSError {
OWSError(error: .assertionFailure, description: genericErrorDescription(), isRetryable: false)
}
public static func makeGenericError() -> OWSError {
OWSError(error: .genericFailure, description: genericErrorDescription(), isRetryable: false)
}
}