diff --git a/benchmark/blob/clone.js b/benchmark/blob/clone.js index 7f66255ad9da0c..39890672fc66f8 100644 --- a/benchmark/blob/clone.js +++ b/benchmark/blob/clone.js @@ -7,14 +7,17 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { n: [50e3], + bytes: [128, 1024, 1024 ** 2], }); let _cloneResult; -function main({ n }) { +function main({ n, bytes }) { + const buff = Buffer.allocUnsafe(bytes); + const blob = new Blob(buff); bench.start(); for (let i = 0; i < n; ++i) - _cloneResult = structuredClone(new Blob(['hello'])); + _cloneResult = structuredClone(blob); bench.end(n); // Avoid V8 deadcode (elimination) diff --git a/lib/internal/blob.js b/lib/internal/blob.js index a6801f3d7fba3b..3ebb1b8a84b50a 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -8,7 +8,6 @@ const { ObjectDefineProperty, ObjectSetPrototypeOf, PromiseReject, - ReflectConstruct, RegExpPrototypeExec, RegExpPrototypeSymbolReplace, StringPrototypeToLowerCase, @@ -200,7 +199,7 @@ class Blob { const length = this[kLength]; return { data: { handle, type, length }, - deserializeInfo: 'internal/blob:ClonedBlob', + deserializeInfo: 'internal/blob:Blob', }; } @@ -397,25 +396,18 @@ class Blob { } } -function ClonedBlob() { - return ReflectConstruct(function() { - markTransferMode(this, true, false); - }, [], Blob); -} -ClonedBlob.prototype[kDeserialize] = () => {}; - -function TransferrableBlob(handle, length, type = '') { +function TransferableBlob(handle, length, type = '') { markTransferMode(this, true, false); this[kHandle] = handle; this[kType] = type; this[kLength] = length; } -ObjectSetPrototypeOf(TransferrableBlob.prototype, Blob.prototype); -ObjectSetPrototypeOf(TransferrableBlob, Blob); +ObjectSetPrototypeOf(TransferableBlob.prototype, Blob.prototype); +ObjectSetPrototypeOf(TransferableBlob, Blob); function createBlob(handle, length, type = '') { - const transferredBlob = new TransferrableBlob(handle, length, type); + const transferredBlob = new TransferableBlob(handle, length, type); // Fix issues like: https://github.com/nodejs/node/pull/49730#discussion_r1331720053 transferredBlob.constructor = Blob; @@ -489,7 +481,6 @@ function createBlobFromFilePath(path, options) { module.exports = { Blob, - ClonedBlob, createBlob, createBlobFromFilePath, isBlob, diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js index 04b0580202c171..cb9e2f239547f0 100644 --- a/test/parallel/test-blob.js +++ b/test/parallel/test-blob.js @@ -480,3 +480,13 @@ assert.throws(() => new Blob({}), { assert.ok(blob.slice(0, 1).constructor === Blob); assert.ok(blob.slice(0, 1) instanceof Blob); } + +(async () => { + const blob = new Blob(['hello']); + + assert.ok(structuredClone(blob).constructor === Blob); + assert.ok(structuredClone(blob) instanceof Blob); + assert.ok(structuredClone(blob).size === blob.size); + assert.ok(structuredClone(blob).size === blob.size); + assert.ok((await structuredClone(blob).text()) === (await blob.text())); +})().then(common.mustCall());