current commit
261105.15 · buffer: align Blob and File with Web IDL
'use strict';

const common = require('../common');
const assert = require('node:assert');
const { Blob, File } = require('node:buffer');

(async () => {
  for (const create of [
    (parts, options) => new Blob(parts, options),
    (parts, options) => new File(parts, 'test', options),
  ]) {
    const buffer = new ArrayBuffer(16);
    const parts = [
      buffer,
      new Uint8Array(buffer),
      new Uint8Array(buffer, 4, 8),
      new Uint16Array(buffer, 4, 4),
      new DataView(buffer),
      new DataView(buffer, 4, 8),
      Buffer.from(buffer, 4, 8),
    ];
    buffer.transfer();

    for (const part of parts) {
      const empty = create([part]);
      assert.strictEqual(empty.size, 0);
      assert.deepStrictEqual(await empty.arrayBuffer(), new ArrayBuffer(0));

      const mixed = create(['hello', part, 'world']);
      assert.strictEqual(mixed.size, 10);
      assert.strictEqual(await mixed.text(), 'helloworld');
    }

    // Options conversion can detach buffers after blob parts conversion.
    const anotherBuffer = new ArrayBuffer(16);
    const view = new DataView(anotherBuffer, 4, 8);
    const blob = create([anotherBuffer, view, 'hello'], {
      get endings() {
        anotherBuffer.transfer();
        return 'transparent';
      },
    });
    assert.strictEqual(blob.size, 5);
    assert.strictEqual(await blob.text(), 'hello');
  }
})().then(common.mustCall());