@@ -76,27 +76,29 @@ export class CsvParserStream<I extends Row, O extends Row> extends Transform {
76
76
if ( this . hasHitRowLimit ) {
77
77
return done ( ) ;
78
78
}
79
+ const wrappedCallback = CsvParserStream . wrapDoneCallback ( done ) ;
79
80
try {
80
81
const { lines } = this ;
81
82
const newLine = lines + this . decoder . write ( data ) ;
82
83
const rows = this . parse ( newLine , true ) ;
83
- return this . processRows ( rows , done ) ;
84
+ return this . processRows ( rows , wrappedCallback ) ;
84
85
} catch ( e ) {
85
- return done ( e ) ;
86
+ return wrappedCallback ( e ) ;
86
87
}
87
88
}
88
89
89
90
public _flush ( done : TransformCallback ) : void {
91
+ const wrappedCallback = CsvParserStream . wrapDoneCallback ( done ) ;
90
92
// if we have hit our maxRows parsing limit then skip parsing
91
93
if ( this . hasHitRowLimit ) {
92
- return done ( ) ;
94
+ return wrappedCallback ( ) ;
93
95
}
94
96
try {
95
97
const newLine = this . lines + this . decoder . end ( ) ;
96
98
const rows = this . parse ( newLine , false ) ;
97
- return this . processRows ( rows , done ) ;
99
+ return this . processRows ( rows , wrappedCallback ) ;
98
100
} catch ( e ) {
99
- return done ( e ) ;
101
+ return wrappedCallback ( e ) ;
100
102
}
101
103
}
102
104
@@ -214,4 +216,20 @@ export class CsvParserStream<I extends Row, O extends Row> extends Transform {
214
216
cb ( e ) ;
215
217
}
216
218
}
219
+
220
+ private static wrapDoneCallback ( done : TransformCallback ) : TransformCallback {
221
+ let errorCalled = false ;
222
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
+ return ( err : Error | null | undefined , ...args : any [ ] ) : void => {
224
+ if ( err ) {
225
+ if ( errorCalled ) {
226
+ throw err ;
227
+ }
228
+ errorCalled = true ;
229
+ done ( err ) ;
230
+ return ;
231
+ }
232
+ done ( ...args ) ;
233
+ } ;
234
+ }
217
235
}
0 commit comments