2121// with the Buffer API defined in buf.js
2222
2323import buf from "./buf" ;
24+ import { StringDecoder } from 'string_decoder' ;
2425let platformObj = { } ;
2526
27+
2628try {
2729 // This will throw an exception is 'buffer' is not available
2830 require . resolve ( "buffer" ) ;
29-
31+ let decoder = new StringDecoder ( 'utf8' ) ;
3032 let node = require ( "buffer" ) ;
3133
3234 platformObj = {
3941 end = start + length ;
4042 buffer . position = end ;
4143 return buffer . _buffer . toString ( 'utf8' , start , end ) ;
42- } else {
44+ }
45+ else if ( buffer instanceof buf . CombinedBuffer ) {
46+ let out = streamDecodeCombinedBuffer ( buffer . _buffers , length ,
47+ ( partBuffer ) => {
48+ return decoder . write ( partBuffer . _buffer ) ;
49+ } ,
50+ ( ) => { return decoder . end ( ) ; }
51+ ) ;
52+ return out ;
53+ }
54+ else {
4355 throw new Error ( "Don't know how to decode strings from `" + buffer + "`." ) ;
4456 }
4557 }
@@ -59,11 +71,40 @@ try {
5971 "decode" : function ( buffer , length ) {
6072 if ( buffer instanceof buf . HeapBuffer ) {
6173 return decoder . decode ( buffer . readView ( length ) ) ;
62- } 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 {
6385 throw new Error ( "Don't know how to decode strings from `" + buffer + "`." ) ;
6486 }
6587 }
6688 }
6789}
6890
91+ let streamDecodeCombinedBuffer = ( combinedBuffers , length , decodeFn , endFn ) => {
92+ let remainingBytesToRead = length ;
93+ // Reduce CombinedBuffers to a decoded string
94+ let out = combinedBuffers . reduce ( function ( last , partBuffer ) {
95+ if ( remainingBytesToRead <= 0 ) {
96+ return last ;
97+ }
98+ if ( partBuffer . length > remainingBytesToRead ) { // When we don't want the whole buffer
99+ let lastSlice = partBuffer . readSlice ( remainingBytesToRead ) ;
100+ partBuffer . _updatePos ( remainingBytesToRead ) ;
101+ remainingBytesToRead = 0 ;
102+ return last + decodeFn ( lastSlice ) ;
103+ }
104+ remainingBytesToRead -= partBuffer . length ;
105+ return last + decodeFn ( partBuffer ) ;
106+ } , '' ) ;
107+ return out + endFn ( ) ;
108+ }
109+
69110export default platformObj ;
0 commit comments