diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index ce5bb1d562207b52cf786be236d3a7486da1dcbf..840e5a87d904ec09a179edd8a2688f3ffe96ce1b 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ declare var Buffer: any; -const hasBuffer = (typeof Buffer !== 'undefined'); +export const hasBuffer = (typeof Buffer !== 'undefined'); let textEncoder: TextEncoder | null; let textDecoder: TextDecoder | null; @@ -20,6 +20,11 @@ export class VSBuffer { } public static wrap(actual: Uint8Array): VSBuffer { + if (hasBuffer && !(Buffer.isBuffer(actual))) { + // https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length + // Create a zero-copy Buffer wrapper around the ArrayBuffer pointed to by the Uint8Array + actual = Buffer.from(actual.buffer, actual.byteOffset, actual.byteLength); + } return new VSBuffer(actual); } diff --git a/src/vs/base/test/common/buffer.test.ts b/src/vs/base/test/common/buffer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..a158aeeb5190ab79fe3e1a5ac768aab5b761a6e9 --- /dev/null +++ b/src/vs/base/test/common/buffer.test.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import * as assert from 'assert'; +import { hasBuffer, VSBuffer } from 'vs/base/common/buffer'; + +suite('Buffer', () => { + + if (hasBuffer) { + test('issue #71993 - VSBuffer#toString returns numbers', () => { + const data = new Uint8Array([1, 2, 3, 'h'.charCodeAt(0), 'i'.charCodeAt(0), 4, 5]).buffer; + const buffer = VSBuffer.wrap(new Uint8Array(data, 3, 2)); + assert.deepEqual(buffer.toString(), 'hi'); + }); + } + +});