From 9a392626f05d17173ce02a49ebd6b7550ac21a1a Mon Sep 17 00:00:00 2001 From: Andrey Gordeev Date: Sun, 21 Aug 2016 10:58:27 +0300 Subject: [PATCH 1/3] Added support for session token and user authentication. Added using of sessionToken for both Connect and Subscribe messages. sessionToken is taken from PFUser.currentUser() directly and passes only if it's not nil. --- Sources/ParseLiveQuery/Client.swift | 3 ++- Sources/ParseLiveQuery/Internal/ClientPrivate.swift | 5 +++-- Sources/ParseLiveQuery/Internal/Operation.swift | 11 ++++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index 6cff996b..6b3c057c 100644 --- a/Sources/ParseLiveQuery/Client.swift +++ b/Sources/ParseLiveQuery/Client.swift @@ -151,7 +151,8 @@ extension Client { subscriptions.append(subscriptionRecord) if socket?.readyState == .OPEN { - _ = sendOperationAsync(.subscribe(requestId: subscriptionRecord.requestId, query: query as! PFQuery)) + _ = sendOperationAsync(.subscribe(requestId: subscriptionRecord.requestId, query: query as! PFQuery, + sessionToken: PFUser.currentUser()?.sessionToken)) } else if socket == nil || socket?.readyState != .CONNECTING { if !userDisconnected { reconnect() diff --git a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift index 2b442e2f..9e3ee4c6 100644 --- a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift +++ b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift @@ -139,7 +139,7 @@ extension Client: SRWebSocketDelegate { public func webSocketDidOpen(_ webSocket: SRWebSocket!) { // TODO: Add support for session token and user authetication. - _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: "")) + _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: PFUser.currentUser()?.sessionToken)) } public func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) { @@ -227,8 +227,9 @@ extension Client { switch response { case .connected: + let sessionToken = PFUser.currentUser()?.sessionToken self.subscriptions.forEach { - _ = self.sendOperationAsync(.subscribe(requestId: $0.requestId, query: $0.query)) + _ = self.sendOperationAsync(.subscribe(requestId: $0.requestId, query: $0.query, sessionToken: sessionToken)) } case .redirect: diff --git a/Sources/ParseLiveQuery/Internal/Operation.swift b/Sources/ParseLiveQuery/Internal/Operation.swift index 27984d34..9214bba2 100644 --- a/Sources/ParseLiveQuery/Internal/Operation.swift +++ b/Sources/ParseLiveQuery/Internal/Operation.swift @@ -12,16 +12,21 @@ import Parse enum ClientOperation { case connect(applicationId: String, sessionToken: String) - case subscribe(requestId: Client.RequestId, query: PFQuery) + case subscribe(requestId: Client.RequestId, query: PFQuery, sessionToken: String?) case unsubscribe(requestId: Client.RequestId) var JSONObjectRepresentation: [String : Any] { switch self { case .connect(let applicationId, let sessionToken): + var result: [String: Any] = [ "op": "connect", "applicationId": applicationId ] return [ "op": "connect", "applicationId": applicationId, "sessionToken": sessionToken ] + if let sessionToken = sessionToken { + result["sessionToken"] = sessionToken + } + return result - case .subscribe(let requestId, let query): - return [ "op": "subscribe", "requestId": requestId.value, "query": Dictionary(query: query) ] + case .subscribe(let requestId, let query, let sessionToken): + return [ "op": "subscribe", "requestId": requestId.value, "query": Dictionary(query: query), "sessionToken": sessionToken ] case .unsubscribe(let requestId): return [ "op": "unsubscribe", "requestId": requestId.value ] From e7de215af306a640cd8a34769b7058ecce1c7d97 Mon Sep 17 00:00:00 2001 From: Andrey Gordeev Date: Mon, 29 Aug 2016 18:51:18 +0300 Subject: [PATCH 2/3] Made userDisconnected public, as it needs to be accessible outside of the framework. --- Sources/ParseLiveQuery/Client.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index 6b3c057c..a7e5f709 100644 --- a/Sources/ParseLiveQuery/Client.swift +++ b/Sources/ParseLiveQuery/Client.swift @@ -23,7 +23,7 @@ open class Client: NSObject { let clientKey: String? var socket: SRWebSocket? - var userDisconnected = false + public var userDisconnected = 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). From bafc28e462e567cf6f0711a4296986b26be4ac66 Mon Sep 17 00:00:00 2001 From: Andrey Gordeev Date: Wed, 26 Oct 2016 10:31:35 +0300 Subject: [PATCH 3/3] Swift 3 conformance. --- Sources/ParseLiveQuery/Client.swift | 2 +- Sources/ParseLiveQuery/Internal/ClientPrivate.swift | 6 +++--- Sources/ParseLiveQuery/Internal/Operation.swift | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index a7e5f709..d9f14e8b 100644 --- a/Sources/ParseLiveQuery/Client.swift +++ b/Sources/ParseLiveQuery/Client.swift @@ -152,7 +152,7 @@ extension Client { if socket?.readyState == .OPEN { _ = sendOperationAsync(.subscribe(requestId: subscriptionRecord.requestId, query: query as! PFQuery, - sessionToken: PFUser.currentUser()?.sessionToken)) + sessionToken: PFUser.current()?.sessionToken)) } else if socket == nil || socket?.readyState != .CONNECTING { if !userDisconnected { reconnect() diff --git a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift index 9e3ee4c6..5b9a67b7 100644 --- a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift +++ b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift @@ -138,8 +138,8 @@ extension Client: SRWebSocketDelegate { } public func webSocketDidOpen(_ webSocket: SRWebSocket!) { - // TODO: Add support for session token and user authetication. - _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: PFUser.currentUser()?.sessionToken)) + let sessionToken = PFUser.current()?.sessionToken ?? "" + _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: sessionToken)) } public func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) { @@ -227,7 +227,7 @@ extension Client { switch response { case .connected: - let sessionToken = PFUser.currentUser()?.sessionToken + let sessionToken = PFUser.current()?.sessionToken self.subscriptions.forEach { _ = self.sendOperationAsync(.subscribe(requestId: $0.requestId, query: $0.query, sessionToken: sessionToken)) } diff --git a/Sources/ParseLiveQuery/Internal/Operation.swift b/Sources/ParseLiveQuery/Internal/Operation.swift index 9214bba2..7dfa1012 100644 --- a/Sources/ParseLiveQuery/Internal/Operation.swift +++ b/Sources/ParseLiveQuery/Internal/Operation.swift @@ -18,16 +18,15 @@ enum ClientOperation { var JSONObjectRepresentation: [String : Any] { switch self { case .connect(let applicationId, let sessionToken): - var result: [String: Any] = [ "op": "connect", "applicationId": applicationId ] return [ "op": "connect", "applicationId": applicationId, "sessionToken": sessionToken ] + + case .subscribe(let requestId, let query, let sessionToken): + var result: [String: Any] = [ "op": "subscribe", "requestId": requestId.value, "query": Dictionary(query: query) ] if let sessionToken = sessionToken { result["sessionToken"] = sessionToken } return result - case .subscribe(let requestId, let query, let sessionToken): - return [ "op": "subscribe", "requestId": requestId.value, "query": Dictionary(query: query), "sessionToken": sessionToken ] - case .unsubscribe(let requestId): return [ "op": "unsubscribe", "requestId": requestId.value ] }