From ac34f11ca2015c46f80f71bba365683c9aa5f08e Mon Sep 17 00:00:00 2001 From: Benjamin Chen Date: Tue, 28 Aug 2018 01:51:00 -0400 Subject: [PATCH] string_decoder: support typed array or data view Refs: https://github.com/nodejs/node/issues/1826 PR-URL: https://github.com/nodejs/node/pull/22562 Reviewed-By: Ruben Bridgewater Reviewed-By: Anna Henningsen Reviewed-By: Trivikram Kamat --- doc/api/string_decoder.md | 12 +++++++----- lib/string_decoder.js | 2 +- test/parallel/test-string-decoder.js | 15 +++++++++++++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/doc/api/string_decoder.md b/doc/api/string_decoder.md index 1311f372551c9c..c2e5434ac72c4a 100644 --- a/doc/api/string_decoder.md +++ b/doc/api/string_decoder.md @@ -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 @@ -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()`. diff --git a/lib/string_decoder.js b/lib/string_decoder.js index b32249ad9e5830..e5f396cab30d3b 100644 --- a/lib/string_decoder.js +++ b/lib/string_decoder.js @@ -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); }; diff --git a/test/parallel/test-string-decoder.js b/test/parallel/test-string-decoder.js index 6e4f4b121d20d7..c4607672b0420c 100644 --- a/test/parallel/test-string-decoder.js +++ b/test/parallel/test-string-decoder.js @@ -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'); @@ -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' } );