refactor, fix reconnect bug, fix internalmessages

This commit is contained in:
Erik 2015-08-13 09:56:22 -04:00
parent 5e92fc323d
commit 7ebcd7439f
6 changed files with 40 additions and 28 deletions

View File

@ -24,9 +24,12 @@
import Foundation import Foundation
public final class SocketAnyEvent: NSObject { @objc public final class SocketAnyEvent: NSObject {
public let event: String! public let event: String!
public let items: NSArray? public let items: NSArray?
override public var description: String {
return "SocketAnyEvent: Event: \(event) items: \(items ?? nil)"
}
init(event: String, items: NSArray?) { init(event: String, items: NSArray?) {
self.event = event self.event = event

View File

@ -33,7 +33,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL) private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL)
private let parseQueue = dispatch_queue_create("engineParseQueue", 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 handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL)
private let session:NSURLSession! private let session: NSURLSession!
private var closed = false private var closed = false
private var extraHeaders: [String: String]? private var extraHeaders: [String: String]?

View File

@ -309,6 +309,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
if status == SocketIOClientStatus.Closed || !reconnects { if status == SocketIOClientStatus.Closed || !reconnects {
didDisconnect(reason) didDisconnect(reason)
} else if status != SocketIOClientStatus.Reconnecting { } else if status != SocketIOClientStatus.Reconnecting {
status = SocketIOClientStatus.Reconnecting
handleEvent("reconnect", data: [reason], isInternalMessage: true) handleEvent("reconnect", data: [reason], isInternalMessage: true)
tryReconnect() 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. 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) { wantsAck ack:Int? = nil) {
guard status == SocketIOClientStatus.Connected && !isInternalMessage else { guard status == SocketIOClientStatus.Connected || isInternalMessage else {
return return
} }
// println("Should do event: \(event) with data: \(data)") // 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() { public func reconnect() {
status = SocketIOClientStatus.Reconnecting
engine?.stopPolling() engine?.stopPolling()
tryReconnect() tryReconnect()
} }
@objc private func tryReconnect() { private func tryReconnect() {
guard status != SocketIOClientStatus.Connected else {
return
}
if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
clearReconnectTimer()
didDisconnect("Reconnect Failed")
return
}
if reconnectTimer == nil { if reconnectTimer == nil {
SocketLogger.log("Starting reconnect", client: self) 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 dispatch_async(dispatch_get_main_queue()) {[weak self] in
if let this = self { if let this = self {
this.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(this.reconnectWait), 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) SocketLogger.log("Trying to reconnect", client: self)
handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt],

View File

@ -225,7 +225,7 @@ class SocketParser {
if packet.type != SocketPacket.PacketType.BinaryAck { if packet.type != SocketPacket.PacketType.BinaryAck {
socket.handleEvent(packet.getEvent(), data: packet.getArgs(), socket.handleEvent(packet.getEvent(), data: packet.getArgs(),
wantsAck: packet.id) isInternalMessage: false, wantsAck: packet.id)
} else { } else {
socket.handleAck(packet.id, data: packet.getArgs()) socket.handleAck(packet.id, data: packet.getArgs())
} }

View File

@ -32,7 +32,11 @@ public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) ->
public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void 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 case NotConnected, Closed, Connecting, Connected, Reconnecting
} }

View File

@ -93,7 +93,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
public var headers = Dictionary<String,String>() public var headers = Dictionary<String,String>()
public var voipEnabled = false public var voipEnabled = false
public var selfSignedSSL = false public var selfSignedSSL = false
public var security: Security? private var security: Security?
public var isConnected :Bool { public var isConnected :Bool {
return connected return connected
} }
@ -771,8 +771,8 @@ public class SSLCert {
} }
} }
public class Security { private class Security {
public var validatedDN = true //should the domain name be validated? private var validatedDN = true //should the domain name be validated?
var isReady = false //is the key processing done? var isReady = false //is the key processing done?
var certificates: [NSData]? //the certificates var certificates: [NSData]? //the certificates
@ -786,7 +786,7 @@ public class Security {
:returns: a representation security object to be used with :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: ".") let paths = NSBundle.mainBundle().pathsForResourcesOfType("cer", inDirectory: ".")
var collect = Array<SSLCert>() var collect = Array<SSLCert>()
for path in paths { for path in paths {
@ -805,7 +805,7 @@ public class Security {
:returns: a representation security object to be used with :returns: a representation security object to be used with
*/ */
public init(certs: [SSLCert], usePublicKeys: Bool) { private init(certs: [SSLCert], usePublicKeys: Bool) {
self.usePublicKeys = usePublicKeys self.usePublicKeys = usePublicKeys
if self.usePublicKeys { if self.usePublicKeys {
@ -842,7 +842,7 @@ public class Security {
:returns: if the key was successfully validated :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 var tries = 0
while(!self.isReady) { while(!self.isReady) {