File tree 2 files changed +32
-8
lines changed
2 files changed +32
-8
lines changed Original file line number Diff line number Diff line change 2
2
3
3
const {
4
4
ObjectDefineProperty,
5
+ PromiseReject,
5
6
Symbol,
6
7
SymbolAsyncIterator,
7
8
} = primordials ;
@@ -157,16 +158,24 @@ class Dir {
157
158
}
158
159
159
160
close ( callback ) {
160
- if ( this [ kDirClosed ] === true ) {
161
- throw new ERR_DIR_CLOSED ( ) ;
162
- }
163
-
161
+ // Promise
164
162
if ( callback === undefined ) {
163
+ if ( this [ kDirClosed ] === true ) {
164
+ return PromiseReject ( new ERR_DIR_CLOSED ( ) ) ;
165
+ }
165
166
return this [ kDirClosePromisified ] ( ) ;
166
- } else if ( typeof callback !== 'function' ) {
167
+ }
168
+
169
+ // callback
170
+ if ( typeof callback !== 'function' ) {
167
171
throw new ERR_INVALID_CALLBACK ( callback ) ;
168
172
}
169
173
174
+ if ( this [ kDirClosed ] === true ) {
175
+ process . nextTick ( callback , new ERR_DIR_CLOSED ( ) ) ;
176
+ return ;
177
+ }
178
+
170
179
if ( this [ kDirOperationQueue ] !== null ) {
171
180
this [ kDirOperationQueue ] . push ( ( ) => {
172
181
this . close ( callback ) ;
Original file line number Diff line number Diff line change @@ -223,12 +223,11 @@ async function doAsyncIterInvalidCallbackTest() {
223
223
}
224
224
doAsyncIterInvalidCallbackTest ( ) . then ( common . mustCall ( ) ) ;
225
225
226
- // Check if directory already closed - throw an exception
226
+ // Check first call to close() - should not report an error.
227
227
async function doAsyncIterDirClosedTest ( ) {
228
228
const dir = await fs . promises . opendir ( testDir ) ;
229
229
await dir . close ( ) ;
230
-
231
- assert . throws ( ( ) => dir . close ( ) , dirclosedError ) ;
230
+ await assert . rejects ( ( ) => dir . close ( ) , dirclosedError ) ;
232
231
}
233
232
doAsyncIterDirClosedTest ( ) . then ( common . mustCall ( ) ) ;
234
233
@@ -267,3 +266,19 @@ async function doConcurrentAsyncMixedOps() {
267
266
await promise2 ;
268
267
}
269
268
doConcurrentAsyncMixedOps ( ) . then ( common . mustCall ( ) ) ;
269
+
270
+ // Check if directory already closed - the callback should pass an error.
271
+ {
272
+ const dir = fs . opendirSync ( testDir ) ;
273
+ dir . closeSync ( ) ;
274
+ dir . close ( common . mustCall ( ( error ) => {
275
+ assert . strictEqual ( error . code , dirclosedError . code ) ;
276
+ } ) ) ;
277
+ }
278
+
279
+ // Check if directory already closed - throw an promise exception.
280
+ {
281
+ const dir = fs . opendirSync ( testDir ) ;
282
+ dir . closeSync ( ) ;
283
+ assert . rejects ( dir . close ( ) , dirclosedError ) . then ( common . mustCall ( ) ) ;
284
+ }
You can’t perform that action at this time.
0 commit comments