Skip to content

Commit f90fa9c

Browse files
suuuuuuminnnnnnaduh95
authored andcommitted
stream: accept ArrayBuffer in CompressionStream and DecompressionStream
PR-URL: #61913Fixes: #43433 Reviewed-By: Mattias Buelens <mattias@buelens.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Jason Zhang <xzha4350@gmail.com> Reviewed-By: René <contact.9a5d6388@renegade334.me.uk> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 8048e05 commit f90fa9c

4 files changed

Lines changed: 81 additions & 3 deletions

File tree

‎lib/internal/webstreams/adapters.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ const {
5353
Buffer,
5454
}=require('buffer');
5555

56+
const{
57+
isArrayBuffer,
58+
}=require('internal/util/types');
59+
5660
const{
5761
AbortError,
5862
ErrnoException,
@@ -213,6 +217,9 @@ function newWritableStreamFromStreamWritable(streamWritable) {
213217
start(c){controller=c;},
214218

215219
write(chunk){
220+
if(!streamWritable.writableObjectMode&&isArrayBuffer(chunk)){
221+
chunk=newUint8Array(chunk);
222+
}
216223
if(streamWritable.writableNeedDrain||!streamWritable.write(chunk)){
217224
backpressurePromise=PromiseWithResolvers();
218225
returnSafePromisePrototypeFinally(
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
'use strict';
2+
require('../common');
3+
constassert=require('assert');
4+
consttest=require('node:test');
5+
const{ DecompressionStream, CompressionStream }=require('stream/web');
6+
7+
// Minimal gzip-compressed bytes for "hello"
8+
constcompressedGzip=newUint8Array([
9+
31,139,8,0,0,0,0,0,0,3,
10+
203,72,205,201,201,7,0,134,166,16,54,5,0,0,0,
11+
]);
12+
13+
test('DecompressionStream accepts ArrayBuffer chunks',async()=>{
14+
constds=newDecompressionStream('gzip');
15+
constwriter=ds.writable.getWriter();
16+
17+
constwritePromise=writer.write(compressedGzip.buffer);
18+
writer.close();
19+
20+
constchunks=awaitArray.fromAsync(ds.readable);
21+
awaitwritePromise;
22+
constout=Buffer.concat(chunks.map((c)=>Buffer.from(c)));
23+
assert.strictEqual(out.toString(),'hello');
24+
});
25+
26+
test('CompressionStream round-trip with ArrayBuffer input',async()=>{
27+
constcs=newCompressionStream('gzip');
28+
constds=newDecompressionStream('gzip');
29+
30+
constcsWriter=cs.writable.getWriter();
31+
32+
constinput=newTextEncoder().encode('hello').buffer;
33+
34+
awaitcsWriter.write(input);
35+
csWriter.close();
36+
37+
awaitcs.readable.pipeTo(ds.writable);
38+
39+
constout=awaitArray.fromAsync(ds.readable);
40+
constresult=Buffer.concat(out.map((c)=>Buffer.from(c)));
41+
assert.strictEqual(result.toString(),'hello');
42+
});

‎test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,35 @@ class TestWritable extends Writable {
165165
constwriter=writableStream.getWriter();
166166
writer.closed.then(common.mustCall());
167167
}
168+
169+
{
170+
constduplex=newPassThrough();
171+
constwritableStream=newWritableStreamFromStreamWritable(duplex);
172+
constec=newTextEncoder();
173+
constarrayBuffer=ec.encode('hello').buffer;
174+
writableStream
175+
.getWriter()
176+
.write(arrayBuffer)
177+
.then(common.mustCall());
178+
179+
duplex.on('data',common.mustCall((chunk)=>{
180+
assert(chunkinstanceofBuffer);
181+
assert(chunk.equals(Buffer.from('hello')));
182+
}));
183+
}
184+
185+
{
186+
constduplex=newPassThrough({objectMode: true});
187+
constwritableStream=newWritableStreamFromStreamWritable(duplex);
188+
constec=newTextEncoder();
189+
constarrayBuffer=ec.encode('hello').buffer;
190+
writableStream
191+
.getWriter()
192+
.write(arrayBuffer)
193+
.then(common.mustCall());
194+
195+
duplex.on('data',common.mustCall((chunk)=>{
196+
assert(chunkinstanceofArrayBuffer);
197+
assert.strictEqual(chunk,arrayBuffer);
198+
}));
199+
}

‎test/wpt/status/compression.json‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
"decompression-bad-chunks.tentative.any.js": {
66
"skip": "Execution \"hangs\", ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write"
77
},
8-
"decompression-buffersource.tentative.any.js": {
9-
"skip": "ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write"
10-
},
118
"compression-with-detach.tentative.window.js": {
129
"requires": ["crypto"]
1310
},

0 commit comments

Comments
 (0)