refactor, fix reconnect bug, fix internalmessages
This commit is contained in:
parent
5e92fc323d
commit
7ebcd7439f
@ -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
|
||||||
|
|||||||
@ -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]?
|
||||||
|
|||||||
@ -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],
|
||||||
|
|||||||
@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user