@@ -43,22 +43,12 @@ try {
4343 return buffer . _buffer . toString ( 'utf8' , start , end ) ;
4444 }
4545 else if ( buffer instanceof buf . CombinedBuffer ) {
46- let remainingBytesToRead = length ;
47- // Reduce CombinedBuffers to a decoded string
48- let out = buffer . _buffers . reduce ( function ( last , partBuffer ) {
49- if ( remainingBytesToRead <= 0 ) {
50- return last ;
51- }
52- if ( partBuffer . length > remainingBytesToRead ) { // When we don't want the whole buffer
53- let lastSlice = partBuffer . readSlice ( remainingBytesToRead ) ;
54- partBuffer . _updatePos ( remainingBytesToRead ) ;
55- remainingBytesToRead = 0 ;
56- return last + decoder . write ( lastSlice . _buffer ) ;
57- }
58- remainingBytesToRead -= partBuffer . length ;
59- return last + decoder . write ( partBuffer . _buffer ) ;
60- } , '' ) ;
61- out += decoder . end ( ) ;
46+ let out = streamDecodeCombinedBuffer ( buffer . _buffers , length ,
47+ ( partBuffer ) => {
48+ return decoder . write ( partBuffer . _buffer ) ;
49+ } ,
50+ ( ) => { return decoder . end ( ) ; }
51+ ) ;
6252 return out ;
6353 }
6454 else {
@@ -81,11 +71,40 @@ try {
8171 "decode" : function ( buffer , length ) {
8272 if ( buffer instanceof buf . HeapBuffer ) {
8373 return decoder . decode ( buffer . readView ( length ) ) ;
84- } else {
74+ }
75+ else if ( buffer instanceof buf . CombinedBuffer ) {
76+ let out = streamDecodeCombinedBuffer ( buffer . _buffers , length ,
77+ ( partBuffer ) => {
78+ return decoder . decode ( partBuffer . readView ( partBuffer . length ) , { stream :true } ) ;
79+ } ,
80+ ( ) => { return decoder . decode ( ) ; }
81+ ) ;
82+ return out ;
83+ }
84+ else {
8585 throw new Error ( "Don't know how to decode strings from `" + buffer + "`." ) ;
8686 }
8787 }
8888 }
8989}
9090
91+ let streamDecodeCombinedBuffer = ( combinedBuffers , length , decodeFn , endFn ) => {
92+ let remainingBytesToRead = length ;
93+ let out = combinedBuffers . reduce ( function ( last , partBuffer ) {
94+ if ( remainingBytesToRead <= 0 ) {
95+ return last ;
96+ }
97+ if ( partBuffer . length > remainingBytesToRead ) { // When we don't want the whole buffer
98+ let lastSlice = partBuffer . readSlice ( remainingBytesToRead ) ;
99+ partBuffer . _updatePos ( remainingBytesToRead ) ;
100+ remainingBytesToRead = 0 ;
101+ return last + decodeFn ( lastSlice ) ;
102+ }
103+ remainingBytesToRead -= partBuffer . length ;
104+ let tmp = decodeFn ( partBuffer ) ;
105+ return last + tmp ;
106+ } , '' ) ;
107+ return out + endFn ( ) ;
108+ }
109+
91110export default platformObj ;
0 commit comments