diff --git a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTDatacenterAuthInfo.h b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTDatacenterAuthInfo.h index 26c7c7ea3f..cdcb4e86a0 100644 --- a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTDatacenterAuthInfo.h +++ b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTDatacenterAuthInfo.h @@ -4,9 +4,10 @@ @property (nonatomic, strong, readonly) NSData *authKey; @property (nonatomic, readonly) int64_t authKeyId; +@property (nonatomic, readonly) int32_t validUntilTimestamp; @property (nonatomic, readonly) bool notBound; -- (instancetype)initWithAuthKey:(NSData *)tempAuthKey authKeyId:(int64_t)authKeyId notBound:(bool)notBound; +- (instancetype)initWithAuthKey:(NSData *)tempAuthKey authKeyId:(int64_t)authKeyId validUntilTimestamp:(int32_t)validUntilTimestamp notBound:(bool)notBound; @end @@ -20,10 +21,11 @@ typedef NS_ENUM(int64_t, MTDatacenterAuthInfoSelector) { @property (nonatomic, strong, readonly) NSData *authKey; @property (nonatomic, readonly) int64_t authKeyId; +@property (nonatomic, readonly) int32_t validUntilTimestamp; @property (nonatomic, strong, readonly) NSArray *saltSet; @property (nonatomic, strong, readonly) NSDictionary *authKeyAttributes; -- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId saltSet:(NSArray *)saltSet authKeyAttributes:(NSDictionary *)authKeyAttributes; +- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId validUntilTimestamp:(int32_t)validUntilTimestamp saltSet:(NSArray *)saltSet authKeyAttributes:(NSDictionary *)authKeyAttributes; - (int64_t)authSaltForMessageId:(int64_t)messageId; - (MTDatacenterAuthInfo *)mergeSaltSet:(NSArray *)updatedSaltSet forTimestamp:(NSTimeInterval)timestamp; diff --git a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTProto.h b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTProto.h index 92b07e7673..ab8301236f 100644 --- a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTProto.h +++ b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTProto.h @@ -8,7 +8,7 @@ @class MTNetworkUsageCalculationInfo; @class MTApiEnvironment; @class MTDatacenterAuthKey; - +@class MTTransport; @class MTProto; @interface MTProtoConnectionState : NSObject @@ -39,6 +39,8 @@ @property (nonatomic) NSInteger datacenterId; @property (nonatomic, strong) MTDatacenterAuthKey *useExplicitAuthKey; +@property (nonatomic, strong) MTTransport *tempConnectionForReuse; + @property (nonatomic, copy) void (^tempAuthKeyBindingResultUpdated)(bool); @property (nonatomic) bool shouldStayConnected; @@ -78,4 +80,6 @@ - (void)simulateDisconnection; +- (MTTransport *)takeConnectionForReusing; + @end diff --git a/submodules/MtProtoKit/Sources/MTContext.m b/submodules/MtProtoKit/Sources/MTContext.m index 44cb2a8f53..33e2e7bfaa 100644 --- a/submodules/MtProtoKit/Sources/MTContext.m +++ b/submodules/MtProtoKit/Sources/MTContext.m @@ -402,14 +402,19 @@ static void copyKeychainKey(NSString * _Nonnull group, NSString * _Nonnull key, NSDictionary *datacenterAuthInfoById = [keychain objectForKey:@"datacenterAuthInfoById" group:@"persistent"]; if (datacenterAuthInfoById != nil) { _datacenterAuthInfoById = [[NSMutableDictionary alloc] initWithDictionary:datacenterAuthInfoById]; -/*#if DEBUG + NSArray *keys = [_datacenterAuthInfoById allKeys]; + + int32_t currentTimestamp = (int32_t)([NSDate date].timeIntervalSince1970); + for (NSNumber *key in keys) { if (parseAuthInfoMapKeyInteger(key).selector != MTDatacenterAuthInfoSelectorPersistent) { - [_datacenterAuthInfoById removeObjectForKey:key]; + MTDatacenterAuthInfo *authInfo = _datacenterAuthInfoById[key]; + if (authInfo.validUntilTimestamp != INT32_MAX && currentTimestamp > authInfo.validUntilTimestamp) { + [_datacenterAuthInfoById removeObjectForKey:key]; + } } } -#endif*/ } NSDictionary *datacenterPublicKeysById = [keychain objectForKey:@"datacenterPublicKeysById" group:@"ephemeral"]; @@ -1479,7 +1484,7 @@ static void copyKeychainKey(NSString * _Nonnull group, NSString * _Nonnull key, _datacenterCheckKeyRemovedActionTimestamps[@(datacenterId)] = currentTimestamp; [_datacenterCheckKeyRemovedActions[@(datacenterId)] dispose]; __weak MTContext *weakSelf = self; - _datacenterCheckKeyRemovedActions[@(datacenterId)] = [[MTDiscoverConnectionSignals checkIfAuthKeyRemovedWithContext:self datacenterId:datacenterId authKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:authInfo.authKey authKeyId:authInfo.authKeyId notBound:false]] startWithNext:^(NSNumber* isRemoved) { + _datacenterCheckKeyRemovedActions[@(datacenterId)] = [[MTDiscoverConnectionSignals checkIfAuthKeyRemovedWithContext:self datacenterId:datacenterId authKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:authInfo.authKey authKeyId:authInfo.authKeyId validUntilTimestamp:authInfo.validUntilTimestamp notBound:false]] startWithNext:^(NSNumber* isRemoved) { [[MTContext contextQueue] dispatchOnQueue:^{ __strong MTContext *strongSelf = weakSelf; if (strongSelf == nil) { diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m index acf6af66c9..404e5b6363 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m @@ -106,7 +106,7 @@ switch (_authKeyInfoSelector) { case MTDatacenterAuthInfoSelectorPersistent: { - MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; + MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId validUntilTimestamp:INT32_MAX saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; MTContext *context = _context; [context updateAuthInfoForDatacenterWithId:_datacenterId authInfo:authInfo selector:_authKeyInfoSelector]; @@ -119,7 +119,7 @@ MTContext *mainContext = _context; if (mainContext != nil) { if (_skipBind) { - MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; + MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId validUntilTimestamp:authKey.validUntilTimestamp saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; [_context updateAuthInfoForDatacenterWithId:_datacenterId authInfo:authInfo selector:_authKeyInfoSelector]; @@ -132,6 +132,7 @@ _bindMtProto.useUnauthorizedMode = false; _bindMtProto.useTempAuthKeys = true; _bindMtProto.useExplicitAuthKey = authKey; + _bindMtProto.tempConnectionForReuse = [_authMtProto takeConnectionForReusing]; switch (_authKeyInfoSelector) { case MTDatacenterAuthInfoSelectorEphemeralMain: @@ -146,7 +147,7 @@ } __weak MTDatacenterAuthAction *weakSelf = self; - [_bindMtProto addMessageService:[[MTBindKeyMessageService alloc] initWithPersistentKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:persistentAuthInfo.authKey authKeyId:persistentAuthInfo.authKeyId notBound:false] ephemeralKey:authKey completion:^(bool success) { + [_bindMtProto addMessageService:[[MTBindKeyMessageService alloc] initWithPersistentKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:persistentAuthInfo.authKey authKeyId:persistentAuthInfo.authKeyId validUntilTimestamp:persistentAuthInfo.validUntilTimestamp notBound:false] ephemeralKey:authKey completion:^(bool success) { __strong MTDatacenterAuthAction *strongSelf = weakSelf; if (strongSelf == nil) { return; @@ -154,7 +155,7 @@ [strongSelf->_bindMtProto stop]; if (success) { - MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; + MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:authKey.authKey authKeyId:authKey.authKeyId validUntilTimestamp:authKey.validUntilTimestamp saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:timestamp lastValidMessageId:timestamp + (29.0 * 60.0) * 4294967296]] authKeyAttributes:nil]; [strongSelf->_context updateAuthInfoForDatacenterWithId:strongSelf->_datacenterId authInfo:authInfo selector:strongSelf->_authKeyInfoSelector]; diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthInfo.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthInfo.m index d6b783dfcd..af95f497d5 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthInfo.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthInfo.m @@ -3,23 +3,30 @@ @implementation MTDatacenterAuthKey -- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId notBound:(bool)notBound { +- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId validUntilTimestamp:(int32_t)validUntilTimestamp notBound:(bool)notBound { self = [super init]; if (self != nil) { _authKey = authKey; _authKeyId = authKeyId; + _validUntilTimestamp = validUntilTimestamp; _notBound = notBound; } return self; } - (instancetype)initWithCoder:(NSCoder *)aDecoder { - return [self initWithAuthKey:[aDecoder decodeObjectForKey:@"key"] authKeyId:[aDecoder decodeInt64ForKey:@"keyId"] notBound:[aDecoder decodeBoolForKey:@"notBound"]]; + int32_t validUntilTimestamp = [aDecoder decodeInt32ForKey:@"validUntilTimestamp"]; + if (validUntilTimestamp == 0) { + validUntilTimestamp = INT32_MAX; + } + + return [self initWithAuthKey:[aDecoder decodeObjectForKey:@"key"] authKeyId:[aDecoder decodeInt64ForKey:@"keyId"] validUntilTimestamp:validUntilTimestamp notBound:[aDecoder decodeBoolForKey:@"notBound"]]; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_authKey forKey:@"key"]; [aCoder encodeInt64:_authKeyId forKey:@"keyId"]; + [aCoder encodeInt32:_validUntilTimestamp forKey:@"validUntilTimestamp"]; [aCoder encodeBool:_notBound forKey:@"notBound"]; } @@ -27,7 +34,7 @@ @implementation MTDatacenterAuthInfo -- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId saltSet:(NSArray *)saltSet authKeyAttributes:(NSDictionary *)authKeyAttributes +- (instancetype)initWithAuthKey:(NSData *)authKey authKeyId:(int64_t)authKeyId validUntilTimestamp:(int32_t)validUntilTimestamp saltSet:(NSArray *)saltSet authKeyAttributes:(NSDictionary *)authKeyAttributes { self = [super init]; if (self != nil) @@ -35,6 +42,7 @@ _authKey = authKey; _authKeyId = authKeyId; _saltSet = saltSet; + _validUntilTimestamp = validUntilTimestamp; _authKeyAttributes = authKeyAttributes; } return self; @@ -47,6 +55,10 @@ { _authKey = [aDecoder decodeObjectForKey:@"authKey"]; _authKeyId = [aDecoder decodeInt64ForKey:@"authKeyId"]; + + int32_t validUntilTimestamp = [aDecoder decodeInt32ForKey:@"validUntilTimestamp"]; + _validUntilTimestamp = validUntilTimestamp; + _saltSet = [aDecoder decodeObjectForKey:@"saltSet"]; _authKeyAttributes = [aDecoder decodeObjectForKey:@"authKeyAttributes"]; } @@ -57,6 +69,7 @@ { [aCoder encodeObject:_authKey forKey:@"authKey"]; [aCoder encodeInt64:_authKeyId forKey:@"authKeyId"]; + [aCoder encodeInt32:_validUntilTimestamp forKey:@"validUntilTimestamp"]; [aCoder encodeObject:_saltSet forKey:@"saltSet"]; [aCoder encodeObject:_authKeyAttributes forKey:@"authKeyAttributes"]; } @@ -107,15 +120,15 @@ } } - return [[MTDatacenterAuthInfo alloc] initWithAuthKey:_authKey authKeyId:_authKeyId saltSet:mergedSaltSet authKeyAttributes:_authKeyAttributes]; + return [[MTDatacenterAuthInfo alloc] initWithAuthKey:_authKey authKeyId:_authKeyId validUntilTimestamp:_validUntilTimestamp saltSet:mergedSaltSet authKeyAttributes:_authKeyAttributes]; } - (MTDatacenterAuthInfo *)withUpdatedAuthKeyAttributes:(NSDictionary *)authKeyAttributes { - return [[MTDatacenterAuthInfo alloc] initWithAuthKey:_authKey authKeyId:_authKeyId saltSet:_saltSet authKeyAttributes:authKeyAttributes]; + return [[MTDatacenterAuthInfo alloc] initWithAuthKey:_authKey authKeyId:_authKeyId validUntilTimestamp:_validUntilTimestamp saltSet:_saltSet authKeyAttributes:authKeyAttributes]; } - (MTDatacenterAuthKey *)persistentAuthKey { - return [[MTDatacenterAuthKey alloc] initWithAuthKey:_authKey authKeyId:_authKeyId notBound:false]; + return [[MTDatacenterAuthKey alloc] initWithAuthKey:_authKey authKeyId:_authKeyId validUntilTimestamp:_validUntilTimestamp notBound:false]; } - (NSString *)description { diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m index 7a2050fe9c..06c4f4264f 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m @@ -702,7 +702,8 @@ static NSData *encryptRSAModernPadding(id encryptionProvider [serverSaltData appendBytes:&x length:1]; } - _authKey = [[MTDatacenterAuthKey alloc] initWithAuthKey:authKey authKeyId:authKeyId notBound:_tempAuth]; + int32_t validUntilTimestamp = ((int32_t)([NSDate date].timeIntervalSince1970)) + mtProto.context.tempKeyExpiration; + _authKey = [[MTDatacenterAuthKey alloc] initWithAuthKey:authKey authKeyId:authKeyId validUntilTimestamp:validUntilTimestamp notBound:_tempAuth]; MTBuffer *clientDhInnerDataBuffer = [[MTBuffer alloc] init]; [clientDhInnerDataBuffer appendInt32:(int32_t)0x6643b654]; diff --git a/submodules/MtProtoKit/Sources/MTProto.m b/submodules/MtProtoKit/Sources/MTProto.m index b3b29ad0a0..77f47d8df3 100644 --- a/submodules/MtProtoKit/Sources/MTProto.m +++ b/submodules/MtProtoKit/Sources/MTProto.m @@ -215,7 +215,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; _mtState |= MTProtoStatePaused; [self setMtState:_mtState | MTProtoStatePaused]; - [self setTransport:nil]; + [self setTransport:nil keepTransportActive:false]; } }]; } @@ -251,7 +251,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; { _transport.delegate = nil; [_transport stop]; - [self setTransport:nil]; + [self setTransport:nil keepTransportActive:false]; } } }]; @@ -276,7 +276,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; }]; } -- (void)setTransport:(MTTransport *)transport +- (void)setTransport:(MTTransport *)transport keepTransportActive:(bool)keepTransportActive { [[MTProto managerQueue] dispatchOnQueue:^ { @@ -298,7 +298,9 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; [self removeMessageService:_transport]; _transport = transport; - [previousTransport stop]; + if (!keepTransportActive) { + [previousTransport stop]; + } if (_transport != nil) [self addMessageService:_transport]; @@ -318,29 +320,36 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; { _transport.delegate = nil; [_transport stop]; - [self setTransport:nil]; + [self setTransport:nil keepTransportActive:false]; } - NSArray *transportSchemes = [_context transportSchemesForDatacenterWithId:_datacenterId media:_media enforceMedia:_enforceMedia isProxy:_apiEnvironment.socksProxySettings != nil]; - - if (transportSchemes.count == 0) { - if ((_mtState & MTProtoStateAwaitingDatacenterScheme) == 0) { - [self setMtState:_mtState | MTProtoStateAwaitingDatacenterScheme]; - - [_context transportSchemeForDatacenterWithIdRequired:_datacenterId media:_media]; - } - } - else if (_requiredAuthToken != nil && !_useUnauthorizedMode && ![_requiredAuthToken isEqual:[_context authTokenForDatacenterWithId:_datacenterId]]) { - if ((_mtState & MTProtoStateAwaitingDatacenterAuthToken) == 0) { - [self setMtState:_mtState | MTProtoStateAwaitingDatacenterAuthToken]; - - [_context authTokenForDatacenterWithIdRequired:_datacenterId authToken:_requiredAuthToken masterDatacenterId:_authTokenMasterDatacenterId]; - } + if (_tempConnectionForReuse != nil) { + MTTransport *tempTransport = _tempConnectionForReuse; + _tempConnectionForReuse = nil; + tempTransport.delegate = self; + [self setTransport:tempTransport keepTransportActive:false]; } else { - assert(transportSchemes.count != 0); - MTTransport *transport = [[MTTcpTransport alloc] initWithDelegate:self context:_context datacenterId:_datacenterId schemes:transportSchemes proxySettings:_context.apiEnvironment.socksProxySettings usageCalculationInfo:_usageCalculationInfo getLogPrefix:_getLogPrefix]; + NSArray *transportSchemes = [_context transportSchemesForDatacenterWithId:_datacenterId media:_media enforceMedia:_enforceMedia isProxy:_apiEnvironment.socksProxySettings != nil]; - [self setTransport:transport]; + if (transportSchemes.count == 0) { + if ((_mtState & MTProtoStateAwaitingDatacenterScheme) == 0) { + [self setMtState:_mtState | MTProtoStateAwaitingDatacenterScheme]; + + [_context transportSchemeForDatacenterWithIdRequired:_datacenterId media:_media]; + } + } + else if (_requiredAuthToken != nil && !_useUnauthorizedMode && ![_requiredAuthToken isEqual:[_context authTokenForDatacenterWithId:_datacenterId]]) { + if ((_mtState & MTProtoStateAwaitingDatacenterAuthToken) == 0) { + [self setMtState:_mtState | MTProtoStateAwaitingDatacenterAuthToken]; + + [_context authTokenForDatacenterWithIdRequired:_datacenterId authToken:_requiredAuthToken masterDatacenterId:_authTokenMasterDatacenterId]; + } + } else { + assert(transportSchemes.count != 0); + MTTransport *transport = [[MTTcpTransport alloc] initWithDelegate:self context:_context datacenterId:_datacenterId schemes:transportSchemes proxySettings:_context.apiEnvironment.socksProxySettings usageCalculationInfo:_usageCalculationInfo getLogPrefix:_getLogPrefix]; + + [self setTransport:transport keepTransportActive:false]; + } } }]; } @@ -666,6 +675,15 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; }]; } +- (MTTransport *)takeConnectionForReusing { + __block MTTransport *result = nil; + [[MTProto managerQueue] dispatchOnQueue:^{ + result = _transport; + [self setTransport:nil keepTransportActive:true]; + } synchronous:true]; + return result; +} + - (bool)canAskForTransactions { return (_mtState & (MTProtoStateAwaitingDatacenterScheme | MTProtoStateAwaitingDatacenterAuthorization | MTProtoStateAwaitingDatacenterAuthToken | MTProtoStateAwaitingTimeFixAndSalts | MTProtoStateStopped)) == 0; @@ -862,13 +880,13 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; } if (_validAuthInfo != nil && _validAuthInfo.selector == selector) { - return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId notBound:false]; + return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId validUntilTimestamp:_validAuthInfo.authInfo.validUntilTimestamp notBound:false]; } - MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:_useExplicitAuthKey.authKey authKeyId:_useExplicitAuthKey.authKeyId saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:0 lastValidMessageId:0]] authKeyAttributes:nil]; + MTDatacenterAuthInfo *authInfo = [[MTDatacenterAuthInfo alloc] initWithAuthKey:_useExplicitAuthKey.authKey authKeyId:_useExplicitAuthKey.authKeyId validUntilTimestamp:_useExplicitAuthKey.validUntilTimestamp saltSet:@[[[MTDatacenterSaltInfo alloc] initWithSalt:0 firstValidMessageId:0 lastValidMessageId:0]] authKeyAttributes:nil]; _validAuthInfo = [[MTProtoValidAuthInfo alloc] initWithAuthInfo:authInfo selector:selector]; - return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId notBound:false]; + return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId validUntilTimestamp:_validAuthInfo.authInfo.validUntilTimestamp notBound:false]; } else { MTDatacenterAuthInfoSelector selector = MTDatacenterAuthInfoSelectorPersistent; @@ -891,14 +909,14 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; } if (_validAuthInfo != nil && _validAuthInfo.selector == selector) { - return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId notBound:false]; + return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId validUntilTimestamp:_validAuthInfo.authInfo.validUntilTimestamp notBound:false]; } else { _validAuthInfo = nil; if (createIfNeeded) { MTDatacenterAuthInfo *authInfo = [_context authInfoForDatacenterWithId:_datacenterId selector:selector]; if (authInfo != nil) { _validAuthInfo = [[MTProtoValidAuthInfo alloc] initWithAuthInfo:authInfo selector:selector]; - return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId notBound:false]; + return [[MTDatacenterAuthKey alloc] initWithAuthKey:_validAuthInfo.authInfo.authKey authKeyId:_validAuthInfo.authInfo.authKeyId validUntilTimestamp:_validAuthInfo.authInfo.validUntilTimestamp notBound:false]; } else { [_context performBatchUpdates:^{ [_context updateAuthInfoForDatacenterWithId:_datacenterId authInfo:nil selector:selector]; diff --git a/submodules/Postbox/Sources/Postbox.swift b/submodules/Postbox/Sources/Postbox.swift index 6fe3d5757c..60cdc42df3 100644 --- a/submodules/Postbox/Sources/Postbox.swift +++ b/submodules/Postbox/Sources/Postbox.swift @@ -1212,6 +1212,11 @@ public final class Transaction { self.postbox!.messageHistoryThreadIndexTable.set(peerId: peerId, threadId: threadId, info: info) } + public func setMessageHistoryThreads(peerId: PeerId) -> [Int64] { + assert(!self.disposed) + return self.postbox!.messageHistoryThreadIndexTable.getAll(peerId: peerId).map(\.threadId) + } + public func getPeerThreadCombinedState(peerId: PeerId) -> StoredPeerThreadCombinedState? { assert(!self.disposed) return self.postbox!.peerThreadCombinedStateTable.get(peerId: peerId) @@ -1302,7 +1307,7 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, #if DEBUG //debugSaveState(basePath: basePath + "/db", name: "previous2") - debugRestoreState(basePath: basePath + "/db", name: "previous2") + //debugRestoreState(basePath: basePath + "/db", name: "previous2") #endif let startTime = CFAbsoluteTimeGetCurrent() diff --git a/submodules/TelegramCore/Sources/Account/Account.swift b/submodules/TelegramCore/Sources/Account/Account.swift index 2342ae4c5b..484a498998 100644 --- a/submodules/TelegramCore/Sources/Account/Account.swift +++ b/submodules/TelegramCore/Sources/Account/Account.swift @@ -212,12 +212,13 @@ public func accountWithId(accountManager: AccountManager Signal() public let shouldBeServiceTaskMaster = Promise() @@ -970,9 +974,25 @@ public class Account { self.callSessionManager = CallSessionManager(postbox: postbox, network: network, maxLayer: networkArguments.voipMaxLayer, versions: networkArguments.voipVersions, addUpdates: { [weak self] updates in self?.stateManager?.addUpdates(updates) }) + + self.mediaReferenceRevalidationContext = MediaReferenceRevalidationContext() + self.stateManager = AccountStateManager(accountPeerId: self.peerId, accountManager: accountManager, postbox: self.postbox, network: self.network, callSessionManager: self.callSessionManager, addIsContactUpdates: { [weak self] updates in self?.contactSyncManager?.addIsContactUpdates(updates) }, shouldKeepOnlinePresence: self.shouldKeepOnlinePresence.get(), peerInputActivityManager: self.peerInputActivityManager, auxiliaryMethods: auxiliaryMethods) + + self.viewTracker = AccountViewTracker(account: self) + + self.taskManager = AccountTaskManager( + stateManager: self.stateManager, + accountManager: accountManager, + networkArguments: networkArguments, + viewTracker: self.viewTracker, + mediaReferenceRevalidationContext: self.mediaReferenceRevalidationContext, + isMainApp: !supplementary, + testingEnvironment: testingEnvironment + ) + self.contactSyncManager = ContactSyncManager(postbox: postbox, network: network, accountPeerId: peerId, stateManager: self.stateManager) self.localInputActivityManager = PeerInputActivityManager() self.accountPresenceManager = AccountPresenceManager(shouldKeepOnlinePresence: self.shouldKeepOnlinePresence.get(), network: network) @@ -986,9 +1006,7 @@ public class Account { |> distinctUntilChanged ) - self.viewTracker = AccountViewTracker(account: self) self.messageMediaPreuploadManager = MessageMediaPreuploadManager() - self.mediaReferenceRevalidationContext = MediaReferenceRevalidationContext() self.pendingMessageManager = PendingMessageManager(network: network, postbox: postbox, accountPeerId: peerId, auxiliaryMethods: auxiliaryMethods, stateManager: self.stateManager, localInputActivityManager: self.localInputActivityManager, messageMediaPreuploadManager: self.messageMediaPreuploadManager, revalidationContext: self.mediaReferenceRevalidationContext) self.pendingUpdateMessageManager = PendingUpdateMessageManager(postbox: postbox, network: network, stateManager: self.stateManager, messageMediaPreuploadManager: self.messageMediaPreuploadManager, mediaReferenceRevalidationContext: self.mediaReferenceRevalidationContext) @@ -1091,37 +1109,7 @@ public class Account { self.managedOperationsDisposable.add(managedAutoremoveMessageOperations(network: self.network, postbox: self.postbox, isRemove: true).start()) self.managedOperationsDisposable.add(managedAutoremoveMessageOperations(network: self.network, postbox: self.postbox, isRemove: false).start()) self.managedOperationsDisposable.add(managedPeerTimestampAttributeOperations(network: self.network, postbox: self.postbox).start()) - self.managedOperationsDisposable.add(managedGlobalNotificationSettings(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedSynchronizePinnedChatsOperations(postbox: self.postbox, network: self.network, accountPeerId: self.peerId, stateManager: self.stateManager).start()) - - self.managedOperationsDisposable.add(managedSynchronizeGroupedPeersOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager, namespace: .stickers).start()) - self.managedOperationsDisposable.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager, namespace: .masks).start()) - self.managedOperationsDisposable.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager, namespace: .emoji).start()) - self.managedOperationsDisposable.add(managedSynchronizeMarkFeaturedStickerPacksAsSeenOperations(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedSynchronizeRecentlyUsedMediaOperations(postbox: self.postbox, network: self.network, category: .stickers, revalidationContext: self.mediaReferenceRevalidationContext).start()) - self.managedOperationsDisposable.add(managedSynchronizeSavedGifsOperations(postbox: self.postbox, network: self.network, revalidationContext: self.mediaReferenceRevalidationContext).start()) - self.managedOperationsDisposable.add(managedSynchronizeSavedStickersOperations(postbox: self.postbox, network: self.network, revalidationContext: self.mediaReferenceRevalidationContext).start()) - self.managedOperationsDisposable.add(_internal_managedRecentlyUsedInlineBots(postbox: self.postbox, network: self.network, accountPeerId: peerId).start()) - self.managedOperationsDisposable.add(managedLocalTypingActivities(activities: self.localInputActivityManager.allActivities(), postbox: self.postbox, network: self.network, accountPeerId: self.peerId).start()) - self.managedOperationsDisposable.add(managedSynchronizeConsumeMessageContentOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedConsumePersonalMessagesActions(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedReadReactionActions(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedSynchronizeMarkAllUnseenPersonalMessagesOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedSynchronizeMarkAllUnseenReactionsOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedApplyPendingMessageReactionsActions(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedSynchronizeEmojiKeywordsOperations(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedApplyPendingScheduledMessagesActions(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedSynchronizeAvailableReactions(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedSynchronizeEmojiSearchCategories(postbox: self.postbox, network: self.network, kind: .emoji).start()) - self.managedOperationsDisposable.add(managedSynchronizeEmojiSearchCategories(postbox: self.postbox, network: self.network, kind: .status).start()) - self.managedOperationsDisposable.add(managedSynchronizeEmojiSearchCategories(postbox: self.postbox, network: self.network, kind: .avatar).start()) - self.managedOperationsDisposable.add(managedSynchronizeAttachMenuBots(postbox: self.postbox, network: self.network, force: true).start()) - self.managedOperationsDisposable.add(managedSynchronizeNotificationSoundList(postbox: self.postbox, network: self.network).start()) - - if !supplementary { - self.managedOperationsDisposable.add(managedChatListFilters(postbox: self.postbox, network: self.network, accountPeerId: self.peerId).start()) - } + self.managedOperationsDisposable.add(managedLocalTypingActivities(activities: self.localInputActivityManager.allActivities(), postbox: self.stateManager.postbox, network: self.stateManager.network, accountPeerId: self.stateManager.accountPeerId).start()) let importantBackgroundOperations: [Signal] = [ managedSynchronizeChatInputStateOperations(postbox: self.postbox, network: self.network) |> map { $0 ? AccountRunningImportantTasks.other : [] }, @@ -1172,42 +1160,6 @@ public class Account { } } })) - self.managedOperationsDisposable.add(managedVoipConfigurationUpdates(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedAppConfigurationUpdates(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedPremiumPromoConfigurationUpdates(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedAutodownloadSettingsUpdates(accountManager: accountManager, network: self.network).start()) - self.managedOperationsDisposable.add(managedTermsOfServiceUpdates(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedAppUpdateInfo(network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedAppChangelog(postbox: self.postbox, network: self.network, stateManager: self.stateManager, appVersion: self.networkArguments.appVersion).start()) - self.managedOperationsDisposable.add(managedPromoInfoUpdates(postbox: self.postbox, network: self.network, viewTracker: self.viewTracker).start()) - self.managedOperationsDisposable.add(managedLocalizationUpdatesOperations(accountManager: accountManager, postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedPendingPeerNotificationSettings(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedSynchronizeAppLogEventsOperations(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedNotificationSettingsBehaviors(postbox: self.postbox).start()) - self.managedOperationsDisposable.add(managedThemesUpdates(accountManager: accountManager, postbox: self.postbox, network: self.network).start()) - if !self.testingEnvironment && !supplementary { - self.managedOperationsDisposable.add(managedChatThemesUpdates(accountManager: accountManager, network: self.network).start()) - } - - if !self.supplementary { - self.managedOperationsDisposable.add(managedAnimatedEmojiUpdates(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedAnimatedEmojiAnimationsUpdates(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedGenericEmojiEffects(postbox: self.postbox, network: self.network).start()) - - self.managedOperationsDisposable.add(managedGreetingStickers(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedPremiumStickers(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedAllPremiumStickers(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedRecentStatusEmoji(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedFeaturedStatusEmoji(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedProfilePhotoEmoji(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedGroupPhotoEmoji(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(managedRecentReactions(postbox: self.postbox, network: self.network).start()) - self.managedTopReactionsDisposable.set(managedTopReactions(postbox: self.postbox, network: self.network).start()) - self.managedOperationsDisposable.add(self.managedTopReactionsDisposable) - - self.managedOperationsDisposable.add(_internal_loadedStickerPack(postbox: self.postbox, network: self.network, reference: .iconStatusEmoji, forceActualized: true).start()) - self.managedOperationsDisposable.add(_internal_loadedStickerPack(postbox: self.postbox, network: self.network, reference: .iconTopicEmoji, forceActualized: true).start()) - } if !supplementary { let mediaBox = postbox.mediaBox @@ -1233,13 +1185,6 @@ public class Account { } self.restartConfigurationUpdates() - self.stateManager.isPremiumUpdated = { [weak self] in - guard let strongSelf = self else { - return - } - strongSelf.managedTopReactionsDisposable.set(managedTopReactions(postbox: strongSelf.postbox, network: strongSelf.network).start()) - } - self.automaticCacheEvictionContext = AutomaticCacheEvictionContext(postbox: postbox, accountManager: accountManager) /*#if DEBUG diff --git a/submodules/TelegramCore/Sources/Network/Download.swift b/submodules/TelegramCore/Sources/Network/Download.swift index b8ebf0c990..7008d84dd2 100644 --- a/submodules/TelegramCore/Sources/Network/Download.swift +++ b/submodules/TelegramCore/Sources/Network/Download.swift @@ -78,6 +78,12 @@ class Download: NSObject, MTRequestMessageServiceDelegate { let mtProto = self.mtProto self.shouldKeepConnectionDisposable = (shouldKeepConnection |> distinctUntilChanged |> deliverOn(queue)).start(next: { [weak mtProto] value in if let mtProto = mtProto { + #if DEBUG + if "".isEmpty { + return + } + #endif + if value { Logger.shared.log("Network", "Resume worker network connection") mtProto.resume() diff --git a/submodules/TelegramCore/Sources/State/AccountStateManager.swift b/submodules/TelegramCore/Sources/State/AccountStateManager.swift index 7fd1550b08..8887c50f3e 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManager.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManager.swift @@ -145,8 +145,8 @@ public final class AccountStateManager { return self.nextId } - private let isUpdatingValue = ValuePromise(false) - private var currentIsUpdatingValue = false { + private let isUpdatingValue = ValuePromise(true) + private var currentIsUpdatingValue = true { didSet { if self.currentIsUpdatingValue != oldValue { self.isUpdatingValue.set(self.currentIsUpdatingValue) diff --git a/submodules/TelegramCore/Sources/State/AccountTaskManager.swift b/submodules/TelegramCore/Sources/State/AccountTaskManager.swift new file mode 100644 index 0000000000..2b070fcf86 --- /dev/null +++ b/submodules/TelegramCore/Sources/State/AccountTaskManager.swift @@ -0,0 +1,152 @@ +import Foundation +import Postbox +import SwiftSignalKit +import MtProtoKit +import TelegramApi + +final class AccountTaskManager { + private final class Impl { + private let queue: Queue + private let stateManager: AccountStateManager + private let accountManager: AccountManager + private let networkArguments: NetworkInitializationArguments + private let viewTracker: AccountViewTracker + private let mediaReferenceRevalidationContext: MediaReferenceRevalidationContext + private let isMainApp: Bool + private let testingEnvironment: Bool + + private var stateDisposable: Disposable? + private let tasksDisposable = MetaDisposable() + + private let managedTopReactionsDisposable = MetaDisposable() + + private var isUpdating: Bool = false + + init(queue: Queue, stateManager: AccountStateManager, accountManager: AccountManager, + networkArguments: NetworkInitializationArguments, viewTracker: AccountViewTracker, mediaReferenceRevalidationContext: MediaReferenceRevalidationContext, isMainApp: Bool, testingEnvironment: Bool) { + self.queue = queue + self.stateManager = stateManager + self.accountManager = accountManager + self.networkArguments = networkArguments + self.viewTracker = viewTracker + self.mediaReferenceRevalidationContext = mediaReferenceRevalidationContext + self.isMainApp = isMainApp + self.testingEnvironment = testingEnvironment + + stateManager.isPremiumUpdated = { [weak self] in + guard let self = self else { + return + } + if !self.isUpdating { + self.managedTopReactionsDisposable.set(managedTopReactions(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + } + } + + self.stateDisposable = (stateManager.isUpdating + |> filter { !$0 } + |> take(1) + |> deliverOn(self.queue)).start(next: { [weak self] value in + guard let self = self else { + return + } + self.stateManagerUpdated(isUpdating: value) + }) + } + + private func stateManagerUpdated(isUpdating: Bool) { + self.isUpdating = isUpdating + + if isUpdating { + self.tasksDisposable.set(nil) + self.managedTopReactionsDisposable.set(nil) + } else { + let tasks = DisposableSet() + + if self.isMainApp { + tasks.add(managedSynchronizePeerReadStates(network: self.stateManager.network, postbox: self.stateManager.postbox, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeGroupMessageStats(network: self.stateManager.network, postbox: self.stateManager.postbox, stateManager: self.stateManager).start()) + + tasks.add(managedGlobalNotificationSettings(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedSynchronizePinnedChatsOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, accountPeerId: self.stateManager.accountPeerId, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeGroupedPeersOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager, namespace: .stickers).start()) + tasks.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager, namespace: .masks).start()) + tasks.add(managedSynchronizeInstalledStickerPacksOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager, namespace: .emoji).start()) + tasks.add(managedSynchronizeMarkFeaturedStickerPacksAsSeenOperations(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedSynchronizeRecentlyUsedMediaOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, category: .stickers, revalidationContext: self.mediaReferenceRevalidationContext).start()) + tasks.add(managedSynchronizeSavedGifsOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, revalidationContext: self.mediaReferenceRevalidationContext).start()) + tasks.add(managedSynchronizeSavedStickersOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, revalidationContext: self.mediaReferenceRevalidationContext).start()) + tasks.add(_internal_managedRecentlyUsedInlineBots(postbox: self.stateManager.postbox, network: self.stateManager.network, accountPeerId: self.stateManager.accountPeerId).start()) + tasks.add(managedSynchronizeConsumeMessageContentOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedConsumePersonalMessagesActions(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedReadReactionActions(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeMarkAllUnseenPersonalMessagesOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeMarkAllUnseenReactionsOperations(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedApplyPendingMessageReactionsActions(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeEmojiKeywordsOperations(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedApplyPendingScheduledMessagesActions(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedSynchronizeAvailableReactions(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedSynchronizeEmojiSearchCategories(postbox: self.stateManager.postbox, network: self.stateManager.network, kind: .emoji).start()) + tasks.add(managedSynchronizeEmojiSearchCategories(postbox: self.stateManager.postbox, network: self.stateManager.network, kind: .status).start()) + tasks.add(managedSynchronizeEmojiSearchCategories(postbox: self.stateManager.postbox, network: self.stateManager.network, kind: .avatar).start()) + tasks.add(managedSynchronizeAttachMenuBots(postbox: self.stateManager.postbox, network: self.stateManager.network, force: true).start()) + tasks.add(managedSynchronizeNotificationSoundList(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedChatListFilters(postbox: self.stateManager.postbox, network: self.stateManager.network, accountPeerId: self.stateManager.accountPeerId).start()) + tasks.add(managedAnimatedEmojiUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedAnimatedEmojiAnimationsUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedGenericEmojiEffects(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedGreetingStickers(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedPremiumStickers(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedAllPremiumStickers(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedRecentStatusEmoji(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedFeaturedStatusEmoji(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedProfilePhotoEmoji(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedGroupPhotoEmoji(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedRecentReactions(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(_internal_loadedStickerPack(postbox: self.stateManager.postbox, network: self.stateManager.network, reference: .iconStatusEmoji, forceActualized: true).start()) + tasks.add(_internal_loadedStickerPack(postbox: self.stateManager.postbox, network: self.stateManager.network, reference: .iconTopicEmoji, forceActualized: true).start()) + + self.managedTopReactionsDisposable.set(managedTopReactions(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + + //tasks.add(managedVoipConfigurationUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedAppConfigurationUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedPremiumPromoConfigurationUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedAutodownloadSettingsUpdates(accountManager: self.accountManager, network: self.stateManager.network).start()) + tasks.add(managedTermsOfServiceUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedAppUpdateInfo(network: self.stateManager.network, stateManager: self.stateManager).start()) + tasks.add(managedAppChangelog(postbox: self.stateManager.postbox, network: self.stateManager.network, stateManager: self.stateManager, appVersion: self.networkArguments.appVersion).start()) + tasks.add(managedPromoInfoUpdates(postbox: self.stateManager.postbox, network: self.stateManager.network, viewTracker: self.viewTracker).start()) + tasks.add(managedLocalizationUpdatesOperations(accountManager: self.accountManager, postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedPendingPeerNotificationSettings(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedSynchronizeAppLogEventsOperations(postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + tasks.add(managedNotificationSettingsBehaviors(postbox: self.stateManager.postbox).start()) + tasks.add(managedThemesUpdates(accountManager: self.accountManager, postbox: self.stateManager.postbox, network: self.stateManager.network).start()) + + if !self.testingEnvironment { + tasks.add(managedChatThemesUpdates(accountManager: self.accountManager, network: self.stateManager.network).start()) + } + } + + self.tasksDisposable.set(tasks) + } + } + + deinit { + self.stateDisposable?.dispose() + self.tasksDisposable.dispose() + self.managedTopReactionsDisposable.dispose() + } + } + + private let queue: Queue + private let impl: QueueLocalObject + + init(stateManager: AccountStateManager, accountManager: AccountManager, + networkArguments: NetworkInitializationArguments, viewTracker: AccountViewTracker, mediaReferenceRevalidationContext: MediaReferenceRevalidationContext, isMainApp: Bool, testingEnvironment: Bool) { + let queue = Account.sharedQueue + self.queue = queue + self.impl = QueueLocalObject(queue: queue, generate: { + return Impl(queue: queue, stateManager: stateManager, accountManager: accountManager, networkArguments: networkArguments, viewTracker: viewTracker, mediaReferenceRevalidationContext: mediaReferenceRevalidationContext, isMainApp: isMainApp, testingEnvironment: testingEnvironment) + }) + } +} diff --git a/submodules/TelegramCore/Sources/State/AppChangelog.swift b/submodules/TelegramCore/Sources/State/AppChangelog.swift index 49049f1db1..6b14154c7e 100644 --- a/submodules/TelegramCore/Sources/State/AppChangelog.swift +++ b/submodules/TelegramCore/Sources/State/AppChangelog.swift @@ -4,9 +4,9 @@ import SwiftSignalKit import MtProtoKit import TelegramApi - func managedAppChangelog(postbox: Postbox, network: Network, stateManager: AccountStateManager, appVersion: String) -> Signal { - return stateManager.pollStateUpdateCompletion() + return stateManager.isUpdating + |> filter { !$0 } |> take(1) |> mapToSignal { _ -> Signal in return postbox.transaction { transaction -> AppChangelogState in diff --git a/submodules/TelegramCore/Sources/State/ContactSyncManager.swift b/submodules/TelegramCore/Sources/State/ContactSyncManager.swift index 9883f78924..95ec7a08f0 100644 --- a/submodules/TelegramCore/Sources/State/ContactSyncManager.swift +++ b/submodules/TelegramCore/Sources/State/ContactSyncManager.swift @@ -179,7 +179,9 @@ private final class ContactSyncManagerImpl { func startOperation(_ operation: ContactSyncOperationContent, disposable: DisposableSet, completion: @escaping () -> Void) { switch operation { case .waitForUpdatedState: - disposable.add((self.stateManager.pollStateUpdateCompletion() + disposable.add((self.stateManager.isUpdating + |> filter { !$0 } + |> take(1) |> deliverOn(self.queue)).start(next: { _ in completion() })) diff --git a/submodules/TelegramCore/Sources/State/ManagedServiceViews.swift b/submodules/TelegramCore/Sources/State/ManagedServiceViews.swift index 1286e780d4..fd34d5f8c6 100644 --- a/submodules/TelegramCore/Sources/State/ManagedServiceViews.swift +++ b/submodules/TelegramCore/Sources/State/ManagedServiceViews.swift @@ -8,8 +8,6 @@ func managedServiceViews(accountPeerId: PeerId, network: Network, postbox: Postb disposable.add(managedMessageHistoryHoles(accountPeerId: accountPeerId, network: network, postbox: postbox).start()) disposable.add(managedChatListHoles(network: network, postbox: postbox, accountPeerId: accountPeerId).start()) disposable.add(managedForumTopicListHoles(network: network, postbox: postbox, accountPeerId: accountPeerId).start()) - disposable.add(managedSynchronizePeerReadStates(network: network, postbox: postbox, stateManager: stateManager).start()) - disposable.add(managedSynchronizeGroupMessageStats(network: network, postbox: postbox, stateManager: stateManager).start()) return disposable } diff --git a/submodules/TelegramCore/Sources/State/ManagedSynchronizeInstalledStickerPacksOperations.swift b/submodules/TelegramCore/Sources/State/ManagedSynchronizeInstalledStickerPacksOperations.swift index a8cdca1fdf..4bf5199679 100644 --- a/submodules/TelegramCore/Sources/State/ManagedSynchronizeInstalledStickerPacksOperations.swift +++ b/submodules/TelegramCore/Sources/State/ManagedSynchronizeInstalledStickerPacksOperations.swift @@ -91,7 +91,9 @@ func managedSynchronizeInstalledStickerPacksOperations(postbox: Postbox, network let signal = withTakenOperation(postbox: postbox, peerId: entry.peerId, tag: tag, tagLocalIndex: entry.tagLocalIndex, { transaction, entry -> Signal in if let entry = entry { if let operation = entry.contents as? SynchronizeInstalledStickerPacksOperation { - return stateManager.pollStateUpdateCompletion() + return stateManager.isUpdating + |> filter { !$0 } + |> take(1) |> mapToSignal { _ -> Signal in return postbox.transaction { transaction -> Signal in return synchronizeInstalledStickerPacks(transaction: transaction, postbox: postbox, network: network, stateManager: stateManager, namespace: namespace, operation: operation) diff --git a/submodules/TelegramCore/Sources/State/ResetState.swift b/submodules/TelegramCore/Sources/State/ResetState.swift index 0417fca345..0b790db2e7 100644 --- a/submodules/TelegramCore/Sources/State/ResetState.swift +++ b/submodules/TelegramCore/Sources/State/ResetState.swift @@ -26,6 +26,14 @@ func _internal_resetAccountState(postbox: Postbox, network: Network, accountPeer if peerId.namespace != Namespaces.Peer.SecretChat { transaction.addHole(peerId: peerId, threadId: nil, namespace: Namespaces.Message.Cloud, space: .everywhere, range: 1 ... (Int32.max - 1)) } + + if peerId.namespace == Namespaces.Peer.CloudChannel, let channel = transaction.getPeer(peerId) as? TelegramChannel, channel.flags.contains(.isForum) { + transaction.setPeerPinnedThreads(peerId: peerId, threadIds: []) + for threadId in transaction.setMessageHistoryThreads(peerId: peerId) { + transaction.setMessageHistoryThreadInfo(peerId: peerId, threadId: threadId, info: nil) + transaction.addHole(peerId: peerId, threadId: threadId, namespace: Namespaces.Message.Cloud, space: .everywhere, range: 1 ... (Int32.max - 1)) + } + } } updatePeers(transaction: transaction, peers: fetchedChats.peers + additionalPeers, update: { _, updated -> Peer in