Skip to content

Commit 41c168a

Browse files
committed
Fixes. Add onAny method
1 parent 44bff82 commit 41c168a

File tree

3 files changed

+63
-33
lines changed

3 files changed

+63
-33
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ Constructor
1919
Methods
2020
-------
2121
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.
22+
2. `socket.onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event.
2223
3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args.
23-
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.
24+
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.
2425
5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
2526
6. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection.
2627
7. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened.

SwiftIO/SocketEngine.swift

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
5151
private let workQueue = NSOperationQueue()
5252
private let emitQueue = dispatch_queue_create(
5353
"emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
54+
private let parseQueue = dispatch_queue_create(
55+
"parseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
5456
private let handleQueue = dispatch_queue_create(
5557
"handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
5658
private var forcePolling = false
@@ -162,7 +164,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
162164
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
163165
// println(str)
164166

165-
dispatch_async(self?.handleQueue) {[weak self] in
167+
dispatch_async(self?.parseQueue) {[weak self] in
166168
self?.parsePollingMessage(str)
167169
return
168170
}
@@ -189,11 +191,21 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
189191
}
190192

191193
private func flushWaitingForPost() {
192-
if self.postWait.count == 0 || !self.connected || !self.polling {
194+
if self.postWait.count == 0 || !self.connected {
193195
return
196+
} else if self.websocket {
197+
self.flushWaitingForPostToWebSocket()
198+
return
199+
}
200+
201+
var postStr = ""
202+
203+
for packet in self.postWait {
204+
let len = countElements(packet)
205+
206+
postStr += "\(len):\(packet)"
194207
}
195208

196-
let postStr = self.postWait.reduce("") {$0 + $1}
197209
self.postWait.removeAll(keepCapacity: true)
198210

199211
var req = NSMutableURLRequest(URL:
@@ -220,7 +232,18 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
220232

221233
self?.flushWaitingForPost()
222234
self?.waitingForPost = false
235+
self?.doPoll()
236+
}
237+
}
238+
239+
// We had packets waiting for send when we upgraded
240+
// Send them raw
241+
private func flushWaitingForPostToWebSocket() {
242+
for msg in self.postWait {
243+
self.ws?.send(msg)
223244
}
245+
246+
self.postWait.removeAll(keepCapacity: true)
224247
}
225248

226249
// A poll failed, tell the client about it
@@ -313,6 +336,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
313336

314337
// println(str)
315338

339+
let strArray = Array(str)
316340
var length = ""
317341
var n = 0
318342
var msg = ""
@@ -328,7 +352,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
328352
}
329353

330354
for var i = 0, l = str.length; i < l; i = i &+ 1 {
331-
let strArray = Array(str)
332355
let chr = String(strArray[i])
333356

334357
if chr != ":" {
@@ -349,8 +372,12 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
349372
}
350373

351374
if msg.length != 0 {
352-
fixSwift = msg
353-
self.parseEngineMessage(fixSwift)
375+
// Be sure to capture the value of the msg
376+
dispatch_async(self.handleQueue) {[weak self, msg] in
377+
fixSwift = msg
378+
self?.parseEngineMessage(fixSwift)
379+
return
380+
}
354381
}
355382

356383
i += n
@@ -360,7 +387,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
360387
}
361388

362389
private func parseEngineMessage(message:AnyObject?) {
363-
// println(message)
390+
// println(message!)
364391
if let data = message as? NSData {
365392
// Strip off message type
366393
self.client.parseSocketMessage(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
@@ -382,6 +409,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
382409
// TODO Handle other packets
383410
if messageString.hasPrefix("b4") {
384411
// binary in base64 string
412+
385413
messageString.removeRange(Range<String.Index>(start: messageString.startIndex,
386414
end: advance(messageString.startIndex, 2)))
387415

@@ -391,6 +419,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
391419
self.client.parseSocketMessage(data)
392420
}
393421

422+
return
423+
} else if type == PacketType.NOOP.rawValue {
424+
self.doPoll()
394425
return
395426
}
396427

@@ -456,32 +487,19 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
456487
}
457488

458489
private func sendPollMessage(msg:String, withType type:PacketType, datas:[NSData]? = nil) {
459-
// println("Sending: \(msg)")
460-
var postData:NSData
461-
var bDatas:[String]?
490+
// println("Sending: poll: \(msg) as type: \(type.rawValue)")
491+
let strMsg = "\(type.rawValue)\(msg)"
492+
493+
self.postWait.append(strMsg)
462494

463495
if datas != nil {
464-
bDatas = [String]()
465496
for data in datas! {
466497
let (nilData, b64Data) = self.createBinaryDataForSend(data)
467-
let dataLen = countElements(b64Data!)
468498

469-
bDatas!.append("\(dataLen):\(b64Data!)")
499+
self.postWait.append(b64Data!)
470500
}
471501
}
472502

473-
let strMsg = "\(type.rawValue)\(msg)"
474-
let postCount = countElements(strMsg)
475-
var postStr = "\(postCount):\(strMsg)"
476-
477-
if bDatas != nil {
478-
for data in bDatas! {
479-
postStr += data
480-
}
481-
}
482-
483-
self.postWait.append(postStr)
484-
485503
if waitingForPost {
486504
self.doPoll()
487505
return
@@ -491,6 +509,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
491509
}
492510

493511
private func sendWebSocketMessage(str:String, withType type:PacketType, datas:[NSData]? = nil) {
512+
// println("Sending: ws: \(str) as type: \(type.rawValue)")
494513
self.ws?.send("\(type.rawValue)\(str)")
495514

496515
if datas != nil {

SwiftIO/SocketIOClient.swift

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class SocketIOClient {
3636
let reconnectAttempts:Int!
3737
private lazy var params = [String: AnyObject]()
3838
private var ackHandlers = [SocketAckHandler]()
39+
private var anyHandler:((AnyHandler) -> Void)?
3940
private var currentAck = -1
4041
private var currentReconnectAttempt = 0
4142
private var forcePolling = false
@@ -269,13 +270,17 @@ class SocketIOClient {
269270
func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false,
270271
wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
271272
// println("Should do event: \(event) with data: \(data)")
272-
dispatch_async(dispatch_get_main_queue()) {
273-
if !self.connected && !isInternalMessage {
274-
return
275-
}
276-
277-
for handler in self.handlers {
278-
if handler.event == event {
273+
if !self.connected && !isInternalMessage {
274+
return
275+
}
276+
277+
dispatch_async(dispatch_get_main_queue()) {[weak self] in
278+
self?.anyHandler?((event, data))
279+
return
280+
}
281+
for handler in self.handlers {
282+
if handler.event == event {
283+
dispatch_async(dispatch_get_main_queue()) {
279284
if data is NSArray {
280285
if ack != nil {
281286
handler.executeCallback(data as? NSArray, withAck: ack!,
@@ -318,6 +323,11 @@ class SocketIOClient {
318323
self.handlers.append(handler)
319324
}
320325

326+
// Adds a handler for any event
327+
func onAny(handler:(AnyHandler) -> Void) {
328+
self.anyHandler = handler
329+
}
330+
321331
// Opens the connection to the socket
322332
func open() {
323333
self.connect()

0 commit comments

Comments
 (0)