diff --git a/lib/internal/blob.js b/lib/internal/blob.js index 5fb25e04fe1abe..462fe3fe6b75b9 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -121,10 +121,10 @@ function getSource(source, endings) { // We copy into a new Uint8Array because the underlying // BackingStores are going to be detached and owned by - // the Blob. We also don't want to have to worry about - // byte offsets. - source = new Uint8Array(source); - return [source.byteLength, source]; + // the Blob. + const { buffer, byteOffset, byteLength } = source; + const slice = buffer.slice(byteOffset, byteOffset + byteLength); + return [byteLength, new Uint8Array(slice)]; } class Blob { diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js index 2ac91ac99c9bcc..6a011dd250c21d 100644 --- a/test/parallel/test-blob.js +++ b/test/parallel/test-blob.js @@ -220,3 +220,18 @@ assert.throws(() => new Blob({}), { }); }); } + +(async () => { + const blob = new Blob([ + new Uint8Array([0x50, 0x41, 0x53, 0x53]), + new Int8Array([0x50, 0x41, 0x53, 0x53]), + new Uint16Array([0x4150, 0x5353]), + new Int16Array([0x4150, 0x5353]), + new Uint32Array([0x53534150]), + new Int32Array([0x53534150]), + new Float32Array([0xD341500000]), + ]); + + assert.strictEqual(blob.size, 28); + assert.strictEqual(blob.type, ''); +})().then(common.mustCall());