merge master

This commit is contained in:
Erik 2015-03-21 11:42:52 -04:00
commit 504d0fbd18
5 changed files with 264 additions and 304 deletions

View File

@ -47,11 +47,11 @@ public class SocketEngine: NSObject, WebSocketDelegate {
unowned let client:SocketEngineClient unowned let client:SocketEngineClient
private let workQueue = NSOperationQueue() private let workQueue = NSOperationQueue()
private let emitQueue = dispatch_queue_create( private let emitQueue = dispatch_queue_create(
"emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "engineEmitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let parseQueue = dispatch_queue_create( private let parseQueue = dispatch_queue_create(
"parseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "engineParseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let handleQueue = dispatch_queue_create( private let handleQueue = dispatch_queue_create(
"handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "engineHandleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let session:NSURLSession! private let session:NSURLSession!
private var _connected = false private var _connected = false
private var fastUpgrade = false private var fastUpgrade = false
@ -91,7 +91,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
func close() { func close() {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.send(PacketType.CLOSE.rawValue) self.send(PacketType.CLOSE.rawValue, withData: nil)
} }
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@ -271,7 +271,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
// A poll failed, tell the client about it // A poll failed, tell the client about it
private func handlePollingFailed(reason:NSError?) { private func handlePollingFailed(reason:NSError) {
assert(self.polling, "Polling failed when we're not polling") assert(self.polling, "Polling failed when we're not polling")
if !self.client.reconnecting { if !self.client.reconnecting {
@ -422,12 +422,6 @@ public class SocketEngine: NSObject, WebSocketDelegate {
fixDoubleUTF8(&message) fixDoubleUTF8(&message)
} }
// We should upgrade
if message == "3probe" {
self.upgradeTransport()
return
}
let type = message["^(\\d)"].groups()?[1] let type = message["^(\\d)"].groups()?[1]
if type != PacketType.MESSAGE.rawValue { if type != PacketType.MESSAGE.rawValue {
@ -452,8 +446,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.doPoll() self.doPoll()
return return
} else if type == PacketType.PONG.rawValue { } else if type == PacketType.PONG.rawValue {
// We should upgrade
if message == "3probe" {
self.upgradeTransport()
return return
} }
}
if message == PacketType.CLOSE.rawValue { if message == PacketType.CLOSE.rawValue {
// do nothing // do nothing
@ -481,7 +479,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
/* /*
Send a message with type 4 Send a message with type 4
*/ */
public func send(msg:String, datas:[NSData]? = nil) { public func send(msg:String, withData datas:[NSData]?) {
if self.probing { if self.probing {
self.probeWait.append((msg, PacketType.MESSAGE, datas)) self.probeWait.append((msg, PacketType.MESSAGE, datas))
} else { } else {

View File

@ -35,7 +35,7 @@ import Foundation
func parseSocketMessage(msg:String) func parseSocketMessage(msg:String)
func parseBinaryData(data:NSData) func parseBinaryData(data:NSData)
func pollingDidFail(err:NSError?) func pollingDidFail(err:NSError)
func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool) func webSocketDidCloseWithCode(code:Int, reason:String, wasClean:Bool)
func webSocketDidFailWithError(error:NSError) func webSocketDidFailWithError(error:NSError)
} }

View File

@ -42,7 +42,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
private var reconnectTimer:NSTimer? private var reconnectTimer:NSTimer?
internal var currentAck = -1 internal var currentAck = -1
internal var waitingData = [SocketEvent]() internal var waitingData = [SocketPacket]()
public let socketURL:String public let socketURL:String
public let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), public let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
@ -190,7 +190,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
self.reconnects = false self.reconnects = false
self._connecting = false self._connecting = false
self._reconnecting = false self._reconnecting = false
self.handleEvent("disconnect", data: message, isInternalMessage: true) self.handleEvent("disconnect", data: [message], isInternalMessage: true)
} }
/** /**
@ -244,7 +244,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) {
var frame:SocketEvent var frame:SocketPacket
var str:String var str:String
let (items, hasBinary, emitDatas) = SocketParser.parseEmitArgs(args) let (items, hasBinary, emitDatas) = SocketParser.parseEmitArgs(args)
@ -255,24 +255,24 @@ public class SocketIOClient: NSObject, SocketEngineClient {
if hasBinary { if hasBinary {
if ack == nil { if ack == nil {
str = SocketEvent.createMessageForEvent(event, withArgs: items, str = SocketPacket.createMessageForEvent(event, withArgs: items,
hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp) hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp)
} else { } else {
str = SocketEvent.createMessageForEvent(event, withArgs: items, str = SocketPacket.createMessageForEvent(event, withArgs: items,
hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack) hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack)
} }
self.engine?.send(str, datas: emitDatas) self.engine?.send(str, withData: emitDatas)
} else { } else {
if ack == nil { if ack == nil {
str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: false,
withDatas: 0, toNamespace: self.nsp) withDatas: 0, toNamespace: self.nsp)
} else { } else {
str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, str = SocketPacket.createMessageForEvent(event, withArgs: items, hasBinary: false,
withDatas: 0, toNamespace: self.nsp, wantsAck: ack) withDatas: 0, toNamespace: self.nsp, wantsAck: ack)
} }
self.engine?.send(str) self.engine?.send(str, withData: nil)
} }
} }
@ -289,24 +289,24 @@ public class SocketIOClient: NSObject, SocketEngineClient {
if !hasBinary { if !hasBinary {
if self?.nsp == nil { if self?.nsp == nil {
str = SocketEvent.createAck(ack, withArgs: items, str = SocketPacket.createAck(ack, withArgs: items,
withAckType: 3, withNsp: "/") withAckType: 3, withNsp: "/")
} else { } else {
str = SocketEvent.createAck(ack, withArgs: items, str = SocketPacket.createAck(ack, withArgs: items,
withAckType: 3, withNsp: self!.nsp!) withAckType: 3, withNsp: self!.nsp!)
} }
self?.engine?.send(str) self?.engine?.send(str, withData: nil)
} else { } else {
if self?.nsp == nil { if self?.nsp == nil {
str = SocketEvent.createAck(ack, withArgs: items, str = SocketPacket.createAck(ack, withArgs: items,
withAckType: 6, withNsp: "/", withBinary: emitDatas.count) withAckType: 6, withNsp: "/", withBinary: emitDatas.count)
} else { } else {
str = SocketEvent.createAck(ack, withArgs: items, str = SocketPacket.createAck(ack, withArgs: items,
withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count) withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count)
} }
self?.engine?.send(str, datas: emitDatas) self?.engine?.send(str, withData: emitDatas)
} }
} }
} }
@ -333,7 +333,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
/** /**
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, withAckType ackType:Int = 3) { wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
// println("Should do event: \(event) with data: \(data)") // println("Should do event: \(event) with data: \(data)")
if !self.connected && !isInternalMessage { if !self.connected && !isInternalMessage {
@ -349,29 +349,11 @@ public class SocketIOClient: NSObject, SocketEngineClient {
for handler in self.handlers { for handler in self.handlers {
if handler.event == event { if handler.event == event {
if data is NSArray {
if ack != nil { if ack != nil {
handler.executeCallback(data as? NSArray, withAck: ack!, handler.executeCallback(data, withAck: ack!,
withAckType: ackType, withSocket: self) withAckType: ackType, withSocket: self)
} else { } else {
handler.executeCallback(data as? NSArray) handler.executeCallback(data)
}
} else {
// Trying to do a ternary expression in the executeCallback method
// seemed to crash Swift
var dataArr:NSArray? = nil
if let data:AnyObject = data {
dataArr = [data]
}
if ack != nil {
handler.executeCallback(dataArr, withAck: ack!,
withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(dataArr)
}
} }
} }
} }
@ -380,7 +362,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
// Should be removed and moved to SocketEngine // Should be removed and moved to SocketEngine
func joinNamespace() { func joinNamespace() {
if self.nsp != nil { if self.nsp != nil {
self.engine?.send("0/\(self.nsp!)") self.engine?.send("0/\(self.nsp!)", withData: nil)
} }
} }
@ -415,10 +397,10 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
// Something happened while polling // Something happened while polling
public func pollingDidFail(err:NSError?) { public func pollingDidFail(err:NSError) {
if !self.reconnecting { if !self.reconnecting {
self._connected = false self._connected = false
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true) self.handleEvent("reconnect", data: [err.localizedDescription], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()
} }
} }
@ -452,7 +434,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
} }
} }
self.handleEvent("reconnectAttempt", data: self.reconnectAttempts - self.currentReconnectAttempt, self.handleEvent("reconnectAttempt", data: [self.reconnectAttempts - self.currentReconnectAttempt],
isInternalMessage: true) isInternalMessage: true)
self.currentReconnectAttempt++ self.currentReconnectAttempt++
@ -470,7 +452,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
if self.closed || !self.reconnects { if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed") self.didForceClose(message: "WebSocket closed")
} else { } else {
self.handleEvent("reconnect", data: reason, isInternalMessage: true) self.handleEvent("reconnect", data: [reason], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()
} }
} }
@ -479,11 +461,11 @@ public class SocketIOClient: NSObject, SocketEngineClient {
public func webSocketDidFailWithError(error:NSError) { public func webSocketDidFailWithError(error:NSError) {
self._connected = false self._connected = false
self._connecting = false self._connecting = false
self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true) self.handleEvent("error", data: [error.localizedDescription], isInternalMessage: true)
if self.closed || !self.reconnects { if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed with an error \(error)") self.didForceClose(message: "WebSocket closed with an error \(error)")
} else if !self.reconnecting { } else if !self.reconnecting {
self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true) self.handleEvent("reconnect", data: [error.localizedDescription], isInternalMessage: true)
self.tryReconnect() self.tryReconnect()
} }
} }

View File

@ -1,5 +1,5 @@
// //
// Event.swift // SocketPacket.swift
// Socket.IO-Swift // Socket.IO-Swift
// //
// Created by Erik Little on 1/18/15. // Created by Erik Little on 1/18/15.
@ -24,21 +24,51 @@
import Foundation import Foundation
class SocketEvent { enum SocketPacketType: Int {
let justAck:Bool! case CONNECT = 0
var ack:Int? case DISCONNECT = 1
var args:AnyObject! case EVENT = 2
lazy var currentPlace = 0 case ACK = 3
lazy var datas = [NSData]() case ERROR = 4
var event:String! case BINARY_EVENT = 5
var placeholders:Int! case BINARY_ACK = 6
init(event:String, args:AnyObject?, placeholders:Int = 0, ackNum:Int? = nil, justAck:Bool = false) { init(str:String) {
self.event = event if let int = str.toInt() {
self.args = args self = SocketPacketType(rawValue: int)!
} else {
self = SocketPacketType(rawValue: 4)!
}
}
}
class SocketPacket {
let type:SocketPacketType
var binary = [NSData]()
var currentPlace = 0
var data:[AnyObject]?
var id:Int?
var justAck = false
var nsp = ""
var placeholders:Int?
init(type:SocketPacketType, data:[AnyObject]? = nil, nsp:String = "",
placeholders:Int? = nil, id:Int? = nil) {
self.type = type
self.data = data
self.nsp = nsp
self.placeholders = placeholders self.placeholders = placeholders
self.ack = ackNum self.id = id
self.justAck = justAck }
/// Only call if you know data is not nil
func createBinaryPlaceHolders() {
var strData = "\(self.data!)"
println(strData)
}
func getEvent() -> String {
return data?.removeAtIndex(0) as String
} }
func addData(data:NSData) -> Bool { func addData(data:NSData) -> Bool {
@ -54,7 +84,7 @@ class SocketEvent {
return true return true
} }
self.datas.append(data) self.binary.append(data)
self.currentPlace++ self.currentPlace++
if checkDoEvent() { if checkDoEvent() {
@ -174,7 +204,7 @@ class SocketEvent {
newArr[i] = self.fillInDict(dict) newArr[i] = self.fillInDict(dict)
} else if let str = arr[i] as? String { } else if let str = arr[i] as? String {
if let num = str["~~(\\d)"].groups() { if let num = str["~~(\\d)"].groups() {
newArr[i] = self.datas[num[1].toInt()!] newArr[i] = self.binary[num[1].toInt()!]
} else { } else {
newArr[i] = arr[i] newArr[i] = arr[i]
} }
@ -210,41 +240,25 @@ class SocketEvent {
return newDict return newDict
} }
func fillInPlaceholders(_ args:AnyObject = true) -> AnyObject { func fillInPlaceholders() {
if let dict = args as? NSDictionary { var newArr = [AnyObject](count: self.data!.count, repeatedValue: 0)
return self.fillInDict(dict)
} else if let arr = args as? NSArray {
return self.fillInArray(args as! NSArray)
} else if let string = args as? String {
if string == "~~\(self.currentPlace)" {
return self.datas[0]
}
} else if args is Bool {
// We have multiple items
// Do it live
let argsAsArray = "[\(self.args)]"
if let parsedArr = SocketParser.parseData(argsAsArray) as? NSArray {
var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0)
for i in 0..<parsedArr.count { for i in 0..<self.data!.count {
if let str = parsedArr[i] as? String { if let str = self.data?[i] as? String {
if let num = str["~~(\\d)"].groups() { if let num = str["~~(\\d)"].groups() {
returnArr[i] = self.datas[num[1].toInt()!] newArr[i] = self.binary[num[1].toInt()!]
} else { } else {
returnArr[i] = str newArr[i] = str
} }
} else if let arr = parsedArr[i] as? NSArray { } else if let arr = self.data?[i] as? NSArray {
returnArr[i] = self.fillInArray(arr) newArr[i] = self.fillInArray(arr)
} else if let dict = parsedArr[i] as? NSDictionary { } else if let dict = self.data?[i] as? NSDictionary {
returnArr[i] = self.fillInDict(dict) newArr[i] = self.fillInDict(dict)
} else { } else {
returnArr[i] = parsedArr[i] newArr[i] = self.data![i]
}
}
return returnArr
} }
} }
return false self.data = newArr
} }
} }

View File

@ -23,6 +23,85 @@
import Foundation import Foundation
class SocketParser { class SocketParser {
// Translation of socket.io-client#decodeString
class func parseString(str:String) -> SocketPacket? {
let arr = Array(str)
let type = String(arr[0])
if arr.count == 1 {
return SocketPacket(type: SocketPacketType(str: type))
}
var id = nil as Int?
var nsp = ""
var i = 0
var placeholders = -1
if type == "5" || type == "6" {
var buf = ""
while arr[++i] != "-" {
buf += String(arr[i])
if i == arr.count {
break
}
}
if buf.toInt() == nil || arr[i] != "-" {
println(buf)
NSLog("Error parsing \(str)")
return nil
} else {
placeholders = buf.toInt()!
}
}
if arr[i + 1] == "/" {
while ++i < arr.count {
let c = arr[i]
if c == "," {
break
}
nsp += String(c)
}
}
if i + 1 >= arr.count {
return SocketPacket(type: SocketPacketType(str: type),
nsp: nsp, placeholders: placeholders, id: id)
}
let next = String(arr[i + 1])
if next.toInt() != nil {
var c = ""
while ++i < arr.count {
if let int = String(arr[i]).toInt() {
c += String(arr[i])
} else {
--i
break
}
}
id = c.toInt()
}
if i + 1 < arr.count {
let d = String(arr[++i...arr.count-1])
let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\""
let data = SocketParser.parseData(noPlaceholders) as [AnyObject]
return SocketPacket(type: SocketPacketType(str: type), data: data,
nsp: nsp, placeholders: placeholders, id: id)
}
return nil
}
// Parse an NSArray looking for binary data // Parse an NSArray looking for binary data
class func parseArray(arr:NSArray, var currentPlaceholder:Int) -> (NSArray, Bool, [NSData]) { class func parseArray(arr:NSArray, var currentPlaceholder:Int) -> (NSArray, Bool, [NSData]) {
var replacementArr = [AnyObject](count: arr.count, repeatedValue: 1) var replacementArr = [AnyObject](count: arr.count, repeatedValue: 1)
@ -72,13 +151,9 @@ class SocketParser {
} }
// Parses data for events // Parses data for events
class func parseData(data:String?) -> AnyObject? { class func parseData(data:String) -> AnyObject? {
if data == nil {
return nil
}
var err:NSError? var err:NSError?
let stringData = data!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!, let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!,
options: NSJSONReadingOptions.AllowFragments, error: &err) options: NSJSONReadingOptions.AllowFragments, error: &err)
@ -190,77 +265,53 @@ class SocketParser {
return return
} }
// NSLog(stringMessage) func checkNSP(nsp:String) -> Bool {
// Check for successful namepsace connect
if socket.nsp != nil {
if stringMessage == "0/\(socket.nsp!)" {
socket.didConnect()
return
}
}
if stringMessage == "0" {
if socket.nsp != nil {
// Join namespace
socket.joinNamespace()
return
} else {
socket.didConnect()
return
}
} else if stringMessage == "1" {
socket.didForceClose(message: "Got disconnect")
return
}
if stringMessage.hasPrefix("5") || stringMessage.hasPrefix("6") {
// Check for message with binary placeholders
self.parseBinaryMessage(stringMessage, socket: socket)
return
}
let type = stringMessage.removeAtIndex(stringMessage.startIndex)
if type == "2" {
if let groups = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let namespace = groups[2]
let ackNum = groups[3]
let event = groups[4]
let data = "[\(groups[5])]"
if namespace == "" && socket.nsp != nil {
return
}
if let parsed:AnyObject = self.parseData(data) {
if ackNum == "" {
socket.handleEvent(event, data: parsed)
} else {
socket.currentAck = ackNum.toInt()!
socket.handleEvent(event, data: parsed, isInternalMessage: false,
wantsAck: ackNum.toInt(), withAckType: 3)
}
}
}
} else if type == "3" {
if let ackGroup = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let nsp = ackGroup[2]
let ackNum = ackGroup[3]
let ackData:AnyObject? = self.parseData("[\(ackGroup[4])]")
if nsp == "" && socket.nsp != nil { if nsp == "" && socket.nsp != nil {
return true
} else {
return false
}
}
var p = parseString(stringMessage) as SocketPacket!
if p.type == SocketPacketType.EVENT {
if checkNSP(p.nsp) {
return return
} }
socket.handleAck(ackNum.toInt()!, data: ackData) socket.handleEvent(p.getEvent(), data: p.data, isInternalMessage: false, wantsAck: p.id, withAckType: 3)
} } else if p.type == SocketPacketType.ACK {
} else { if checkNSP(p.nsp) {
NSLog("Error in parsing message: %s", stringMessage)
return return
} }
socket.handleAck(p.id!, data: p.data)
} else if p.type == SocketPacketType.BINARY_EVENT {
if checkNSP(p.nsp) {
return
}
socket.waitingData.append(p)
} else if p.type == SocketPacketType.BINARY_ACK {
if checkNSP(p.nsp) {
return
}
p.justAck = true
socket.waitingData.append(p)
} else if p.type == SocketPacketType.CONNECT {
if p.nsp == "" && socket.nsp != nil {
socket.joinNamespace()
} else if p.nsp != "" && socket.nsp == nil {
socket.didConnect()
} else {
socket.didConnect()
}
} else if p.type == SocketPacketType.DISCONNECT {
socket.didForceClose(message: "Got Disconnect")
}
} }
// Handles binary data // Handles binary data
@ -274,103 +325,18 @@ class SocketParser {
let shouldExecute = socket.waitingData[0].addData(data) let shouldExecute = socket.waitingData[0].addData(data)
if shouldExecute { if !shouldExecute {
let socketEvent = socket.waitingData.removeAtIndex(0)
var event = socketEvent.event
var parsedArgs:AnyObject? = self.parseData(socketEvent.args as? String)
if let args:AnyObject = parsedArgs {
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args)
if socketEvent.justAck! {
// Should handle ack
socket.handleAck(socketEvent.ack!, data: filledInArgs)
return return
} }
// Should do event let packet = socket.waitingData.removeAtIndex(0)
if socketEvent.ack != nil { packet.fillInPlaceholders()
socket.handleEvent(event, data: filledInArgs, isInternalMessage: false,
wantsAck: socketEvent.ack!, withAckType: 6) if !packet.justAck {
socket.handleEvent(packet.getEvent(), data: packet.data,
wantsAck: packet.id, withAckType: 6)
} else { } else {
socket.handleEvent(event, data: filledInArgs) socket.handleAck(packet.id!, data: packet.data)
}
} else {
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders()
// Should handle ack
if socketEvent.justAck! {
socket.handleAck(socketEvent.ack!, data: filledInArgs)
return
}
// Should handle ack
if socketEvent.ack != nil {
socket.handleEvent(event, data: filledInArgs, isInternalMessage: false,
wantsAck: socketEvent.ack!, withAckType: 6)
} else {
socket.handleEvent(event, data: filledInArgs)
}
}
}
}
// Tries to parse a message that contains binary
class func parseBinaryMessage(var message:String, socket:SocketIOClient) {
// NSLog(message)
let type = message.removeAtIndex(message.startIndex)
if type == "5" {
if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let numberOfPlaceholders = groups[1]
let namespace = groups[3]
let ackNum = groups[4]
let event = groups[5]
let mutMessageObject = groups[6]
if namespace == "" && socket.nsp != nil {
return
}
let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"]
~= "\"~~$2\""
var mes:SocketEvent
if ackNum == "" {
mes = SocketEvent(event: event, args: placeholdersRemoved,
placeholders: numberOfPlaceholders.toInt()!)
} else {
socket.currentAck = ackNum.toInt()!
mes = SocketEvent(event: event, args: placeholdersRemoved,
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt())
}
socket.waitingData.append(mes)
}
} else if type == "6" {
if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let numberOfPlaceholders = groups[1]
let namespace = groups[3]
let ackNum = groups[4]
let mutMessageObject = groups[5]
if namespace == "" && socket.nsp != nil {
return
}
let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"]
~= "\"~~$2\""
let event = SocketEvent(event: "", args: placeholdersRemoved,
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true)
socket.waitingData.append(event)
}
} else {
NSLog("Error in parsing binary message: %s", message)
return
} }
} }
} }