better swift style
This commit is contained in:
parent
137fd1229b
commit
2579c04f67
@ -25,38 +25,38 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
private struct SocketAck: Hashable, Equatable {
|
private struct SocketAck: Hashable, Equatable {
|
||||||
let ack:Int
|
let ack: Int
|
||||||
var callback:AckCallback!
|
var callback: AckCallback!
|
||||||
var hashValue:Int {
|
var hashValue: Int {
|
||||||
return ack.hashValue
|
return ack.hashValue
|
||||||
}
|
}
|
||||||
|
|
||||||
init(ack:Int) {
|
init(ack: Int) {
|
||||||
self.ack = ack
|
self.ack = ack
|
||||||
}
|
}
|
||||||
|
|
||||||
init(ack:Int, callback:AckCallback) {
|
init(ack: Int, callback: AckCallback) {
|
||||||
self.ack = ack
|
self.ack = ack
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func <(lhs:SocketAck, rhs:SocketAck) -> Bool {
|
private func <(lhs: SocketAck, rhs: SocketAck) -> Bool {
|
||||||
return lhs.ack < rhs.ack
|
return lhs.ack < rhs.ack
|
||||||
}
|
}
|
||||||
|
|
||||||
private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool {
|
private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool {
|
||||||
return lhs.ack == rhs.ack
|
return lhs.ack == rhs.ack
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SocketAckManager {
|
struct SocketAckManager {
|
||||||
private var acks = Set<SocketAck>(minimumCapacity: 1)
|
private var acks = Set<SocketAck>(minimumCapacity: 1)
|
||||||
|
|
||||||
mutating func addAck(ack:Int, callback:AckCallback) {
|
mutating func addAck(ack: Int, callback: AckCallback) {
|
||||||
acks.insert(SocketAck(ack: ack, callback: callback))
|
acks.insert(SocketAck(ack: ack, callback: callback))
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func executeAck(ack:Int, items:[AnyObject]?) {
|
mutating func executeAck(ack: Int, items: [AnyObject]?) {
|
||||||
let callback = acks.remove(SocketAck(ack: ack))
|
let callback = acks.remove(SocketAck(ack: ack))
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
@ -64,7 +64,7 @@ struct SocketAckManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func timeoutAck(ack:Int) {
|
mutating func timeoutAck(ack: Int) {
|
||||||
let callback = acks.remove(SocketAck(ack: ack))
|
let callback = acks.remove(SocketAck(ack: ack))
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
|
|||||||
@ -25,10 +25,10 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class SocketAnyEvent: NSObject {
|
public final class SocketAnyEvent: NSObject {
|
||||||
public let event:String!
|
public let event: String!
|
||||||
public let items:NSArray?
|
public let items: NSArray?
|
||||||
|
|
||||||
init(event:String, items:NSArray?) {
|
init(event: String, items: NSArray?) {
|
||||||
self.event = event
|
self.event = event
|
||||||
self.items = items
|
self.items = items
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
||||||
private typealias Probe = (msg:String, type:PacketType, data:[NSData]?)
|
private typealias Probe = (msg: String, type: PacketType, data: [NSData]?)
|
||||||
private typealias ProbeWaitQueue = [Probe]
|
private typealias ProbeWaitQueue = [Probe]
|
||||||
|
|
||||||
private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet
|
private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet
|
||||||
@ -37,12 +37,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
private var closed = false
|
private var closed = false
|
||||||
private var _connected = false
|
private var _connected = false
|
||||||
private var extraHeaders:[String: String]?
|
private var extraHeaders: [String: String]?
|
||||||
private var fastUpgrade = false
|
private var fastUpgrade = false
|
||||||
private var forcePolling = false
|
private var forcePolling = false
|
||||||
private var forceWebsockets = false
|
private var forceWebsockets = false
|
||||||
private var pingInterval:Double?
|
private var pingInterval: Double?
|
||||||
private var pingTimer:NSTimer?
|
private var pingTimer: NSTimer?
|
||||||
private var pingTimeout = 0.0 {
|
private var pingTimeout = 0.0 {
|
||||||
didSet {
|
didSet {
|
||||||
pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25))
|
pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25))
|
||||||
@ -61,25 +61,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
let logType = "SocketEngine"
|
let logType = "SocketEngine"
|
||||||
|
|
||||||
var connected:Bool {
|
var connected: Bool {
|
||||||
return _connected
|
return _connected
|
||||||
}
|
}
|
||||||
weak var client:SocketEngineClient?
|
weak var client: SocketEngineClient?
|
||||||
var cookies:[NSHTTPCookie]?
|
var cookies: [NSHTTPCookie]?
|
||||||
var log = false
|
var log = false
|
||||||
var polling:Bool {
|
var polling: Bool {
|
||||||
return _polling
|
return _polling
|
||||||
}
|
}
|
||||||
var sid = ""
|
var sid = ""
|
||||||
var socketPath = ""
|
var socketPath = ""
|
||||||
var urlPolling:String?
|
var urlPolling: String?
|
||||||
var urlWebSocket:String?
|
var urlWebSocket: String?
|
||||||
var websocket:Bool {
|
var websocket: Bool {
|
||||||
return _websocket
|
return _websocket
|
||||||
}
|
}
|
||||||
var ws:WebSocket?
|
var ws:WebSocket?
|
||||||
|
|
||||||
public enum PacketType:Int {
|
public enum PacketType: Int {
|
||||||
case OPEN = 0
|
case OPEN = 0
|
||||||
case CLOSE = 1
|
case CLOSE = 1
|
||||||
case PING = 2
|
case PING = 2
|
||||||
@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
case UPGRADE = 5
|
case UPGRADE = 5
|
||||||
case NOOP = 6
|
case NOOP = 6
|
||||||
|
|
||||||
init?(str:String?) {
|
init?(str: String?) {
|
||||||
if let value = Int(str ?? ""), raw = PacketType(rawValue: value) {
|
if let value = Int(str ?? ""), raw = PacketType(rawValue: value) {
|
||||||
self = raw
|
self = raw
|
||||||
} else {
|
} else {
|
||||||
@ -97,13 +97,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) {
|
public init(client: SocketEngineClient, sessionDelegate: NSURLSessionDelegate?) {
|
||||||
self.client = client
|
self.client = client
|
||||||
self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
|
self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
|
||||||
delegate: sessionDelegate, delegateQueue: workQueue)
|
delegate: sessionDelegate, delegateQueue: workQueue)
|
||||||
}
|
}
|
||||||
|
|
||||||
public convenience init(client:SocketEngineClient, opts:NSDictionary?) {
|
public convenience init(client: SocketEngineClient, opts: NSDictionary?) {
|
||||||
self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate)
|
self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate)
|
||||||
forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false
|
forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false
|
||||||
forcePolling = opts?["forcePolling"] as? Bool ?? false
|
forcePolling = opts?["forcePolling"] as? Bool ?? false
|
||||||
@ -117,7 +117,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
SocketLogger.log("Engine is being deinit", client: self)
|
SocketLogger.log("Engine is being deinit", client: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close(fast fast:Bool) {
|
public func close(fast fast: Bool) {
|
||||||
SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast)
|
SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast)
|
||||||
|
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
@ -133,7 +133,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
stopPolling()
|
stopPolling()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
|
private func createBinaryDataForSend(data: NSData) -> (NSData?, String?) {
|
||||||
if websocket {
|
if websocket {
|
||||||
var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
|
var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
|
||||||
byteArray[0] = 4
|
byteArray[0] = 4
|
||||||
@ -151,7 +151,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createURLs(params:[String: AnyObject]?) -> (String?, String?) {
|
private func createURLs(params: [String: AnyObject]?) -> (String?, String?) {
|
||||||
if client == nil {
|
if client == nil {
|
||||||
return (nil, nil)
|
return (nil, nil)
|
||||||
}
|
}
|
||||||
@ -159,8 +159,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
let path = socketPath == "" ? "/socket.io" : socketPath
|
let path = socketPath == "" ? "/socket.io" : socketPath
|
||||||
|
|
||||||
let url = "\(client!.socketURL)\(path)/?transport="
|
let url = "\(client!.socketURL)\(path)/?transport="
|
||||||
var urlPolling:String
|
var urlPolling: String
|
||||||
var urlWebSocket:String
|
var urlWebSocket: String
|
||||||
|
|
||||||
if client!.secure {
|
if client!.secure {
|
||||||
urlPolling = "https://" + url + "polling"
|
urlPolling = "https://" + url + "polling"
|
||||||
@ -193,7 +193,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
return (urlPolling, urlWebSocket)
|
return (urlPolling, urlWebSocket)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createWebsocket(andConnect connect:Bool) {
|
private func createWebsocket(andConnect connect: Bool) {
|
||||||
let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)")
|
let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)")
|
||||||
|
|
||||||
ws = WebSocket(url: NSURL(string: wsUrl)!,
|
ws = WebSocket(url: NSURL(string: wsUrl)!,
|
||||||
@ -249,7 +249,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
doRequest(req)
|
doRequest(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func doRequest(req:NSMutableURLRequest) {
|
private func doRequest(req: NSMutableURLRequest) {
|
||||||
if !polling {
|
if !polling {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -380,7 +380,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func checkIfMessageIsBase64Binary(var message:String) {
|
private func checkIfMessageIsBase64Binary(var message: String) {
|
||||||
if message.hasPrefix("b4") {
|
if message.hasPrefix("b4") {
|
||||||
// binary in base64 string
|
// binary in base64 string
|
||||||
message.removeRange(Range<String.Index>(start: message.startIndex,
|
message.removeRange(Range<String.Index>(start: message.startIndex,
|
||||||
@ -395,7 +395,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleMessage(message:String) {
|
private func handleMessage(message: String) {
|
||||||
if let client = client {
|
if let client = client {
|
||||||
dispatch_async(client.handleQueue) {[weak client] in
|
dispatch_async(client.handleQueue) {[weak client] in
|
||||||
client?.parseSocketMessage(message)
|
client?.parseSocketMessage(message)
|
||||||
@ -407,7 +407,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
doPoll()
|
doPoll()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleOpen(openData:String) {
|
private func handleOpen(openData: String) {
|
||||||
let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
|
let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -437,7 +437,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handlePong(pongMessage:String) {
|
private func handlePong(pongMessage: String) {
|
||||||
pongsMissed = 0
|
pongsMissed = 0
|
||||||
|
|
||||||
// We should upgrade
|
// We should upgrade
|
||||||
@ -447,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A poll failed, tell the client about it
|
// A poll failed, tell the client about it
|
||||||
private func handlePollingFailed(reason:String) {
|
private func handlePollingFailed(reason: String) {
|
||||||
_connected = false
|
_connected = false
|
||||||
ws?.disconnect()
|
ws?.disconnect()
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
@ -465,7 +465,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func open(opts:[String: AnyObject]? = nil) {
|
public func open(opts: [String: AnyObject]? = nil) {
|
||||||
if connected {
|
if connected {
|
||||||
SocketLogger.err("Tried to open while connected", client: self)
|
SocketLogger.err("Tried to open while connected", client: self)
|
||||||
client?.didError("Tried to open while connected")
|
client?.didError("Tried to open while connected")
|
||||||
@ -504,7 +504,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Translatation of engine.io-parser#decodePayload
|
// Translatation of engine.io-parser#decodePayload
|
||||||
private func parsePollingMessage(str:String) {
|
private func parsePollingMessage(str: String) {
|
||||||
if str.characters.count == 1 {
|
if str.characters.count == 1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -557,7 +557,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func parseEngineData(data:NSData) {
|
private func parseEngineData(data: NSData) {
|
||||||
if let client = client {
|
if let client = client {
|
||||||
dispatch_async(client.handleQueue) {[weak self] in
|
dispatch_async(client.handleQueue) {[weak self] in
|
||||||
self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
|
self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
|
||||||
@ -565,7 +565,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func parseEngineMessage(var message:String, fromPolling:Bool) {
|
private func parseEngineMessage(var message: String, fromPolling: Bool) {
|
||||||
SocketLogger.log("Got message: %@", client: self, args: message)
|
SocketLogger.log("Got message: %@", client: self, args: message)
|
||||||
|
|
||||||
if fromPolling {
|
if fromPolling {
|
||||||
@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Send an engine message (4)
|
/// Send an engine message (4)
|
||||||
public func send(msg:String, withData datas:[NSData]?) {
|
public func send(msg: String, withData datas: [NSData]?) {
|
||||||
if probing {
|
if probing {
|
||||||
probeWait.append((msg, PacketType.MESSAGE, datas))
|
probeWait.append((msg, PacketType.MESSAGE, datas))
|
||||||
} else {
|
} else {
|
||||||
@ -624,7 +624,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
/// Send polling message.
|
/// Send polling message.
|
||||||
/// Only call on emitQueue
|
/// Only call on emitQueue
|
||||||
private func sendPollMessage(var msg:String, withType type:PacketType,
|
private func sendPollMessage(var msg: String, withType type: PacketType,
|
||||||
datas:[NSData]? = nil) {
|
datas:[NSData]? = nil) {
|
||||||
SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue)
|
SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue)
|
||||||
|
|
||||||
@ -648,7 +648,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
/// Send message on WebSockets
|
/// Send message on WebSockets
|
||||||
/// Only call on emitQueue
|
/// Only call on emitQueue
|
||||||
private func sendWebSocketMessage(str:String, withType type:PacketType,
|
private func sendWebSocketMessage(str: String, withType type: PacketType,
|
||||||
datas:[NSData]? = nil) {
|
datas:[NSData]? = nil) {
|
||||||
SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue)
|
SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue)
|
||||||
|
|
||||||
@ -696,7 +696,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
/**
|
/**
|
||||||
Write a message, independent of transport.
|
Write a message, independent of transport.
|
||||||
*/
|
*/
|
||||||
public func write(msg:String, withType type:PacketType, withData data:[NSData]?) {
|
public func write(msg: String, withType type: PacketType, withData data: [NSData]?) {
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {[weak self] in
|
||||||
if let this = self where this.connected {
|
if let this = self where this.connected {
|
||||||
if this.websocket {
|
if this.websocket {
|
||||||
@ -715,7 +715,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
/**
|
/**
|
||||||
Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData
|
Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData
|
||||||
*/
|
*/
|
||||||
public func writeObjc(msg:String, withType type:Int, withData data:NSArray?) {
|
public func writeObjc(msg: String, withType type: Int, withData data: NSArray?) {
|
||||||
if let pType = PacketType(rawValue: type) {
|
if let pType = PacketType(rawValue: type) {
|
||||||
var arr = [NSData]()
|
var arr = [NSData]()
|
||||||
|
|
||||||
@ -744,7 +744,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func websocketDidDisconnect(socket:WebSocket, error:NSError?) {
|
public func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
|
||||||
websocketConnected = false
|
websocketConnected = false
|
||||||
probing = false
|
probing = false
|
||||||
|
|
||||||
@ -770,11 +770,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func websocketDidReceiveMessage(socket:WebSocket, text:String) {
|
public func websocketDidReceiveMessage(socket: WebSocket, text: String) {
|
||||||
parseEngineMessage(text, fromPolling: false)
|
parseEngineMessage(text, fromPolling: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func websocketDidReceiveData(socket:WebSocket, data:NSData) {
|
public func websocketDidReceiveData(socket: WebSocket, data: NSData) {
|
||||||
parseEngineData(data)
|
parseEngineData(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,12 +26,12 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
@objc public protocol SocketEngineClient {
|
@objc public protocol SocketEngineClient {
|
||||||
var handleQueue:dispatch_queue_t! {get}
|
var handleQueue: dispatch_queue_t! {get}
|
||||||
var socketURL:String {get}
|
var socketURL: String {get}
|
||||||
var secure:Bool {get}
|
var secure: Bool {get}
|
||||||
|
|
||||||
func didError(reason:AnyObject)
|
func didError(reason: AnyObject)
|
||||||
func engineDidClose(reason:String)
|
func engineDidClose(reason: String)
|
||||||
func parseSocketMessage(msg:String)
|
func parseSocketMessage(msg: String)
|
||||||
func parseBinaryData(data:NSData)
|
func parseBinaryData(data: NSData)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,22 +24,22 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
private func emitAckCallback(socket:SocketIOClient?, num:Int?)
|
private func emitAckCallback(socket: SocketIOClient?, num: Int?)
|
||||||
(items:AnyObject...) -> Void {
|
(items: AnyObject...) -> Void {
|
||||||
socket?.emitAck(num ?? -1, withData: items)
|
socket?.emitAck(num ?? -1, withData: items)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SocketEventHandler {
|
struct SocketEventHandler {
|
||||||
let event:String
|
let event: String
|
||||||
let callback:NormalCallback
|
let callback: NormalCallback
|
||||||
|
|
||||||
init(event:String, callback:NormalCallback) {
|
init(event: String, callback: NormalCallback) {
|
||||||
self.event = event
|
self.event = event
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
}
|
}
|
||||||
|
|
||||||
func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil,
|
func executeCallback(items: NSArray? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil,
|
||||||
withSocket socket:SocketIOClient? = nil) {
|
withSocket socket: SocketIOClient? = nil) {
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
self.callback(items, emitAckCallback(socket, num: ack))
|
self.callback(items, emitAckCallback(socket, num: ack))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,13 +25,13 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
func fixDoubleUTF8(inout name:String) {
|
func fixDoubleUTF8(inout name: String) {
|
||||||
let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)!
|
let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)!
|
||||||
let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)!
|
let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)!
|
||||||
name = latin1 as String
|
name = latin1 as String
|
||||||
}
|
}
|
||||||
|
|
||||||
func doubleEncodeUTF8(inout str:String) {
|
func doubleEncodeUTF8(inout str: String) {
|
||||||
let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)!
|
let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)!
|
||||||
let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)!
|
let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)!
|
||||||
str = utf8 as String
|
str = utf8 as String
|
||||||
|
|||||||
@ -31,51 +31,50 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
private var _connecting = false
|
private var _connecting = false
|
||||||
private var currentReconnectAttempt = 0
|
private var currentReconnectAttempt = 0
|
||||||
private var handlers = ContiguousArray<SocketEventHandler>()
|
private var handlers = ContiguousArray<SocketEventHandler>()
|
||||||
private var connectParams:[String: AnyObject]?
|
private var connectParams: [String: AnyObject]?
|
||||||
private var _secure = false
|
private var _secure = false
|
||||||
private var _reconnecting = false
|
private var _reconnecting = false
|
||||||
private var reconnectTimer:NSTimer?
|
private var reconnectTimer: NSTimer?
|
||||||
|
|
||||||
let reconnectAttempts:Int!
|
let reconnectAttempts: Int!
|
||||||
let logType = "SocketClient"
|
let logType = "SocketClient"
|
||||||
var ackHandlers = SocketAckManager()
|
var ackHandlers = SocketAckManager()
|
||||||
var currentAck = -1
|
var currentAck = -1
|
||||||
var log = false
|
var log = false
|
||||||
var waitingData = [SocketPacket]()
|
var waitingData = [SocketPacket]()
|
||||||
var sessionDelegate:NSURLSessionDelegate?
|
|
||||||
|
|
||||||
public let socketURL:String
|
public let socketURL: String
|
||||||
public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL)
|
public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL)
|
public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
public var closed:Bool {
|
public var closed: Bool {
|
||||||
return _closed
|
return _closed
|
||||||
}
|
}
|
||||||
public var connected:Bool {
|
public var connected: Bool {
|
||||||
return _connected
|
return _connected
|
||||||
}
|
}
|
||||||
public var connecting:Bool {
|
public var connecting: Bool {
|
||||||
return _connecting
|
return _connecting
|
||||||
}
|
}
|
||||||
public var engine:SocketEngine?
|
public var engine:SocketEngine?
|
||||||
public var nsp = "/"
|
public var nsp = "/"
|
||||||
public var opts:[String: AnyObject]?
|
public var opts: [String: AnyObject]?
|
||||||
public var reconnects = true
|
public var reconnects = true
|
||||||
public var reconnecting:Bool {
|
public var reconnecting: Bool {
|
||||||
return _reconnecting
|
return _reconnecting
|
||||||
}
|
}
|
||||||
public var reconnectWait = 10
|
public var reconnectWait = 10
|
||||||
public var secure:Bool {
|
public var secure: Bool {
|
||||||
return _secure
|
return _secure
|
||||||
}
|
}
|
||||||
public var sid:String? {
|
public var sid: String? {
|
||||||
return engine?.sid
|
return engine?.sid
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a new SocketIOClient. opts can be omitted
|
Create a new SocketIOClient. opts can be omitted
|
||||||
*/
|
*/
|
||||||
public init(var socketURL:String, opts:[String: AnyObject]? = nil) {
|
public init(var socketURL: String, opts: [String: AnyObject]? = nil) {
|
||||||
if socketURL["https://"].matches().count != 0 {
|
if socketURL["https://"].matches().count != 0 {
|
||||||
self._secure = true
|
self._secure = true
|
||||||
}
|
}
|
||||||
@ -86,11 +85,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
self.socketURL = socketURL
|
self.socketURL = socketURL
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
|
|
||||||
// Set options
|
|
||||||
if let sessionDelegate = opts?["sessionDelegate"] as? NSURLSessionDelegate {
|
|
||||||
self.sessionDelegate = sessionDelegate
|
|
||||||
}
|
|
||||||
|
|
||||||
if let connectParams = opts?["connectParams"] as? [String: AnyObject] {
|
if let connectParams = opts?["connectParams"] as? [String: AnyObject] {
|
||||||
self.connectParams = connectParams
|
self.connectParams = connectParams
|
||||||
}
|
}
|
||||||
@ -141,7 +135,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Will turn off automatic reconnects.
|
Will turn off automatic reconnects.
|
||||||
Pass true to fast if you're closing from a background task
|
Pass true to fast if you're closing from a background task
|
||||||
*/
|
*/
|
||||||
public func close(fast fast:Bool) {
|
public func close(fast fast: Bool) {
|
||||||
SocketLogger.log("Closing socket", client: self)
|
SocketLogger.log("Closing socket", client: self)
|
||||||
|
|
||||||
reconnects = false
|
reconnects = false
|
||||||
@ -162,7 +156,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Connect to the server. If we aren't connected after timeoutAfter, call handler
|
Connect to the server. If we aren't connected after timeoutAfter, call handler
|
||||||
*/
|
*/
|
||||||
public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) {
|
public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) {
|
||||||
if closed {
|
if closed {
|
||||||
SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self)
|
SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self)
|
||||||
_closed = false
|
_closed = false
|
||||||
@ -191,7 +185,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createOnAck(event:String, items:[AnyObject]) -> OnAckCallback {
|
private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback {
|
||||||
return {[weak self, ack = ++currentAck] timeout, callback in
|
return {[weak self, ack = ++currentAck] timeout, callback in
|
||||||
if let this = self {
|
if let this = self {
|
||||||
this.ackHandlers.addAck(ack, callback: callback)
|
this.ackHandlers.addAck(ack, callback: callback)
|
||||||
@ -226,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
handleEvent("connect", data: nil, isInternalMessage: false)
|
handleEvent("connect", data: nil, isInternalMessage: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func didDisconnect(reason:String) {
|
func didDisconnect(reason: String) {
|
||||||
if closed {
|
if closed {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -245,7 +239,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// error
|
/// error
|
||||||
public func didError(reason:AnyObject) {
|
public func didError(reason: AnyObject) {
|
||||||
SocketLogger.err("%@", client: self, args: reason)
|
SocketLogger.err("%@", client: self, args: reason)
|
||||||
|
|
||||||
handleEvent("error", data: reason as? [AnyObject] ?? [reason],
|
handleEvent("error", data: reason as? [AnyObject] ?? [reason],
|
||||||
@ -255,14 +249,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Same as close
|
Same as close
|
||||||
*/
|
*/
|
||||||
public func disconnect(fast fast:Bool) {
|
public func disconnect(fast fast: Bool) {
|
||||||
close(fast: fast)
|
close(fast: fast)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Send a message to the server
|
Send a message to the server
|
||||||
*/
|
*/
|
||||||
public func emit(event:String, _ items:AnyObject...) {
|
public func emit(event:String, _ items: AnyObject...) {
|
||||||
if !connected {
|
if !connected {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -275,7 +269,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Same as emit, but meant for Objective-C
|
Same as emit, but meant for Objective-C
|
||||||
*/
|
*/
|
||||||
public func emit(event:String, withItems items:[AnyObject]) {
|
public func emit(event: String, withItems items: [AnyObject]) {
|
||||||
if !connected {
|
if !connected {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -289,7 +283,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add
|
Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add
|
||||||
an ack.
|
an ack.
|
||||||
*/
|
*/
|
||||||
public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback {
|
public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback {
|
||||||
if !connected {
|
if !connected {
|
||||||
return createOnAck(event, items: items)
|
return createOnAck(event, items: items)
|
||||||
}
|
}
|
||||||
@ -300,7 +294,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Same as emitWithAck, but for Objective-C
|
Same as emitWithAck, but for Objective-C
|
||||||
*/
|
*/
|
||||||
public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback {
|
public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback {
|
||||||
if !connected {
|
if !connected {
|
||||||
return createOnAck(event, items: items)
|
return createOnAck(event, items: items)
|
||||||
}
|
}
|
||||||
@ -308,7 +302,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
return createOnAck(event, items: items)
|
return createOnAck(event, items: items)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) {
|
private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) {
|
||||||
if !connected {
|
if !connected {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -326,7 +320,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the server wants to know that the client received data
|
// If the server wants to know that the client received data
|
||||||
func emitAck(ack:Int, withData args:[AnyObject]) {
|
func emitAck(ack: Int, withData args: [AnyObject]) {
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {[weak self] in
|
||||||
if let this = self where this.connected {
|
if let this = self where this.connected {
|
||||||
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp)
|
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp)
|
||||||
@ -344,7 +338,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func engineDidClose(reason:String) {
|
public func engineDidClose(reason: String) {
|
||||||
_connected = false
|
_connected = false
|
||||||
_connecting = false
|
_connecting = false
|
||||||
|
|
||||||
@ -357,7 +351,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Called when the socket gets an ack for something it sent
|
// Called when the socket gets an ack for something it sent
|
||||||
func handleAck(ack:Int, data:AnyObject?) {
|
func handleAck(ack: Int, data: AnyObject?) {
|
||||||
SocketLogger.log("Handling ack: %@ with data: %@", client: self,
|
SocketLogger.log("Handling ack: %@ with data: %@", client: self,
|
||||||
args: ack, data ?? "")
|
args: ack, data ?? "")
|
||||||
|
|
||||||
@ -368,8 +362,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Causes an event to be handled. Only use if you know what you're doing.
|
Causes an event to be handled. Only use if you know what you're doing.
|
||||||
*/
|
*/
|
||||||
public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false,
|
public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool = false,
|
||||||
wantsAck ack:Int? = nil) {
|
wantsAck ack: Int? = nil) {
|
||||||
// println("Should do event: \(event) with data: \(data)")
|
// println("Should do event: \(event) with data: \(data)")
|
||||||
if !connected && !isInternalMessage {
|
if !connected && !isInternalMessage {
|
||||||
return
|
return
|
||||||
@ -417,7 +411,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Removes handler(s)
|
Removes handler(s)
|
||||||
*/
|
*/
|
||||||
public func off(event:String) {
|
public func off(event: String) {
|
||||||
SocketLogger.log("Removing handler for event: %@", client: self, args: event)
|
SocketLogger.log("Removing handler for event: %@", client: self, args: event)
|
||||||
|
|
||||||
handlers = ContiguousArray(handlers.filter {!($0.event == event)})
|
handlers = ContiguousArray(handlers.filter {!($0.event == event)})
|
||||||
@ -426,7 +420,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Adds a handler for an event.
|
Adds a handler for an event.
|
||||||
*/
|
*/
|
||||||
public func on(event:String, callback:NormalCallback) {
|
public func on(event: String, callback: NormalCallback) {
|
||||||
SocketLogger.log("Adding handler for event: %@", client: self, args: event)
|
SocketLogger.log("Adding handler for event: %@", client: self, args: event)
|
||||||
|
|
||||||
let handler = SocketEventHandler(event: event, callback: callback)
|
let handler = SocketEventHandler(event: event, callback: callback)
|
||||||
@ -444,7 +438,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
/**
|
/**
|
||||||
Adds a handler that will be called on every event.
|
Adds a handler that will be called on every event.
|
||||||
*/
|
*/
|
||||||
public func onAny(handler:(SocketAnyEvent) -> Void) {
|
public func onAny(handler: (SocketAnyEvent) -> Void) {
|
||||||
anyHandler = handler
|
anyHandler = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,11 +449,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
connect()
|
connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseSocketMessage(msg:String) {
|
public func parseSocketMessage(msg: String) {
|
||||||
SocketParser.parseSocketMessage(msg, socket: self)
|
SocketParser.parseSocketMessage(msg, socket: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseBinaryData(data:NSData) {
|
public func parseBinaryData(data: NSData) {
|
||||||
SocketParser.parseBinaryData(data, socket: self)
|
SocketParser.parseBinaryData(data, socket: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +469,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
tryReconnect()
|
tryReconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
// We lost connection and should attempt to reestablish
|
|
||||||
@objc private func tryReconnect() {
|
@objc private func tryReconnect() {
|
||||||
if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
|
if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
|
||||||
clearReconnectTimer()
|
clearReconnectTimer()
|
||||||
|
|||||||
@ -25,18 +25,18 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
protocol SocketLogClient {
|
protocol SocketLogClient {
|
||||||
var log:Bool {get set}
|
var log: Bool {get set}
|
||||||
var logType:String {get}
|
var logType: String {get}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class SocketLogger {
|
final class SocketLogger {
|
||||||
private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL)
|
private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
|
|
||||||
private static func toCVArgType(item:AnyObject) -> CVarArgType {
|
private static func toCVArgType(item: AnyObject) -> CVarArgType {
|
||||||
return String(item)
|
return String(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func log(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) {
|
static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) {
|
||||||
if !client.log {
|
if !client.log {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -49,7 +49,7 @@ final class SocketLogger {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func err(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) {
|
static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) {
|
||||||
if !client.log {
|
if !client.log {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,12 +25,12 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct SocketPacket {
|
struct SocketPacket {
|
||||||
let nsp:String
|
let nsp: String
|
||||||
let id:Int
|
let id: Int
|
||||||
let placeholders:Int
|
let placeholders: Int
|
||||||
let type:PacketType
|
let type: PacketType
|
||||||
|
|
||||||
enum PacketType:Int {
|
enum PacketType: Int {
|
||||||
case CONNECT = 0
|
case CONNECT = 0
|
||||||
case DISCONNECT = 1
|
case DISCONNECT = 1
|
||||||
case EVENT = 2
|
case EVENT = 2
|
||||||
@ -39,7 +39,7 @@ struct SocketPacket {
|
|||||||
case BINARY_EVENT = 5
|
case BINARY_EVENT = 5
|
||||||
case BINARY_ACK = 6
|
case BINARY_ACK = 6
|
||||||
|
|
||||||
init?(str:String) {
|
init?(str: String) {
|
||||||
if let int = Int(str), raw = PacketType(rawValue: int) {
|
if let int = Int(str), raw = PacketType(rawValue: int) {
|
||||||
self = raw
|
self = raw
|
||||||
} else {
|
} else {
|
||||||
@ -49,9 +49,9 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var currentPlace = 0
|
var currentPlace = 0
|
||||||
var binary:[NSData]
|
var binary: [NSData]
|
||||||
var data:[AnyObject]
|
var data: [AnyObject]
|
||||||
var description:String {
|
var description: String {
|
||||||
var better = "SocketPacket {type: ~~0; data: ~~1; " +
|
var better = "SocketPacket {type: ~~0; data: ~~1; " +
|
||||||
"id: ~~2; placeholders: ~~3;}"
|
"id: ~~2; placeholders: ~~3;}"
|
||||||
|
|
||||||
@ -63,8 +63,8 @@ struct SocketPacket {
|
|||||||
return better
|
return better
|
||||||
}
|
}
|
||||||
|
|
||||||
init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1,
|
init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1,
|
||||||
nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) {
|
nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) {
|
||||||
self.data = data
|
self.data = data
|
||||||
self.id = id
|
self.id = id
|
||||||
self.nsp = nsp
|
self.nsp = nsp
|
||||||
@ -73,7 +73,7 @@ struct SocketPacket {
|
|||||||
self.binary = binary
|
self.binary = binary
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func addData(data:NSData) -> Bool {
|
mutating func addData(data: NSData) -> Bool {
|
||||||
if placeholders == currentPlace {
|
if placeholders == currentPlace {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func completeMessage(var message:String, ack:Bool = false) -> String {
|
private func completeMessage(var message: String, ack: Bool) -> String {
|
||||||
if data.count == 0 {
|
if data.count == 0 {
|
||||||
return message + "]"
|
return message + "]"
|
||||||
} else if !ack {
|
} else if !ack {
|
||||||
@ -127,7 +127,7 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createAck() -> String {
|
func createAck() -> String {
|
||||||
let msg:String
|
let msg: String
|
||||||
|
|
||||||
if type == PacketType.ACK {
|
if type == PacketType.ACK {
|
||||||
if nsp == "/" {
|
if nsp == "/" {
|
||||||
@ -147,8 +147,8 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func createMessageForEvent(event:String) -> String {
|
func createMessageForEvent(event: String) -> String {
|
||||||
let message:String
|
let message: String
|
||||||
|
|
||||||
if type == PacketType.EVENT {
|
if type == PacketType.EVENT {
|
||||||
if nsp == "/" {
|
if nsp == "/" {
|
||||||
@ -180,7 +180,7 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return completeMessage(message)
|
return completeMessage(message, ack: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutating func fillInPlaceholders() {
|
mutating func fillInPlaceholders() {
|
||||||
@ -197,7 +197,7 @@ struct SocketPacket {
|
|||||||
data = newArr as [AnyObject]
|
data = newArr as [AnyObject]
|
||||||
}
|
}
|
||||||
|
|
||||||
private mutating func _fillInPlaceholders(data:AnyObject) -> AnyObject {
|
private mutating func _fillInPlaceholders(data: AnyObject) -> AnyObject {
|
||||||
if let str = data as? String {
|
if let str = data as? String {
|
||||||
if let num = str["~~(\\d)"].groups() {
|
if let num = str["~~(\\d)"].groups() {
|
||||||
return binary[Int(num[1])!]
|
return binary[Int(num[1])!]
|
||||||
@ -246,7 +246,7 @@ struct SocketPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension SocketPacket {
|
extension SocketPacket {
|
||||||
private static func findType(binCount:Int, ack:Bool) -> PacketType {
|
private static func findType(binCount: Int, ack: Bool) -> PacketType {
|
||||||
switch binCount {
|
switch binCount {
|
||||||
case 0 where !ack:
|
case 0 where !ack:
|
||||||
return PacketType.EVENT
|
return PacketType.EVENT
|
||||||
@ -261,7 +261,7 @@ extension SocketPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket {
|
static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket {
|
||||||
let (parsedData, binary) = deconstructData(data)
|
let (parsedData, binary) = deconstructData(data)
|
||||||
let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData,
|
let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData,
|
||||||
id: id, nsp: nsp, placeholders: -1, binary: binary)
|
id: id, nsp: nsp, placeholders: -1, binary: binary)
|
||||||
@ -269,7 +269,7 @@ extension SocketPacket {
|
|||||||
return packet
|
return packet
|
||||||
}
|
}
|
||||||
|
|
||||||
static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket {
|
static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket {
|
||||||
let (parsedData, binary) = deconstructData(data)
|
let (parsedData, binary) = deconstructData(data)
|
||||||
let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData,
|
let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData,
|
||||||
id: id, nsp: nsp, placeholders: -1, binary: binary)
|
id: id, nsp: nsp, placeholders: -1, binary: binary)
|
||||||
@ -279,7 +279,7 @@ extension SocketPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension SocketPacket {
|
extension SocketPacket {
|
||||||
private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject {
|
private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject {
|
||||||
if let bin = data as? NSData {
|
if let bin = data as? NSData {
|
||||||
let placeholder = ["_placeholder" :true, "num": binary.count]
|
let placeholder = ["_placeholder" :true, "num": binary.count]
|
||||||
|
|
||||||
@ -307,7 +307,7 @@ extension SocketPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func deconstructData(var data:[AnyObject]) -> ([AnyObject], [NSData]) {
|
private static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) {
|
||||||
var binary = [NSData]()
|
var binary = [NSData]()
|
||||||
|
|
||||||
for i in 0..<data.count {
|
for i in 0..<data.count {
|
||||||
|
|||||||
@ -23,11 +23,11 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class SocketParser {
|
class SocketParser {
|
||||||
private static func isCorrectNamespace(nsp:String, _ socket:SocketIOClient) -> Bool {
|
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
|
||||||
return nsp == socket.nsp
|
return nsp == socket.nsp
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleAck(p:SocketPacket, socket:SocketIOClient) {
|
private static func handleAck(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
if !isCorrectNamespace(p.nsp, socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ class SocketParser {
|
|||||||
socket.handleAck(p.id, data: p.data)
|
socket.handleAck(p.id, data: p.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) {
|
private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
if !isCorrectNamespace(p.nsp, socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -43,7 +43,7 @@ class SocketParser {
|
|||||||
socket.waitingData.append(p)
|
socket.waitingData.append(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) {
|
private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
if !isCorrectNamespace(p.nsp, socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -51,7 +51,7 @@ class SocketParser {
|
|||||||
socket.waitingData.append(p)
|
socket.waitingData.append(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleConnect(p:SocketPacket, socket:SocketIOClient) {
|
private static func handleConnect(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if p.nsp == "/" && socket.nsp != "/" {
|
if p.nsp == "/" && socket.nsp != "/" {
|
||||||
socket.joinNamespace()
|
socket.joinNamespace()
|
||||||
} else if p.nsp != "/" && socket.nsp == "/" {
|
} else if p.nsp != "/" && socket.nsp == "/" {
|
||||||
@ -61,7 +61,7 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleEvent(p:SocketPacket, socket:SocketIOClient) {
|
private static func handleEvent(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
if !isCorrectNamespace(p.nsp, socket) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Translation of socket.io-client#decodeString
|
// Translation of socket.io-client#decodeString
|
||||||
static func parseString(str:String) -> SocketPacket? {
|
static func parseString(str: String) -> SocketPacket? {
|
||||||
let arr = Array(str.characters)
|
let arr = Array(str.characters)
|
||||||
let type = String(arr[0])
|
let type = String(arr[0])
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ class SocketParser {
|
|||||||
return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/")
|
return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/")
|
||||||
}
|
}
|
||||||
|
|
||||||
var id = nil as Int?
|
var id: Int?
|
||||||
var nsp:String?
|
var nsp:String?
|
||||||
var i = 0
|
var i = 0
|
||||||
var placeholders = -1
|
var placeholders = -1
|
||||||
@ -150,10 +150,11 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parses data for events
|
// Parses data for events
|
||||||
static func parseData(data:String) -> AnyObject? {
|
static func parseData(data: String) -> AnyObject? {
|
||||||
var err:NSError?
|
var err: NSError?
|
||||||
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
|
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
|
||||||
let parsed:AnyObject?
|
let parsed: AnyObject?
|
||||||
|
|
||||||
do {
|
do {
|
||||||
parsed = try NSJSONSerialization.JSONObjectWithData(stringData!,
|
parsed = try NSJSONSerialization.JSONObjectWithData(stringData!,
|
||||||
options: NSJSONReadingOptions.MutableContainers)
|
options: NSJSONReadingOptions.MutableContainers)
|
||||||
@ -171,14 +172,14 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parses messages recieved
|
// Parses messages recieved
|
||||||
static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) {
|
static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) {
|
||||||
if stringMessage == "" {
|
if stringMessage == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage)
|
SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage)
|
||||||
|
|
||||||
let p:SocketPacket
|
let p: SocketPacket
|
||||||
|
|
||||||
if let pack = parseString(stringMessage) {
|
if let pack = parseString(stringMessage) {
|
||||||
p = pack
|
p = pack
|
||||||
@ -207,7 +208,7 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func parseBinaryData(data:NSData, socket:SocketIOClient) {
|
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
|
||||||
if socket.waitingData.count == 0 {
|
if socket.waitingData.count == 0 {
|
||||||
SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser")
|
SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser")
|
||||||
return
|
return
|
||||||
|
|||||||
@ -27,4 +27,4 @@ import Foundation
|
|||||||
public typealias AckCallback = (NSArray?) -> Void
|
public typealias AckCallback = (NSArray?) -> Void
|
||||||
public typealias AckEmitter = (AnyObject...) -> Void
|
public typealias AckEmitter = (AnyObject...) -> Void
|
||||||
public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
||||||
public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void
|
public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user