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
-------
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.
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.
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.

View File

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

View File

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