@@ -316,54 +316,65 @@ class Unpacker {
316
316
this . structMappers = { } ;
317
317
}
318
318
319
- unpackList ( size , buffer ) {
320
- let value = [ ] ;
321
- for ( let i = 0 ; i < size ; i ++ ) {
322
- value . push ( this . unpack ( buffer ) ) ;
323
- }
324
- return value ;
325
- }
319
+ unpack ( buffer ) {
320
+ const marker = buffer . readUInt8 ( ) ;
321
+ const markerHigh = marker & 0xF0 ;
322
+ const markerLow = marker & 0x0F ;
326
323
327
- unpackBytes ( size , buffer ) {
328
- const value = new Int8Array ( size ) ;
329
- for ( let i = 0 ; i < size ; i ++ ) {
330
- value [ i ] = buffer . readInt8 ( ) ;
324
+ if ( marker == NULL ) {
325
+ return null ;
331
326
}
332
- return value ;
333
- }
334
327
335
- unpackMap ( size , buffer ) {
336
- let value = { } ;
337
- for ( let i = 0 ; i < size ; i ++ ) {
338
- let key = this . unpack ( buffer ) ;
339
- value [ key ] = this . unpack ( buffer ) ;
328
+ const boolean = this . _unpackBoolean ( marker ) ;
329
+ if ( boolean !== null ) {
330
+ return boolean ;
340
331
}
341
- return value ;
342
- }
343
332
344
- unpackStruct ( size , buffer ) {
345
- let signature = buffer . readUInt8 ( ) ;
346
- let mapper = this . structMappers [ signature ] ;
347
- if ( mapper ) {
348
- return mapper ( this , buffer ) ;
349
- } else {
350
- let value = new Structure ( signature , [ ] ) ;
351
- for ( let i = 0 ; i < size ; i ++ ) {
352
- value . fields . push ( this . unpack ( buffer ) ) ;
353
- }
354
- return value ;
333
+ const number = this . _unpackNumber ( marker , buffer ) ;
334
+ if ( number !== null ) {
335
+ return number ;
336
+ }
337
+
338
+ const string = this . _unpackString ( marker , markerHigh , markerLow , buffer ) ;
339
+ if ( string !== null ) {
340
+ return string ;
341
+ }
342
+
343
+ const list = this . _unpackList ( marker , markerHigh , markerLow , buffer ) ;
344
+ if ( list !== null ) {
345
+ return list ;
355
346
}
347
+
348
+ const byteArray = this . _unpackByteArray ( marker , buffer ) ;
349
+ if ( byteArray !== null ) {
350
+ return byteArray ;
351
+ }
352
+
353
+ const map = this . _unpackMap ( marker , markerHigh , markerLow , buffer ) ;
354
+ if ( map !== null ) {
355
+ return map ;
356
+ }
357
+
358
+ const struct = this . _unpackStruct ( marker , markerHigh , markerLow , buffer ) ;
359
+ if ( struct !== null ) {
360
+ return struct ;
361
+ }
362
+
363
+ throw newError ( 'Unknown packed value with marker ' + marker . toString ( 16 ) ) ;
356
364
}
357
365
358
- unpack ( buffer ) {
359
- let marker = buffer . readUInt8 ( ) ;
360
- if ( marker == NULL ) {
361
- return null ;
362
- } else if ( marker == TRUE ) {
366
+ _unpackBoolean ( marker ) {
367
+ if ( marker == TRUE ) {
363
368
return true ;
364
369
} else if ( marker == FALSE ) {
365
370
return false ;
366
- } else if ( marker == FLOAT_64 ) {
371
+ } else {
372
+ return null ;
373
+ }
374
+ }
375
+
376
+ _unpackNumber ( marker , buffer ) {
377
+ if ( marker == FLOAT_64 ) {
367
378
return buffer . readFloat64 ( ) ;
368
379
} else if ( marker >= 0 && marker < 128 ) {
369
380
return int ( marker ) ;
@@ -378,55 +389,122 @@ class Unpacker {
378
389
return int ( b ) ;
379
390
} else if ( marker == INT_64 ) {
380
391
let high = buffer . readInt32 ( ) ;
381
- let low = buffer . readInt32 ( ) ;
382
- return new Integer ( low , high ) ;
392
+ let low = buffer . readInt32 ( ) ;
393
+ return new Integer ( low , high ) ;
394
+ } else {
395
+ return null ;
396
+ }
397
+ }
398
+
399
+ _unpackString ( marker , markerHigh , markerLow , buffer ) {
400
+ if ( markerHigh == TINY_STRING ) {
401
+ return utf8 . decode ( buffer , markerLow ) ;
383
402
} else if ( marker == STRING_8 ) {
384
- return utf8 . decode ( buffer , buffer . readUInt8 ( ) ) ;
403
+ return utf8 . decode ( buffer , buffer . readUInt8 ( ) ) ;
385
404
} else if ( marker == STRING_16 ) {
386
- return utf8 . decode ( buffer , buffer . readUInt16 ( ) ) ;
405
+ return utf8 . decode ( buffer , buffer . readUInt16 ( ) ) ;
387
406
} else if ( marker == STRING_32 ) {
388
- return utf8 . decode ( buffer , buffer . readUInt32 ( ) ) ;
407
+ return utf8 . decode ( buffer , buffer . readUInt32 ( ) ) ;
408
+ } else {
409
+ return null ;
410
+ }
411
+ }
412
+
413
+ _unpackList ( marker , markerHigh , markerLow , buffer ) {
414
+ if ( markerHigh == TINY_LIST ) {
415
+ return this . _unpackListWithSize ( markerLow , buffer ) ;
389
416
} else if ( marker == LIST_8 ) {
390
- return this . unpackList ( buffer . readUInt8 ( ) , buffer ) ;
417
+ return this . _unpackListWithSize ( buffer . readUInt8 ( ) , buffer ) ;
391
418
} else if ( marker == LIST_16 ) {
392
- return this . unpackList ( buffer . readUInt16 ( ) , buffer ) ;
419
+ return this . _unpackListWithSize ( buffer . readUInt16 ( ) , buffer ) ;
393
420
} else if ( marker == LIST_32 ) {
394
- return this . unpackList ( buffer . readUInt32 ( ) , buffer ) ;
395
- } else if ( marker == BYTES_8 ) {
396
- return this . unpackBytes ( buffer . readUInt8 ( ) , buffer ) ;
421
+ return this . _unpackListWithSize ( buffer . readUInt32 ( ) , buffer ) ;
422
+ } else {
423
+ return null ;
424
+ }
425
+ }
426
+
427
+ _unpackListWithSize ( size , buffer ) {
428
+ let value = [ ] ;
429
+ for ( let i = 0 ; i < size ; i ++ ) {
430
+ value . push ( this . unpack ( buffer ) ) ;
431
+ }
432
+ return value ;
433
+ }
434
+
435
+ _unpackByteArray ( marker , buffer ) {
436
+ if ( marker == BYTES_8 ) {
437
+ return this . _unpackByteArrayWithSize ( buffer . readUInt8 ( ) , buffer ) ;
397
438
} else if ( marker == BYTES_16 ) {
398
- return this . unpackBytes ( buffer . readUInt16 ( ) , buffer ) ;
439
+ return this . _unpackByteArrayWithSize ( buffer . readUInt16 ( ) , buffer ) ;
399
440
} else if ( marker == BYTES_32 ) {
400
- return this . unpackBytes ( buffer . readUInt32 ( ) , buffer ) ;
441
+ return this . _unpackByteArrayWithSize ( buffer . readUInt32 ( ) , buffer ) ;
442
+ } else {
443
+ return null ;
444
+ }
445
+ }
446
+
447
+ _unpackByteArrayWithSize ( size , buffer ) {
448
+ const value = new Int8Array ( size ) ;
449
+ for ( let i = 0 ; i < size ; i ++ ) {
450
+ value [ i ] = buffer . readInt8 ( ) ;
451
+ }
452
+ return value ;
453
+ }
454
+
455
+ _unpackMap ( marker , markerHigh , markerLow , buffer ) {
456
+ if ( markerHigh == TINY_MAP ) {
457
+ return this . _unpackMapWithSize ( markerLow , buffer ) ;
401
458
} else if ( marker == MAP_8 ) {
402
- return this . unpackMap ( buffer . readUInt8 ( ) , buffer ) ;
459
+ return this . _unpackMapWithSize ( buffer . readUInt8 ( ) , buffer ) ;
403
460
} else if ( marker == MAP_16 ) {
404
- return this . unpackMap ( buffer . readUInt16 ( ) , buffer ) ;
461
+ return this . _unpackMapWithSize ( buffer . readUInt16 ( ) , buffer ) ;
405
462
} else if ( marker == MAP_32 ) {
406
- return this . unpackMap ( buffer . readUInt32 ( ) , buffer ) ;
463
+ return this . _unpackMapWithSize ( buffer . readUInt32 ( ) , buffer ) ;
464
+ } else {
465
+ return null ;
466
+ }
467
+ }
468
+
469
+ _unpackMapWithSize ( size , buffer ) {
470
+ let value = { } ;
471
+ for ( let i = 0 ; i < size ; i ++ ) {
472
+ let key = this . unpack ( buffer ) ;
473
+ value [ key ] = this . unpack ( buffer ) ;
474
+ }
475
+ return value ;
476
+ }
477
+
478
+ _unpackStruct ( marker , markerHigh , markerLow , buffer ) {
479
+ if ( markerHigh == TINY_STRUCT ) {
480
+ return this . _unpackStructWithSize ( markerLow , buffer ) ;
407
481
} else if ( marker == STRUCT_8 ) {
408
- return this . unpackStruct ( buffer . readUInt8 ( ) , buffer ) ;
482
+ return this . _unpackStructWithSize ( buffer . readUInt8 ( ) , buffer ) ;
409
483
} else if ( marker == STRUCT_16 ) {
410
- return this . unpackStruct ( buffer . readUInt16 ( ) , buffer ) ;
411
- }
412
- let markerHigh = marker & 0xF0 ;
413
- let markerLow = marker & 0x0F ;
414
- if ( markerHigh == 0x80 ) {
415
- return utf8 . decode ( buffer , markerLow ) ;
416
- } else if ( markerHigh == 0x90 ) {
417
- return this . unpackList ( markerLow , buffer ) ;
418
- } else if ( markerHigh == 0xA0 ) {
419
- return this . unpackMap ( markerLow , buffer ) ;
420
- } else if ( markerHigh == 0xB0 ) {
421
- return this . unpackStruct ( markerLow , buffer ) ;
484
+ return this . _unpackStructWithSize ( buffer . readUInt16 ( ) , buffer ) ;
485
+ } else {
486
+ return null ;
487
+ }
488
+ }
489
+
490
+ _unpackStructWithSize ( size , buffer ) {
491
+ let signature = buffer . readUInt8 ( ) ;
492
+ let mapper = this . structMappers [ signature ] ;
493
+ if ( mapper ) {
494
+ return mapper ( this , buffer ) ;
422
495
} else {
423
- throw newError ( "Unknown packed value with marker " + marker . toString ( 16 ) ) ;
496
+ let value = new Structure ( signature , [ ] ) ;
497
+ for ( let i = 0 ; i < size ; i ++ ) {
498
+ value . fields . push ( this . unpack ( buffer ) ) ;
499
+ }
500
+ return value ;
424
501
}
425
502
}
503
+
426
504
}
427
505
428
506
export {
429
507
Packer ,
430
508
Unpacker ,
431
509
Structure
432
- }
510
+ } ;
0 commit comments