diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index 6cff996b..d9f14e8b 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). @@ -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.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 2b442e2f..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: "")) + let sessionToken = PFUser.current()?.sessionToken ?? "" + _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: sessionToken)) } public func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) { @@ -227,8 +227,9 @@ extension Client { switch response { case .connected: + let sessionToken = PFUser.current()?.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..7dfa1012 100644 --- a/Sources/ParseLiveQuery/Internal/Operation.swift +++ b/Sources/ParseLiveQuery/Internal/Operation.swift @@ -12,7 +12,7 @@ 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] { @@ -20,8 +20,12 @@ enum ClientOperation { case .connect(let applicationId, let sessionToken): return [ "op": "connect", "applicationId": applicationId, "sessionToken": sessionToken ] - case .subscribe(let requestId, let query): - return [ "op": "subscribe", "requestId": requestId.value, "query": Dictionary(query: query) ] + 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 .unsubscribe(let requestId): return [ "op": "unsubscribe", "requestId": requestId.value ]