diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index c46c4eb1..5ffa0b92 100644 --- a/Sources/ParseLiveQuery/Client.swift +++ b/Sources/ParseLiveQuery/Client.swift @@ -25,6 +25,7 @@ open class Client: NSObject { var socket: WebSocket? public var shouldPrintWebSocketLog = true public var userDisconnected = false + var isConnecting = false // This allows us to easily plug in another request ID generation scheme, or more easily change the request id type // if needed (technically this could be a string). @@ -222,12 +223,14 @@ extension Client { you use the client, and should usually only be called when an error occurs. */ public func reconnect() { + guard socket == nil || !isConnecting else { return } socket?.disconnect() socket = { let socket = WebSocket(url: host) socket.delegate = self socket.callbackQueue = queue socket.connect() + isConnecting = true userDisconnected = false return socket }() @@ -240,6 +243,7 @@ extension Client { Use this if you wish to dispose of the live query client. */ public func disconnect() { + isConnecting = false guard let socket = socket else { return diff --git a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift index d19781e6..9233f64a 100644 --- a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift +++ b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift @@ -129,11 +129,13 @@ extension Client: WebSocketDelegate { } public func websocketDidConnect(socket: WebSocket) { + isConnecting = false let sessionToken = PFUser.current()?.sessionToken ?? "" _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: sessionToken, clientKey: clientKey)) } public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { + isConnecting = false if shouldPrintWebSocketLog { print("error: \(String(describing: error))") } // TODO: Better retry logic, unless `disconnect()` was explicitly called @@ -143,6 +145,7 @@ extension Client: WebSocketDelegate { } public func webSocket(_ webSocket: WebSocket, didCloseWithCode code: Int, reason: String?, wasClean: Bool) { + isConnecting = false if shouldPrintWebSocketLog { print("code: \(code) reason: \(String(describing: reason))") } // TODO: Better retry logic, unless `disconnect()` was explicitly called