Refine de-duplication logic.
This commit is contained in:
parent
564dcf87aa
commit
fc45ec8f63
@ -33,10 +33,11 @@ let hasShownFirstUnlockError = AtomicBool(false)
|
||||
|
||||
class NotificationService: UNNotificationServiceExtension {
|
||||
|
||||
private var contentHandler: ((UNNotificationContent) -> Void)?
|
||||
private typealias ContentHandler = (UNNotificationContent) -> Void
|
||||
private var contentHandler = AtomicOptional<ContentHandler>(nil)
|
||||
|
||||
func completeSilenty(timeHasExpired: Bool = false) {
|
||||
guard let contentHandler = contentHandler else {
|
||||
guard let contentHandler = contentHandler.swap(nil) else {
|
||||
if DebugFlags.internalLogging {
|
||||
Logger.info("No contentHandler.")
|
||||
}
|
||||
@ -57,8 +58,14 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
}
|
||||
Logger.flush()
|
||||
|
||||
contentHandler(content)
|
||||
self.contentHandler = nil
|
||||
let isSync = timeHasExpired
|
||||
if isSync {
|
||||
contentHandler(content)
|
||||
} else {
|
||||
DispatchQueue.global().asyncAfter(deadline: .now() + .milliseconds(1000)) {
|
||||
contentHandler(content)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
||||
@ -94,7 +101,7 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
fatalError("Posting error notification and skipping processing.")
|
||||
}
|
||||
|
||||
self.contentHandler = contentHandler
|
||||
self.contentHandler.set(contentHandler)
|
||||
|
||||
owsAssertDebug(FeatureFlags.notificationServiceExtension)
|
||||
|
||||
|
||||
@ -34,8 +34,10 @@ public extension DebugUIMessages {
|
||||
serverDeliveryTimestamp: 0,
|
||||
wasReceivedByUD: false) { error in
|
||||
switch error {
|
||||
case MessageProcessingError.duplicateMessage?:
|
||||
Logger.warn("Duplicate.")
|
||||
case MessageProcessingError.duplicatePendingEnvelope?:
|
||||
Logger.warn("duplicatePendingEnvelope.")
|
||||
case MessageProcessingError.duplicateDecryption?:
|
||||
Logger.warn("duplicateDecryption.")
|
||||
case let otherError?:
|
||||
owsFailDebug("Error: \(otherError)")
|
||||
case nil:
|
||||
|
||||
@ -295,8 +295,22 @@ public class MessageFetcherJob: NSObject {
|
||||
let envelopeInfo = Self.buildEnvelopeInfo(envelope: envelope)
|
||||
do {
|
||||
let envelopeData = try envelope.serializedData()
|
||||
return EnvelopeJob(encryptedEnvelopeData: envelopeData, encryptedEnvelope: envelope) {_ in
|
||||
Self.messageFetcherJob.acknowledgeDelivery(envelopeInfo: envelopeInfo)
|
||||
return EnvelopeJob(encryptedEnvelopeData: envelopeData, encryptedEnvelope: envelope) { processingError in
|
||||
var shouldAck: Bool
|
||||
switch processingError {
|
||||
case nil:
|
||||
shouldAck = true
|
||||
case MessageProcessingError.duplicatePendingEnvelope?:
|
||||
shouldAck = false
|
||||
case MessageProcessingError.duplicateDecryption?:
|
||||
shouldAck = true
|
||||
default:
|
||||
shouldAck = true
|
||||
}
|
||||
|
||||
if shouldAck {
|
||||
Self.messageFetcherJob.acknowledgeDelivery(envelopeInfo: envelopeInfo)
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
owsFailDebug("failed to serialize envelope")
|
||||
|
||||
@ -193,7 +193,7 @@ public class MessageProcessor: NSObject {
|
||||
switch result {
|
||||
case .duplicate:
|
||||
Logger.warn("Duplicate envelope, envelopeSource: \(envelopeSource).")
|
||||
completion(MessageProcessingError.duplicateMessage)
|
||||
completion(MessageProcessingError.duplicatePendingEnvelope)
|
||||
case .enqueued:
|
||||
drainPendingEnvelopes()
|
||||
}
|
||||
@ -628,7 +628,7 @@ private struct EncryptedEnvelope: PendingEnvelope, Dependencies {
|
||||
// Proceed with decryption.
|
||||
break
|
||||
case .duplicate:
|
||||
return .failure(MessageProcessingError.duplicateMessage)
|
||||
return .failure(MessageProcessingError.duplicateDecryption)
|
||||
}
|
||||
|
||||
let result = Self.messageDecrypter.decryptEnvelope(
|
||||
@ -803,5 +803,6 @@ public class PendingEnvelopes {
|
||||
// MARK: -
|
||||
|
||||
public enum MessageProcessingError: Error {
|
||||
case duplicateMessage
|
||||
case duplicatePendingEnvelope
|
||||
case duplicateDecryption
|
||||
}
|
||||
|
||||
@ -534,10 +534,12 @@ public class OWSWebSocket: NSObject {
|
||||
switch processingError {
|
||||
case nil:
|
||||
shouldAck = true
|
||||
case MessageProcessingError.duplicateMessage?:
|
||||
case MessageProcessingError.duplicatePendingEnvelope?:
|
||||
shouldAck = false
|
||||
case MessageProcessingError.duplicateDecryption?:
|
||||
shouldAck = true
|
||||
case let alertableError?:
|
||||
shouldAck = false
|
||||
shouldAck = true
|
||||
Logger.warn("Failed to process message: \(alertableError)")
|
||||
Self.databaseStorage.write { transaction in
|
||||
let errorMessage = ThreadlessErrorMessage.corruptedMessageInUnknownThread()
|
||||
|
||||
@ -105,8 +105,10 @@ class MessageProcessingIntegrationTest: SSKBaseTestSwift {
|
||||
serverDeliveryTimestamp: NSDate.ows_millisecondTimeStamp(),
|
||||
envelopeSource: .tests) { error in
|
||||
switch error {
|
||||
case MessageProcessingError.duplicateMessage?:
|
||||
XCTFail("duplicate")
|
||||
case MessageProcessingError.duplicatePendingEnvelope?:
|
||||
XCTFail("duplicatePendingEnvelope")
|
||||
case MessageProcessingError.duplicateDecryption?:
|
||||
XCTFail("duplicateDecryption")
|
||||
case .some(_):
|
||||
XCTFail("failure")
|
||||
case nil:
|
||||
@ -177,8 +179,10 @@ class MessageProcessingIntegrationTest: SSKBaseTestSwift {
|
||||
serverDeliveryTimestamp: NSDate.ows_millisecondTimeStamp(),
|
||||
envelopeSource: .tests) { error in
|
||||
switch error {
|
||||
case MessageProcessingError.duplicateMessage?:
|
||||
XCTFail("duplicate")
|
||||
case MessageProcessingError.duplicatePendingEnvelope?:
|
||||
XCTFail("duplicatePendingEnvelope")
|
||||
case MessageProcessingError.duplicateDecryption?:
|
||||
XCTFail("duplicateDecryption")
|
||||
case .some(_):
|
||||
XCTFail("failure")
|
||||
case nil:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user