Integrate swarm changes into message sending code

pull/17/head
Niels Andriesse 6 years ago
parent adcb469b53
commit e1d2c48c9b

@ -91,7 +91,11 @@ import PromiseKit
// MARK: Public API (Obj-C) // MARK: Public API (Obj-C)
@objc public static func objc_sendSignalMessage(_ signalMessage: SignalMessage, to destination: String, timestamp: UInt64, requiringPoW isPoWRequired: Bool) -> AnyPromise { @objc public static func objc_sendSignalMessage(_ signalMessage: SignalMessage, to destination: String, timestamp: UInt64, requiringPoW isPoWRequired: Bool) -> AnyPromise {
let promise = Message.from(signalMessage: signalMessage, timestamp: timestamp, requiringPoW: isPoWRequired).then(sendMessage) let promise = Message.from(signalMessage: signalMessage, timestamp: timestamp, requiringPoW: isPoWRequired).then(sendMessage).mapValues { promise -> AnyPromise in
let anyPromise = AnyPromise(promise)
anyPromise.retainUntilComplete()
return anyPromise
}.map { Set($0) }
let anyPromise = AnyPromise(promise) let anyPromise = AnyPromise(promise)
anyPromise.retainUntilComplete() anyPromise.retainUntilComplete()
return anyPromise return anyPromise

@ -1103,11 +1103,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
return messageSend.failure(error); return messageSend.failure(error);
} }
// Update the state to show that proof of work is being calculated // Update the state to show that the proof of work is being calculated
[self setIsCalculatingProofOfWorkForMessage:messageSend]; [self setIsCalculatingProofOfWorkForMessage:messageSend];
// Convert the message to a Loki message and send it using the Loki messaging API // Convert the message to a Loki message and send it using the Loki messaging API
NSDictionary *signalMessage = deviceMessages.firstObject; NSDictionary *signalMessage = deviceMessages.firstObject;
// Update the thread's friend request status if needed // Update the message and thread if needed
NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue;
if (messageType == TSFriendRequestMessageType) { if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil];
@ -1116,51 +1116,53 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
BOOL isPoWRequired = YES; // TODO: Base on message type BOOL isPoWRequired = YES; // TODO: Base on message type
[[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired] [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired]
.thenOn(OWSDispatch.sendingQueue, ^(id result) { .thenOn(OWSDispatch.sendingQueue, ^(id result) {
// Loki NSSet<AnyPromise *> *promises = (NSSet<AnyPromise *> *)result;
// ======== BOOL isSuccess = NO;
if (messageType == TSFriendRequestMessageType) { NSUInteger promiseCount = promises.count;
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { NSUInteger errorCount = 0;
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; for (AnyPromise *promise in promises) {
[message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; [promise
// Set the expiration date .thenOn(OWSDispatch.sendingQueue, ^(id result) {
NSTimeInterval expirationInterval = 72 * kHourInterval; if (isSuccess) { return; } // Succeed as soon as the first promise succeeds
NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; isSuccess = YES;
[message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expireDate] withTransaction:transaction]; // Update the message and thread if needed
}]; if (messageType == TSFriendRequestMessageType) {
} [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
// ======== [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
// Invoke the completion handler [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction];
[self messageSendDidSucceed:messageSend NSTimeInterval expirationInterval = 72 * kHourInterval;
deviceMessages:deviceMessages NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
wasSentByUD:false [message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction];
wasSentByWebsocket:false]; }];
}) }
.catchOn(OWSDispatch.sendingQueue, ^(NSError *error) { // Invoke the completion handler
// Loki [self messageSendDidSucceed:messageSend deviceMessages:deviceMessages wasSentByUD:false wasSentByWebsocket:false];
// ======== })
if (messageType == TSFriendRequestMessageType) { .catchOn(OWSDispatch.sendingQueue, ^(NSError *error) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; errorCount += 1;
} if (errorCount != promiseCount) { return; } // Only error out if all promises failed
// ======== // Update the thread if needed
// Handle the error if (messageType == TSFriendRequestMessageType) {
NSUInteger statusCode = 0; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
NSData *_Nullable responseData = nil; }
if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) { // Handle the error
statusCode = error.code; NSUInteger statusCode = 0;
NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey]; NSData *_Nullable responseData = nil;
if (underlyingError) { if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) {
responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; statusCode = error.code;
} else { NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey];
OWSFailDebug(@"Missing underlying error: %@", error); if (underlyingError) {
} responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
} else { } else {
OWSFailDebug(@"Unexpected error: %@", error); OWSFailDebug(@"Missing underlying error: %@.", error);
}
} else {
OWSFailDebug(@"Unexpected error: %@.", error);
}
[self messageSendDidFail:messageSend deviceMessages:deviceMessages statusCode:statusCode error:error responseData:responseData];
}) retainUntilComplete];
} }
[self messageSendDidFail:messageSend
deviceMessages:deviceMessages
statusCode:statusCode
error:error
responseData:responseData];
}) retainUntilComplete]; }) retainUntilComplete];
// Loki: Original code // Loki: Original code

Loading…
Cancel
Save