Add toUint8Array for output backed by transferable ArrayBuffer #4355

This commit is contained in:
Lovell Fuller
2025-12-22 15:05:33 +00:00
parent e1bad5470e
commit dbcb7e60bd
10 changed files with 161 additions and 5 deletions

View File

@@ -7,6 +7,7 @@ const fs = require('node:fs');
const path = require('node:path');
const { afterEach, beforeEach, describe, it } = require('node:test');
const assert = require('node:assert');
const { isMarkedAsUntransferable } = require('node:worker_threads');
const sharp = require('../../');
const fixtures = require('../fixtures');
@@ -1092,4 +1093,39 @@ describe('Input/output', () => {
assert.strictEqual(channels, 3);
assert.strictEqual(format, 'jpeg');
});
it('toBuffer resolves with an untransferable Buffer', async () => {
const data = await sharp(fixtures.inputJpg)
.resize({ width: 8, height: 8 })
.toBuffer();
if (isMarkedAsUntransferable) {
assert.strictEqual(isMarkedAsUntransferable(data.buffer), true);
}
assert.strictEqual(ArrayBuffer.isView(data), true);
assert.strictEqual(ArrayBuffer.isView(data.buffer), false);
});
it('toUint8Array resolves with a transferable Uint8Array', async () => {
const { data, info } = await sharp(fixtures.inputJpg)
.resize({ width: 8, height: 8 })
.toUint8Array();
assert.strictEqual(data instanceof Uint8Array, true);
if (isMarkedAsUntransferable) {
assert.strictEqual(isMarkedAsUntransferable(data.buffer), false);
}
assert.strictEqual(ArrayBuffer.isView(data), true);
assert.strictEqual(info.format, 'jpeg');
assert.strictEqual(info.width, 8);
assert.strictEqual(info.height, 8);
assert.strictEqual(data.byteLength, info.size);
assert.strictEqual(data[0], 0xFF);
assert.strictEqual(data[1], 0xD8);
const metadata = await sharp(data).metadata();
assert.strictEqual(metadata.format, 'jpeg');
assert.strictEqual(metadata.width, 8);
assert.strictEqual(metadata.height, 8);
});
});