Fixes. Add onAny method
This commit is contained in:
parent
44bff82a43
commit
41c168a29a
@ -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.
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user