Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

string_decoder : support typed array or data view #22562

Closed
wants to merge 7 commits into from
12 changes: 7 additions & 5 deletions doc/api/string_decoder.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ Creates a new `StringDecoder` instance.
added: v0.9.3
-->

* `buffer` {Buffer} A `Buffer` containing the bytes to decode.
* `buffer` {Buffer|TypedArray|DataView} A `Buffer`, or `TypedArray`, or
`DataView` containing the bytes to decode.
* Returns: {string}

Returns any remaining input stored in the internal buffer as a string. Bytes
Expand All @@ -79,10 +80,11 @@ changes:
character instead of one for each individual byte.
-->

* `buffer` {Buffer} A `Buffer` containing the bytes to decode.
* `buffer` {Buffer|TypedArray|DataView} A `Buffer`, or `TypedArray`, or
`DataView` containing the bytes to decode.
* Returns: {string}

Returns a decoded string, ensuring that any incomplete multibyte characters at
the end of the `Buffer` are omitted from the returned string and stored in an
internal buffer for the next call to `stringDecoder.write()` or
`stringDecoder.end()`.
the end of the `Buffer`, or `TypedArray`, or `DataView` are omitted from the
returned string and stored in an internal buffer for the next call to
`stringDecoder.write()` or `stringDecoder.end()`.
2 changes: 1 addition & 1 deletion lib/string_decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ StringDecoder.prototype.write = function write(buf) {
return buf;
if (!ArrayBuffer.isView(buf))
throw new ERR_INVALID_ARG_TYPE('buf',
['Buffer', 'Uint8Array', 'ArrayBufferView'],
['Buffer', 'TypedArray', 'DataView'],
buf);
return decode(this[kNativeDecoder], buf);
};
Expand Down
15 changes: 13 additions & 2 deletions test/parallel/test-string-decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,17 @@ assert.strictEqual(decoder.lastTotal, 3);

assert.strictEqual(decoder.end(), '\ufffd');

// ArrayBufferView tests
const arrayBufferViewStr = 'String for ArrayBufferView tests\n';
const inputBuffer = Buffer.from(arrayBufferViewStr.repeat(8), 'utf8');
for (const expectView of common.getArrayBufferViews(inputBuffer)) {
assert.strictEqual(
decoder.write(expectView),
inputBuffer.toString('utf8')
);
assert.strictEqual(decoder.end(), '');
}

decoder = new StringDecoder('utf8');
assert.strictEqual(decoder.write(Buffer.from('E18B', 'hex')), '');
assert.strictEqual(decoder.end(), '\ufffd');
Expand Down Expand Up @@ -174,8 +185,8 @@ common.expectsError(
{
code: 'ERR_INVALID_ARG_TYPE',
type: TypeError,
message: 'The "buf" argument must be one of type Buffer, Uint8Array, or' +
' ArrayBufferView. Received type object'
message: 'The "buf" argument must be one of type Buffer, TypedArray,' +
' or DataView. Received type object'
}
);

Expand Down