@@ -2,12 +2,7 @@ import { Writer } from '@transcend-io/conflux';
2
2
import mime from 'mime' ;
3
3
import { StreamSaverInstance } from './streamsaver.js' ;
4
4
import type { PenumbraFile , ZipOptions } from './types.js' ;
5
- import {
6
- isNumber ,
7
- emitZipProgress ,
8
- emitZipCompletion ,
9
- throwOutside ,
10
- } from './utils/index.js' ;
5
+ import { isNumber , emitZipProgress , emitZipCompletion } from './utils/index.js' ;
11
6
import { logger } from './logger.js' ;
12
7
13
8
/**
@@ -34,11 +29,9 @@ const sumWrites = async (writes: Promise<number>[]): Promise<number> => {
34
29
logger . error ( error . reason , null ) ;
35
30
}
36
31
// Throw AggregateError to console
37
- throwOutside (
38
- new AggregateError (
39
- errors ,
40
- `File${ errors . length > 1 ? 's' : '' } failed to be written to zip` ,
41
- ) ,
32
+ throw new AggregateError (
33
+ errors ,
34
+ `File${ errors . length > 1 ? 's' : '' } failed to be written to zip` ,
42
35
) ;
43
36
}
44
37
@@ -66,7 +59,7 @@ export class PenumbraZipWriter extends EventTarget {
66
59
private saveBuffer = false ;
67
60
68
61
/** Zip buffer used for testing */
69
- private zipBuffer : Promise < ArrayBuffer > | undefined ;
62
+ private zipBufferPromise : Promise < ArrayBuffer > | undefined ;
70
63
71
64
/** Allow & auto-rename duplicate files sent to writer */
72
65
private allowDuplicates : boolean ;
@@ -90,7 +83,7 @@ export class PenumbraZipWriter extends EventTarget {
90
83
private bytesWritten = 0 ;
91
84
92
85
/** Promise representing completion of the zip stream piping to the file sink */
93
- private pipePromise ?: Promise < void > ;
86
+ public pipePromise ?: Promise < void > ;
94
87
95
88
/**
96
89
* Penumbra zip writer constructor
@@ -119,6 +112,7 @@ export class PenumbraZipWriter extends EventTarget {
119
112
'abort' ,
120
113
( ) => {
121
114
this . close ( ) . catch ( ( error : unknown ) => {
115
+ logger . error ( error , null ) ;
122
116
logger . error (
123
117
`Failed to close zip writer: ${ error instanceof Error ? error . message : String ( error ) } ` ,
124
118
null ,
@@ -158,20 +152,34 @@ export class PenumbraZipWriter extends EventTarget {
158
152
// keep the original promise's rejection for callers that await `done()`.
159
153
// This is intentionally not chained to the `zipStream.pipeTo()` promise, so that `this.pipePromise` throws as normal.
160
154
this . pipePromise . catch ( ( error : unknown ) => {
161
- const finalError =
155
+ const asError =
162
156
error instanceof Error
163
157
? error
164
158
: typeof error === 'string'
165
159
? new Error ( error )
166
160
: new Error ( 'Unknown error' ) ;
167
- finalError . message = `penumbra.saveZip() failed to create zip: ${ finalError . message } ` ;
161
+ const finalError = new Error (
162
+ `penumbra.saveZip() failed to create zip: ${ asError . message } ` ,
163
+ ) ;
168
164
logger . error ( finalError , null ) ;
169
165
} ) ;
170
166
171
167
// Buffer zip stream for debug & testing
172
168
if ( saveBuffer && bufferedZipStream ) {
173
169
this . saveBuffer = saveBuffer ;
174
- this . zipBuffer = new Response ( bufferedZipStream ) . arrayBuffer ( ) ;
170
+ this . zipBufferPromise = new Response ( bufferedZipStream ) . arrayBuffer ( ) ;
171
+ this . zipBufferPromise . catch ( ( error : unknown ) => {
172
+ const asError =
173
+ error instanceof Error
174
+ ? error
175
+ : typeof error === 'string'
176
+ ? new Error ( error )
177
+ : new Error ( 'Unknown error' ) ;
178
+ const finalError = new Error (
179
+ `penumbra.saveZip() failed to buffer zip: ${ asError . message } ` ,
180
+ ) ;
181
+ logger . error ( finalError , null ) ;
182
+ } ) ;
175
183
}
176
184
}
177
185
@@ -255,7 +263,7 @@ export class PenumbraZipWriter extends EventTarget {
255
263
null ,
256
264
) ;
257
265
} else {
258
- zip . abort ( ) ;
266
+ zip . abort ( new Error ( warning ) ) ;
259
267
throw new Error ( warning ) ;
260
268
}
261
269
}
@@ -316,16 +324,19 @@ export class PenumbraZipWriter extends EventTarget {
316
324
controller . close ( ) ;
317
325
reader . releaseLock ( ) ;
318
326
} ,
319
- cancel : ( reason ) => {
320
- const error =
327
+ cancel : ( reason : unknown ) => {
328
+ const asError =
321
329
reason instanceof Error
322
330
? reason
323
331
: typeof reason === 'string'
324
332
? new Error ( reason )
325
333
: new Error ( 'Unknown error' ) ;
326
334
327
- error . message = `penumbra.saveZip(): stream was cancelled: ${ error . message } ` ;
328
- reject ( error ) ;
335
+ const finalError = new Error (
336
+ `penumbra.saveZip(): stream was cancelled: ${ asError . message } ` ,
337
+ ) ;
338
+ logger . error ( finalError , null ) ;
339
+ reject ( finalError ) ;
329
340
} ,
330
341
} ) ;
331
342
@@ -339,14 +350,17 @@ export class PenumbraZipWriter extends EventTarget {
339
350
stream : ( ) => completionTrackerStream ,
340
351
} )
341
352
. catch ( ( error : unknown ) => {
342
- const finalError =
353
+ const asError =
343
354
error instanceof Error
344
355
? error
345
356
: typeof error === 'string'
346
357
? new Error ( error )
347
358
: new Error ( 'Unknown error' ) ;
348
359
349
- finalError . message = `penumbra.saveZip(): failed to write file ${ filePath } : ${ finalError . message } ` ;
360
+ const finalError = new Error (
361
+ `penumbra.saveZip(): failed to write file ${ filePath } : ${ asError . message } ` ,
362
+ ) ;
363
+ logger . error ( finalError , null ) ;
350
364
reject ( finalError ) ;
351
365
} ) ;
352
366
} ) ;
@@ -369,13 +383,16 @@ export class PenumbraZipWriter extends EventTarget {
369
383
try {
370
384
await this . writer . close ( ) ;
371
385
} catch ( error : unknown ) {
372
- const finalError =
386
+ const asError =
373
387
error instanceof Error
374
388
? error
375
389
: typeof error === 'string'
376
390
? new Error ( error )
377
391
: new Error ( 'Unknown error' ) ;
378
- finalError . message = `penumbra.saveZip(): failed to close zip writer: ${ finalError . message } ` ;
392
+ const finalError = new Error (
393
+ `penumbra.saveZip(): failed to close zip writer: ${ asError . message } ` ,
394
+ ) ;
395
+ logger . error ( finalError , null ) ;
379
396
throw finalError ;
380
397
}
381
398
}
@@ -387,22 +404,25 @@ export class PenumbraZipWriter extends EventTarget {
387
404
*/
388
405
await this . pipePromise ;
389
406
} catch ( error : unknown ) {
390
- const finalError =
407
+ const asError =
391
408
error instanceof Error
392
409
? error
393
410
: typeof error === 'string'
394
411
? new Error ( error )
395
412
: new Error ( 'Unknown error' ) ;
396
- finalError . message = `penumbra.saveZip(): finished writing zip, but failed to download: ${ finalError . message } ` ;
413
+ const finalError = new Error (
414
+ `penumbra.saveZip(): finished writing zip, but failed to download: ${ asError . message } ` ,
415
+ ) ;
416
+ logger . error ( finalError , null ) ;
397
417
throw finalError ;
398
418
}
399
419
return size ;
400
420
}
401
421
402
422
/** Cancel Penumbra zip writer */
403
- abort ( ) : void {
423
+ abort ( reason ?: Error ) : void {
404
424
if ( ! this . controller . signal . aborted ) {
405
- this . controller . abort ( ) ;
425
+ this . controller . abort ( reason ) ;
406
426
}
407
427
}
408
428
@@ -416,12 +436,12 @@ export class PenumbraZipWriter extends EventTarget {
416
436
'getBuffer() can only be called when a PenumbraZipWriter is closed' ,
417
437
) ;
418
438
}
419
- if ( ! this . saveBuffer || ! this . zipBuffer ) {
439
+ if ( ! this . saveBuffer || ! this . zipBufferPromise ) {
420
440
throw new Error (
421
441
'getBuffer() can only be called on a PenumbraZipWriter in buffered mode, e.g. createZip({ saveBuffer: true })' ,
422
442
) ;
423
443
}
424
- return this . zipBuffer ;
444
+ return this . zipBufferPromise ;
425
445
}
426
446
427
447
/**
0 commit comments