@@ -121,12 +121,15 @@ describe("Brotli-wasm", () => {
121121 const input1 = input . slice ( 0 , input . length / 2 ) ;
122122 const input2 = input . slice ( input . length / 2 ) ;
123123 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 ) ;
130133 expect ( dataToBase64 ( [ ...output1 , ...output2 , ...output3 ] ) ) . to . equal ( 'Gw4A+KWpyubolCCjVAjmxJ4D' ) ;
131134 } ) ;
132135
@@ -136,12 +139,15 @@ describe("Brotli-wasm", () => {
136139 const input2 = input . slice ( input . length / 2 ) ;
137140 const quality = 1 ;
138141 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 ) ;
145151 // It will be different from non-streaming result.
146152 // But it can still be decompressed back to the original string.
147153 let output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
@@ -154,10 +160,12 @@ describe("Brotli-wasm", () => {
154160 const input1 = input . slice ( 0 , input . length / 2 ) ;
155161 const input2 = input . slice ( input . length / 2 ) ;
156162 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 ) ;
161169 expect ( textDecoder . decode ( new Uint8Array ( [ ...output1 , ...output2 ] ) ) ) . to . equal ( 'Brotli brotli brotli brotli' ) ;
162170 } ) ;
163171
@@ -167,12 +175,15 @@ describe("Brotli-wasm", () => {
167175 const input2 = input . slice ( input . length / 2 ) ;
168176 const quality = 12 ;
169177 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 ) ;
176187 expect ( dataToBase64 ( [ ...output1 , ...output2 , ...output3 ] ) ) . to . equal ( 'Gw4A+KWpyubolCCjVAjmxJ4D' ) ;
177188 } ) ;
178189
@@ -182,7 +193,6 @@ describe("Brotli-wasm", () => {
182193 expect ( ( ) =>
183194 stream . decompress ( input , 100 )
184195 ) . to . throw ( 'Brotli streaming decompress failed' ) ;
185- expect ( stream . result ( ) ) . to . lt ( 0 ) ;
186196 } ) ;
187197
188198 it ( "can streamingly compress & decompress back to the original result" , ( ) => {
@@ -191,21 +201,26 @@ describe("Brotli-wasm", () => {
191201 const encInput1 = encInput . slice ( 0 , encInput . length / 2 ) ;
192202 const encInput2 = encInput . slice ( encInput . length / 2 ) ;
193203 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 ) ;
200213 const encOutput = new Uint8Array ( [ ...encOutput1 , ...encOutput2 , ...encOutput3 ] ) ;
201214
202215 const decInput1 = encOutput . slice ( 0 , encOutput . length / 2 ) ;
203216 const decInput2 = encOutput . slice ( encOutput . length / 2 ) ;
204217 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 ) ;
209224 const decOutput = new Uint8Array ( [ ...decOutput1 , ...decOutput2 ] ) ;
210225
211226 expect ( textDecoder . decode ( decOutput ) ) . to . equal ( s ) ;
@@ -218,21 +233,26 @@ describe("Brotli-wasm", () => {
218233 const encInput2 = encInput . slice ( encInput . length / 2 ) ;
219234 const quality = 3 ;
220235 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 ) ;
227245 const encOutput = new Uint8Array ( [ ...encOutput1 , ...encOutput2 , ...encOutput3 ] ) ;
228246
229247 const decInput1 = encOutput . slice ( 0 , encOutput . length / 2 ) ;
230248 const decInput2 = encOutput . slice ( encOutput . length / 2 ) ;
231249 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 ) ;
236256 const decOutput = new Uint8Array ( [ ...decOutput1 , ...decOutput2 ] ) ;
237257
238258 expect ( textDecoder . decode ( decOutput ) ) . to . equal ( s ) ;
@@ -244,12 +264,15 @@ describe("Brotli-wasm", () => {
244264 // to make the compressor ask for more output space when the action is PROCESS
245265 const input = generateRandomBytes ( 1600000 ) ;
246266 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 ) ;
253276 const output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
254277
255278 expect ( [ ...brotli . decompress ( output ) ] ) . to . deep . equal ( [ ...input ] ) ;
@@ -258,23 +281,28 @@ describe("Brotli-wasm", () => {
258281 it ( "streaming compressing can handle needing more output when action is finish" , ( ) => {
259282 const input = textEncoder . encode ( 'Some thrilling text I urgently need to compress' ) ;
260283 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 ) ;
267293 const output = new Uint8Array ( [ ...output1 , ...output2 , ...output3 ] ) ;
268294 expect ( dataToBase64 ( brotli . decompress ( output ) ) ) . to . equal ( dataToBase64 ( input ) ) ;
269295 } ) ;
270296
271297 it ( "streaming decompressing can handle needing more output" , ( ) => {
272298 const input = base64ToData ( 'GxoAABypU587dC0k9ianQOgqjS32iUTcCA==' ) ;
273299 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 ) ;
278306 expect ( textDecoder . decode ( new Uint8Array ( [ ...output1 , ...output2 ] ) ) ) . to . equal ( 'Brotli brotli brotli brotli' ) ;
279307 } ) ;
280308
@@ -304,14 +332,28 @@ describe("Brotli-wasm", () => {
304332 const compressionStream = new TransformStream ( {
305333 start ( ) { } ,
306334 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+ }
308347 } ,
309348 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 } ` ) ;
315357 }
316358 controller . terminate ( ) ;
317359 }
@@ -321,12 +363,23 @@ describe("Brotli-wasm", () => {
321363 const decompressionStream = new TransformStream ( {
322364 start ( ) { } ,
323365 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+ }
325381 } ,
326382 flush ( controller ) {
327- while ( decompressStream . result ( ) === brotli . BrotliStreamResult . NeedsMoreOutput ) {
328- controller . enqueue ( decompressStream . decompress ( new Uint8Array ( 0 ) , 100 ) ) ;
329- }
330383 controller . terminate ( ) ;
331384 }
332385 } ) ;
0 commit comments