@@ -316,54 +316,65 @@ class Unpacker {
316316 this . structMappers = { } ;
317317 }
318318
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 ;
326323
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 ;
331326 }
332- return value ;
333- }
334327
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 ;
340331 }
341- return value ;
342- }
343332
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 ;
355346 }
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 ) ) ;
356364 }
357365
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 ) {
363368 return true ;
364369 } else if ( marker == FALSE ) {
365370 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 ) {
367378 return buffer . readFloat64 ( ) ;
368379 } else if ( marker >= 0 && marker < 128 ) {
369380 return int ( marker ) ;
@@ -378,55 +389,122 @@ class Unpacker {
378389 return int ( b ) ;
379390 } else if ( marker == INT_64 ) {
380391 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 ) ;
383402 } else if ( marker == STRING_8 ) {
384- return utf8 . decode ( buffer , buffer . readUInt8 ( ) ) ;
403+ return utf8 . decode ( buffer , buffer . readUInt8 ( ) ) ;
385404 } else if ( marker == STRING_16 ) {
386- return utf8 . decode ( buffer , buffer . readUInt16 ( ) ) ;
405+ return utf8 . decode ( buffer , buffer . readUInt16 ( ) ) ;
387406 } 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 ) ;
389416 } else if ( marker == LIST_8 ) {
390- return this . unpackList ( buffer . readUInt8 ( ) , buffer ) ;
417+ return this . _unpackListWithSize ( buffer . readUInt8 ( ) , buffer ) ;
391418 } else if ( marker == LIST_16 ) {
392- return this . unpackList ( buffer . readUInt16 ( ) , buffer ) ;
419+ return this . _unpackListWithSize ( buffer . readUInt16 ( ) , buffer ) ;
393420 } 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 ) ;
397438 } else if ( marker == BYTES_16 ) {
398- return this . unpackBytes ( buffer . readUInt16 ( ) , buffer ) ;
439+ return this . _unpackByteArrayWithSize ( buffer . readUInt16 ( ) , buffer ) ;
399440 } 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 ) ;
401458 } else if ( marker == MAP_8 ) {
402- return this . unpackMap ( buffer . readUInt8 ( ) , buffer ) ;
459+ return this . _unpackMapWithSize ( buffer . readUInt8 ( ) , buffer ) ;
403460 } else if ( marker == MAP_16 ) {
404- return this . unpackMap ( buffer . readUInt16 ( ) , buffer ) ;
461+ return this . _unpackMapWithSize ( buffer . readUInt16 ( ) , buffer ) ;
405462 } 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 ) ;
407481 } else if ( marker == STRUCT_8 ) {
408- return this . unpackStruct ( buffer . readUInt8 ( ) , buffer ) ;
482+ return this . _unpackStructWithSize ( buffer . readUInt8 ( ) , buffer ) ;
409483 } 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 ) ;
422495 } 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 ;
424501 }
425502 }
503+
426504}
427505
428506export {
429507 Packer ,
430508 Unpacker ,
431509 Structure
432- }
510+ } ;
0 commit comments