Signal-iOS/SignalServiceKit/Jobs/OWSGroupSyncProcessingJobQueue.swift
Jordan Rose 2727a70b90 Make AtomicValue's lock-sharing explicit
Also:
- Remove AtomicUInt's @objc, it's no longer used from ObjC
- Remove Codable conformances, they would implicitly use shared locks
  and weren't used in practice
2024-03-27 10:57:32 -07:00

91 lines
3.0 KiB
Swift

//
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
/// Queue for processing deprecated "groups" sync messages.
///
/// Groups sync messages are a V1 groups concept, and have been deprecated. It's
/// unlikely, but there may be existing job records referring to ancient group
/// sync messages. In that event, this job queue remains to boot them up and
/// immediately fail them.
public class IncomingGroupSyncJobQueue: NSObject, JobQueue {
public typealias DurableOperationType = IncomingGroupSyncOperation
public let requiresInternet: Bool = false
public let isEnabled: Bool = true
public var runningOperations = AtomicArray<IncomingGroupSyncOperation>(lock: .sharedGlobal)
public let isSetup = AtomicBool(false, lock: .sharedGlobal)
private let defaultQueue: OperationQueue = {
let operationQueue = OperationQueue()
operationQueue.name = "IncomingGroupSyncJobQueue"
operationQueue.maxConcurrentOperationCount = 1
return operationQueue
}()
public override init() {
super.init()
AppReadiness.runNowOrWhenAppDidBecomeReadyAsync {
self.setup()
}
}
public func setup() {
defaultSetup()
}
public func didMarkAsReady(oldJobRecord: IncomingGroupSyncJobRecord, transaction: SDSAnyWriteTransaction) {}
public func operationQueue(jobRecord: IncomingGroupSyncJobRecord) -> OperationQueue {
return defaultQueue
}
public func buildOperation(jobRecord: IncomingGroupSyncJobRecord, transaction: SDSAnyReadTransaction) throws -> IncomingGroupSyncOperation {
return IncomingGroupSyncOperation(jobRecord: jobRecord)
}
}
public class IncomingGroupSyncOperation: OWSOperation, DurableOperation {
public typealias JobRecordType = IncomingGroupSyncJobRecord
public typealias DurableOperationDelegateType = IncomingGroupSyncJobQueue
public weak var durableOperationDelegate: IncomingGroupSyncJobQueue?
public var jobRecord: IncomingGroupSyncJobRecord
public var operation: OWSOperation { return self }
public let maxRetries: UInt = 0
// MARK: -
init(jobRecord: IncomingGroupSyncJobRecord) {
self.jobRecord = jobRecord
}
public override func run() {
enum DeprecatedError: Error, IsRetryableProvider {
case deprecated
var isRetryableProvider: Bool { false }
}
reportError(DeprecatedError.deprecated)
}
public override func didSucceed() {
owsFail("Can never succeed!")
}
public override func didReportError(_ error: Error) {
self.databaseStorage.write { transaction in
self.durableOperationDelegate?.durableOperation(self, didReportError: error, transaction: transaction)
}
}
public override func didFail(error: Error) {
self.databaseStorage.write { transaction in
self.durableOperationDelegate?.durableOperation(self, didFailWithError: error, transaction: transaction)
}
}
}