Skip to content

Commit affd792

Browse files
committed
redo acks
1 parent 38163d2 commit affd792

File tree

5 files changed

+122
-118
lines changed

5 files changed

+122
-118
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ socket.on("connect") {data, ack in
1111

1212
socket.on("currentAmount") {data, ack in
1313
if let cur = data?[0] as? Double {
14-
socket.emitWithAck("canUpdate", cur).onAck(0) {data in
14+
socket.emitWithAck("canUpdate", cur)(timeout: 0) {data in
1515
socket.emit("update", ["amount": cur + 2.50])
1616
}
1717

@@ -30,9 +30,9 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8
3030
[socket on: @"connect" callback: ^(NSArray* data, void (^ack)(NSArray*)) {
3131
NSLog(@"connected");
3232
[socket emitObjc:@"echo" withItems:@[@"echo test"]];
33-
[[socket emitWithAckObjc:@"ackack" withItems:@[@"test"]] onAck:0 withCallback:^(NSArray* data) {
34-
NSLog(@"Got data");
35-
}];
33+
[socket emitWithAckObjc:@"connect" withItems:@[@1]](10, ^(NSArray* data) {
34+
NSLog(@"Got ack");
35+
});
3636
}];
3737

3838
```
Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
//
2-
// SocketAckHandler.swift
3-
// Socket.IO-Swift
2+
// SocketAckMap.swift
3+
// SocketIO-Swift
4+
//
5+
// Created by Erik Little on 4/3/15.
46
//
5-
// Created by Erik Little on 2/14/15.
6-
77
// Permission is hereby granted, free of charge, to any person obtaining a copy
88
// of this software and associated documentation files (the "Software"), to deal
99
// in the Software without restriction, including without limitation the rights
@@ -25,45 +25,35 @@
2525
import Foundation
2626

2727
public typealias AckCallback = (NSArray?) -> Void
28+
public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void
2829

29-
@objc public class SocketAckHandler {
30-
let ackNum:Int!
31-
let event:String!
32-
var acked = false
33-
var callback:AckCallback?
34-
weak var socket:SocketIOClient?
35-
30+
struct SocketAckMap {
31+
private var acks = [Int: AckCallback]()
32+
private var waiting = [Int: Bool]()
3633

37-
init(event:String, ackNum:Int = 0, socket:SocketIOClient) {
38-
self.ackNum = ackNum
39-
self.event = event
40-
self.socket = socket
34+
mutating func addAck(ack:Int, callback:AckCallback) {
35+
waiting[ack] = true
36+
acks[ack] = callback
4137
}
4238

43-
public func onAck(timeout:UInt64, withCallback callback:AckCallback) {
44-
self.callback = callback
45-
39+
mutating func executeAck(ack:Int, items:[AnyObject]?) {
40+
let callback = acks[ack]
41+
waiting[ack] = false
4642

47-
if timeout != 0 {
48-
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
49-
dispatch_after(time, dispatch_get_main_queue()) {[weak self] in
50-
if self == nil {
51-
return
52-
}
53-
54-
if !self!.acked {
55-
self?.executeAck(["No ACK"])
56-
self?.socket?.removeAck(self!)
57-
}
58-
}
43+
dispatch_async(dispatch_get_main_queue()) {
44+
callback?(items)
45+
return
5946
}
47+
48+
acks.removeValueForKey(ack)
6049
}
6150

62-
func executeAck(data:NSArray?) {
63-
dispatch_async(dispatch_get_main_queue()) {[weak self, cb = self.callback] in
64-
self?.acked = true
65-
cb?(data)
66-
return
51+
mutating func timeoutAck(ack:Int) {
52+
if waiting[ack] != nil && waiting[ack]! {
53+
acks[ack]?(["NO ACK"])
6754
}
55+
56+
acks.removeValueForKey(ack)
57+
waiting.removeValueForKey(ack)
6858
}
69-
}
59+
}

SwiftIO/SocketEngine.swift

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,21 @@ public class SocketEngine: NSObject, WebSocketDelegate {
164164
self.ws = WebSocket(url: NSURL(string: self.urlWebSocket! + "&sid=\(self.sid)")!)
165165
self.ws?.queue = self.handleQueue
166166
self.ws?.delegate = self
167-
167+
168168
if connect {
169169
self.ws?.connect()
170170
}
171171
}
172172

173173
private func doFastUpgrade() {
174-
self.sendWebSocketMessage("", withType: PacketType.UPGRADE)
175-
self._websocket = true
176-
self._polling = false
177-
self.fastUpgrade = false
178-
self.flushProbeWait()
174+
dispatch_async(self.emitQueue) {[weak self] in
175+
self?.sendWebSocketMessage("", withType: PacketType.UPGRADE)
176+
self?._websocket = true
177+
self?._polling = false
178+
self?.fastUpgrade = false
179+
self?.probing = false
180+
self?.flushProbeWait()
181+
}
179182
}
180183

181184
private func doPoll() {
@@ -229,7 +232,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
229232
}
230233

231234
private func flushProbeWait() {
232-
// println("flushing probe wait")
235+
// NSLog("flushing probe wait")
233236
dispatch_async(self.emitQueue) {[weak self] in
234237
if self == nil {
235238
return
@@ -240,6 +243,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
240243
}
241244

242245
self?.probeWait.removeAll(keepCapacity: false)
246+
// NSLog("waiting for post after flush probe: \(self!.postWait.count)")
243247
}
244248
}
245249

@@ -269,11 +273,14 @@ public class SocketEngine: NSObject, WebSocketDelegate {
269273
let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding,
270274
allowLossyConversion: false)!
271275

272-
// NSLog("posting: \(postStr)")
273276
req.HTTPBody = postData
274277
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
275278

276279
self.waitingForPost = true
280+
281+
// NSLog("posting: \(postStr)")
282+
// NSLog("Posting with WS status of: \(self.websocket)")
283+
277284
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
278285
if self == nil {
279286
return
@@ -284,9 +291,13 @@ public class SocketEngine: NSObject, WebSocketDelegate {
284291

285292
self?.waitingForPost = false
286293
dispatch_async(self!.emitQueue) {
287-
self?.flushWaitingForPost()
288-
self?.doPoll()
289-
return
294+
if self!.fastUpgrade {
295+
self?.doFastUpgrade()
296+
return
297+
} else {
298+
self?.flushWaitingForPost()
299+
self?.doPoll()
300+
}
290301
}}.resume()
291302
}
292303

@@ -517,6 +528,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
517528
self.write("", withType: PacketType.PING, withData: nil)
518529
}
519530

531+
/// Send polling message.
532+
/// Only call on emitQueue
520533
private func sendPollMessage(var msg:String, withType type:PacketType,
521534
datas:ContiguousArray<NSData>? = nil) {
522535
// println("Sending poll: \(msg) as type: \(type.rawValue)")
@@ -538,6 +551,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
538551
}
539552
}
540553

554+
/// Send message on WebSockets
555+
/// Only call on emitQueue
541556
private func sendWebSocketMessage(str:String, withType type:PacketType,
542557
datas:ContiguousArray<NSData>? = nil) {
543558
// println("Sending ws: \(str) as type: \(type.rawValue)")
@@ -569,9 +584,9 @@ public class SocketEngine: NSObject, WebSocketDelegate {
569584

570585
private func upgradeTransport() {
571586
if self.websocketConnected {
587+
// NSLog("Doing fast upgrade")
572588
// Do a fast upgrade
573589
self.fastUpgrade = true
574-
self.probing = false
575590
self.sendPollMessage("", withType: PacketType.NOOP)
576591
}
577592
}
@@ -591,7 +606,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
591606
}
592607
}
593608
}
594-
609+
595610
// Delagate methods
596611

597612
public func websocketDidConnect(socket:WebSocket) {

0 commit comments

Comments
 (0)