cleanup status api

This commit is contained in:
Lukas Schmidt 2015-08-02 18:47:37 +02:00
parent 92367fc796
commit 7800591367
2 changed files with 31 additions and 66 deletions

View File

@ -26,14 +26,11 @@ import Foundation
public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient {
private var anyHandler:((SocketAnyEvent) -> Void)?
private var _closed = false
private var _connected = false
private var _connecting = false
public private(set) var status = SocketIOClientStatus.NotConnected
private var currentReconnectAttempt = 0
private var handlers = ContiguousArray<SocketEventHandler>()
private var connectParams:[String: AnyObject]?
private var _secure = false
private var _reconnecting = false
private var reconnectTimer:NSTimer?
let reconnectAttempts:Int!
@ -48,22 +45,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL)
public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL)
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
public var closed:Bool {
return _closed
}
public var connected:Bool {
return _connected
}
public var connecting:Bool {
return _connecting
}
public var engine:SocketEngine?
public var nsp = "/"
public var opts:[String: AnyObject]?
public var reconnects = true
public var reconnecting:Bool {
return _reconnecting
}
public var reconnectWait = 10
public var secure:Bool {
return _secure
@ -145,9 +131,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
SocketLogger.log("Closing socket", client: self)
reconnects = false
_connecting = false
_connected = false
_reconnecting = false
status = SocketIOClientStatus.Closed
engine?.close(fast: fast)
engine = nil
}
@ -163,14 +147,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Connect to the server. If we aren't connected after timeoutAfter, call handler
*/
public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) {
if closed {
SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self)
_closed = false
} else if connected {
guard status == SocketIOClientStatus.Connected else {
return
}
if status == SocketIOClientStatus.Closed {
SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self)
}
_connecting = true
status = SocketIOClientStatus.Connecting
addEngine()
engine?.open(connectParams)
@ -181,9 +165,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {[weak self] in
if let this = self where !this.connected {
this._closed = true
this._connecting = false
if let this = self where this.status != SocketIOClientStatus.Connected {
this.status = SocketIOClientStatus.Closed
this.engine?.close(fast: true)
handler?()
@ -213,11 +196,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
func didConnect() {
SocketLogger.log("Socket connected", client: self)
_closed = false
_connected = true
_connecting = false
_reconnecting = false
status = SocketIOClientStatus.Connected
currentReconnectAttempt = 0
clearReconnectTimer()
@ -227,17 +206,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
}
func didDisconnect(reason:String) {
if closed {
guard status == SocketIOClientStatus.Closed else {
return
}
SocketLogger.log("Disconnected: %@", client: self, args: reason)
_closed = true
_connected = false
status = SocketIOClientStatus.Closed
reconnects = false
_connecting = false
_reconnecting = false
// Make sure the engine is actually dead.
engine?.close(fast: true)
@ -263,10 +240,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Send a message to the server
*/
public func emit(event:String, _ items:AnyObject...) {
if !connected {
guard status == SocketIOClientStatus.Connected else {
return
}
dispatch_async(emitQueue) {[weak self] in
self?._emit(event, items)
}
@ -276,7 +252,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Same as emit, but meant for Objective-C
*/
public func emit(event:String, withItems items:[AnyObject]) {
if !connected {
guard status != SocketIOClientStatus.Connected else {
return
}
@ -290,10 +266,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
an ack.
*/
public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback {
if !connected {
return createOnAck(event, items: items)
}
return createOnAck(event, items: items)
}
@ -301,15 +273,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Same as emitWithAck, but for Objective-C
*/
public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback {
if !connected {
return createOnAck(event, items: items)
}
return createOnAck(event, items: items)
}
private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) {
if !connected {
guard status != SocketIOClientStatus.Connected else {
return
}
@ -328,7 +296,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
// If the server wants to know that the client received data
func emitAck(ack:Int, withData args:[AnyObject]) {
dispatch_async(emitQueue) {[weak self] in
if let this = self where this.connected {
if let this = self where this.status == SocketIOClientStatus.Connected {
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp)
let str = packet.createAck()
@ -345,12 +313,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
}
public func engineDidClose(reason:String) {
_connected = false
_connecting = false
if closed || !reconnects {
if status == SocketIOClientStatus.Closed || !reconnects {
didDisconnect(reason)
} else if !reconnecting {
} else if status != SocketIOClientStatus.Reconnecting {
handleEvent("reconnect", data: [reason], isInternalMessage: true)
tryReconnect()
}
@ -370,10 +335,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
*/
public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false,
wantsAck ack:Int? = nil) {
// println("Should do event: \(event) with data: \(data)")
if !connected && !isInternalMessage {
guard status != SocketIOClientStatus.Connected && !isInternalMessage else {
return
}
// println("Should do event: \(event) with data: \(data)")
SocketLogger.log("Handling event: %@ with data: %@", client: self,
args: event, data ?? "")
@ -467,31 +432,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Trieds to reconnect to the server.
*/
public func reconnect() {
_connected = false
_connecting = false
_reconnecting = false
status = SocketIOClientStatus.Reconnecting
engine?.stopPolling()
tryReconnect()
}
// We lost connection and should attempt to reestablish
@objc private func tryReconnect() {
guard status == SocketIOClientStatus.Connected else {
return
}
if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
clearReconnectTimer()
didDisconnect("Reconnect Failed")
return
} else if connected {
_connecting = false
_reconnecting = false
return
}
if reconnectTimer == nil {
SocketLogger.log("Starting reconnect", client: self)
_reconnecting = true
status = SocketIOClientStatus.Reconnecting
dispatch_async(dispatch_get_main_queue()) {[weak self] in
if let this = self {

View File

@ -28,3 +28,7 @@ public typealias AckCallback = (NSArray?) -> Void
public typealias AckEmitter = (AnyObject...) -> Void
public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void
public enum SocketIOClientStatus {
case NotConnected, Closed, Connecting, Connected, Reconnecting
}