Rework recipient device updates.

pull/1/head
Matthew Chen 7 years ago
parent a00ebdf4a2
commit 9519e7961a

@ -25,9 +25,9 @@ NS_ASSUME_NONNULL_BEGIN
+ (instancetype)getOrBuildUnsavedRecipientForRecipientId:(NSString *)recipientId + (instancetype)getOrBuildUnsavedRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadTransaction *)transaction; transaction:(YapDatabaseReadTransaction *)transaction;
- (void)addDevicesToRegisteredRecipient:(NSSet *)devices - (void)updateRegisteredRecipientWithDevicesToAdd:(nullable NSArray *)devicesToAdd
transaction:(YapDatabaseReadWriteTransaction *)transaction; devicesToRemove:(nullable NSArray *)devicesToRemove
- (void)removeDevicesFromRecipient:(NSSet *)devices transaction:(YapDatabaseReadWriteTransaction *)transaction; transaction:(YapDatabaseReadWriteTransaction *)transaction;
- (NSString *)recipientId; - (NSString *)recipientId;

@ -112,6 +112,23 @@ NS_ASSUME_NONNULL_BEGIN
self.devices = [updatedDevices copy]; self.devices = [updatedDevices copy];
} }
- (void)updateRegisteredRecipientWithDevicesToAdd:(nullable NSArray *)devicesToAdd
devicesToRemove:(nullable NSArray *)devicesToRemove
transaction:(YapDatabaseReadWriteTransaction *)transaction {
OWSAssertDebug(transaction);
OWSAssertDebug(devicesToAdd.count > 0 || devicesToRemove.count > 0);
// Add before we remove, since removeDevicesFromRecipient:...
// can removeUnregisteredRecipient:... if the recipient has
// no devices left.
if (devicesToAdd.count > 0) {
[self addDevicesToRegisteredRecipient:[NSSet setWithArray:devicesToAdd] transaction:transaction];
}
if (devicesToRemove.count > 0) {
[self removeDevicesFromRecipient:[NSSet setWithArray:devicesToRemove] transaction:transaction];
}
}
- (void)addDevicesToRegisteredRecipient:(NSSet *)devices transaction:(YapDatabaseReadWriteTransaction *)transaction - (void)addDevicesToRegisteredRecipient:(NSSet *)devices transaction:(YapDatabaseReadWriteTransaction *)transaction
{ {
OWSAssertDebug(transaction); OWSAssertDebug(transaction);
@ -119,8 +136,8 @@ NS_ASSUME_NONNULL_BEGIN
[self addDevices:devices]; [self addDevices:devices];
SignalRecipient *latest = SignalRecipient *latest = [SignalRecipient markRecipientAsRegisteredAndGet:self.recipientId
[SignalRecipient markRecipientAsRegisteredAndGet:self.recipientId transaction:transaction]; transaction:transaction];
if ([devices isSubsetOfSet:latest.devices.set]) { if ([devices isSubsetOfSet:latest.devices.set]) {
return; return;

@ -1264,20 +1264,17 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSProdFail([OWSAnalyticsEvents messageSenderErrorNoMissingOrExtraDevices]); OWSProdFail([OWSAnalyticsEvents messageSenderErrorNoMissingOrExtraDevices]);
} }
if (missingDevices && missingDevices.count > 0) { [recipient updateRegisteredRecipientWithDevicesToAdd:missingDevices
OWSLogInfo(@"Adding missing devices: %@", missingDevices); devicesToRemove:extraDevices
[recipient addDevicesToRegisteredRecipient:[NSSet setWithArray:missingDevices] transaction:transaction]; transaction:transaction];
}
if (extraDevices && extraDevices.count > 0) { if (extraDevices && extraDevices.count > 0) {
OWSLogInfo(@"removing extra devices: %@", extraDevices); OWSLogInfo(@"Deleting sessions for extra devices: %@", extraDevices);
for (NSNumber *extraDeviceId in extraDevices) { for (NSNumber *extraDeviceId in extraDevices) {
[self.primaryStorage deleteSessionForContact:recipient.uniqueId [self.primaryStorage deleteSessionForContact:recipient.uniqueId
deviceId:extraDeviceId.intValue deviceId:extraDeviceId.intValue
protocolContext:transaction]; protocolContext:transaction];
} }
[recipient removeDevicesFromRecipient:[NSSet setWithArray:extraDevices] transaction:transaction];
} }
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@ -1372,7 +1369,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} @catch (NSException *exception) { } @catch (NSException *exception) {
if ([exception.name isEqualToString:OWSMessageSenderInvalidDeviceException]) { if ([exception.name isEqualToString:OWSMessageSenderInvalidDeviceException]) {
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[recipient removeDevicesFromRecipient:[NSSet setWithObject:deviceId] transaction:transaction]; [recipient updateRegisteredRecipientWithDevicesToAdd:nil
devicesToRemove:@[ deviceId ]
transaction:transaction];
}]; }];
continue; continue;
} else { } else {
@ -1409,7 +1408,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} @catch (NSException *exception) { } @catch (NSException *exception) {
if ([exception.name isEqualToString:OWSMessageSenderInvalidDeviceException]) { if ([exception.name isEqualToString:OWSMessageSenderInvalidDeviceException]) {
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[recipient removeDevicesFromRecipient:[NSSet setWithObject:deviceId] transaction:transaction]; [recipient updateRegisteredRecipientWithDevicesToAdd:nil
devicesToRemove:@[ deviceId ]
transaction:transaction];
}]; }];
} else { } else {
@throw exception; @throw exception;

Loading…
Cancel
Save