Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 84dd307

Browse files
committedMay 6, 2017
Make client single queued
Shouldn't need to protoct ack generation now that client is single queued
1 parent ed049e8 commit 84dd307

File tree

3 files changed

+83
-93
lines changed

3 files changed

+83
-93
lines changed
 

‎Source/SocketAckEmitter.swift

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

25+
import Dispatch
2526
import Foundation
2627

2728
public final class SocketAckEmitter : NSObject {
@@ -31,57 +32,52 @@ public final class SocketAckEmitter : NSObject {
3132
public var expected: Bool {
3233
return ackNum != -1
3334
}
34-
35+
3536
init(socket: SocketIOClient, ackNum: Int) {
3637
self.socket = socket
3738
self.ackNum = ackNum
3839
}
39-
40+
4041
public func with(_ items: SocketData...) {
4142
guard ackNum != -1 else { return }
42-
43+
4344
socket.emitAck(ackNum, with: items)
4445
}
45-
46+
4647
public func with(_ items: [Any]) {
4748
guard ackNum != -1 else { return }
48-
49+
4950
socket.emitAck(ackNum, with: items)
5051
}
51-
52+
5253
}
5354

5455
public final class OnAckCallback : NSObject {
5556
private let ackNumber: Int
5657
private let items: [Any]
5758
private weak var socket: SocketIOClient?
58-
59+
5960
init(ackNumber: Int, items: [Any], socket: SocketIOClient) {
6061
self.ackNumber = ackNumber
6162
self.items = items
6263
self.socket = socket
6364
}
64-
65+
6566
deinit {
6667
DefaultSocketLogger.Logger.log("OnAckCallback for \(ackNumber) being released", type: "OnAckCallback")
6768
}
68-
69+
6970
public func timingOut(after seconds: Int, callback: @escaping AckCallback) {
7071
guard let socket = self.socket else { return }
71-
72-
socket.ackQueue.sync() {
73-
socket.ackHandlers.addAck(ackNumber, callback: callback)
74-
}
75-
72+
73+
socket.ackHandlers.addAck(ackNumber, callback: callback)
7674
socket._emit(items, ack: ackNumber)
77-
75+
7876
guard seconds != 0 else { return }
79-
80-
let time = DispatchTime.now() + Double(UInt64(seconds) * NSEC_PER_SEC) / Double(NSEC_PER_SEC)
81-
82-
socket.handleQueue.asyncAfter(deadline: time) {
77+
78+
socket.handleQueue.asyncAfter(deadline: DispatchTime.now() + Double(seconds)) {
8379
socket.ackHandlers.timeoutAck(self.ackNumber, onQueue: socket.handleQueue)
8480
}
8581
}
86-
82+
8783
}

‎Source/SocketIOClient.swift

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

25+
import Dispatch
2526
import Foundation
2627

2728
public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, SocketParsable {
@@ -41,43 +42,38 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
4142
}
4243

4344
public var forceNew = false
45+
public var handleQueue = DispatchQueue.main
4446
public var nsp = "/"
4547
public var config: SocketIOClientConfiguration
4648
public var reconnects = true
4749
public var reconnectWait = 10
4850

4951
private let logType = "SocketIOClient"
50-
private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue")
5152

5253
private var anyHandler: ((SocketAnyEvent) -> Void)?
5354
private var currentReconnectAttempt = 0
5455
private var handlers = [SocketEventHandler]()
5556
private var reconnecting = false
5657

57-
private let ackSemaphore = DispatchSemaphore(value: 1)
5858
private(set) var currentAck = -1
59-
private(set) var handleQueue = DispatchQueue.main
6059
private(set) var reconnectAttempts = -1
61-
62-
let ackQueue = DispatchQueue(label: "com.socketio.ackQueue")
63-
let emitQueue = DispatchQueue(label: "com.socketio.emitQueue")
6460

6561
var ackHandlers = SocketAckManager()
6662
var waitingPackets = [SocketPacket]()
67-
63+
6864
public var sid: String? {
6965
return engine?.sid
7066
}
71-
67+
7268
/// Type safe way to create a new SocketIOClient. opts can be omitted
7369
public init(socketURL: URL, config: SocketIOClientConfiguration = []) {
7470
self.config = config
7571
self.socketURL = socketURL
76-
72+
7773
if socketURL.absoluteString.hasPrefix("https://") {
7874
self.config.insert(.secure(true))
7975
}
80-
76+
8177
for option in config {
8278
switch option {
8379
case let .reconnects(reconnects):
@@ -102,10 +98,10 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
10298
}
10399

104100
self.config.insert(.path("/socket.io/"), replacing: false)
105-
101+
106102
super.init()
107103
}
108-
104+
109105
/// Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity.
110106
/// If using Swift it's recommended to use `init(socketURL: NSURL, options: Set<SocketIOClientOption>)`
111107
public convenience init(socketURL: NSURL, config: NSDictionary?) {
@@ -148,30 +144,25 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
148144
} else {
149145
engine?.connect()
150146
}
151-
147+
152148
guard timeoutAfter != 0 else { return }
153149

154150
let time = DispatchTime.now() + Double(UInt64(timeoutAfter) * NSEC_PER_SEC) / Double(NSEC_PER_SEC)
155151

156152
handleQueue.asyncAfter(deadline: time) {[weak self] in
157153
guard let this = self, this.status != .connected && this.status != .disconnected else { return }
158-
154+
159155
this.status = .disconnected
160156
this.engine?.disconnect(reason: "Connect timeout")
161-
157+
162158
handler?()
163159
}
164160
}
165161

166-
private func nextAck() -> Int {
167-
ackSemaphore.wait()
168-
defer { ackSemaphore.signal() }
162+
private func createOnAck(_ items: [Any]) -> OnAckCallback {
169163
currentAck += 1
170-
return currentAck
171-
}
172164

173-
private func createOnAck(_ items: [Any]) -> OnAckCallback {
174-
return OnAckCallback(ackNumber: nextAck(), items: items, socket: self)
165+
return OnAckCallback(ackNumber: currentAck, items: items, socket: self)
175166
}
176167

177168
func didConnect() {
@@ -214,7 +205,7 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
214205
handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true)
215206
return
216207
}
217-
208+
218209
_emit([event] + items)
219210
}
220211

@@ -230,40 +221,40 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
230221
}
231222

