even more type safe solution, idea from @lightsprint09
This commit is contained in:
parent
a5db43b834
commit
b9e05286a2
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
public func ==(lhs: SocketIOClientOption, rhs: SocketIOClientOption) -> Bool {
|
||||
return lhs.description == rhs.description
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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<SocketIOClientOption>
|
||||
|
||||
enum Either<E, V> {
|
||||
case Left(E)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user