@@ -43,22 +43,12 @@ try {
43
43
return buffer . _buffer . toString ( 'utf8' , start , end ) ;
44
44
}
45
45
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
+ ) ;
62
52
return out ;
63
53
}
64
54
else {
@@ -81,11 +71,40 @@ try {
81
71
"decode" : function ( buffer , length ) {
82
72
if ( buffer instanceof buf . HeapBuffer ) {
83
73
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 {
85
85
throw new Error ( "Don't know how to decode strings from `" + buffer + "`." ) ;
86
86
}
87
87
}
88
88
}
89
89
}
90
90
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
+
91
110
export default platformObj ;
0 commit comments