Skip to content

Commit a43dbe3

Browse files
committed
UTF8 decode CombinedBuffer in web browser env.
- Refactor, create helper function for stream decoding.
1 parent ce39700 commit a43dbe3

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

lib/internal/utf8.js

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
91110
export default platformObj;

0 commit comments

Comments
 (0)