@@ -34,6 +34,8 @@ extension String {
34
34
}
35
35
}
36
36
37
+ private typealias ProbeQueue = [ ( ) -> Void ]
38
+
37
39
private enum PacketType : String {
38
40
case OPEN = " 0 "
39
41
case CLOSE = " 1 "
@@ -46,9 +48,11 @@ private enum PacketType: String {
46
48
47
49
class SocketEngine : NSObject , SRWebSocketDelegate {
48
50
unowned let client : SocketIOClient
49
- private let pollingQueue = NSOperationQueue ( )
51
+ private let workQueue = NSOperationQueue ( )
50
52
private var pingTimer : NSTimer ?
51
53
private var _polling = true
54
+ private var probing = false
55
+ private var probeWait = ProbeQueue ( )
52
56
private var wait = false
53
57
private var _websocket = false
54
58
private var websocketConnected = false
@@ -141,7 +145,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
141
145
self . wait = true
142
146
143
147
NSURLConnection . sendAsynchronousRequest ( req,
144
- queue: self . pollingQueue ) { [ weak self] res, data, err in
148
+ queue: self . workQueue ) { [ weak self] res, data, err in
145
149
if self == nil {
146
150
return
147
151
} else if err != nil {
@@ -172,7 +176,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
172
176
let reqPolling = NSURLRequest ( URL: NSURL ( string: urlPolling + " &t= \( time) -0&b64=1 " ) !)
173
177
174
178
NSURLConnection . sendAsynchronousRequest ( reqPolling,
175
- queue: self . pollingQueue ) { [ weak self] res, data, err in
179
+ queue: self . workQueue ) { [ weak self] res, data, err in
176
180
var err : NSError ?
177
181
if self == nil {
178
182
return
@@ -209,7 +213,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
209
213
self ? . ws = SRWebSocket ( URL:
210
214
NSURL ( string: urlWebSocket + " &sid= \( self !. sid) " ) !)
211
215
self ? . ws? . delegate = self
212
- // self?.ws?.open()
216
+ self ? . ws? . open ( )
213
217
} else {
214
218
NSLog ( " Error handshaking " )
215
219
return
@@ -340,16 +344,31 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
340
344
}
341
345
}
342
346
343
- func send( msg: AnyObject ) {
344
- if self . websocket {
345
- if !( msg is NSData ) {
346
- self . ws? . send ( " \( PacketType . MESSAGE. rawValue) \( msg) " )
347
- } else {
348
- let ( data, nilString) = self . createBinaryDataForSend ( msg as NSData )
349
- self . ws? . send ( data!)
347
+ func send( msg: AnyObject , datas: [ NSData ] ? = nil ) {
348
+ let _send = { [ weak self] ( msg: AnyObject , datas: [ NSData ] ? ) -> ( ) -> Void in
349
+ return {
350
+ if self == nil {
351
+ return
352
+ }
353
+
354
+ if self !. websocket {
355
+ self ? . ws? . send ( " \( PacketType . MESSAGE. rawValue) \( msg) " )
356
+ if datas != nil {
357
+ for data in datas! {
358
+ let ( data, nilString) = self !. createBinaryDataForSend ( data)
359
+ self ? . ws? . send ( data!)
360
+ }
361
+ }
362
+ } else {
363
+ self ? . sendPollMessage ( msg)
364
+ }
350
365
}
366
+ }
367
+
368
+ if self . probing {
369
+ self . probeWait. append ( _send ( msg, datas) )
351
370
} else {
352
- self . sendPollMessage ( msg)
371
+ _send ( msg, datas ) ( )
353
372
}
354
373
}
355
374
@@ -370,7 +389,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
370
389
req. HTTPBody = postData
371
390
372
391
NSURLConnection . sendAsynchronousRequest ( req,
373
- queue: self . pollingQueue ) { [ weak self] res, data, err in
392
+ queue: self . workQueue ) { [ weak self] res, data, err in
374
393
if self == nil {
375
394
return
376
395
} else if err != nil {
@@ -385,6 +404,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
385
404
}
386
405
387
406
func sendPollMessage( msg: AnyObject ) {
407
+ // println("Sending: \(msg)")
408
+
388
409
var postData : NSData
389
410
let time = Int ( NSDate ( ) . timeIntervalSince1970)
390
411
var req = NSMutableURLRequest ( URL:
@@ -415,7 +436,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
415
436
req. setValue ( String ( postData. length) , forHTTPHeaderField: " Content-Length " )
416
437
req. HTTPBody = postData
417
438
418
- NSURLConnection . sendAsynchronousRequest ( req, queue: self . pollingQueue ) { [ weak self] res, data, err in
439
+ NSURLConnection . sendAsynchronousRequest ( req, queue: self . workQueue ) { [ weak self] res, data, err in
419
440
if err != nil {
420
441
println ( err)
421
442
return
@@ -438,9 +459,15 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
438
459
439
460
private func upgradeTransport( ) {
440
461
if self . websocketConnected {
462
+ self . probing = false
441
463
self . _websocket = true
442
464
self . _polling = false
443
465
self . ws? . send ( PacketType . UPGRADE. rawValue)
466
+ for sender in self . probeWait {
467
+ sender ( )
468
+ }
469
+
470
+ self . probeWait. removeAll ( keepCapacity: false )
444
471
}
445
472
}
446
473
@@ -454,12 +481,14 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
454
481
// Called when the socket is opened
455
482
func webSocketDidOpen( webSocket: SRWebSocket ! ) {
456
483
self . websocketConnected = true
484
+ self . probing = true
457
485
self . probeWebSocket ( )
458
486
}
459
487
460
488
// Called when the socket is closed
461
489
func webSocket( webSocket: SRWebSocket ! , didCloseWithCode code: Int , reason: String ! , wasClean: Bool ) {
462
490
self . websocketConnected = false
491
+ self . probing = false
463
492
self . _websocket = false
464
493
self . _polling = true
465
494
@@ -471,6 +500,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
471
500
self . websocketConnected = false
472
501
self . _websocket = false
473
502
self . _polling = true
503
+ self . probing = false
474
504
475
505
self . client. webSocketDidFailWithError ( error)
476
506
}
0 commit comments