232223
func _emit(_ data: [Any], ack: Int? = nil) {
233-
emitQueue.async {
234-
guard self.status == .connected else {
235-
self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true)
236-
return
237-
}
238-
239-
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false)
240-
let str = packet.packetString
241-
242-
DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str)
243-
244-
self.engine?.send(str, withData: packet.binary)
224+
guard status == .connected else {
225+
handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true)
226+
return
245227
}
228+
229+
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false)
230+
let str = packet.packetString
231+
232+
DefaultSocketLogger.Logger.log("Emitting: %@", type: logType, args: str)
233+
234+
engine?.send(str, withData: packet.binary)
246235
}
247236

248237
// If the server wants to know that the client received data
249238
func emitAck(_ ack: Int, with items: [Any]) {
250-
emitQueue.async {
251-
guard self.status == .connected else { return }
252-
253-
let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: self.nsp, ack: true)
254-
let str = packet.packetString
255-
256-
DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str)
257-
258-
self.engine?.send(str, withData: packet.binary)
259-
}
239+
guard status == .connected else { return }
240+
241+
let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: nsp, ack: true)
242+
let str = packet.packetString
243+
244+
DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: logType, args: str)
245+
246+
engine?.send(str, withData: packet.binary)
260247
}
261248

262249
public func engineDidClose(reason: String) {
263-
parseQueue.async {
264-
self.waitingPackets.removeAll()
250+
handleQueue.async {
251+
self._engineDidClose(reason: reason)
265252
}
266-
253+
}
254+
255+
private func _engineDidClose(reason: String) {
256+
waitingPackets.removeAll()
257+
267258
if status != .disconnected {
268259
status = .notConnected
269260
}
@@ -276,13 +267,19 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
276267
}
277268
}
278269

