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

View File

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