This commit is contained in:
Erik 2016-01-03 11:56:16 -05:00
parent 4ed4681cc4
commit 5068986a50
3 changed files with 134 additions and 64 deletions

View File

@ -109,7 +109,7 @@ public final class SocketEngine: NSObject, SocketEngineSpec, WebSocketDelegate {
public convenience init(client: SocketEngineClient, url: String, options: NSDictionary?) { public convenience init(client: SocketEngineClient, url: String, options: NSDictionary?) {
self.init(client: client, url: url, self.init(client: client, url: url,
options: Set<SocketIOClientOption>.NSDictionaryToSocketOptionsSet(options ?? [:])) options: options?.toSocketOptionsSet() ?? [])
} }
deinit { deinit {

View File

@ -104,7 +104,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
*/ */
public convenience init(socketURL: String, options: NSDictionary?) { public convenience init(socketURL: String, options: NSDictionary?) {
self.init(socketURL: socketURL, self.init(socketURL: socketURL,
options: Set<SocketIOClientOption>.NSDictionaryToSocketOptionsSet(options ?? [:])) options: options?.toSocketOptionsSet() ?? [])
} }
deinit { deinit {

View File

@ -25,7 +25,7 @@
import Foundation import Foundation
protocol ClientOption: CustomStringConvertible, Hashable { protocol ClientOption: CustomStringConvertible, Hashable {
func getSocketIOOptionValue() -> AnyObject? func getSocketIOOptionValue() -> AnyObject
} }
public enum SocketIOClientOption: ClientOption { public enum SocketIOClientOption: ClientOption {
@ -49,62 +49,97 @@ public enum SocketIOClientOption: ClientOption {
case VoipEnabled(Bool) case VoipEnabled(Bool)
public var description: String { public var description: String {
if let label = Mirror(reflecting: self).children.first?.label { let description: String
return String(label[label.startIndex]).lowercaseString + String(label.characters.dropFirst())
} else { switch self {
return "" case .ConnectParams:
description = "connectParams"
case .Cookies:
description = "cookies"
case .ExtraHeaders:
description = "extraHeaders"
case .ForceNew:
description = "forceNew"
case .ForcePolling:
description = "forcePolling"
case .ForceWebsockets:
description = "forceWebsockets"
case .HandleQueue:
description = "handleQueue"
case .Log:
description = "log"
case .Logger:
description = "logger"
case .Nsp:
description = "nsp"
case .Path:
description = "path"
case .Reconnects:
description = "reconnects"
case .ReconnectAttempts:
description = "reconnectAttempts"
case .ReconnectWait:
description = "reconnectWait"
case .Secure:
description = "secure"
case .SelfSigned:
description = "selfSigned"
case .SessionDelegate:
description = "sessionDelegate"
case .VoipEnabled:
description = "voipEnabled"
} }
return description
} }
public var hashValue: Int { public var hashValue: Int {
return description.hashValue return description.hashValue
} }
static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { func getSocketIOOptionValue() -> AnyObject {
switch (key, value) { let value: AnyObject
case ("connectParams", let params as [String: AnyObject]):
return .ConnectParams(params) switch self {
case ("reconnects", let reconnects as Bool): case let .ConnectParams(params):
return .Reconnects(reconnects) value = params
case ("reconnectAttempts", let attempts as Int): case let .Cookies(cookies):
return .ReconnectAttempts(attempts) value = cookies
case ("reconnectWait", let wait as Int): case let .ExtraHeaders(headers):
return .ReconnectWait(wait) value = headers
case ("forceNew", let force as Bool): case let .ForceNew(force):
return .ForceNew(force) value = force
case ("forcePolling", let force as Bool): case let .ForcePolling(force):
return .ForcePolling(force) value = force
case ("forceWebsockets", let force as Bool): case let .ForceWebsockets(force):
return .ForceWebsockets(force) value = force
case ("nsp", let nsp as String): case let .HandleQueue(queue):
return .Nsp(nsp) value = queue
case ("cookies", let cookies as [NSHTTPCookie]): case let .Log(log):
return .Cookies(cookies) value = log
case ("log", let log as Bool): case let .Logger(logger):
return .Log(log) value = logger
case ("logger", let logger as SocketLogger): case let .Nsp(nsp):
return .Logger(logger) value = nsp
case ("sessionDelegate", let delegate as NSURLSessionDelegate): case let .Path(path):
return .SessionDelegate(delegate) value = path
case ("path", let path as String): case let .Reconnects(reconnects):
return .Path(path) value = reconnects
case ("extraHeaders", let headers as [String: String]): case let .ReconnectAttempts(attempts):
return .ExtraHeaders(headers) value = attempts
case ("handleQueue", let queue as dispatch_queue_t): case let .ReconnectWait(wait):
return .HandleQueue(queue) value = wait
case ("voipEnabled", let enable as Bool): case let .Secure(secure):
return .VoipEnabled(enable) value = secure
case ("secure", let secure as Bool): case let .SelfSigned(signed):
return .Secure(secure) value = signed
case ("selfSigned", let selfSigned as Bool): case let .SessionDelegate(delegate):
return .SelfSigned(selfSigned) value = delegate
default: case let .VoipEnabled(enabled):
return nil value = enabled
} }
}
return value
func getSocketIOOptionValue() -> AnyObject? {
return Mirror(reflecting: self).children.first?.value as? AnyObject
} }
} }
@ -118,26 +153,61 @@ extension Set where Element: ClientOption {
insert(element) insert(element)
} }
} }
}
extension NSDictionary {
static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? {
switch (key, value) {
case let ("connectParams", params as [String: AnyObject]):
return .ConnectParams(params)
case let ("reconnects", reconnects as Bool):
return .Reconnects(reconnects)
case let ("reconnectAttempts", attempts as Int):
return .ReconnectAttempts(attempts)
case let ("reconnectWait", wait as Int):
return .ReconnectWait(wait)
case let ("forceNew", force as Bool):
return .ForceNew(force)
case let ("forcePolling", force as Bool):
return .ForcePolling(force)
case let ("forceWebsockets", force as Bool):
return .ForceWebsockets(force)
case let ("nsp", nsp as String):
return .Nsp(nsp)
case let ("cookies", cookies as [NSHTTPCookie]):
return .Cookies(cookies)
case let ("log", log as Bool):
return .Log(log)
case let ("logger", logger as SocketLogger):
return .Logger(logger)
case let ("sessionDelegate", delegate as NSURLSessionDelegate):
return .SessionDelegate(delegate)
case let ("path", path as String):
return .Path(path)
case let ("extraHeaders", headers as [String: String]):
return .ExtraHeaders(headers)
case let ("handleQueue", queue as dispatch_queue_t):
return .HandleQueue(queue)
case let ("voipEnabled", enable as Bool):
return .VoipEnabled(enable)
case let ("secure", secure as Bool):
return .Secure(secure)
case let ("selfSigned", selfSigned as Bool):
return .SelfSigned(selfSigned)
default:
return nil
}
}
static func NSDictionaryToSocketOptionsSet(dict: NSDictionary) -> Set<SocketIOClientOption> { func toSocketOptionsSet() -> Set<SocketIOClientOption> {
var options = Set<SocketIOClientOption>() var options = Set<SocketIOClientOption>()
for (rawKey, value) in dict { for (rawKey, value) in self {
if let key = rawKey as? String, opt = SocketIOClientOption.keyValueToSocketIOClientOption(key, value: value) { if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) {
options.insertIgnore(opt) options.insertIgnore(opt)
} }
} }
return options return options
} }
func SocketOptionsSetToNSDictionary() -> NSDictionary {
let options = NSMutableDictionary()
for option in self {
options[option.description] = option.getSocketIOOptionValue()
}
return options
}
} }