Send delivery receipts.

pull/1/head
Matthew Chen 7 years ago
parent de7bffa593
commit 45d6250aee

@ -110,11 +110,11 @@ NSString *const kDeliveryReceiptManagerCollection = @"kDeliveryReceiptManagerCol
usingBlock:^(NSString *key, id object, BOOL *stop) { usingBlock:^(NSString *key, id object, BOOL *stop) {
NSString *recipientId = key; NSString *recipientId = key;
NSSet<NSNumber *> *timestamps = object; NSSet<NSNumber *> *timestamps = object;
deliveryReceiptMap[recipientId] = timestamps; deliveryReceiptMap[recipientId] = [timestamps copy];
}]; }];
}]; }];
BOOL didWork = NO; NSMutableArray<AnyPromise *> *sendPromises = [NSMutableArray array];
for (NSString *recipientId in deliveryReceiptMap) { for (NSString *recipientId in deliveryReceiptMap) {
NSSet<NSNumber *> *timestamps = deliveryReceiptMap[recipientId]; NSSet<NSNumber *> *timestamps = deliveryReceiptMap[recipientId];
@ -128,30 +128,33 @@ NSString *const kDeliveryReceiptManagerCollection = @"kDeliveryReceiptManagerCol
[OWSReceiptsForSenderMessage deliveryReceiptsForSenderMessageWithThread:thread [OWSReceiptsForSenderMessage deliveryReceiptsForSenderMessageWithThread:thread
messageTimestamps:timestamps.allObjects]; messageTimestamps:timestamps.allObjects];
AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
[self.messageSender enqueueMessage:message [self.messageSender enqueueMessage:message
success:^{ success:^{
OWSLogInfo(@"Successfully sent %lu delivery receipts to sender.", (unsigned long)timestamps.count); OWSLogInfo(@"Successfully sent %lu delivery receipts to sender.", (unsigned long)timestamps.count);
[self dequeueDeliveryReceiptsWithRecipientId:recipientId timestamps:timestamps];
// The value doesn't matter, we just need any non-NSError value.
resolve(@(1));
} }
failure:^(NSError *error) { failure:^(NSError *error) {
OWSLogError(@"Failed to send delivery receipts to sender with error: %@", error); OWSLogError(@"Failed to send delivery receipts to sender with error: %@", error);
}];
didWork = YES;
}
// Now that they've been processed, remove all enqueued delivery receipts. resolve(error);
// }];
// NOTE: we don't need to worry about race conditions; this
// collection will only be mutated on serialQueue.
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[transaction removeAllObjectsInCollection:kDeliveryReceiptManagerCollection];
}]; }];
[sendPromises addObject:sendPromise];
}
if (!didWork) { if (sendPromises.count < 1) {
// No work to do; abort.
self.isProcessing = NO; self.isProcessing = NO;
return; return;
} }
AnyPromise *completionPromise = PMKJoin(sendPromises);
completionPromise.always(^() {
// Wait N seconds before processing delivery receipts again. // Wait N seconds before processing delivery receipts again.
// This allows time for a batch to accumulate. // This allows time for a batch to accumulate.
// //
@ -159,10 +162,13 @@ NSString *const kDeliveryReceiptManagerCollection = @"kDeliveryReceiptManagerCol
// delivery receipts without being so high that we risk not sending delivery // delivery receipts without being so high that we risk not sending delivery
// receipts due to app exit. // receipts due to app exit.
const CGFloat kProcessingFrequencySeconds = 3.f; const CGFloat kProcessingFrequencySeconds = 3.f;
dispatch_after( dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kProcessingFrequencySeconds * NSEC_PER_SEC)),
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kProcessingFrequencySeconds * NSEC_PER_SEC)), self.serialQueue, ^{ self.serialQueue,
^{
[self process]; [self process];
}); });
});
[completionPromise retainUntilComplete];
} }
- (void)envelopeWasReceived:(SSKProtoEnvelope *)envelope { - (void)envelopeWasReceived:(SSKProtoEnvelope *)envelope {

Loading…
Cancel
Save