From 7ebcd7439f08054822f5654815d50e473cf56540 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 13 Aug 2015 09:56:22 -0400 Subject: [PATCH] refactor, fix reconnect bug, fix internalmessages --- SocketIOClientSwift/SocketAnyEvent.swift | 5 ++- SocketIOClientSwift/SocketEngine.swift | 4 +-- SocketIOClientSwift/SocketIOClient.swift | 39 +++++++++++++----------- SocketIOClientSwift/SocketParser.swift | 2 +- SocketIOClientSwift/SocketTypes.swift | 6 +++- SocketIOClientSwift/WebSocket.swift | 12 ++++---- 6 files changed, 40 insertions(+), 28 deletions(-) diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 3b3e97e..9e951fd 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -24,9 +24,12 @@ import Foundation -public final class SocketAnyEvent: NSObject { +@objc public final class SocketAnyEvent: NSObject { public let event: String! public let items: NSArray? + override public var description: String { + return "SocketAnyEvent: Event: \(event) items: \(items ?? nil)" + } init(event: String, items: NSArray?) { self.event = event diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 24913bd..fd58a7e 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -33,7 +33,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL) private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL) private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL) - private let session:NSURLSession! + private let session: NSURLSession! private var closed = false private var extraHeaders: [String: String]? @@ -748,7 +748,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if error != nil { client?.didError(reason) } - + client?.engineDidClose(reason) } else { flushProbeWait() diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 7e98c30..fc95d73 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -309,6 +309,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient if status == SocketIOClientStatus.Closed || !reconnects { didDisconnect(reason) } else if status != SocketIOClientStatus.Reconnecting { + status = SocketIOClientStatus.Reconnecting handleEvent("reconnect", data: [reason], isInternalMessage: true) tryReconnect() } @@ -326,9 +327,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Causes an event to be handled. Only use if you know what you're doing. */ - public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, + public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage: Bool, wantsAck ack:Int? = nil) { - guard status == SocketIOClientStatus.Connected && !isInternalMessage else { + guard status == SocketIOClientStatus.Connected || isInternalMessage else { return } // println("Should do event: \(event) with data: \(data)") @@ -444,26 +445,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } /** - Trieds to reconnect to the server. + Tries to reconnect to the server. */ public func reconnect() { - status = SocketIOClientStatus.Reconnecting engine?.stopPolling() tryReconnect() } - @objc private func tryReconnect() { - guard status != SocketIOClientStatus.Connected else { - return - } - - if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { - clearReconnectTimer() - didDisconnect("Reconnect Failed") - - return - } - + private func tryReconnect() { if reconnectTimer == nil { SocketLogger.log("Starting reconnect", client: self) @@ -472,10 +461,26 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient dispatch_async(dispatch_get_main_queue()) {[weak self] in if let this = self { this.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(this.reconnectWait), - target: this, selector: "tryReconnect", userInfo: nil, repeats: true) + target: this, selector: "_tryReconnect", userInfo: nil, repeats: true) } } } + } + + @objc private func _tryReconnect() { + if status == SocketIOClientStatus.Connected { + clearReconnectTimer() + + return + } + + + if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { + clearReconnectTimer() + didDisconnect("Reconnect Failed") + + return + } SocketLogger.log("Trying to reconnect", client: self) handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 23c4e72..933413f 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -225,7 +225,7 @@ class SocketParser { if packet.type != SocketPacket.PacketType.BinaryAck { socket.handleEvent(packet.getEvent(), data: packet.getArgs(), - wantsAck: packet.id) + isInternalMessage: false, wantsAck: packet.id) } else { socket.handleAck(packet.id, data: packet.getArgs()) } diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 263653f..d47e5b8 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -32,7 +32,11 @@ public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void -@objc public enum SocketIOClientStatus: Int { +@objc public enum SocketIOClientStatus: Int, CustomStringConvertible { + public var description: String { + return String(self.rawValue) + } + case NotConnected, Closed, Connecting, Connected, Reconnecting } diff --git a/SocketIOClientSwift/WebSocket.swift b/SocketIOClientSwift/WebSocket.swift index c82b08b..c2796f3 100644 --- a/SocketIOClientSwift/WebSocket.swift +++ b/SocketIOClientSwift/WebSocket.swift @@ -93,7 +93,7 @@ public class WebSocket : NSObject, NSStreamDelegate { public var headers = Dictionary() public var voipEnabled = false public var selfSignedSSL = false - public var security: Security? + private var security: Security? public var isConnected :Bool { return connected } @@ -771,8 +771,8 @@ public class SSLCert { } } -public class Security { - public var validatedDN = true //should the domain name be validated? +private class Security { + private var validatedDN = true //should the domain name be validated? var isReady = false //is the key processing done? var certificates: [NSData]? //the certificates @@ -786,7 +786,7 @@ public class Security { :returns: a representation security object to be used with */ - public convenience init(usePublicKeys: Bool = false) { + private convenience init(usePublicKeys: Bool = false) { let paths = NSBundle.mainBundle().pathsForResourcesOfType("cer", inDirectory: ".") var collect = Array() for path in paths { @@ -805,7 +805,7 @@ public class Security { :returns: a representation security object to be used with */ - public init(certs: [SSLCert], usePublicKeys: Bool) { + private init(certs: [SSLCert], usePublicKeys: Bool) { self.usePublicKeys = usePublicKeys if self.usePublicKeys { @@ -842,7 +842,7 @@ public class Security { :returns: if the key was successfully validated */ - public func isValid(trust: SecTrustRef, domain: String?) -> Bool { + private func isValid(trust: SecTrustRef, domain: String?) -> Bool { var tries = 0 while(!self.isReady) {