mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Network optimizations
This commit is contained in:
parent
5f3de7a40b
commit
f6be1e4120
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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<NSNumber *> *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) {
|
||||
|
@ -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];
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -702,7 +702,8 @@ static NSData *encryptRSAModernPadding(id<EncryptionProvider> 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];
|
||||
|
@ -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<MTTransportScheme *> *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<MTTransportScheme *> *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];
|
||||
|
@ -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()
|
||||
|
@ -212,12 +212,13 @@ public func accountWithId(accountManager: AccountManager<TelegramAccountManagerT
|
||||
let backupState = AuthorizedAccountState(isTestingEnvironment: beginWithTestingEnvironment, masterDatacenterId: backupData.masterDatacenterId, peerId: PeerId(backupData.peerId), state: nil, invalidatedChannels: [])
|
||||
state = backupState
|
||||
let dict = NSMutableDictionary()
|
||||
dict.setObject(MTDatacenterAuthInfo(authKey: backupData.masterDatacenterKey, authKeyId: backupData.masterDatacenterKeyId, saltSet: [], authKeyAttributes: [:])!, forKey: backupData.masterDatacenterId as NSNumber)
|
||||
dict.setObject(MTDatacenterAuthInfo(authKey: backupData.masterDatacenterKey, authKeyId: backupData.masterDatacenterKeyId, validUntilTimestamp: Int32.max, saltSet: [], authKeyAttributes: [:])!, forKey: backupData.masterDatacenterId as NSNumber)
|
||||
|
||||
for (id, datacenterKey) in backupData.additionalDatacenterKeys {
|
||||
dict.setObject(MTDatacenterAuthInfo(
|
||||
authKey: datacenterKey.key,
|
||||
authKeyId: datacenterKey.keyId,
|
||||
validUntilTimestamp: Int32.max,
|
||||
saltSet: [],
|
||||
authKeyAttributes: [:]
|
||||
)!, forKey: id as NSNumber)
|
||||
@ -878,6 +879,8 @@ public func accountBackupData(postbox: Postbox) -> Signal<AccountBackupData?, No
|
||||
}
|
||||
|
||||
public class Account {
|
||||
static let sharedQueue = Queue(name: "Account-Shared")
|
||||
|
||||
public let id: AccountRecordId
|
||||
public let basePath: String
|
||||
public let testingEnvironment: Bool
|
||||
@ -909,10 +912,11 @@ public class Account {
|
||||
private let becomeMasterDisposable = MetaDisposable()
|
||||
private let managedServiceViewsDisposable = MetaDisposable()
|
||||
private let managedOperationsDisposable = DisposableSet()
|
||||
private let managedTopReactionsDisposable = MetaDisposable()
|
||||
private var storageSettingsDisposable: Disposable?
|
||||
private var automaticCacheEvictionContext: AutomaticCacheEvictionContext?
|
||||
|
||||
private var taskManager: AccountTaskManager?
|
||||
|
||||
public let importableContacts = Promise<[DeviceContactNormalizedPhoneNumber: ImportableDeviceContactData]>()
|
||||
|
||||
public let shouldBeServiceTaskMaster = Promise<AccountServiceTaskMasterMode>()
|
||||
@ -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<AccountRunningImportantTasks, NoError>] = [
|
||||
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
|
||||
|
@ -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()
|
||||
|
@ -145,8 +145,8 @@ public final class AccountStateManager {
|
||||
return self.nextId
|
||||
}
|
||||
|
||||
private let isUpdatingValue = ValuePromise<Bool>(false)
|
||||
private var currentIsUpdatingValue = false {
|
||||
private let isUpdatingValue = ValuePromise<Bool>(true)
|
||||
private var currentIsUpdatingValue = true {
|
||||
didSet {
|
||||
if self.currentIsUpdatingValue != oldValue {
|
||||
self.isUpdatingValue.set(self.currentIsUpdatingValue)
|
||||
|
152
submodules/TelegramCore/Sources/State/AccountTaskManager.swift
Normal file
152
submodules/TelegramCore/Sources/State/AccountTaskManager.swift
Normal file
@ -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<TelegramAccountManagerTypes>
|
||||
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<TelegramAccountManagerTypes>,
|
||||
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<Impl>
|
||||
|
||||
init(stateManager: AccountStateManager, accountManager: AccountManager<TelegramAccountManagerTypes>,
|
||||
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)
|
||||
})
|
||||
}
|
||||
}
|
@ -4,9 +4,9 @@ import SwiftSignalKit
|
||||
import MtProtoKit
|
||||
import TelegramApi
|
||||
|
||||
|
||||
func managedAppChangelog(postbox: Postbox, network: Network, stateManager: AccountStateManager, appVersion: String) -> Signal<Void, NoError> {
|
||||
return stateManager.pollStateUpdateCompletion()
|
||||
return stateManager.isUpdating
|
||||
|> filter { !$0 }
|
||||
|> take(1)
|
||||
|> mapToSignal { _ -> Signal<Void, NoError> in
|
||||
return postbox.transaction { transaction -> AppChangelogState in
|
||||
|
@ -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()
|
||||
}))
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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<Void, NoError> in
|
||||
if let entry = entry {
|
||||
if let operation = entry.contents as? SynchronizeInstalledStickerPacksOperation {
|
||||
return stateManager.pollStateUpdateCompletion()
|
||||
return stateManager.isUpdating
|
||||
|> filter { !$0 }
|
||||
|> take(1)
|
||||
|> mapToSignal { _ -> Signal<Void, NoError> in
|
||||
return postbox.transaction { transaction -> Signal<Void, NoError> in
|
||||
return synchronizeInstalledStickerPacks(transaction: transaction, postbox: postbox, network: network, stateManager: stateManager, namespace: namespace, operation: operation)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user