(maybe) decompresses a stream
jsr.io/@mary/maybe-decompression-stream
jsr
typescript
1import { assertEquals } from '@std/assert';
2
3import { MaybeDecompressionStream } from './mod.ts';
4
5Deno.test({
6 name: 'decompresses a gzip stream',
7 async fn() {
8 const { readable, writable } = new MaybeDecompressionStream();
9
10 {
11 const writer = writable.getWriter();
12
13 // deno-fmt-ignore
14 writer.write(
15 Uint8Array.from([
16 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 242, 72, 205, 201, 201, 215, 81,
17 40, 207, 47, 202, 73, 81, 4, 0, 0, 0, 255, 255, 3, 0, 230, 198, 230,
18 235, 13, 0, 0, 0,
19 ]),
20 );
21
22 writer.close();
23 }
24
25 {
26 const result = await toUint8Array(readable);
27 const decoded = new TextDecoder().decode(result);
28
29 assertEquals(decoded, 'Hello, world!');
30 }
31 },
32});
33
34Deno.test({
35 name: 'passthroughs a non-gzip stream',
36 async fn() {
37 const { readable, writable } = new MaybeDecompressionStream();
38
39 const input = Uint8Array.from([1, 2, 3, 4, 5]);
40
41 {
42 const writer = writable.getWriter();
43 writer.write(input);
44 writer.close();
45 }
46
47 {
48 const result = await toUint8Array(readable);
49 assertEquals(result, input);
50 }
51 },
52});
53
54async function toUint8Array(source: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
55 let buffer: Uint8Array | undefined;
56
57 for await (const value of source) {
58 if (buffer === undefined) {
59 buffer = value;
60 } else {
61 const concat = new Uint8Array(buffer.length + value.length);
62 concat.set(buffer);
63 concat.set(value, buffer.length);
64 buffer = concat;
65 }
66 }
67
68 return buffer ?? new Uint8Array(0);
69}