245 lines
8.3 KiB
Objective-C
245 lines
8.3 KiB
Objective-C
#import "ARTClientOptions+Private.h"
|
|
#import "ARTAuthOptions+Private.h"
|
|
|
|
#import "ARTDefault+Private.h"
|
|
#import "ARTStatus.h"
|
|
#import "ARTTokenParams.h"
|
|
#import "ARTDeltaCodec.h"
|
|
#import "ARTStringifiable.h"
|
|
#import "ARTNSString+ARTUtil.h"
|
|
|
|
NSString *ARTDefaultEnvironment = nil;
|
|
|
|
@interface ARTClientOptions ()
|
|
|
|
@property (nullable, strong, nonatomic) NSMutableArray<NSString *> *additionalAgents;
|
|
|
|
- (instancetype)initDefaults;
|
|
|
|
@end
|
|
|
|
@implementation ARTClientOptions
|
|
|
|
- (instancetype)initDefaults {
|
|
self = [super initDefaults];
|
|
_port = [ARTDefault port];
|
|
_tlsPort = [ARTDefault tlsPort];
|
|
_environment = ARTDefaultEnvironment;
|
|
_queueMessages = YES;
|
|
_echoMessages = YES;
|
|
_useBinaryProtocol = true;
|
|
_autoConnect = true;
|
|
_tls = YES;
|
|
_logLevel = ARTLogLevelNone;
|
|
_logHandler = [[ARTLog alloc] init];
|
|
_disconnectedRetryTimeout = 15.0; //Seconds
|
|
_suspendedRetryTimeout = 30.0; //Seconds
|
|
_channelRetryTimeout = 15.0; //Seconds
|
|
_httpOpenTimeout = 4.0; //Seconds
|
|
_httpRequestTimeout = 10.0; //Seconds
|
|
_httpMaxRetryDuration = 15.0; //Seconds
|
|
_httpMaxRetryCount = 3;
|
|
_fallbackHosts = nil;
|
|
_fallbackHostsUseDefault = false;
|
|
_logExceptionReportingUrl = @"https://765e1fcaba404d7598d2fd5a2a43c4f0:8d469b2b0fb34c01a12ae217931c4aed@errors.ably.io/3";
|
|
_dispatchQueue = dispatch_get_main_queue();
|
|
_internalDispatchQueue = dispatch_queue_create("io.ably.main", DISPATCH_QUEUE_SERIAL);
|
|
_pushFullWait = false;
|
|
_idempotentRestPublishing = [ARTClientOptions getDefaultIdempotentRestPublishingForVersion:[ARTDefault apiVersion]];
|
|
_addRequestIds = false;
|
|
_pushRegistererDelegate = nil;
|
|
_additionalAgents = [NSMutableArray array];
|
|
return self;
|
|
}
|
|
|
|
- (NSString *)description {
|
|
return [NSString stringWithFormat:@"%@\n\t clientId: %@;", [super description], self.clientId];
|
|
}
|
|
|
|
- (NSString*)restHost {
|
|
if (_restHost != nil) {
|
|
return _restHost;
|
|
}
|
|
if ([_environment isEqualToString:ARTDefaultProduction]) {
|
|
return [ARTDefault restHost];
|
|
}
|
|
return self.hasEnvironment ? [self host:[ARTDefault restHost] forEnvironment:_environment] : [ARTDefault restHost];
|
|
}
|
|
|
|
- (NSString*)realtimeHost {
|
|
if (_realtimeHost != nil) {
|
|
return _realtimeHost;
|
|
}
|
|
if ([_environment isEqualToString:ARTDefaultProduction]) {
|
|
return [ARTDefault realtimeHost];
|
|
}
|
|
|
|
return self.hasEnvironment ? [self host:[ARTDefault realtimeHost] forEnvironment:_environment] : [ARTDefault realtimeHost];
|
|
}
|
|
|
|
- (NSURLComponents *)restUrlComponents {
|
|
NSURLComponents *components = [[NSURLComponents alloc] init];
|
|
components.scheme = self.tls ? @"https" : @"http";
|
|
components.host = self.restHost;
|
|
components.port = [NSNumber numberWithInteger:(self.tls ? self.tlsPort : self.port)];
|
|
return components;
|
|
}
|
|
|
|
- (NSURL*)restUrl {
|
|
return [self restUrlComponents].URL;
|
|
}
|
|
|
|
- (NSURL*)realtimeUrl {
|
|
NSURLComponents *components = [[NSURLComponents alloc] init];
|
|
components.scheme = self.tls ? @"wss" : @"ws";
|
|
components.host = self.realtimeHost;
|
|
components.port = [NSNumber numberWithInteger:(self.tls ? self.tlsPort : self.port)];
|
|
return components.URL;
|
|
}
|
|
|
|
- (id)copyWithZone:(NSZone *)zone {
|
|
ARTClientOptions *options = [super copyWithZone:zone];
|
|
|
|
options.clientId = self.clientId;
|
|
options.port = self.port;
|
|
options.tlsPort = self.tlsPort;
|
|
if (self->_restHost) options.restHost = self.restHost;
|
|
if (self->_realtimeHost) options.realtimeHost = self.realtimeHost;
|
|
options.queueMessages = self.queueMessages;
|
|
options.echoMessages = self.echoMessages;
|
|
options.recover = self.recover;
|
|
options.useBinaryProtocol = self.useBinaryProtocol;
|
|
options.autoConnect = self.autoConnect;
|
|
options.environment = self.environment;
|
|
options.tls = self.tls;
|
|
options.logLevel = self.logLevel;
|
|
options.logHandler = self.logHandler;
|
|
options.suspendedRetryTimeout = self.suspendedRetryTimeout;
|
|
options.disconnectedRetryTimeout = self.disconnectedRetryTimeout;
|
|
options.channelRetryTimeout = self.channelRetryTimeout;
|
|
options.httpMaxRetryCount = self.httpMaxRetryCount;
|
|
options.httpMaxRetryDuration = self.httpMaxRetryDuration;
|
|
options.httpOpenTimeout = self.httpOpenTimeout;
|
|
options.httpRequestTimeout = self.httpRequestTimeout;
|
|
options->_fallbackHosts = self.fallbackHosts; //ignore setter
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
options->_fallbackHostsUseDefault = self.fallbackHostsUseDefault; //ignore setter
|
|
#pragma clang diagnostic pop
|
|
|
|
options.httpRequestTimeout = self.httpRequestTimeout;
|
|
options.logExceptionReportingUrl = self.logExceptionReportingUrl;
|
|
options.dispatchQueue = self.dispatchQueue;
|
|
options.internalDispatchQueue = self.internalDispatchQueue;
|
|
options.pushFullWait = self.pushFullWait;
|
|
options.idempotentRestPublishing = self.idempotentRestPublishing;
|
|
options.channelNamePrefix = self.channelNamePrefix;
|
|
options.addRequestIds = self.addRequestIds;
|
|
options.pushRegistererDelegate = self.pushRegistererDelegate;
|
|
options.transportParams = self.transportParams;
|
|
options.additionalAgents = self.additionalAgents;
|
|
|
|
return options;
|
|
}
|
|
|
|
- (BOOL)isBasicAuth {
|
|
return self.useTokenAuth == false &&
|
|
self.key != nil &&
|
|
self.token == nil &&
|
|
self.tokenDetails == nil &&
|
|
self.authUrl == nil &&
|
|
self.authCallback == nil;
|
|
}
|
|
|
|
- (BOOL)hasCustomRestHost {
|
|
return (_restHost && ![_restHost isEqualToString:[ARTDefault restHost]]) || (self.hasEnvironment && !self.isProductionEnvironment);
|
|
}
|
|
|
|
- (BOOL)hasDefaultRestHost {
|
|
return ![self hasCustomRestHost];
|
|
}
|
|
|
|
- (BOOL)hasCustomRealtimeHost {
|
|
return (_realtimeHost && ![_realtimeHost isEqualToString:[ARTDefault realtimeHost]]) || (self.hasEnvironment && !self.isProductionEnvironment);
|
|
}
|
|
|
|
- (BOOL)hasDefaultRealtimeHost {
|
|
return ![self hasCustomRealtimeHost];
|
|
}
|
|
|
|
- (BOOL)hasCustomPort {
|
|
return self.port && self.port != [ARTDefault port];
|
|
}
|
|
|
|
- (BOOL)hasCustomTlsPort {
|
|
return self.tlsPort && self.tlsPort != [ARTDefault tlsPort];
|
|
}
|
|
|
|
- (void)setFallbackHosts:(nullable NSArray<NSString *> *)value {
|
|
if (_fallbackHostsUseDefault) {
|
|
[ARTException raise:ARTFallbackIncompatibleOptionsException format:@"Could not setup custom fallback hosts because it is currently configured to use default fallback hosts."];
|
|
}
|
|
_fallbackHosts = value;
|
|
}
|
|
|
|
- (void)setFallbackHostsUseDefault:(BOOL)value {
|
|
if (_fallbackHosts) {
|
|
[ARTException raise:ARTFallbackIncompatibleOptionsException format:@"Could not configure options to use default fallback hosts because a custom fallback host list is being used."];
|
|
}
|
|
_fallbackHostsUseDefault = value;
|
|
}
|
|
|
|
+ (void)setDefaultEnvironment:(NSString *)environment {
|
|
ARTDefaultEnvironment = environment;
|
|
}
|
|
|
|
- (void)setDefaultTokenParams:(ARTTokenParams *)value {
|
|
_defaultTokenParams = [[ARTTokenParams alloc] initWithTokenParams:value];
|
|
}
|
|
|
|
+ (BOOL)getDefaultIdempotentRestPublishingForVersion:(NSString *)version {
|
|
if ([@"1.2" compare:version options:NSNumericSearch] == NSOrderedDescending) {
|
|
return false;
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
- (BOOL)isProductionEnvironment {
|
|
return [[self.environment lowercaseString] isEqualToString:[ARTDefaultProduction lowercaseString]];
|
|
}
|
|
|
|
- (BOOL)hasEnvironment {
|
|
return self.environment != nil && [self.environment isNotEmptyString];
|
|
}
|
|
|
|
- (BOOL)hasEnvironmentDifferentThanProduction {
|
|
return self.hasEnvironment && !self.isProductionEnvironment;
|
|
}
|
|
|
|
- (NSString *)host:(NSString *)host forEnvironment:(NSString *)environment {
|
|
return [NSString stringWithFormat:@"%@-%@", environment, host];
|
|
}
|
|
|
|
- (void)addAgent:(NSString *)agentName version:(NSString * _Nullable)version {
|
|
NSString* agentString = version == nil ? agentName : [NSString stringWithFormat:@"%@/%@", agentName, version];
|
|
if ([_additionalAgents containsObject:agentString]) {
|
|
[ARTException raise:ARTFallbackIncompatibleOptionsException format:@"This agent string is already in the list."];
|
|
}
|
|
[_additionalAgents addObject:agentString];
|
|
}
|
|
|
|
- (NSString *)agents {
|
|
NSMutableString *agents = [NSMutableString string];
|
|
[agents appendFormat:@"%@ ", [ARTDefault libraryAgent]];
|
|
for (NSString *agent in _additionalAgents) {
|
|
[agents appendFormat:@"%@ ", agent];
|
|
}
|
|
[agents appendFormat:@"%@", [ARTDefault platformAgent]];
|
|
return agents;
|
|
}
|
|
|
|
@end
|