mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Fix message dependency ordering
This commit is contained in:
parent
b60c8d25a6
commit
8f1dafed6e
@ -244,7 +244,7 @@ typedef enum {
|
||||
[reqPqBuffer appendBytes:_nonce.bytes length:_nonce.length];
|
||||
|
||||
NSString *messageDescription = [NSString stringWithFormat:@"reqPq nonce:%@", _nonce];
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqPqBuffer.data metadata:messageDescription additionalDebugDescription:nil shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
{
|
||||
if (_stage == MTDatacenterAuthStagePQ && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)
|
||||
@ -268,7 +268,7 @@ typedef enum {
|
||||
[reqDhBuffer appendTLBytes:_dhEncryptedData];
|
||||
|
||||
NSString *messageDescription = [NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint];
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription additionalDebugDescription:nil shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
{
|
||||
if (_stage == MTDatacenterAuthStageReqDH && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)
|
||||
@ -288,7 +288,7 @@ typedef enum {
|
||||
[setDhParamsBuffer appendBytes:_serverNonce.bytes length:_serverNonce.length];
|
||||
[setDhParamsBuffer appendTLBytes:_encryptedClientData];
|
||||
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" shortMetadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:setDhParamsBuffer.data metadata:@"setDhParams" additionalDebugDescription:nil shortMetadata:@"setDhParams" messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo];
|
||||
return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
{
|
||||
if (_stage == MTDatacenterAuthStageKeyVerification && messageInternalIdToTransactionId[message.internalId] != nil && messageInternalIdToPreparedMessage[message.internalId] != nil)
|
||||
|
@ -7,6 +7,7 @@
|
||||
@property (nonatomic, strong, readonly) id internalId;
|
||||
@property (nonatomic, strong, readonly) NSData *data;
|
||||
@property (nonatomic, strong, readonly) id metadata;
|
||||
@property (nonatomic, strong, readonly) NSString *additionalDebugDescription;
|
||||
@property (nonatomic, strong, readonly) id shortMetadata;
|
||||
@property (nonatomic, readonly) int64_t messageId;
|
||||
@property (nonatomic, readonly) int32_t messageSeqNo;
|
||||
@ -15,9 +16,9 @@
|
||||
@property (nonatomic) bool hasHighPriority;
|
||||
@property (nonatomic) int64_t inResponseToMessageId;
|
||||
|
||||
@property (nonatomic, copy) id (^dynamicDecorator)(NSData *currentData, NSMutableDictionary *messageInternalIdToPreparedMessage);
|
||||
@property (nonatomic, copy) id (^dynamicDecorator)(int64_t, NSData *currentData, NSMutableDictionary *messageInternalIdToPreparedMessage);
|
||||
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata;
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo;
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata;
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo;
|
||||
|
||||
@end
|
||||
|
@ -46,12 +46,12 @@
|
||||
|
||||
@implementation MTOutgoingMessage
|
||||
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata
|
||||
{
|
||||
return [self initWithData:data metadata:metadata shortMetadata:shortMetadata messageId:0 messageSeqNo:0];
|
||||
return [self initWithData:data metadata:metadata additionalDebugDescription:additionalDebugDescription shortMetadata:shortMetadata messageId:0 messageSeqNo:0];
|
||||
}
|
||||
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
|
||||
- (instancetype)initWithData:(NSData *)data metadata:(id)metadata additionalDebugDescription:(NSString *)additionalDebugDescription shortMetadata:(id)shortMetadata messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil)
|
||||
@ -59,6 +59,7 @@
|
||||
_internalId = [[MTOutgoingMessageInternalId alloc] init];
|
||||
_data = data;
|
||||
_metadata = metadata;
|
||||
_additionalDebugDescription = additionalDebugDescription;
|
||||
_shortMetadata = shortMetadata;
|
||||
_messageId = messageId;
|
||||
_messageSeqNo = messageSeqNo;
|
||||
|
@ -867,7 +867,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
|
||||
- (NSString *)outgoingMessageDescription:(MTOutgoingMessage *)message messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
|
||||
{
|
||||
return [[NSString alloc] initWithFormat:@"%@ (%" PRId64 "/%" PRId32 ")", message.metadata, message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo];
|
||||
return [[NSString alloc] initWithFormat:@"%@%@ (%" PRId64 "/%" PRId32 ")", message.metadata, message.additionalDebugDescription != nil ? message.additionalDebugDescription : @"", message.messageId == 0 ? messageId : message.messageId, message.messageSeqNo == 0 ? message.messageSeqNo : messageSeqNo];
|
||||
}
|
||||
|
||||
- (NSString *)outgoingShortMessageDescription:(MTOutgoingMessage *)message messageId:(int64_t)messageId messageSeqNo:(int32_t)messageSeqNo
|
||||
@ -956,7 +956,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
[msgsAckBuffer appendInt64:(int64_t)[nMessageId longLongValue]];
|
||||
}
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck" shortMetadata:@"msgsAck"];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:msgsAckBuffer.data metadata:@"msgsAck" additionalDebugDescription:nil shortMetadata:@"msgsAck"];
|
||||
outgoingMessage.requiresConfirmation = false;
|
||||
|
||||
[messageTransactions addObject:[[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(__unused NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
@ -993,17 +993,6 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
{
|
||||
for (MTOutgoingMessage *outgoingMessage in messageTransaction.messagePayload)
|
||||
{
|
||||
NSData *messageData = outgoingMessage.data;
|
||||
|
||||
if (outgoingMessage.dynamicDecorator != nil)
|
||||
{
|
||||
id decoratedData = outgoingMessage.dynamicDecorator(messageData, messageInternalIdToPreparedMessage);
|
||||
if (decoratedData != nil)
|
||||
messageData = decoratedData;
|
||||
}
|
||||
|
||||
NSData *data = messageData;
|
||||
|
||||
int64_t messageId = 0;
|
||||
int32_t messageSeqNo = 0;
|
||||
if (outgoingMessage.messageId == 0)
|
||||
@ -1017,18 +1006,19 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
messageSeqNo = outgoingMessage.messageSeqNo;
|
||||
}
|
||||
|
||||
NSData *messageData = outgoingMessage.data;
|
||||
|
||||
if (outgoingMessage.dynamicDecorator != nil)
|
||||
{
|
||||
id decoratedData = outgoingMessage.dynamicDecorator(messageId, messageData, messageInternalIdToPreparedMessage);
|
||||
if (decoratedData != nil)
|
||||
messageData = decoratedData;
|
||||
}
|
||||
|
||||
NSData *data = messageData;
|
||||
|
||||
if (MTLogEnabled()) {
|
||||
NSString *messageDescription = [self outgoingMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo];
|
||||
/*if ([messageDescription hasPrefix:@"updates.getDifference"]) {
|
||||
static dispatch_once_t onceToken;
|
||||
__block bool flag = false;
|
||||
dispatch_once(&onceToken, ^{
|
||||
flag = true;
|
||||
});
|
||||
if (flag) {
|
||||
debugResetTransport = true;
|
||||
}
|
||||
}*/
|
||||
MTLog(@"[MTProto#%p@%p preparing %@]", self, _context, messageDescription);
|
||||
}
|
||||
NSString *shortMessageDescription = [self outgoingShortMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo];
|
||||
|
@ -285,10 +285,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (NSData *)decorateRequestData:(MTRequest *)request initializeApi:(bool)initializeApi unresolvedDependencyOnRequestInternalId:(__autoreleasing id *)unresolvedDependencyOnRequestInternalId
|
||||
- (NSData *)decorateRequestData:(MTRequest *)request initializeApi:(bool)initializeApi unresolvedDependencyOnRequestInternalId:(__autoreleasing id *)unresolvedDependencyOnRequestInternalId decoratedDebugDescription:(__autoreleasing NSString **)decoratedDebugDescription
|
||||
{
|
||||
NSData *currentData = request.payload;
|
||||
|
||||
NSString *debugDescription = @"";
|
||||
|
||||
if (initializeApi && _apiEnvironment != nil)
|
||||
{
|
||||
if (MTLogEnabled()) {
|
||||
@ -345,6 +347,8 @@
|
||||
|
||||
[buffer appendBytes:currentData.bytes length:currentData.length];
|
||||
currentData = buffer.data;
|
||||
|
||||
debugDescription = [debugDescription stringByAppendingString:@", disableUpdates"];
|
||||
}
|
||||
|
||||
if (request.shouldDependOnRequest != nil)
|
||||
@ -352,7 +356,7 @@
|
||||
NSUInteger index = [_requests indexOfObject:request];
|
||||
if (index != NSNotFound)
|
||||
{
|
||||
for (MTRequest *anotherRequest in _requests)
|
||||
for (MTRequest *anotherRequest in _requests.reverseObjectEnumerator)
|
||||
{
|
||||
if (request == anotherRequest) {
|
||||
continue;
|
||||
@ -370,9 +374,13 @@
|
||||
[buffer appendBytes:currentData.bytes length:currentData.length];
|
||||
|
||||
currentData = buffer.data;
|
||||
|
||||
debugDescription = [debugDescription stringByAppendingFormat:@", invokeAfter(%lld)", anotherRequest.requestContext.messageId];
|
||||
}
|
||||
else if (unresolvedDependencyOnRequestInternalId != nil)
|
||||
else if (unresolvedDependencyOnRequestInternalId != nil) {
|
||||
*unresolvedDependencyOnRequestInternalId = anotherRequest.internalId;
|
||||
debugDescription = [debugDescription stringByAppendingString:@", unresolvedDependency"];
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@ -380,6 +388,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (decoratedDebugDescription != nil) {
|
||||
*decoratedDebugDescription = debugDescription;
|
||||
}
|
||||
|
||||
return currentData;
|
||||
}
|
||||
|
||||
@ -413,6 +425,7 @@
|
||||
requestInternalIdToMessageInternalId = [[NSMutableDictionary alloc] init];
|
||||
|
||||
__autoreleasing id autoreleasingUnresolvedDependencyOnRequestInternalId = nil;
|
||||
__autoreleasing NSString *decoratedDebugDescription = nil;
|
||||
|
||||
int64_t messageId = 0;
|
||||
int32_t messageSeqNo = 0;
|
||||
@ -422,14 +435,16 @@
|
||||
messageSeqNo = request.requestContext.messageSeqNo;
|
||||
}
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:[self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId] metadata:request.metadata shortMetadata:request.shortMetadata messageId:messageId messageSeqNo:messageSeqNo];
|
||||
NSData *decoratedRequestData = [self decorateRequestData:request initializeApi:requestsWillInitializeApi unresolvedDependencyOnRequestInternalId:&autoreleasingUnresolvedDependencyOnRequestInternalId decoratedDebugDescription:&decoratedDebugDescription];
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:decoratedRequestData metadata:request.metadata additionalDebugDescription:decoratedDebugDescription shortMetadata:request.shortMetadata messageId:messageId messageSeqNo:messageSeqNo];
|
||||
outgoingMessage.needsQuickAck = request.acknowledgementReceived != nil;
|
||||
outgoingMessage.hasHighPriority = request.hasHighPriority;
|
||||
|
||||
id unresolvedDependencyOnRequestInternalId = autoreleasingUnresolvedDependencyOnRequestInternalId;
|
||||
if (unresolvedDependencyOnRequestInternalId != nil)
|
||||
{
|
||||
outgoingMessage.dynamicDecorator = ^id (NSData *currentData, NSDictionary *messageInternalIdToPreparedMessage)
|
||||
outgoingMessage.dynamicDecorator = ^id (int64_t currentMessageId, NSData *currentData, NSDictionary *messageInternalIdToPreparedMessage)
|
||||
{
|
||||
id messageInternalId = requestInternalIdToMessageInternalId[unresolvedDependencyOnRequestInternalId];
|
||||
if (messageInternalId != nil)
|
||||
@ -441,6 +456,9 @@
|
||||
[invokeAfterBuffer appendInt32:(int32_t)0xcb9f372d];
|
||||
[invokeAfterBuffer appendInt64:preparedMessage.messageId];
|
||||
[invokeAfterBuffer appendBytes:currentData.bytes length:currentData.length];
|
||||
if (MTLogEnabled()) {
|
||||
MTLog(@"[MTRequestMessageService] %lld dynamically added invokeAfter %lld", currentMessageId, preparedMessage.messageId);
|
||||
}
|
||||
return invokeAfterBuffer.data;
|
||||
}
|
||||
}
|
||||
@ -467,7 +485,7 @@
|
||||
[dropAnswerBuffer appendInt64:dropContext.dropMessageId];
|
||||
|
||||
NSString *messageDecription = [NSString stringWithFormat:@"dropAnswer for %" PRId64, dropContext.dropMessageId];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:messageDecription shortMetadata:messageDecription messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:dropAnswerBuffer.data metadata:messageDecription additionalDebugDescription:nil shortMetadata:messageDecription messageId:dropContext.messageId messageSeqNo:dropContext.messageSeqNo];
|
||||
outgoingMessage.requiresConfirmation = false;
|
||||
dropMessageIdToMessageInternalId[@(dropContext.dropMessageId)] = outgoingMessage.internalId;
|
||||
[messages addObject:outgoingMessage];
|
||||
|
@ -57,7 +57,7 @@
|
||||
|
||||
NSData *resentMessagesRequestData = resendRequestBuffer.data;
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages" shortMetadata:@"resendMessages"];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:resentMessagesRequestData metadata:@"resendMessages" additionalDebugDescription:nil shortMetadata:@"resendMessages"];
|
||||
outgoingMessage.requiresConfirmation = false;
|
||||
|
||||
return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
|
@ -620,7 +620,7 @@ static const NSTimeInterval MTTcpTransportSleepWatchdogTimeout = 60.0;
|
||||
[pingBuffer appendInt32:(int32_t)0x7abe77ec];
|
||||
[pingBuffer appendInt64:randomId];
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping" shortMetadata:@"ping"];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:pingBuffer.data metadata:@"ping" additionalDebugDescription:nil shortMetadata:@"ping"];
|
||||
outgoingMessage.requiresConfirmation = false;
|
||||
|
||||
__weak MTTcpTransport *weakSelf = self;
|
||||
|
@ -59,7 +59,7 @@
|
||||
[getFutureSaltsBuffer appendInt32:(int32_t)0xb921bd04];
|
||||
[getFutureSaltsBuffer appendInt32:_futureSalts.count != 0 ? 1 : 32];
|
||||
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts" shortMetadata:@"getFutureSalts"];
|
||||
MTOutgoingMessage *outgoingMessage = [[MTOutgoingMessage alloc] initWithData:getFutureSaltsBuffer.data metadata:@"getFutureSalts" additionalDebugDescription:nil shortMetadata:@"getFutureSalts"];
|
||||
|
||||
return [[MTMessageTransaction alloc] initWithMessagePayload:@[outgoingMessage] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user