Skip to content

Commit 346edc7

Browse files
committed
Better handle moving between polling and websockets. Sending binary on polling still bork
1 parent 95d50ec commit 346edc7

File tree

2 files changed

+46
-22
lines changed

2 files changed

+46
-22
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ extension String {
3434
}
3535
}
3636

37+
private typealias ProbeQueue = [() -> Void]
38+
3739
private enum PacketType: String {
3840
case OPEN = "0"
3941
case CLOSE = "1"
@@ -46,9 +48,11 @@ private enum PacketType: String {
4648

4749
class SocketEngine: NSObject, SRWebSocketDelegate {
4850
unowned let client:SocketIOClient
49-
private let pollingQueue = NSOperationQueue()
51+
private let workQueue = NSOperationQueue()
5052
private var pingTimer:NSTimer?
5153
private var _polling = true
54+
private var probing = false
55+
private var probeWait = ProbeQueue()
5256
private var wait = false
5357
private var _websocket = false
5458
private var websocketConnected = false
@@ -141,7 +145,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
141145
self.wait = true
142146

143147
NSURLConnection.sendAsynchronousRequest(req,
144-
queue: self.pollingQueue) {[weak self] res, data, err in
148+
queue: self.workQueue) {[weak self] res, data, err in
145149
if self == nil {
146150
return
147151
} else if err != nil {
@@ -172,7 +176,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
172176
let reqPolling = NSURLRequest(URL: NSURL(string: urlPolling + "&t=\(time)-0&b64=1")!)
173177

174178
NSURLConnection.sendAsynchronousRequest(reqPolling,
175-
queue: self.pollingQueue) {[weak self] res, data, err in
179+
queue: self.workQueue) {[weak self] res, data, err in
176180
var err:NSError?
177181
if self == nil {
178182
return
@@ -209,7 +213,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
209213
self?.ws = SRWebSocket(URL:
210214
NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
211215
self?.ws?.delegate = self
212-
// self?.ws?.open()
216+
self?.ws?.open()
213217
} else {
214218
NSLog("Error handshaking")
215219
return
@@ -340,16 +344,31 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
340344
}
341345
}
342346

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+
}
350365
}
366+
}
367+
368+
if self.probing {
369+
self.probeWait.append(_send(msg, datas))
351370
} else {
352-
self.sendPollMessage(msg)
371+
_send(msg, datas)()
353372
}
354373
}
355374

@@ -370,7 +389,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
370389
req.HTTPBody = postData
371390

372391
NSURLConnection.sendAsynchronousRequest(req,
373-
queue: self.pollingQueue) {[weak self] res, data, err in
392+
queue: self.workQueue) {[weak self] res, data, err in
374393
if self == nil {
375394
return
376395
} else if err != nil {
@@ -385,6 +404,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
385404
}
386405

387406
func sendPollMessage(msg:AnyObject) {
407+
// println("Sending: \(msg)")
408+
388409
var postData:NSData
389410
let time = Int(NSDate().timeIntervalSince1970)
390411
var req = NSMutableURLRequest(URL:
@@ -415,7 +436,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
415436
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
416437
req.HTTPBody = postData
417438

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
419440
if err != nil {
420441
println(err)
421442
return
@@ -438,9 +459,15 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
438459

439460
private func upgradeTransport() {
440461
if self.websocketConnected {
462+
self.probing = false
441463
self._websocket = true
442464
self._polling = false
443465
self.ws?.send(PacketType.UPGRADE.rawValue)
466+
for sender in self.probeWait {
467+
sender()
468+
}
469+
470+
self.probeWait.removeAll(keepCapacity: false)
444471
}
445472
}
446473

@@ -454,12 +481,14 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
454481
// Called when the socket is opened
455482
func webSocketDidOpen(webSocket:SRWebSocket!) {
456483
self.websocketConnected = true
484+
self.probing = true
457485
self.probeWebSocket()
458486
}
459487

460488
// Called when the socket is closed
461489
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) {
462490
self.websocketConnected = false
491+
self.probing = false
463492
self._websocket = false
464493
self._polling = true
465494

@@ -471,6 +500,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
471500
self.websocketConnected = false
472501
self._websocket = false
473502
self._polling = true
503+
self.probing = false
474504

475505
self.client.webSocketDidFailWithError(error)
476506
}

SwiftIO/SocketIOClient.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,7 @@ class SocketIOClient {
171171
hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: self.currentAck)
172172
}
173173

174-
self.engine?.send(str)
175-
for data in emitDatas {
176-
self.engine?.send(data)
177-
}
174+
self.engine?.send(str, datas: emitDatas)
178175
} else {
179176
if !ack {
180177
str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false,
@@ -217,10 +214,7 @@ class SocketIOClient {
217214
withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count)
218215
}
219216

220-
self?.engine?.send(str)
221-
for data in emitDatas {
222-
self?.engine?.send(data)
223-
}
217+
self?.engine?.send(str, datas: emitDatas)
224218
}
225219
}
226220
}

0 commit comments

Comments
 (0)