cleanup status api
This commit is contained in:
parent
92367fc796
commit
7800591367
@ -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 {
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user