diff --git a/Source/ARTConnection.m b/Source/ARTConnection.m index c708d585b..f56a71a40 100644 --- a/Source/ARTConnection.m +++ b/Source/ARTConnection.m @@ -1,10 +1,12 @@ #import "ARTConnection+Private.h" - +#import "ARTDefault.h" #import "ARTRealtime+Private.h" #import "ARTEventEmitter+Private.h" #import "ARTQueuedDealloc.h" #import "ARTRealtimeChannels+Private.h" #import "ARTRealtimeChannel+Private.h" +#import "ARTDefault+Private.h" +#import "ARTClientOptions+Private.h" #define IsInactiveConnectionState(state) (state == ARTRealtimeClosing || state == ARTRealtimeClosed || state == ARTRealtimeFailed || state == ARTRealtimeSuspended) @@ -193,6 +195,12 @@ - (NSString *)key_nosync { return _key; } +- (NSInteger)maxMessageSize { + if (_maxMessageSize) + return _maxMessageSize; + return _realtime.options.isProductionEnvironment ? [ARTDefault maxProductionMessageSize] : [ARTDefault maxSandboxMessageSize]; +} + - (ARTRealtimeConnectionState)state_nosync { return _state; } diff --git a/Source/ARTDefault.m b/Source/ARTDefault.m index 5daab3df1..f30eba8f2 100644 --- a/Source/ARTDefault.m +++ b/Source/ARTDefault.m @@ -11,7 +11,9 @@ static NSString *const ARTDefault_realtimeHost = @"realtime.ably.io"; static NSTimeInterval _connectionStateTtl = 60.0; -static NSInteger _maxMessageSize = 65536; +static NSInteger _maxMessageSize = 0; +static NSInteger _maxProductionMessageSize = 65536; +static NSInteger _maxSandboxMessageSize = 16384; @implementation ARTDefault @@ -70,7 +72,21 @@ + (NSTimeInterval)realtimeRequestTimeout { } + (NSInteger)maxMessageSize { - return _maxMessageSize; + if (_maxMessageSize) + return _maxMessageSize; +#if DEBUG + return _maxSandboxMessageSize; +#else + return _maxProductionMessageSize; +#endif +} + ++ (NSInteger)maxSandboxMessageSize { + return _maxSandboxMessageSize; +} + ++ (NSInteger)maxProductionMessageSize { + return _maxProductionMessageSize; } + (void)setConnectionStateTtl:(NSTimeInterval)value { @@ -85,6 +101,18 @@ + (void)setMaxMessageSize:(NSInteger)value { } } ++ (void)setMaxProductionMessageSize:(NSInteger)value { + @synchronized (self) { + _maxProductionMessageSize = value; + } +} + ++ (void)setMaxSandboxMessageSize:(NSInteger)value { + @synchronized (self) { + _maxSandboxMessageSize = value; + } +} + + (NSString *)libraryAgent { return [ARTClientInformation libraryAgentIdentifier]; } diff --git a/Source/ARTProtocolMessage.m b/Source/ARTProtocolMessage.m index e36d0bb1c..178b35269 100644 --- a/Source/ARTProtocolMessage.m +++ b/Source/ARTProtocolMessage.m @@ -77,12 +77,12 @@ - (id)copyWithZone:(NSZone *)zone { return pm; } - - (BOOL)mergeFrom:(ARTProtocolMessage *)src { +- (BOOL)mergeFrom:(ARTProtocolMessage *)src maxSize:(NSInteger)maxSize { if (![src.channel isEqualToString:self.channel] || src.action != self.action) { // RTL6d3 return NO; } - if ([self mergeWouldExceedMaxSize:src.messages]) { + if ([self mergeWithMessages:src.messages wouldExceedMaxSize:maxSize]) { // RTL6d1 return NO; } @@ -142,7 +142,7 @@ - (BOOL)clientIdsAreDifferent:(NSArray*)messages { } } -- (BOOL)mergeWouldExceedMaxSize:(NSArray*)messages { +- (BOOL)mergeWithMessages:(NSArray*)messages wouldExceedMaxSize:(NSInteger)maxSize { NSInteger queuedMessagesSize = 0; for (ARTMessage *message in self.messages) { queuedMessagesSize += [message messageSize]; @@ -152,10 +152,6 @@ - (BOOL)mergeWouldExceedMaxSize:(NSArray*)messages { messagesSize += [message messageSize]; } NSInteger totalSize = queuedMessagesSize + messagesSize; - NSInteger maxSize = [ARTDefault maxMessageSize]; - if (_connectionDetails.maxMessageSize) { - maxSize = _connectionDetails.maxMessageSize; - } return totalSize > maxSize; } diff --git a/Source/ARTQueuedMessage.m b/Source/ARTQueuedMessage.m index 76c62654d..17c0dc821 100644 --- a/Source/ARTQueuedMessage.m +++ b/Source/ARTQueuedMessage.m @@ -25,8 +25,8 @@ - (NSString *)description { return [self.msg description]; } -- (BOOL)mergeFrom:(ARTProtocolMessage *)msg sentCallback:(ARTCallback)sentCallback ackCallback:(ARTStatusCallback)ackCallback { - if ([self.msg mergeFrom:msg]) { +- (BOOL)mergeFrom:(ARTProtocolMessage *)msg maxSize:(NSInteger)maxSize sentCallback:(ARTCallback)sentCallback ackCallback:(ARTStatusCallback)ackCallback { + if ([self.msg mergeFrom:msg maxSize:maxSize]) { if (sentCallback) { [self.sentCallbacks addObject:sentCallback]; } diff --git a/Source/ARTRealtime.m b/Source/ARTRealtime.m index f76ce096f..4df091e40 100644 --- a/Source/ARTRealtime.m +++ b/Source/ARTRealtime.m @@ -1273,7 +1273,8 @@ - (void)send:(ARTProtocolMessage *)msg reuseMsgSerial:(BOOL)reuseMsgSerial sentC else if (msg.ackRequired) { if (self.isActive && self.options.queueMessages) { ARTQueuedMessage *lastQueuedMessage = self.queuedMessages.lastObject; //RTL6d5 - BOOL merged = [lastQueuedMessage mergeFrom:msg sentCallback:nil ackCallback:ackCallback]; + NSInteger maxSize = _connection.maxMessageSize; + BOOL merged = [lastQueuedMessage mergeFrom:msg maxSize:maxSize sentCallback:nil ackCallback:ackCallback]; if (!merged) { ARTQueuedMessage *qm = [[ARTQueuedMessage alloc] initWithProtocolMessage:msg sentCallback:sentCallback ackCallback:ackCallback]; [self.queuedMessages addObject:qm]; diff --git a/Source/ARTRealtimeChannel.m b/Source/ARTRealtimeChannel.m index 9be91a6aa..e4510f3cf 100644 --- a/Source/ARTRealtimeChannel.m +++ b/Source/ARTRealtimeChannel.m @@ -1066,10 +1066,7 @@ - (BOOL)exceedMaxSize:(NSArray *)messages { for (ARTMessage *message in messages) { size += [message messageSize]; } - NSInteger maxSize = [ARTDefault maxMessageSize]; - if (self.realtime.connection.maxMessageSize) { - maxSize = self.realtime.connection.maxMessageSize; - } + NSInteger maxSize = _realtime.connection.maxMessageSize; return size > maxSize; } diff --git a/Source/PrivateHeaders/Ably/ARTDefault+Private.h b/Source/PrivateHeaders/Ably/ARTDefault+Private.h index a8b352707..328326353 100644 --- a/Source/PrivateHeaders/Ably/ARTDefault+Private.h +++ b/Source/PrivateHeaders/Ably/ARTDefault+Private.h @@ -7,4 +7,7 @@ extern NSString *const ARTDefaultProduction; + (void)setConnectionStateTtl:(NSTimeInterval)value; + (void)setMaxMessageSize:(NSInteger)value; ++ (NSInteger)maxSandboxMessageSize; ++ (NSInteger)maxProductionMessageSize; + @end diff --git a/Source/PrivateHeaders/Ably/ARTProtocolMessage+Private.h b/Source/PrivateHeaders/Ably/ARTProtocolMessage+Private.h index 0722be468..fd3e50330 100644 --- a/Source/PrivateHeaders/Ably/ARTProtocolMessage+Private.h +++ b/Source/PrivateHeaders/Ably/ARTProtocolMessage+Private.h @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @property (readonly, nonatomic) BOOL hasBacklog; @property (readonly, nonatomic) BOOL resumed; -- (BOOL)mergeFrom:(ARTProtocolMessage *)msg; +- (BOOL)mergeFrom:(ARTProtocolMessage *)msg maxSize:(NSInteger)maxSize; @end diff --git a/Source/include/Ably/ARTQueuedMessage.h b/Source/include/Ably/ARTQueuedMessage.h index 951490f2b..9c9473780 100644 --- a/Source/include/Ably/ARTQueuedMessage.h +++ b/Source/include/Ably/ARTQueuedMessage.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithProtocolMessage:(ARTProtocolMessage *)msg sentCallback:(nullable ARTCallback)sentCallback ackCallback:(nullable ARTStatusCallback)ackCallback; -- (BOOL)mergeFrom:(ARTProtocolMessage *)msg sentCallback:(nullable ARTCallback)sentCallback ackCallback:(nullable ARTStatusCallback)ackCallback; +- (BOOL)mergeFrom:(ARTProtocolMessage *)msg maxSize:(NSInteger)maxSize sentCallback:(nullable ARTCallback)sentCallback ackCallback:(nullable ARTStatusCallback)ackCallback; - (ARTCallback)sentCallback; - (ARTStatusCallback)ackCallback; diff --git a/Test/Tests/AuthTests.swift b/Test/Tests/AuthTests.swift index 9a09da555..9fb811768 100644 --- a/Test/Tests/AuthTests.swift +++ b/Test/Tests/AuthTests.swift @@ -1914,7 +1914,7 @@ class AuthTests: XCTestCase { guard let error = error else { fail("Error is nil"); done(); return } - expect(error.message).to(contain("mismatched clientId")) + expect(error.message).to(contain("invalid clientId")) done() } } diff --git a/Test/Tests/RealtimeClientConnectionTests.swift b/Test/Tests/RealtimeClientConnectionTests.swift index d15b9269a..a995144d9 100644 --- a/Test/Tests/RealtimeClientConnectionTests.swift +++ b/Test/Tests/RealtimeClientConnectionTests.swift @@ -168,19 +168,22 @@ class RealtimeClientConnectionTests: XCTestCase { options.testOptions.transportFactory = TestProxyTransportFactory() let client = ARTRealtime(options: options) let defaultMaxMessageSize = ARTDefault.maxMessageSize() - XCTAssertEqual(defaultMaxMessageSize, 65536) + // Sandbox apps have a 16384 limit + XCTAssertEqual(defaultMaxMessageSize, 16384) defer { ARTDefault.setMaxMessageSize(defaultMaxMessageSize) client.dispose() client.close() } + // Setting different value to check override below ARTDefault.setMaxMessageSize(1) waitUntil(timeout: testTimeout) { done in client.connection.once(.connected) { _ in let transport = client.internal.transport as! TestProxyTransport - let firstConnectionDetails = transport.protocolMessagesReceived.filter { $0.action == .connected }[0].connectionDetails - XCTAssertEqual(firstConnectionDetails!.maxMessageSize, 16384) // Sandbox apps have a 16384 limit + let maxMessageSize = transport.protocolMessagesReceived.filter { $0.action == .connected }[0].connectionDetails?.maxMessageSize + XCTAssertEqual(maxMessageSize, defaultMaxMessageSize) + XCTAssertEqual(client.connection.maxMessageSize, maxMessageSize) done() } client.connect()