@@ -166,12 +166,23 @@ private void ProcessMessage(IDictionary<string, object> message)
166166 }
167167 }
168168
169+ private bool ValidateClientMessage ( IDictionary < string , object > message , out int requestId )
170+ {
171+ requestId = 0 ;
172+
173+ if ( ! ( message . TryGetValue ( "clientId" , out object clientIdObj ) &&
174+ clientIdObj is string clientId && clientId == ClientId ) )
175+ return false ;
176+
177+ return message . TryGetValue ( "requestId" , out object requestIdObj ) &&
178+ Int32 . TryParse ( requestIdObj ? . ToString ( ) , out requestId ) ;
179+ }
180+
169181 void ProcessDeleteEventMessage ( IDictionary < string , object > message )
170182 {
171- string clientId = message [ "clientId" ] as string ;
172- if ( clientId != ClientId )
183+ if ( ! ValidateClientMessage ( message , out int requestId ) )
173184 return ;
174- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
185+
175186 if ( Subscriptions . TryGetValue ( requestId , out IParseLiveQuerySubscription subscription ) )
176187 {
177188 subscription . OnDelete ( ParseObjectCoder . Instance . Decode (
@@ -183,10 +194,9 @@ void ProcessDeleteEventMessage(IDictionary<string, object> message)
183194
184195 void ProcessLeaveEventMessage ( IDictionary < string , object > message )
185196 {
186- string clientId = message [ "clientId" ] as string ;
187- if ( clientId != ClientId )
197+ if ( ! ValidateClientMessage ( message , out int requestId ) )
188198 return ;
189- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
199+
190200 if ( Subscriptions . TryGetValue ( requestId , out IParseLiveQuerySubscription subscription ) )
191201 {
192202 subscription . OnLeave (
@@ -203,10 +213,9 @@ void ProcessLeaveEventMessage(IDictionary<string, object> message)
203213
204214 void ProcessUpdateEventMessage ( IDictionary < string , object > message )
205215 {
206- string clientId = message [ "clientId" ] as string ;
207- if ( clientId != ClientId )
216+ if ( ! ValidateClientMessage ( message , out int requestId ) )
208217 return ;
209- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
218+
210219 if ( Subscriptions . TryGetValue ( requestId , out IParseLiveQuerySubscription subscription ) )
211220 {
212221 subscription . OnUpdate (
@@ -223,10 +232,9 @@ void ProcessUpdateEventMessage(IDictionary<string, object> message)
223232
224233 void ProcessEnterEventMessage ( IDictionary < string , object > message )
225234 {
226- string clientId = message [ "clientId" ] as string ;
227- if ( clientId != ClientId )
235+ if ( ! ValidateClientMessage ( message , out int requestId ) )
228236 return ;
229- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
237+
230238 if ( Subscriptions . TryGetValue ( requestId , out IParseLiveQuerySubscription subscription ) )
231239 {
232240 subscription . OnEnter (
@@ -243,10 +251,9 @@ void ProcessEnterEventMessage(IDictionary<string, object> message)
243251
244252 void ProcessCreateEventMessage ( IDictionary < string , object > message )
245253 {
246- string clientId = message [ "clientId" ] as string ;
247- if ( clientId != ClientId )
254+ if ( ! ValidateClientMessage ( message , out int requestId ) )
248255 return ;
249- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
256+
250257 if ( Subscriptions . TryGetValue ( requestId , out IParseLiveQuerySubscription subscription ) )
251258 {
252259 subscription . OnCreate ( ParseObjectCoder . Instance . Decode (
@@ -258,19 +265,27 @@ void ProcessCreateEventMessage(IDictionary<string, object> message)
258265
259266 void ProcessErrorMessage ( IDictionary < string , object > message )
260267 {
261- ParseLiveQueryErrorEventArgs errorArgs = new ParseLiveQueryErrorEventArgs (
262- Convert . ToInt32 ( message [ "code" ] ) ,
263- message [ "error" ] as string ,
264- Convert . ToBoolean ( message [ "reconnect" ] ) ) ;
268+ if ( ! ( message . TryGetValue ( "code" , out object codeObj ) &&
269+ Int32 . TryParse ( codeObj ? . ToString ( ) , out int code ) ) )
270+ return ;
271+
272+ if ( ! ( message . TryGetValue ( "error" , out object errorObj ) &&
273+ errorObj is string error ) )
274+ return ;
275+
276+ if ( ! ( message . TryGetValue ( "reconnect" , out object reconnectObj ) &&
277+ Boolean . TryParse ( reconnectObj ? . ToString ( ) , out bool reconnect ) ) )
278+ return ;
279+
280+ ParseLiveQueryErrorEventArgs errorArgs = new ParseLiveQueryErrorEventArgs ( code , error , reconnect ) ;
265281 Error ? . Invoke ( this , errorArgs ) ;
266282 }
267283
268284 void ProcessUnsubscriptionMessage ( IDictionary < string , object > message )
269285 {
270- string clientId = message [ "clientId" ] as string ;
271- if ( clientId != ClientId )
286+ if ( ! ValidateClientMessage ( message , out int requestId ) )
272287 return ;
273- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
288+
274289 if ( UnsubscriptionSignals . TryGetValue ( requestId , out TaskCompletionSource unsubscriptionSign ) )
275290 {
276291 unsubscriptionSign ? . TrySetResult ( ) ;
@@ -279,10 +294,9 @@ void ProcessUnsubscriptionMessage(IDictionary<string, object> message)
279294
280295 void ProcessSubscriptionMessage ( IDictionary < string , object > message )
281296 {
282- string clientId = message [ "clientId" ] as string ;
283- if ( clientId != ClientId )
297+ if ( ! ValidateClientMessage ( message , out int requestId ) )
284298 return ;
285- int requestId = Convert . ToInt32 ( message [ "requestId" ] ) ;
299+
286300 if ( SubscriptionSignals . TryGetValue ( requestId , out TaskCompletionSource subscriptionSignal ) )
287301 {
288302 subscriptionSignal ? . TrySetResult ( ) ;
@@ -291,8 +305,12 @@ void ProcessSubscriptionMessage(IDictionary<string, object> message)
291305
292306 void ProcessConnectionMessage ( IDictionary < string , object > message )
293307 {
308+ if ( ! ( message . TryGetValue ( "clientId" , out object clientIdObj ) &&
309+ clientIdObj is string clientId ) )
310+ return ;
311+
312+ ClientId = clientId ;
294313 _state = ParseLiveQueryState . Connected ;
295- ClientId = message [ "clientId" ] as string ;
296314 ConnectionSignal . TrySetResult ( ) ;
297315 }
298316
0 commit comments