diff --git a/lib/internal/blob.js b/lib/internal/blob.js
index 655023e07780f2..c5b417ddc291b6 100644
--- a/lib/internal/blob.js
+++ b/lib/internal/blob.js
@@ -360,6 +360,11 @@ class Blob {
queueMicrotask(() => {
if (c.desiredSize <= 0) {
// A manual backpressure check.
+ if (this.pendingPulls.length !== 0) {
+ // A case of waiting pull finished (= not yet canceled)
+ const pending = this.pendingPulls.shift();
+ pending.resolve();
+ }
return;
}
readNext();
diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js
index 27dee5690d7e06..fdd4d239edc1f5 100644
--- a/test/parallel/test-blob.js
+++ b/test/parallel/test-blob.js
@@ -269,6 +269,29 @@ assert.throws(() => new Blob({}), {
reader.closed.then(common.mustCall());
})().then(common.mustCall());
+(async () => {
+ const b = new Blob(['A', 'B', 'C']);
+ const stream = b.stream();
+ const chunks = [];
+ const decoder = new TextDecoder();
+ await stream.pipeTo(new WritableStream({
+ write(chunk) {
+ chunks.push(decoder.decode(chunk, { stream: true }));
+ }
+ }));
+ assert.strictEqual(chunks.join(''), 'ABC');
+})().then(common.mustCall());
+
+(async () => {
+ const file = new Blob([''], { type: 'image/svg+xml' });
+ const url = URL.createObjectURL(file);
+ const res = await fetch(url);
+ const blob = await res.blob();
+ assert.strictEqual(blob.size, 11);
+ assert.strictEqual(blob.type, 'image/svg+xml');
+ assert.strictEqual(await blob.text(), '');
+})().then(common.mustCall());
+
(async () => {
const b = new Blob(Array(10).fill('hello'));
const stream = b.stream();