Add toArrayBuffer to generate transferable output #4355

This commit is contained in:
Lovell Fuller
2025-12-22 15:05:33 +00:00
parent e1bad5470e
commit 6176f53f83
11 changed files with 142 additions and 7 deletions

View File

@@ -86,6 +86,10 @@ let transformer = sharp()
});
readableStream.pipe(transformer).pipe(writableStream);
sharp().toArrayBuffer();
sharp().toArrayBuffer().then(({ data }) => data);
sharp().toArrayBuffer().then(({ data }) => new Uint8Array(data));
console.log(sharp.format);
console.log(sharp.versions);

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,36 @@ 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('toArrayBuffer resolves with a transferable ArrayBuffer', async () => {
const { data, info } = await sharp(fixtures.inputJpg)
.resize({ width: 8, height: 8 })
.toArrayBuffer();
if (isMarkedAsUntransferable) {
assert.strictEqual(isMarkedAsUntransferable(data), false);
}
assert.strictEqual(ArrayBuffer.isView(data), true);
assert.strictEqual(info.format, 'jpeg');
assert.strictEqual(info.width, 8);
assert.strictEqual(info.height, 8);
const uint8Array = new Uint8Array(data);
assert.strictEqual(ArrayBuffer.isView(uint8Array), true);
assert.strictEqual(uint8Array.length, info.size);
assert.strictEqual(uint8Array[0], 0xFF);
assert.strictEqual(uint8Array[1], 0xD8);
});
});