@@ -64,6 +64,7 @@ type ExportsManagerEvents = {
64
64
65
65
export class ExportsManager extends EventEmitter < ExportsManagerEvents > {
66
66
private wasInitialized : boolean = false ;
67
+ private isShuttingDown : boolean = false ;
67
68
private storedExports : Record < StoredExport [ "exportName" ] , StoredExport > = { } ;
68
69
private exportsCleanupInProgress : boolean = false ;
69
70
private exportsCleanupInterval ?: NodeJS . Timeout ;
@@ -77,6 +78,7 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
77
78
}
78
79
79
80
public get availableExports ( ) : AvailableExport [ ] {
81
+ this . assertIsNotShuttingDown ( ) ;
80
82
return Object . values ( this . storedExports )
81
83
. filter ( ( storedExport ) => {
82
84
return (
@@ -103,6 +105,11 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
103
105
}
104
106
105
107
public async close ( ) : Promise < void > {
108
+ if ( this . isShuttingDown ) {
109
+ return ;
110
+ }
111
+
112
+ this . isShuttingDown = true ;
106
113
try {
107
114
clearInterval ( this . exportsCleanupInterval ) ;
108
115
await fs . rm ( this . exportsDirectoryPath , { force : true , recursive : true } ) ;
@@ -117,6 +124,7 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
117
124
118
125
public async readExport ( exportName : string ) : Promise < string > {
119
126
try {
127
+ this . assertIsNotShuttingDown ( ) ;
120
128
exportName = decodeURIComponent ( exportName ) ;
121
129
const exportHandle = this . storedExports [ exportName ] ;
122
130
if ( ! exportHandle ) {
@@ -157,6 +165,7 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
157
165
jsonExportFormat : JSONExportFormat ;
158
166
} ) : AvailableExport {
159
167
try {
168
+ this . assertIsNotShuttingDown ( ) ;
160
169
const exportNameWithExtension = validateExportName ( ensureExtension ( exportName , "json" ) ) ;
161
170
if ( this . storedExports [ exportNameWithExtension ] ) {
162
171
throw new Error ( "Export with same name is either already available or being generated." ) ;
@@ -270,7 +279,7 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
270
279
}
271
280
272
281
private async cleanupExpiredExports ( ) : Promise < void > {
273
- if ( this . exportsCleanupInProgress ) {
282
+ if ( this . exportsCleanupInProgress || this . isShuttingDown ) {
274
283
return ;
275
284
}
276
285
@@ -318,6 +327,12 @@ export class ExportsManager extends EventEmitter<ExportsManagerEvents> {
318
327
}
319
328
}
320
329
330
+ private assertIsNotShuttingDown ( ) : void {
331
+ if ( this . isShuttingDown ) {
332
+ throw new Error ( "ExportsManager is shutting down." ) ;
333
+ }
334
+ }
335
+
321
336
static init ( sessionId : string , config : ExportsManagerConfig , logger : LoggerBase ) : ExportsManager {
322
337
const exportsDirectoryPath = path . join ( config . exportsPath , sessionId ) ;
323
338
const exportsManager = new ExportsManager ( exportsDirectoryPath , config , logger ) ;
0 commit comments