diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 8f68dad..ea0b562 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -32,7 +32,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public private(set) var status = SocketIOClientStatus.NotConnected public var nsp = "/" - public var opts: SocketOptionsDictionary? + public var opts: SocketOptionsSet? public var reconnects = true public var reconnectWait = 10 public var sid: String? { @@ -40,9 +40,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { } private let emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL) - private let handleQueue: dispatch_queue_t! private let logType = "SocketIOClient" - private let reconnectAttempts: Int! private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 @@ -52,12 +50,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient { private var ackHandlers = SocketAckManager() private(set) var currentAck = -1 + private(set) var handleQueue = dispatch_get_main_queue() + private(set) var reconnectAttempts = -1 var waitingData = [SocketPacket]() /** Type safe way to create a new SocketIOClient. opts can be omitted */ - public init(var socketURL: String, opts: SocketOptionsDictionary? = nil) { + public init(var socketURL: String, opts: SocketOptionsSet? = nil) { if socketURL["https://"].matches().count != 0 { self.secure = true } @@ -68,40 +68,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient { self.socketURL = socketURL self.opts = opts - if let connectParams = opts?[.ConnectParams] as? [String: AnyObject] { - self.connectParams = connectParams - } - - if let logger = opts?[.Logger] as? SocketLogger { - Logger = logger - } - - if let log = opts?[.Log] as? Bool { - Logger.log = log - } - - if let nsp = opts?[.Nsp] as? String { - self.nsp = nsp - } - - if let reconnects = opts?[.Reconnects] as? Bool { - self.reconnects = reconnects - } - - if let reconnectAttempts = opts?[.ReconnectAttempts] as? Int { - self.reconnectAttempts = reconnectAttempts - } else { - self.reconnectAttempts = -1 - } - - if let reconnectWait = opts?[.ReconnectWait] as? Int { - self.reconnectWait = abs(reconnectWait) - } - - if let handleQueue = opts?[.HandleQueue] as? dispatch_queue_t { - self.handleQueue = handleQueue - } else { - self.handleQueue = dispatch_get_main_queue() + for option in opts ?? [] { + switch option { + case .ConnectParams(let params): + connectParams = params + case .Reconnects(let reconnects): + self.reconnects = reconnects + case .ReconnectAttempts(let attempts): + reconnectAttempts = attempts + case .ReconnectWait(let wait): + reconnectWait = wait + case .Nsp(let nsp): + self.nsp = nsp + case .Log(let log): + Logger.log = log + case .Logger(let logger): + Logger = logger + case .HandleQueue(let queue): + handleQueue = queue + default: + continue + } } super.init() @@ -113,7 +100,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { */ public convenience init(socketURL: String, opts: NSDictionary?) { self.init(socketURL: socketURL, - opts: SocketIOClientOptions.NSDictionaryToSocketOptionsDictionary(opts ?? [:])) + opts: SocketIOClientOption.NSDictionaryToSocketOptionsSet(opts ?? [:])) } deinit { @@ -124,7 +111,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { Logger.log("Adding engine", type: logType) let newEngine = SocketEngine(client: self, opts: - SocketIOClientOptions.SocketOptionsDictionaryToNSDictionary(opts ?? [:])) + SocketIOClientOption.SocketOptionsSetToNSDictionary(opts ?? [])) engine = newEngine return newEngine diff --git a/SocketIOClientSwift/SocketIOClientOptions .swift b/SocketIOClientSwift/SocketIOClientOptions .swift index 19c32e3..36739e1 100644 --- a/SocketIOClientSwift/SocketIOClientOptions .swift +++ b/SocketIOClientSwift/SocketIOClientOptions .swift @@ -1,5 +1,5 @@ // -// SocketIOClientOptions .swift +// SocketIOClientOption .swift // Socket.IO-Client-Swift // // Created by Erik Little on 10/17/15. @@ -24,41 +24,125 @@ import Foundation -public enum SocketIOClientOptions: String { - case ConnectParams = "connectParams" - case Reconnects = "reconnects" - case ReconnectAttempts = "reconnectAttempts" - case ReconnectWait = "reconnectWait" - case ForcePolling = "forcePolling" - case ForceWebsockets = "forceWebsockets" - case Nsp = "nsp" - case Cookies = "cookies" - case Log = "log" - case Logger = "logger" - case SessionDelegate = "sessionDelegate" - case Path = "path" - case ExtraHeaders = "extraHeaders" - case HandleQueue = "handleQueue" +public enum SocketIOClientOption: CustomStringConvertible, Hashable { + case ConnectParams([String: AnyObject]) + case Reconnects(Bool) + case ReconnectAttempts(Int) + case ReconnectWait(Int) + case ForcePolling(Bool) + case ForceWebsockets(Bool) + case Nsp(String) + case Cookies([NSHTTPCookie]) + case Log(Bool) + case Logger(SocketLogger) + case SessionDelegate(NSURLSessionDelegate) + case Path(String) + case ExtraHeaders([String: String]) + case HandleQueue(dispatch_queue_t) - static func NSDictionaryToSocketOptionsDictionary(dict: NSDictionary) -> SocketOptionsDictionary { - var options = SocketOptionsDictionary() + public var description: String { + switch self { + case .ConnectParams: + return "connectParams" + case .Reconnects: + return "reconnects" + case .ReconnectAttempts: + return "reconnectAttempts" + case .ReconnectWait: + return "reconnectWait" + case .ForcePolling: + return "forcePolling" + case .ForceWebsockets: + return "forceWebsockets" + case .Nsp: + return "nsp" + case .Cookies: + return "cookies" + case .Log: + return "log" + case .Logger: + return "logger" + case .SessionDelegate: + return "sessionDelegate" + case .Path: + return "path" + case .ExtraHeaders: + return "extraHeaders" + case .HandleQueue: + return "handleQueue" + } + } + + public var hashValue: Int { + return description.hashValue + } + + static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { + switch key { + case "connectParams" where value is [String: AnyObject]: + return .ConnectParams(value as! [String: AnyObject]) + case "reconnects" where value is Bool: + return .Reconnects(value as! Bool) + case "reconnectAttempts" where value is Int: + return .ReconnectAttempts(value as! Int) + case "reconnectWait" where value is Int: + return .ReconnectWait(value as! Int) + case "forcePolling" where value is Bool: + return .ForcePolling(value as! Bool) + case "forceWebsockets" where value is Bool: + return .ForceWebsockets(value as! Bool) + case "nsp" where value is String: + return .Nsp(value as! String) + case "cookies" where value is [NSHTTPCookie]: + return .Cookies(value as! [NSHTTPCookie]) + case "log" where value is Bool: + return .Log(value as! Bool) + case "logger" where value is SocketLogger: + return .Logger(value as! SocketLogger) + case "sessionDelegate" where value is NSURLSessionDelegate: + return .SessionDelegate(value as! NSURLSessionDelegate) + case "path" where value is String: + return .Path(value as! String) + case "extraHeaders" where value is [String: String]: + return .ExtraHeaders(value as! [String: String]) + case "handleQueue" where value is dispatch_queue_t: + return .HandleQueue(value as! dispatch_queue_t) + default: + return nil + } + } + + static func getSocketIOOptionValue(option: SocketIOClientOption) -> AnyObject? { + if let value = Mirror(reflecting: option).children.first!.value as? AnyObject { + return value + } else { + return nil + } + } + + static func NSDictionaryToSocketOptionsSet(dict: NSDictionary) -> SocketOptionsSet { + var options = SocketOptionsSet() for (rawKey, value) in dict { - if let key = rawKey as? String, opt = SocketIOClientOptions(rawValue: key) { - options[opt] = value + if let key = rawKey as? String, opt = keyValueToSocketIOClientOption(key, value: value) { + options.insert(opt) } } return options } - static func SocketOptionsDictionaryToNSDictionary(dict: SocketOptionsDictionary) -> NSDictionary { + static func SocketOptionsSetToNSDictionary(set: SocketOptionsSet) -> NSDictionary { let options = NSMutableDictionary() - for (key, value) in dict { - options[key.rawValue] = value + for option in set { + options[option.description] = getSocketIOOptionValue(option) } return options } -} \ No newline at end of file +} + +public func ==(lhs: SocketIOClientOption, rhs: SocketIOClientOption) -> Bool { + return lhs.description == rhs.description +} diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 6c62aa9..b168820 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -26,7 +26,7 @@ import Foundation var Logger: SocketLogger = DefaultSocketLogger() -public protocol SocketLogger { +public protocol SocketLogger: class { /// Whether to log or not var log: Bool {get set} @@ -56,6 +56,6 @@ public extension SocketLogger { } } -struct DefaultSocketLogger: SocketLogger { +class DefaultSocketLogger: SocketLogger { var log = false } diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 2b50db4..d992c75 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -27,7 +27,7 @@ import Foundation public typealias AckCallback = ([AnyObject]) -> Void public typealias NormalCallback = ([AnyObject], SocketAckEmitter?) -> Void public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void -public typealias SocketOptionsDictionary = [SocketIOClientOptions: AnyObject] +public typealias SocketOptionsSet = Set enum Either { case Left(E)