232 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  SocketIOClientOption .swift
 | 
						|
//  Socket.IO-Client-Swift
 | 
						|
//
 | 
						|
//  Created by Erik Little on 10/17/15.
 | 
						|
//
 | 
						|
//  Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
//  of this software and associated documentation files (the "Software"), to deal
 | 
						|
//  in the Software without restriction, including without limitation the rights
 | 
						|
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
//  copies of the Software, and to permit persons to whom the Software is
 | 
						|
//  furnished to do so, subject to the following conditions:
 | 
						|
//
 | 
						|
//  The above copyright notice and this permission notice shall be included in
 | 
						|
//  all copies or substantial portions of the Software.
 | 
						|
//
 | 
						|
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
						|
//  THE SOFTWARE.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import Starscream
 | 
						|
 | 
						|
/// The socket.io version being used.
 | 
						|
public enum SocketIOVersion: Int {
 | 
						|
    case two = 2
 | 
						|
    case three = 3
 | 
						|
}
 | 
						|
 | 
						|
protocol ClientOption : CustomStringConvertible, Equatable {
 | 
						|
    func getSocketIOOptionValue() -> Any
 | 
						|
}
 | 
						|
 | 
						|
/// The options for a client.
 | 
						|
public enum SocketIOClientOption : ClientOption {
 | 
						|
    /// If given, the WebSocket transport will attempt to use compression.
 | 
						|
    case compress
 | 
						|
 | 
						|
    /// A dictionary of GET parameters that will be included in the connect url.
 | 
						|
    case connectParams([String: Any])
 | 
						|
 | 
						|
    /// An array of cookies that will be sent during the initial connection.
 | 
						|
    case cookies([HTTPCookie])
 | 
						|
 | 
						|
    /// Any extra HTTP headers that should be sent during the initial connection.
 | 
						|
    case extraHeaders([String: String])
 | 
						|
 | 
						|
    /// If passed `true`, will cause the client to always create a new engine. Useful for debugging,
 | 
						|
    /// or when you want to be sure no state from previous engines is being carried over.
 | 
						|
    case forceNew(Bool)
 | 
						|
 | 
						|
    /// If passed `true`, the only transport that will be used will be HTTP long-polling.
 | 
						|
    case forcePolling(Bool)
 | 
						|
 | 
						|
    /// If passed `true`, the only transport that will be used will be WebSockets.
 | 
						|
    case forceWebsockets(Bool)
 | 
						|
 | 
						|
    /// If passed `true`, the WebSocket stream will be configured with the enableSOCKSProxy `true`.
 | 
						|
    case enableSOCKSProxy(Bool)
 | 
						|
 | 
						|
    /// The queue that all interaction with the client should occur on. This is the queue that event handlers are
 | 
						|
    /// called on.
 | 
						|
    ///
 | 
						|
    /// **This should be a serial queue! Concurrent queues are not supported and might cause crashes and races**.
 | 
						|
    case handleQueue(DispatchQueue)
 | 
						|
 | 
						|
    /// If passed `true`, the client will log debug information. This should be turned off in production code.
 | 
						|
    case log(Bool)
 | 
						|
 | 
						|
    /// Used to pass in a custom logger.
 | 
						|
    case logger(SocketLogger)
 | 
						|
 | 
						|
    /// A custom path to socket.io. Only use this if the socket.io server is configured to look for this path.
 | 
						|
    case path(String)
 | 
						|
 | 
						|
    /// If passed `false`, the client will not reconnect when it loses connection. Useful if you want full control
 | 
						|
    /// over when reconnects happen.
 | 
						|
    case reconnects(Bool)
 | 
						|
 | 
						|
    /// The number of times to try and reconnect before giving up. Pass `-1` to [never give up](https://www.youtube.com/watch?v=dQw4w9WgXcQ).
 | 
						|
    case reconnectAttempts(Int)
 | 
						|
 | 
						|
    /// The minimum number of seconds to wait before reconnect attempts.
 | 
						|
    case reconnectWait(Int)
 | 
						|
 | 
						|
    /// The maximum number of seconds to wait before reconnect attempts.
 | 
						|
    case reconnectWaitMax(Int)
 | 
						|
 | 
						|
    /// The randomization factor for calculating reconnect jitter.
 | 
						|
    case randomizationFactor(Double)
 | 
						|
 | 
						|
    /// Set `true` if your server is using secure transports.
 | 
						|
    case secure(Bool)
 | 
						|
 | 
						|
    /// Allows you to set which certs are valid. Useful for SSL pinning.
 | 
						|
    case security(CertificatePinning)
 | 
						|
 | 
						|
    /// If you're using a self-signed set. Only use for development.
 | 
						|
    case selfSigned(Bool)
 | 
						|
 | 
						|
    /// Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs.
 | 
						|
    case sessionDelegate(URLSessionDelegate)
 | 
						|
 | 
						|
    /// The version of socket.io being used. This should match the server version. Default is 3.
 | 
						|
    case version(SocketIOVersion)
 | 
						|
 | 
						|
    // MARK: Properties
 | 
						|
 | 
						|
    /// The description of this option.
 | 
						|
    public var description: String {
 | 
						|
        let description: String
 | 
						|
 | 
						|
        switch self {
 | 
						|
        case .compress:
 | 
						|
            description = "compress"
 | 
						|
        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 .path:
 | 
						|
            description = "path"
 | 
						|
        case .reconnects:
 | 
						|
            description = "reconnects"
 | 
						|
        case .reconnectAttempts:
 | 
						|
            description = "reconnectAttempts"
 | 
						|
        case .reconnectWait:
 | 
						|
            description = "reconnectWait"
 | 
						|
        case .reconnectWaitMax:
 | 
						|
            description = "reconnectWaitMax"
 | 
						|
        case .randomizationFactor:
 | 
						|
            description = "randomizationFactor"
 | 
						|
        case .secure:
 | 
						|
            description = "secure"
 | 
						|
        case .selfSigned:
 | 
						|
            description = "selfSigned"
 | 
						|
        case .security:
 | 
						|
            description = "security"
 | 
						|
        case .sessionDelegate:
 | 
						|
            description = "sessionDelegate"
 | 
						|
        case .enableSOCKSProxy:
 | 
						|
            description = "enableSOCKSProxy"
 | 
						|
        case .version:
 | 
						|
            description = "version"
 | 
						|
        }
 | 
						|
 | 
						|
        return description
 | 
						|
    }
 | 
						|
 | 
						|
    func getSocketIOOptionValue() -> Any {
 | 
						|
        let value: Any
 | 
						|
 | 
						|
        switch self {
 | 
						|
        case .compress:
 | 
						|
            value = true
 | 
						|
        case let .connectParams(params):
 | 
						|
            value = params
 | 
						|
        case let .cookies(cookies):
 | 
						|
            value = cookies
 | 
						|
        case let .extraHeaders(headers):
 | 
						|
            value = headers
 | 
						|
        case let .forceNew(force):
 | 
						|
            value = force
 | 
						|
        case let .forcePolling(force):
 | 
						|
            value = force
 | 
						|
        case let .forceWebsockets(force):
 | 
						|
            value = force
 | 
						|
        case let .handleQueue(queue):
 | 
						|
            value = queue
 | 
						|
        case let .log(log):
 | 
						|
            value = log
 | 
						|
        case let .logger(logger):
 | 
						|
            value = logger
 | 
						|
        case let .path(path):
 | 
						|
            value = path
 | 
						|
        case let .reconnects(reconnects):
 | 
						|
            value = reconnects
 | 
						|
        case let .reconnectAttempts(attempts):
 | 
						|
            value = attempts
 | 
						|
        case let .reconnectWait(wait):
 | 
						|
            value = wait
 | 
						|
        case let .reconnectWaitMax(wait):
 | 
						|
            value = wait
 | 
						|
        case let .randomizationFactor(factor):
 | 
						|
            value = factor
 | 
						|
        case let .secure(secure):
 | 
						|
            value = secure
 | 
						|
        case let .security(security):
 | 
						|
            value = security
 | 
						|
        case let .selfSigned(signed):
 | 
						|
            value = signed
 | 
						|
        case let .sessionDelegate(delegate):
 | 
						|
            value = delegate
 | 
						|
        case let .enableSOCKSProxy(enable):
 | 
						|
            value = enable
 | 
						|
        case let.version(versionNum):
 | 
						|
            value = versionNum
 | 
						|
        }
 | 
						|
 | 
						|
        return value
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: Operators
 | 
						|
 | 
						|
    /// Compares whether two options are the same.
 | 
						|
    ///
 | 
						|
    /// - parameter lhs: Left operand to compare.
 | 
						|
    /// - parameter rhs: Right operand to compare.
 | 
						|
    /// - returns: `true` if the two are the same option.
 | 
						|
    public static func ==(lhs: SocketIOClientOption, rhs: SocketIOClientOption) -> Bool {
 | 
						|
        return lhs.description == rhs.description
 | 
						|
    }
 | 
						|
 | 
						|
}
 |