@@ -121,12 +121,15 @@ describe("Brotli-wasm", () => {
121
121
const input1 = input . slice ( 0 , input . length / 2 ) ;
122
122
const input2 = input . slice ( input . length / 2 ) ;
123
123
const stream = new brotli . CompressStream ( ) ;
124
- const output1 = stream . compress ( input1 , 100 ) ;
125
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
126
- const output2 = stream . compress ( input2 , 100 ) ;
127
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
128
- const output3 = stream . compress ( undefined , 100 ) ;
129
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
124
+ const result1 = stream . compress ( input1 , 100 ) ;
125
+ const output1 = result1 . buf ;
126
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
127
+ const result2 = stream . compress ( input2 , 100 ) ;
128
+ const output2 = result2 . buf ;
129
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
130
+ const result3 = stream . compress ( undefined , 100 ) ;
131
+ const output3 = result3 . buf ;
132
+ expect ( result3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
130
133
expect ( dataToBase64 ( [ ...output1 , ...output2 , ...output3 ] ) ) . to . equal ( 'Gw4A+KWpyubolCCjVAjmxJ4D' ) ;
131
134
} ) ;
132
135
@@ -136,12 +139,15 @@ describe("Brotli-wasm", () => {
136
139
const input2 = input . slice ( input . length / 2 ) ;
137
140
const quality = 1 ;
138
141
const stream = new brotli . CompressStream ( quality ) ;
139
- const output1 = stream . compress ( input1 , 100 ) ;
140
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
141
- const output2 = stream . compress ( input2 , 100 ) ;
142
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
143
- const output3 = stream . compress ( undefined , 100 ) ;
144
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
142
+ const result1 = stream . compress ( input1 , 100 ) ;
143
+ const output1 = result1 . buf ;
144
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
145
+ const result2 = stream . compress ( input2 , 100 ) ;
146
+ const output2 = result2 . buf ;
147
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
148
+ const result3 = stream . compress ( undefined , 100 ) ;
149
+ const output3 = result3 . buf ;
150
+ expect ( result3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
145
151
// It will be different from non-streaming result.
146
152
// But it can still be decompressed back to the original string.
147
153
let output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
@@ -154,10 +160,12 @@ describe("Brotli-wasm", () => {
154
160
const input1 = input . slice ( 0 , input . length / 2 ) ;
155
161
const input2 = input . slice ( input . length / 2 ) ;
156
162
const stream = new brotli . DecompressStream ( ) ;
157
- const output1 = stream . decompress ( input1 , 100 ) ;
158
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
159
- const output2 = stream . decompress ( input2 , 100 ) ;
160
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
163
+ const result1 = stream . decompress ( input1 , 100 ) ;
164
+ const output1 = result1 . buf ;
165
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
166
+ const result2 = stream . decompress ( input2 , 100 ) ;
167
+ const output2 = result2 . buf ;
168
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
161
169
expect ( textDecoder . decode ( new Uint8Array ( [ ...output1 , ...output2 ] ) ) ) . to . equal ( 'Brotli brotli brotli brotli' ) ;
162
170
} ) ;
163
171
@@ -167,12 +175,15 @@ describe("Brotli-wasm", () => {
167
175
const input2 = input . slice ( input . length / 2 ) ;
168
176
const quality = 12 ;
169
177
const stream = new brotli . CompressStream ( quality ) ;
170
- const output1 = stream . compress ( input1 , 100 ) ;
171
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
172
- const output2 = stream . compress ( input2 , 100 ) ;
173
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
174
- const output3 = stream . compress ( undefined , 100 ) ;
175
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
178
+ const result1 = stream . compress ( input1 , 100 ) ;
179
+ const output1 = result1 . buf ;
180
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
181
+ const result2 = stream . compress ( input2 , 100 ) ;
182
+ const output2 = result2 . buf ;
183
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
184
+ const result3 = stream . compress ( undefined , 100 ) ;
185
+ const output3 = result3 . buf ;
186
+ expect ( result3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
176
187
expect ( dataToBase64 ( [ ...output1 , ...output2 , ...output3 ] ) ) . to . equal ( 'Gw4A+KWpyubolCCjVAjmxJ4D' ) ;
177
188
} ) ;
178
189
@@ -182,7 +193,6 @@ describe("Brotli-wasm", () => {
182
193
expect ( ( ) =>
183
194
stream . decompress ( input , 100 )
184
195
) . to . throw ( 'Brotli streaming decompress failed' ) ;
185
- expect ( stream . result ( ) ) . to . lt ( 0 ) ;
186
196
} ) ;
187
197
188
198
it ( "can streamingly compress & decompress back to the original result" , ( ) => {
@@ -191,21 +201,26 @@ describe("Brotli-wasm", () => {
191
201
const encInput1 = encInput . slice ( 0 , encInput . length / 2 ) ;
192
202
const encInput2 = encInput . slice ( encInput . length / 2 ) ;
193
203
const encStream = new brotli . CompressStream ( ) ;
194
- const encOutput1 = encStream . compress ( encInput1 , 100 ) ;
195
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
196
- const encOutput2 = encStream . compress ( encInput2 , 100 ) ;
197
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
198
- const encOutput3 = encStream . compress ( undefined , 100 ) ;
199
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
204
+ const encResult1 = encStream . compress ( encInput1 , 100 ) ;
205
+ const encOutput1 = encResult1 . buf ;
206
+ expect ( encResult1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
207
+ const encResult2 = encStream . compress ( encInput2 , 100 ) ;
208
+ const encOutput2 = encResult2 . buf ;
209
+ expect ( encResult2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
210
+ const encResult3 = encStream . compress ( undefined , 100 ) ;
211
+ const encOutput3 = encResult3 . buf ;
212
+ expect ( encResult3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
200
213
const encOutput = new Uint8Array ( [ ...encOutput1 , ...encOutput2 , ...encOutput3 ] ) ;
201
214
202
215
const decInput1 = encOutput . slice ( 0 , encOutput . length / 2 ) ;
203
216
const decInput2 = encOutput . slice ( encOutput . length / 2 ) ;
204
217
const decStream = new brotli . DecompressStream ( ) ;
205
- const decOutput1 = decStream . decompress ( decInput1 , 100 ) ;
206
- expect ( decStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
207
- const decOutput2 = decStream . decompress ( decInput2 , 100 ) ;
208
- expect ( decStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
218
+ const decResult1 = decStream . decompress ( decInput1 , 100 ) ;
219
+ const decOutput1 = decResult1 . buf ;
220
+ expect ( decResult1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
221
+ const decResult2 = decStream . decompress ( decInput2 , 100 ) ;
222
+ const decOutput2 = decResult2 . buf ;
223
+ expect ( decResult2 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
209
224
const decOutput = new Uint8Array ( [ ...decOutput1 , ...decOutput2 ] ) ;
210
225
211
226
expect ( textDecoder . decode ( decOutput ) ) . to . equal ( s ) ;
@@ -218,21 +233,26 @@ describe("Brotli-wasm", () => {
218
233
const encInput2 = encInput . slice ( encInput . length / 2 ) ;
219
234
const quality = 3 ;
220
235
const encStream = new brotli . CompressStream ( quality ) ;
221
- const encOutput1 = encStream . compress ( encInput1 , 100 ) ;
222
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
223
- const encOutput2 = encStream . compress ( encInput2 , 100 ) ;
224
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
225
- const encOutput3 = encStream . compress ( undefined , 100 ) ;
226
- expect ( encStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
236
+ const encResult1 = encStream . compress ( encInput1 , 100 ) ;
237
+ const encOutput1 = encResult1 . buf ;
238
+ expect ( encResult1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
239
+ const encResult2 = encStream . compress ( encInput2 , 100 ) ;
240
+ const encOutput2 = encResult2 . buf ;
241
+ expect ( encResult2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
242
+ const encResult3 = encStream . compress ( undefined , 100 ) ;
243
+ const encOutput3 = encResult3 . buf ;
244
+ expect ( encResult3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
227
245
const encOutput = new Uint8Array ( [ ...encOutput1 , ...encOutput2 , ...encOutput3 ] ) ;
228
246
229
247
const decInput1 = encOutput . slice ( 0 , encOutput . length / 2 ) ;
230
248
const decInput2 = encOutput . slice ( encOutput . length / 2 ) ;
231
249
const decStream = new brotli . DecompressStream ( ) ;
232
- const decOutput1 = decStream . decompress ( decInput1 , 100 ) ;
233
- expect ( decStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
234
- const decOutput2 = decStream . decompress ( decInput2 , 100 ) ;
235
- expect ( decStream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
250
+ const decResult1 = decStream . decompress ( decInput1 , 100 ) ;
251
+ const decOutput1 = decResult1 . buf ;
252
+ expect ( decResult1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
253
+ const decResult2 = decStream . decompress ( decInput2 , 100 ) ;
254
+ const decOutput2 = decResult2 . buf ;
255
+ expect ( decResult2 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
236
256
const decOutput = new Uint8Array ( [ ...decOutput1 , ...decOutput2 ] ) ;
237
257
238
258
expect ( textDecoder . decode ( decOutput ) ) . to . equal ( s ) ;
@@ -244,12 +264,15 @@ describe("Brotli-wasm", () => {
244
264
// to make the compressor ask for more output space when the action is PROCESS
245
265
const input = generateRandomBytes ( 1600000 ) ;
246
266
const stream = new brotli . CompressStream ( ) ;
247
- const output1 = stream . compress ( input , 1 ) ;
248
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreOutput ) ;
249
- const output2 = stream . compress ( input . slice ( stream . last_input_offset ( ) ) , 1500000 ) ;
250
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
251
- const output3 = stream . compress ( undefined , 1640000 ) ;
252
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
267
+ const result1 = stream . compress ( input , 1 ) ;
268
+ const output1 = result1 . buf ;
269
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreOutput ) ;
270
+ const result2 = stream . compress ( input . slice ( result1 . input_offset ) , 1500000 ) ;
271
+ const output2 = result2 . buf ;
272
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
273
+ const result3 = stream . compress ( undefined , 1640000 ) ;
274
+ const output3 = result3 . buf ;
275
+ expect ( result3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
253
276
const output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
254
277
255
278
expect ( [ ...brotli . decompress ( output ) ] ) . to . deep . equal ( [ ...input ] ) ;
@@ -258,23 +281,28 @@ describe("Brotli-wasm", () => {
258
281
it ( "streaming compressing can handle needing more output when action is finish" , ( ) => {
259
282
const input = textEncoder . encode ( 'Some thrilling text I urgently need to compress' ) ;
260
283
const stream = new brotli . CompressStream ( ) ;
261
- const output1 = stream . compress ( input , 1 ) ;
262
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreInput ) ;
263
- const output2 = stream . compress ( undefined , 1 ) ;
264
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreOutput ) ;
265
- const output3 = stream . compress ( undefined , 100 ) ;
266
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
284
+ const result1 = stream . compress ( input , 1 ) ;
285
+ const output1 = result1 . buf ;
286
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreInput ) ;
287
+ const result2 = stream . compress ( undefined , 1 ) ;
288
+ const output2 = result2 . buf ;
289
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreOutput ) ;
290
+ const result3 = stream . compress ( undefined , 100 ) ;
291
+ const output3 = result3 . buf ;
292
+ expect ( result3 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
267
293
const output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
268
294
expect ( dataToBase64 ( brotli . decompress ( output ) ) ) . to . equal ( dataToBase64 ( input ) ) ;
269
295
} ) ;
270
296
271
297
it ( "streaming decompressing can handle needing more output" , ( ) => {
272
298
const input = base64ToData ( 'GxoAABypU587dC0k9ianQOgqjS32iUTcCA==' ) ;
273
299
const stream = new brotli . DecompressStream ( ) ;
274
- const output1 = stream . decompress ( input , 1 ) ;
275
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . NeedsMoreOutput ) ;
276
- const output2 = stream . decompress ( input . slice ( stream . last_input_offset ( ) ) , 100 ) ;
277
- expect ( stream . result ( ) ) . to . equal ( brotli . BrotliStreamResult . ResultSuccess ) ;
300
+ const result1 = stream . decompress ( input , 1 ) ;
301
+ const output1 = result1 . buf ;
302
+ expect ( result1 . code ) . to . equal ( brotli . BrotliStreamResultCode . NeedsMoreOutput ) ;
303
+ const result2 = stream . decompress ( input . slice ( result1 . input_offset ) , 100 ) ;
304
+ const output2 = result2 . buf ;
305
+ expect ( result2 . code ) . to . equal ( brotli . BrotliStreamResultCode . ResultSuccess ) ;
278
306
expect ( textDecoder . decode ( new Uint8Array ( [ ...output1 , ...output2 ] ) ) ) . to . equal ( 'Brotli brotli brotli brotli' ) ;
279
307
} ) ;
280
308
@@ -304,14 +332,28 @@ describe("Brotli-wasm", () => {
304
332
const compressionStream = new TransformStream ( {
305
333
start ( ) { } ,
306
334
transform ( chunk , controller ) {
307
- controller . enqueue ( compressStream . compress ( chunk , 10 ) ) ;
335
+ let resultCode ;
336
+ let inputOffset = 0 ;
337
+ do {
338
+ const input = chunk . slice ( inputOffset ) ;
339
+ const result = compressStream . compress ( input , 10 ) ;
340
+ controller . enqueue ( result . buf ) ;
341
+ resultCode = result . code ;
342
+ inputOffset += result . input_offset ;
343
+ } while ( resultCode === brotli . BrotliStreamResultCode . NeedsMoreOutput ) ;
344
+ if ( resultCode !== brotli . BrotliStreamResultCode . NeedsMoreInput ) {
345
+ controller . error ( `Brotli compression failed when transforming with code ${ resultCode } ` ) ;
346
+ }
308
347
} ,
309
348
flush ( controller ) {
310
- while (
311
- compressStream . result ( ) === brotli . BrotliStreamResult . NeedsMoreInput ||
312
- compressStream . result ( ) === brotli . BrotliStreamResult . NeedsMoreOutput
313
- ) {
314
- controller . enqueue ( compressStream . compress ( undefined , 10 ) ) ;
349
+ let resultCode ;
350
+ do {
351
+ const result = compressStream . compress ( undefined , 10 ) ;
352
+ controller . enqueue ( result . buf ) ;
353
+ resultCode = result . code ;
354
+ } while ( resultCode === brotli . BrotliStreamResultCode . NeedsMoreOutput )
355
+ if ( resultCode !== brotli . BrotliStreamResultCode . ResultSuccess ) {
356
+ controller . error ( `Brotli compression failed when flushing with code ${ resultCode } ` ) ;
315
357
}
316
358
controller . terminate ( ) ;
317
359
}
@@ -321,12 +363,23 @@ describe("Brotli-wasm", () => {
321
363
const decompressionStream = new TransformStream ( {
322
364
start ( ) { } ,
323
365
transform ( chunk , controller ) {
324
- controller . enqueue ( decompressStream . decompress ( chunk , 100 ) ) ;
366
+ let resultCode ;
367
+ let inputOffset = 0 ;
368
+ do {
369
+ const input = chunk . slice ( inputOffset ) ;
370
+ const result = decompressStream . decompress ( input , 100 ) ;
371
+ controller . enqueue ( result . buf ) ;
372
+ resultCode = result . code ;
373
+ inputOffset += result . input_offset ;
374
+ } while ( resultCode === brotli . BrotliStreamResultCode . NeedsMoreOutput ) ;
375
+ if (
376
+ resultCode !== brotli . BrotliStreamResultCode . NeedsMoreInput &&
377
+ resultCode !== brotli . BrotliStreamResultCode . ResultSuccess
378
+ ) {
379
+ controller . error ( `Brotli decompression failed with code ${ resultCode } ` )
380
+ }
325
381
} ,
326
382
flush ( controller ) {
327
- while ( decompressStream . result ( ) === brotli . BrotliStreamResult . NeedsMoreOutput ) {
328
- controller . enqueue ( decompressStream . decompress ( new Uint8Array ( 0 ) , 100 ) ) ;
329
- }
330
383
controller . terminate ( ) ;
331
384
}
332
385
} ) ;
0 commit comments