@@ -131,11 +131,6 @@ export class Encoder {
131
131
}
132
132
}
133
133
134
- // see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript
135
- function isObject ( value : any ) : boolean {
136
- return Object . prototype . toString . call ( value ) === "[object Object]" ;
137
- }
138
-
139
134
interface DecoderReservedEvents {
140
135
decoded : ( packet : Packet ) => void ;
141
136
}
@@ -262,12 +257,7 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> {
262
257
263
258
// look up json data
264
259
if ( str . charAt ( ++ i ) ) {
265
- const payload = this . tryParse ( str . substr ( i ) ) ;
266
- if ( Decoder . isPayloadValid ( p . type , payload ) ) {
267
- p . data = payload ;
268
- } else {
269
- throw new Error ( "invalid payload" ) ;
270
- }
260
+ p . data = this . tryParse ( str . substr ( i ) ) ;
271
261
}
272
262
273
263
debug ( "decoded %s as %j" , str , p ) ;
@@ -282,28 +272,6 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> {
282
272
}
283
273
}
284
274
285
- private static isPayloadValid ( type : PacketType , payload : any ) : boolean {
286
- switch ( type ) {
287
- case PacketType . CONNECT :
288
- return isObject ( payload ) ;
289
- case PacketType . DISCONNECT :
290
- return payload === undefined ;
291
- case PacketType . CONNECT_ERROR :
292
- return typeof payload === "string" || isObject ( payload ) ;
293
- case PacketType . EVENT :
294
- case PacketType . BINARY_EVENT :
295
- return (
296
- Array . isArray ( payload ) &&
297
- ( typeof payload [ 0 ] === "number" ||
298
- ( typeof payload [ 0 ] === "string" &&
299
- RESERVED_EVENTS . indexOf ( payload [ 0 ] ) === - 1 ) )
300
- ) ;
301
- case PacketType . ACK :
302
- case PacketType . BINARY_ACK :
303
- return Array . isArray ( payload ) ;
304
- }
305
- }
306
-
307
275
/**
308
276
* Deallocates a parser's resources
309
277
*/
@@ -359,3 +327,56 @@ class BinaryReconstructor {
359
327
this . buffers = [ ] ;
360
328
}
361
329
}
330
+
331
+ function isNamespaceValid ( nsp : unknown ) {
332
+ return typeof nsp === "string" ;
333
+ }
334
+
335
+ const isInteger =
336
+ Number . isInteger ||
337
+ function ( value ) {
338
+ return (
339
+ typeof value === "number" &&
340
+ isFinite ( value ) &&
341
+ Math . floor ( value ) === value
342
+ ) ;
343
+ } ;
344
+
345
+ function isAckIdValid ( id : unknown ) {
346
+ return id === undefined || isInteger ( id ) ;
347
+ }
348
+
349
+ // see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript
350
+ function isObject ( value : any ) : boolean {
351
+ return Object . prototype . toString . call ( value ) === "[object Object]" ;
352
+ }
353
+
354
+ function isDataValid ( type : PacketType , payload : unknown ) {
355
+ switch ( type ) {
356
+ case PacketType . CONNECT :
357
+ return payload === undefined || isObject ( payload ) ;
358
+ case PacketType . DISCONNECT :
359
+ return payload === undefined ;
360
+ case PacketType . EVENT :
361
+ return (
362
+ Array . isArray ( payload ) &&
363
+ ( typeof payload [ 0 ] === "number&q
B41A
uot; ||
364
+ ( typeof payload [ 0 ] === "string" &&
365
+ RESERVED_EVENTS . indexOf ( payload [ 0 ] ) === - 1 ) )
366
+ ) ;
367
+ case PacketType . ACK :
368
+ return Array . isArray ( payload ) ;
369
+ case PacketType . CONNECT_ERROR :
370
+ return typeof payload === "string" || isObject ( payload ) ;
371
+ default :
372
+ return false ;
373
+ }
374
+ }
375
+
376
+ export function isPacketValid ( packet : Packet ) : boolean {
377
+ return (
378
+ isNamespaceValid ( packet . nsp ) &&
379
+ isAckIdValid ( packet . id ) &&
380
+ isDataValid ( packet . type , packet . data )
381
+ ) ;
382
+ }
0 commit comments