seems to be on par with the native js-client most of the time
This commit is contained in:
parent
cf65f56a1d
commit
5388084c79
@ -587,6 +587,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
self.probing = false
|
self.probing = false
|
||||||
|
|
||||||
if self.websocket {
|
if self.websocket {
|
||||||
|
println(error)
|
||||||
self.pingTimer?.invalidate()
|
self.pingTimer?.invalidate()
|
||||||
self._connected = false
|
self._connected = false
|
||||||
self._websocket = false
|
self._websocket = false
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
@ -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),
|
||||||
@ -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,20 +255,20 @@ 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, withData: 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,20 +289,20 @@ 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, withData: nil)
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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:NSArray?, 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 {
|
||||||
|
|||||||
@ -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)!
|
||||||
self.placeholders = placeholders
|
} else {
|
||||||
self.ack = ackNum
|
self = SocketPacketType(rawValue: 4)!
|
||||||
self.justAck = justAck
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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.id = id
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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]
|
||||||
}
|
}
|
||||||
@ -196,7 +226,7 @@ class SocketEvent {
|
|||||||
// if it is a placeholder for data
|
// if it is a placeholder for data
|
||||||
if let str = value as? String {
|
if let str = value as? String {
|
||||||
if let num = str["~~(\\d)"].groups() {
|
if let num = str["~~(\\d)"].groups() {
|
||||||
newDict[key as String] = self.datas[num[1].toInt()!]
|
newDict[key as String] = self.binary[num[1].toInt()!]
|
||||||
} else {
|
} else {
|
||||||
newDict[key as String] = str
|
newDict[key as String] = str
|
||||||
}
|
}
|
||||||
@ -210,29 +240,25 @@ class SocketEvent {
|
|||||||
return newDict
|
return newDict
|
||||||
}
|
}
|
||||||
|
|
||||||
func fillInPlaceholders() -> NSArray? {
|
func fillInPlaceholders() {
|
||||||
let argsAsArray = "[\(self.args)]"
|
var newArr = [AnyObject](count: self.data!.count, repeatedValue: 0)
|
||||||
if let parsedArr:AnyObject = SocketParser.parseData(argsAsArray) {
|
|
||||||
var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0)
|
for i in 0..<self.data!.count {
|
||||||
|
if let str = self.data?[i] as? String {
|
||||||
for i in 0..<parsedArr.count {
|
if let num = str["~~(\\d)"].groups() {
|
||||||
if let str = parsedArr[i] as? String {
|
newArr[i] = self.binary[num[1].toInt()!]
|
||||||
if let num = str["~~(\\d)"].groups() {
|
|
||||||
returnArr[i] = self.datas[num[1].toInt()!]
|
|
||||||
} else {
|
|
||||||
returnArr[i] = str
|
|
||||||
}
|
|
||||||
} else if let arr = parsedArr[i] as? NSArray {
|
|
||||||
returnArr[i] = self.fillInArray(arr)
|
|
||||||
} else if let dict = parsedArr[i] as? NSDictionary {
|
|
||||||
returnArr[i] = self.fillInDict(dict)
|
|
||||||
} else {
|
} else {
|
||||||
returnArr[i] = parsedArr[i]
|
newArr[i] = str
|
||||||
}
|
}
|
||||||
|
} else if let arr = self.data?[i] as? NSArray {
|
||||||
|
newArr[i] = self.fillInArray(arr)
|
||||||
|
} else if let dict = self.data?[i] as? NSDictionary {
|
||||||
|
newArr[i] = self.fillInDict(dict)
|
||||||
|
} else {
|
||||||
|
newArr[i] = self.data![i]
|
||||||
}
|
}
|
||||||
return returnArr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
self.data = newArr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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)
|
||||||
@ -186,64 +265,51 @@ class SocketParser {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSLog(stringMessage)
|
func checkNSP(nsp:String) -> Bool {
|
||||||
|
if nsp == "" && socket.nsp != nil {
|
||||||
let type = stringMessage.removeAtIndex(stringMessage.startIndex)
|
return true
|
||||||
|
} else {
|
||||||
if type == "2" {
|
return false
|
||||||
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 as? NSArray)
|
|
||||||
} else {
|
|
||||||
socket.currentAck = ackNum.toInt()!
|
|
||||||
socket.handleEvent(event, data: parsed as? NSArray, wantsAck: ackNum.toInt(), withAckType: 3)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if type == "3" {
|
}
|
||||||
if let ackGroup = stringMessage["(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$",
|
|
||||||
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
|
var p = parseString(stringMessage) as SocketPacket!
|
||||||
let nsp = ackGroup[2]
|
|
||||||
let ackNum = ackGroup[3]
|
|
||||||
let ackData:AnyObject? = self.parseData("[\(ackGroup[4])]")
|
if p.type == SocketPacketType.EVENT {
|
||||||
|
if checkNSP(p.nsp) {
|
||||||
if nsp == "" && socket.nsp != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.handleAck(ackNum.toInt()!, data: ackData)
|
|
||||||
}
|
|
||||||
} else if type == "4" {
|
|
||||||
NSLog("Got Error packet")
|
|
||||||
} else if type == "5" {
|
|
||||||
self.parseBinaryMessage(stringMessage, socket: socket, type: "5")
|
|
||||||
} else if type == "6" {
|
|
||||||
self.parseBinaryMessage(stringMessage, socket: socket, type: "6")
|
|
||||||
} else if type == "0" {
|
|
||||||
if socket.nsp != nil && stringMessage == "/\(socket.nsp!)" {
|
|
||||||
socket.didConnect()
|
|
||||||
return
|
return
|
||||||
} else if socket.nsp != nil {
|
}
|
||||||
|
|
||||||
|
socket.handleEvent(p.getEvent(), data: p.data, isInternalMessage: false, wantsAck: p.id, withAckType: 3)
|
||||||
|
} else if p.type == SocketPacketType.ACK {
|
||||||
|
if checkNSP(p.nsp) {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.waitingData.append(p)
|
||||||
|
} else if p.type == SocketPacketType.CONNECT {
|
||||||
|
if p.nsp == "" && socket.nsp != nil {
|
||||||
socket.joinNamespace()
|
socket.joinNamespace()
|
||||||
|
} else if p.nsp != "" && socket.nsp == nil {
|
||||||
|
socket.didConnect()
|
||||||
} else {
|
} else {
|
||||||
socket.didConnect()
|
socket.didConnect()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
} else if type == "1" {
|
} else if p.type == SocketPacketType.DISCONNECT {
|
||||||
socket.didForceClose(message: "Got disconnect")
|
socket.didForceClose(message: "Got Disconnect")
|
||||||
} else {
|
|
||||||
NSLog("Error in parsing message: %s", stringMessage)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,100 +324,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
|
|
||||||
|
|
||||||
if let args:AnyObject = self.parseData(socketEvent.args as String) {
|
|
||||||
let filledInArgs = socketEvent.fillInPlaceholders()
|
|
||||||
|
|
||||||
if socketEvent.justAck! {
|
|
||||||
// Should handle ack
|
|
||||||
socket.handleAck(socketEvent.ack!, data: filledInArgs)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Should do event
|
|
||||||
if socketEvent.ack != nil {
|
|
||||||
socket.handleEvent(event, data: filledInArgs, isInternalMessage: false,
|
|
||||||
wantsAck: socketEvent.ack!, withAckType: 6)
|
|
||||||
} else {
|
|
||||||
socket.handleEvent(event, data: filledInArgs)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let filledInArgs = 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(stringMessage:String, socket:SocketIOClient, type:String) {
|
|
||||||
// NSLog(message)
|
|
||||||
|
|
||||||
if type == "5" {
|
|
||||||
if let groups = stringMessage["^(\\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 = stringMessage["^(\\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", stringMessage)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let packet = socket.waitingData.removeAtIndex(0)
|
||||||
|
packet.fillInPlaceholders()
|
||||||
|
|
||||||
|
if !packet.justAck {
|
||||||
|
socket.handleEvent(packet.getEvent(), data: packet.data,
|
||||||
|
wantsAck: packet.id, withAckType: 6)
|
||||||
|
} else {
|
||||||
|
socket.handleAck(packet.id!, data: packet.data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user