From 6ac754060670cc0aedb6cb29c24078a139ef7637 Mon Sep 17 00:00:00 2001 From: Appurva Murawat Date: Thu, 29 Aug 2024 14:50:21 +0530 Subject: [PATCH] Add missing buffer APIs --- CHANGELOG.yaml | 1 + lib/vendor/buffer/buffer.js | 14 ++++++++++++- lib/vendor/buffer/index.browser.js | 15 ++++++++++++-- lib/vendor/buffer/specific-buffer.js | 8 ++++++++ test/unit/sandbox-libraries/buffer.test.js | 23 ++++++++++++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.yaml b/CHANGELOG.yaml index 88bc26d6..7d0b9bd8 100644 --- a/CHANGELOG.yaml +++ b/CHANGELOG.yaml @@ -3,6 +3,7 @@ unreleased: - GH-1032 Add support for configuring module resolver based on environment new features: - GH-1032 Enhanced performance when operating on buffers in Node environment + - GH-1035 Added missing buffer APIs to expose a uniform interface across environments 5.1.1: date: 2024-08-01 diff --git a/lib/vendor/buffer/buffer.js b/lib/vendor/buffer/buffer.js index 41ea6da8..ee4306cf 100644 --- a/lib/vendor/buffer/buffer.js +++ b/lib/vendor/buffer/buffer.js @@ -1,9 +1,21 @@ +const NOT_IMPLEMENTED = function () { + throw new Error('Not implemented'); +}; + function getBufferModule (buffer) { return { Buffer: buffer.Buffer, SlowBuffer: buffer.SlowBuffer, INSPECT_MAX_BYTES: buffer.INSPECT_MAX_BYTES, - kMaxLength: buffer.kMaxLength + kMaxLength: buffer.kMaxLength, + kStringMaxLength: buffer.kStringMaxLength, + constants: buffer.constants, + File: buffer.File, + Blob: buffer.Blob, + isAscii: NOT_IMPLEMENTED, + isUtf8: NOT_IMPLEMENTED, + resolveObjectURL: NOT_IMPLEMENTED, + transcode: NOT_IMPLEMENTED } } diff --git a/lib/vendor/buffer/index.browser.js b/lib/vendor/buffer/index.browser.js index f07c967a..0bddc8d7 100644 --- a/lib/vendor/buffer/index.browser.js +++ b/lib/vendor/buffer/index.browser.js @@ -2,7 +2,18 @@ const getBufferModule = require('./buffer'); const SpecificBuffer = require('./specific-buffer'); const buffer = require('buffer/'); +// Using 32-bit implementation value from Node +// https://github.com/nodejs/node/blob/main/deps/v8/include/v8-primitive.h#L126 +const K_STRING_MAX_LENGTH = (1 << 28) - 16; + module.exports = getBufferModule({ ...buffer, - Buffer: SpecificBuffer(buffer.Buffer) -}) + Buffer: SpecificBuffer(buffer.Buffer), + kStringMaxLength: K_STRING_MAX_LENGTH, + constants: { + MAX_LENGTH: buffer.kMaxLength, + MAX_STRING_LENGTH: K_STRING_MAX_LENGTH + }, + File: File, + Blob: Blob +}); diff --git a/lib/vendor/buffer/specific-buffer.js b/lib/vendor/buffer/specific-buffer.js index d2968066..13202589 100644 --- a/lib/vendor/buffer/specific-buffer.js +++ b/lib/vendor/buffer/specific-buffer.js @@ -1,3 +1,7 @@ +const NOT_IMPLEMENTED = function () { + throw new Error('Not implemented'); +}; + function SpecificBuffer (_Buffer) { const Buffer = function () { if (typeof arguments[0] === 'number') { @@ -51,6 +55,10 @@ function SpecificBuffer (_Buffer) { return _Buffer.byteLength(...arguments); }; + Buffer.copyBytesFrom = NOT_IMPLEMENTED; + + Buffer.of = NOT_IMPLEMENTED; + return Buffer; } diff --git a/test/unit/sandbox-libraries/buffer.test.js b/test/unit/sandbox-libraries/buffer.test.js index 07599d47..2f4d08eb 100644 --- a/test/unit/sandbox-libraries/buffer.test.js +++ b/test/unit/sandbox-libraries/buffer.test.js @@ -243,8 +243,31 @@ describe('sandbox library - buffer', function () { buffer = require('buffer'); assert.strictEqual(typeof buffer.kMaxLength, 'number'); + assert.strictEqual(typeof buffer.kStringMaxLength, 'number'); + assert.strictEqual(typeof buffer.constants.MAX_LENGTH, 'number'); + assert.strictEqual(typeof buffer.constants.MAX_STRING_LENGTH, 'number'); assert.strictEqual(typeof buffer.INSPECT_MAX_BYTES, 'number'); `, done); }); + + it('should expose File class', function (done) { + context.execute(` + const assert = require('assert'), + buffer = require('buffer'); + const lastModified = Date.now(); + const file = new buffer.File([], 'filename.txt', { type: 'text/plain', lastModified }); + assert.strictEqual(file.name, 'filename.txt'); + assert.strictEqual(file.lastModified, lastModified); + `, done); + }); + + it('should expose Blob class', function (done) { + context.execute(` + const assert = require('assert'), + buffer = require('buffer'); + const blob = new buffer.Blob(['hello world'], { type: 'text/plain' }); + assert.strictEqual(blob.size, 11); + `, done); + }); });