Fixes. Add onAny method

This commit is contained in:
Erik 2015-03-06 16:29:13 -05:00
parent 44bff82a43
commit 41c168a29a
3 changed files with 63 additions and 33 deletions

View File

@ -19,8 +19,9 @@ Constructor
Methods Methods
------- -------
1. `socket.on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. 1. `socket.on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example.
2. `socket.onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event.
3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args. 3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args.
4. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknoweldgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example. 4. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknowledgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example.
5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
6. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection. 6. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection.
7. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened. 7. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened.

View File

@ -51,6 +51,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
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) "emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let parseQueue = dispatch_queue_create(
"parseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let handleQueue = dispatch_queue_create( private let handleQueue = dispatch_queue_create(
"handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private var forcePolling = false private var forcePolling = false
@ -162,7 +164,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) { if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
// println(str) // println(str)
dispatch_async(self?.handleQueue) {[weak self] in dispatch_async(self?.parseQueue) {[weak self] in
self?.parsePollingMessage(str) self?.parsePollingMessage(str)
return return
} }
@ -189,11 +191,21 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
private func flushWaitingForPost() { private func flushWaitingForPost() {
if self.postWait.count == 0 || !self.connected || !self.polling { if self.postWait.count == 0 || !self.connected {
return
} else if self.websocket {
self.flushWaitingForPostToWebSocket()
return return
} }
let postStr = self.postWait.reduce("") {$0 + $1} var postStr = ""
for packet in self.postWait {
let len = countElements(packet)
postStr += "\(len):\(packet)"
}
self.postWait.removeAll(keepCapacity: true) self.postWait.removeAll(keepCapacity: true)
var req = NSMutableURLRequest(URL: var req = NSMutableURLRequest(URL:
@ -220,9 +232,20 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self?.flushWaitingForPost() self?.flushWaitingForPost()
self?.waitingForPost = false self?.waitingForPost = false
self?.doPoll()
} }
} }
// We had packets waiting for send when we upgraded
// Send them raw
private func flushWaitingForPostToWebSocket() {
for msg in self.postWait {
self.ws?.send(msg)
}
self.postWait.removeAll(keepCapacity: true)
}
// A poll failed, tell the client about it // A poll failed, tell the client about it
// We check to see if we were closed by the server first // We check to see if we were closed by the server first
private func handlePollingFailed(reason:NSError?) { private func handlePollingFailed(reason:NSError?) {
@ -313,6 +336,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// println(str) // println(str)
let strArray = Array(str)
var length = "" var length = ""
var n = 0 var n = 0
var msg = "" var msg = ""
@ -328,7 +352,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
for var i = 0, l = str.length; i < l; i = i &+ 1 { for var i = 0, l = str.length; i < l; i = i &+ 1 {
let strArray = Array(str)
let chr = String(strArray[i]) let chr = String(strArray[i])
if chr != ":" { if chr != ":" {
@ -349,8 +372,12 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
if msg.length != 0 { if msg.length != 0 {
fixSwift = msg // Be sure to capture the value of the msg
self.parseEngineMessage(fixSwift) dispatch_async(self.handleQueue) {[weak self, msg] in
fixSwift = msg
self?.parseEngineMessage(fixSwift)
return
}
} }
i += n i += n
@ -360,7 +387,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
private func parseEngineMessage(message:AnyObject?) { private func parseEngineMessage(message:AnyObject?) {
// println(message) // println(message!)
if let data = message as? NSData { if let data = message as? NSData {
// Strip off message type // Strip off message type
self.client.parseSocketMessage(data.subdataWithRange(NSMakeRange(1, data.length - 1))) self.client.parseSocketMessage(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
@ -382,6 +409,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// TODO Handle other packets // TODO Handle other packets
if messageString.hasPrefix("b4") { if messageString.hasPrefix("b4") {
// binary in base64 string // binary in base64 string
messageString.removeRange(Range<String.Index>(start: messageString.startIndex, messageString.removeRange(Range<String.Index>(start: messageString.startIndex,
end: advance(messageString.startIndex, 2))) end: advance(messageString.startIndex, 2)))
@ -391,6 +419,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.client.parseSocketMessage(data) self.client.parseSocketMessage(data)
} }
return
} else if type == PacketType.NOOP.rawValue {
self.doPoll()
return return
} }
@ -456,32 +487,19 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
private func sendPollMessage(msg:String, withType type:PacketType, datas:[NSData]? = nil) { private func sendPollMessage(msg:String, withType type:PacketType, datas:[NSData]? = nil) {
// println("Sending: \(msg)") // println("Sending: poll: \(msg) as type: \(type.rawValue)")
var postData:NSData let strMsg = "\(type.rawValue)\(msg)"
var bDatas:[String]?
self.postWait.append(strMsg)
if datas != nil { if datas != nil {
bDatas = [String]()
for data in datas! { for data in datas! {
let (nilData, b64Data) = self.createBinaryDataForSend(data) let (nilData, b64Data) = self.createBinaryDataForSend(data)
let dataLen = countElements(b64Data!)
bDatas!.append("\(dataLen):\(b64Data!)") self.postWait.append(b64Data!)
} }
} }
let strMsg = "\(type.rawValue)\(msg)"
let postCount = countElements(strMsg)
var postStr = "\(postCount):\(strMsg)"
if bDatas != nil {
for data in bDatas! {
postStr += data
}
}
self.postWait.append(postStr)
if waitingForPost { if waitingForPost {
self.doPoll() self.doPoll()
return return
@ -491,6 +509,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
private func sendWebSocketMessage(str:String, withType type:PacketType, datas:[NSData]? = nil) { private func sendWebSocketMessage(str:String, withType type:PacketType, datas:[NSData]? = nil) {
// println("Sending: ws: \(str) as type: \(type.rawValue)")
self.ws?.send("\(type.rawValue)\(str)") self.ws?.send("\(type.rawValue)\(str)")
if datas != nil { if datas != nil {

View File

@ -36,6 +36,7 @@ class SocketIOClient {
let reconnectAttempts:Int! let reconnectAttempts:Int!
private lazy var params = [String: AnyObject]() private lazy var params = [String: AnyObject]()
private var ackHandlers = [SocketAckHandler]() private var ackHandlers = [SocketAckHandler]()
private var anyHandler:((AnyHandler) -> Void)?
private var currentAck = -1 private var currentAck = -1
private var currentReconnectAttempt = 0 private var currentReconnectAttempt = 0
private var forcePolling = false private var forcePolling = false
@ -269,13 +270,17 @@ class SocketIOClient {
func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false, 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)")
dispatch_async(dispatch_get_main_queue()) { if !self.connected && !isInternalMessage {
if !self.connected && !isInternalMessage { return
return }
}
dispatch_async(dispatch_get_main_queue()) {[weak self] in
for handler in self.handlers { self?.anyHandler?((event, data))
if handler.event == event { return
}
for handler in self.handlers {
if handler.event == event {
dispatch_async(dispatch_get_main_queue()) {
if data is NSArray { if data is NSArray {
if ack != nil { if ack != nil {
handler.executeCallback(data as? NSArray, withAck: ack!, handler.executeCallback(data as? NSArray, withAck: ack!,
@ -318,6 +323,11 @@ class SocketIOClient {
self.handlers.append(handler) self.handlers.append(handler)
} }
// Adds a handler for any event
func onAny(handler:(AnyHandler) -> Void) {
self.anyHandler = handler
}
// Opens the connection to the socket // Opens the connection to the socket
func open() { func open() {
self.connect() self.connect()