279-
/// error
280270
public func engineDidError(reason: String) {
271+
handleQueue.async {
272+
self._engineDidError(reason: reason)
273+
}
274+
}
275+
276+
/// error
277+
private func _engineDidError(reason: String) {
281278
DefaultSocketLogger.Logger.error("%@", type: logType, args: reason)
282279

283280
handleEvent("error", data: [reason], isInternalMessage: true)
284281
}
285-
282+
286283
public func engineDidOpen(reason: String) {
287284
DefaultSocketLogger.Logger.log(reason, type: "SocketEngineClient")
288285
}
@@ -293,9 +290,7 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
293290

294291
DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data)
295292

296-
handleQueue.async() {
297-
self.ackHandlers.executeAck(ack, with: data, onQueue: self.handleQueue)
298-
}
293+
ackHandlers.executeAck(ack, with: data, onQueue: handleQueue)
299294
}
300295

301296
/// Causes an event to be handled. Only use if you know what you're doing.
@@ -304,12 +299,10 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
304299

305300
DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data)
306301

307-
handleQueue.async {
308-
self.anyHandler?(SocketAnyEvent(event: event, items: data))
302+
anyHandler?(SocketAnyEvent(event: event, items: data))
309303

310-
for handler in self.handlers where handler.event == event {
311-
handler.executeCallback(with: data, withAck: ack, withSocket: self)
312-
}
304+
for handler in handlers where handler.event == event {
305+
handler.executeCallback(with: data, withAck: ack, withSocket: self)
313306
}
314307
}
315308

@@ -384,17 +377,17 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
384377
public func parseEngineMessage(_ msg: String) {
385378
DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg)
386379

387-
parseQueue.async { self.parseSocketMessage(msg) }
380+
handleQueue.async { self.parseSocketMessage(msg) }
388381
}
389382

390383
public func parseEngineBinaryData(_ data: Data) {
391-
parseQueue.async { self.parseBinaryData(data) }
384+
handleQueue.async { self.parseBinaryData(data) }
392385
}
393386

394387
/// Tries to reconnect to the server.
395388
public func reconnect() {
396389
guard !reconnecting else { return }
397-
390+
398391
engine?.disconnect(reason: "manual reconnect")
399392
}
400393

@@ -409,7 +402,7 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
409402

410403
DefaultSocketLogger.Logger.log("Starting reconnect", type: logType)
411404
handleEvent("reconnect", data: [reason], isInternalMessage: true)
412-
405+
413406
_tryReconnect()
414407
}
415408

@@ -425,26 +418,24 @@ public final class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineCl
425418

426419
currentReconnectAttempt += 1
427420
connect()
428-
429-
let deadline = DispatchTime.now() + Double(Int64(UInt64(reconnectWait) * NSEC_PER_SEC)) / Double(NSEC_PER_SEC)
430-
431-
DispatchQueue.main.asyncAfter(deadline: deadline, execute: _tryReconnect)
421+
422+
handleQueue.asyncAfter(deadline: DispatchTime.now() + Double(reconnectWait), execute: _tryReconnect)
432423
}
433-
424+
434425
// Test properties
435-
426+
436427
var testHandlers: [SocketEventHandler] {
437428
return handlers
438429
}
439-
430+
440431
func setTestable() {
441432
status = .connected
442433
}
443-
434+
444435
func setTestEngine(_ engine: SocketEngineSpec?) {
445436
self.engine = engine
446437
}
447-
438+
448439
func emitTest(event: String, _ data: Any...) {
449440
_emit([event] + data)
450441
}

‎Source/SocketIOClientSpec.swift

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

25+
import Dispatch
26+
2527
protocol SocketIOClientSpec : class {
28+
var handleQueue: DispatchQueue { get set }
2629
var nsp: String { get set }
2730
var waitingPackets: [SocketPacket] { get set }
28-
31+
2932
func didConnect()
3033
func didDisconnect(reason: String)
3134
func didError(reason: String)
@@ -37,7 +40,7 @@ protocol SocketIOClientSpec : class {
3740
extension SocketIOClientSpec {
3841
func didError(reason: String) {
3942
DefaultSocketLogger.Logger.error("%@", type: "SocketIOClient", args: reason)
40-
43+
4144
handleEvent("error", data: [reason], isInternalMessage: true, withAck: -1)
4245
}
4346
}

0 commit comments

Comments
 (0)
Please sign in to comment.