Skip to content

Commit 8365ded

Browse files
committed
Use starscream for websockets. Execute emitAcks on the main queue.
1 parent 2e5a85a commit 8365ded

File tree

6 files changed

+876
-187
lines changed

6 files changed

+876
-187
lines changed

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ For Swift 1.2 use the 1.2 branch.
77

88
Installation
99
============
10-
1. Requires linking [SocketRocket](https://github.com/square/SocketRocket) against your xcode project. (Be sure to link the [frameworks](https://github.com/square/SocketRocket#framework-dependencies) required by SocketRocket)
11-
2. Create a bridging header for SocketRocket
12-
3. Copy the SwiftIO folder into your xcode project
10+
1. Copy the SwiftIO folder into your Xcode project!
1311

1412
API
1513
===

SwiftIO/SocketAckHandler.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,11 @@ class SocketAckHandler {
3939
func onAck(callback:AckCallback) {
4040
self.callback = callback
4141
}
42+
43+
func executeAck(data:NSArray?) {
44+
dispatch_async(dispatch_get_main_queue()) {[cb = self.callback] in
45+
cb?(data)
46+
return
47+
}
48+
}
4249
}

SwiftIO/SocketEngine.swift

Lines changed: 44 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private enum PacketType: String {
4646
case NOOP = "6"
4747
}
4848

49-
class SocketEngine: NSObject, SRWebSocketDelegate {
49+
class SocketEngine: NSObject, WebSocketDelegate {
5050
unowned let client:SocketIOClient
5151
private let workQueue = NSOperationQueue()
5252
private let emitQueue = dispatch_queue_create(
@@ -77,7 +77,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
7777
var websocket:Bool {
7878
return self._websocket
7979
}
80-
var ws:SRWebSocket?
80+
var ws:WebSocket?
8181

8282
init(client:SocketIOClient, forcePolling:Bool = false) {
8383
self.client = client
@@ -165,7 +165,11 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
165165
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
166166
// println(str)
167167

168-
dispatch_async(self?.parseQueue) {[weak self] in
168+
dispatch_async(self!.parseQueue) {[weak self] in
169+
if self == nil {
170+
return
171+
}
172+
169173
self?.parsePollingMessage(str)
170174
return
171175
}
@@ -224,12 +228,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
224228
self.waitingForPost = true
225229

226230
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
227-
if err != nil {
228-
if self!.polling {
229-
self?.handlePollingFailed(err)
230-
}
231+
if self == nil {
231232
return
232-
} else if self == nil {
233+
} else if err != nil && self!.polling {
234+
self?.handlePollingFailed(err)
233235
return
234236
}
235237

@@ -245,7 +247,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
245247
// Send them raw
246248
private func flushWaitingForPostToWebSocket() {
247249
for msg in self.postWait {
248-
self.ws?.send(msg)
250+
self.ws?.writeString(msg)
249251
}
250252

251253
self.postWait.removeAll(keepCapacity: true)
@@ -256,7 +258,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
256258
private func handlePollingFailed(reason:NSError?) {
257259
if !self.client.reconnecting {
258260
self.connected = false
259-
self.ws?.close()
261+
self.ws?.disconnect()
260262
self.pingTimer?.invalidate()
261263
self.waitingForPoll = false
262264
self.waitingForPost = false
@@ -310,10 +312,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
310312
self?.sid = sid
311313

312314
if !self!.forcePolling {
313-
self?.ws = SRWebSocket(URL:
314-
NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
315+
self?.ws = WebSocket(url: NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
316+
self?.ws?.queue = self?.handleQueue
315317
self?.ws?.delegate = self
316-
self?.ws?.open()
318+
self?.ws?.connect()
317319
}
318320
} else {
319321
NSLog("Error handshaking")
@@ -377,8 +379,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
377379
// Be sure to capture the value of the msg
378380
dispatch_async(self.handleQueue) {[weak self, msg] in
379381
fixSwift = msg
380-
self?.parseEngineMessage(fixSwift)
381-
return
382+
if fixSwift is String {
383+
self?.parseEngineMessage(fixSwift as String)
384+
}
382385
}
383386
}
384387

@@ -388,16 +391,14 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
388391
}
389392
}
390393

391-
private func parseEngineMessage(message:AnyObject?) {
394+
private func parseEngineData(data:NSData) {
395+
self.client.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
396+
}
397+
398+
private func parseEngineMessage(var message:String) {
392399
// println(message!)
393-
if let data = message as? NSData {
394-
// Strip off message type
395-
self.client.parseSocketMessage(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
396-
return
397-
}
398400

399-
var messageString = message as String
400-
var strMessage = RegexMutable(messageString)
401+
var strMessage = RegexMutable(message)
401402

402403
// We should upgrade
403404
if strMessage == "3probe" {
@@ -409,16 +410,16 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
409410

410411
if type != PacketType.MESSAGE.rawValue {
411412
// TODO Handle other packets
412-
if messageString.hasPrefix("b4") {
413+
if message.hasPrefix("b4") {
413414
// binary in base64 string
414415

415-
messageString.removeRange(Range<String.Index>(start: messageString.startIndex,
416-
end: advance(messageString.startIndex, 2)))
416+
message.removeRange(Range<String.Index>(start: message.startIndex,
417+
end: advance(message.startIndex, 2)))
417418

418-
if let data = NSData(base64EncodedString: messageString,
419+
if let data = NSData(base64EncodedString: message,
419420
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
420421
// println("sending \(data)")
421-
self.client.parseSocketMessage(data)
422+
self.client.parseBinaryData(data)
422423
}
423424

424425
return
@@ -427,7 +428,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
427428
return
428429
}
429430

430-
if messageString == PacketType.CLOSE.rawValue {
431+
if message == PacketType.CLOSE.rawValue {
431432
// do nothing
432433
return
433434
}
@@ -436,10 +437,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
436437
}
437438

438439
// Remove message type
439-
messageString.removeAtIndex(messageString.startIndex)
440+
message.removeAtIndex(message.startIndex)
440441
// println("sending \(messageString)")
441442

442-
self.client.parseSocketMessage(messageString)
443+
self.client.parseSocketMessage(message)
443444
}
444445

445446
private func probeWebSocket() {
@@ -480,6 +481,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
480481

481482
func sendPing() {
482483
if self.websocket {
484+
self.ws?.writePing(NSData())
483485
self.sendWebSocketMessage("", withType: PacketType.PING)
484486
} else {
485487
self.sendPollMessage("", withType: PacketType.PING)
@@ -510,13 +512,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
510512

511513
private func sendWebSocketMessage(str:String, withType type:PacketType, datas:[NSData]? = nil) {
512514
// println("Sending: ws: \(str) as type: \(type.rawValue)")
513-
self.ws?.send("\(type.rawValue)\(str)")
515+
self.ws?.writeString("\(type.rawValue)\(str)")
514516

515517
if datas != nil {
516518
for data in datas! {
517519
let (data, nilString) = self.createBinaryDataForSend(data)
518520
if data != nil {
519-
self.ws?.send(data!)
521+
self.ws?.writeData(data!)
520522
}
521523
}
522524
}
@@ -546,25 +548,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
546548
}
547549
}
548550

549-
// Called when a message is recieved
550-
func webSocket(webSocket:SRWebSocket!, didReceiveMessage message:AnyObject?) {
551-
// println(message)
552-
553-
dispatch_async(self.handleQueue) {[weak self] in
554-
self?.parseEngineMessage(message)
555-
return
556-
}
557-
}
558-
559-
// Called when the socket is opened
560-
func webSocketDidOpen(webSocket:SRWebSocket!) {
551+
func websocketDidConnect(socket:WebSocket) {
561552
self.websocketConnected = true
562553
self.probing = true
563554
self.probeWebSocket()
564555
}
565556

566-
// Called when the socket is closed
567-
func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) {
557+
func websocketDidDisconnect(socket:WebSocket, error:NSError?) {
568558
self.websocketConnected = false
569559
self.probing = false
570560

@@ -573,24 +563,17 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
573563
self.connected = false
574564
self._websocket = false
575565
self._polling = true
576-
self.client.webSocketDidCloseWithCode(code, reason: reason, wasClean: wasClean)
566+
self.client.webSocketDidCloseWithCode(1, reason: "Socket Disconnect", wasClean: true)
577567
} else {
578568
self.flushProbeWait()
579569
}
580570
}
581571

582-
// Called when an error occurs.
583-
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {
584-
self.websocketConnected = false
585-
self._polling = true
586-
self.probing = false
587-
588-
if self.websocket {
589-
self.pingTimer?.invalidate()
590-
self.connected = false
591-
self.client.webSocketDidFailWithError(error)
592-
} else {
593-
self.flushProbeWait()
594-
}
572+
func websocketDidReceiveMessage(socket:WebSocket, text:String) {
573+
self.parseEngineMessage(text)
574+
}
575+
576+
func websocketDidReceiveData(socket:WebSocket, data:NSData) {
577+
self.parseEngineData(data)
595578
}
596579
}

SwiftIO/SocketEventHandler.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
// THE SOFTWARE.
2424

25+
import Foundation
26+
2527
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
2628
typealias AnyHandler = (event:String, items:AnyObject?)
2729
typealias AckEmitter = (AnyObject...) -> Void

0 commit comments

Comments
 (0)