, 1: type } = ArrayPrototypeSplice(this[kDirBufferedEntries], 0, 2); return getDirent(this[kDirPath], name, type); } const ctx = { path: this[kDirPath] }; const result = this[kDirHandle].read( this[kDirOptions].encoding, this[kDirOptions].bufferSize, undefined, ctx ); handleErrorFromBinding(ctx); if (result === null) { return result; } this[kDirBufferedEntries] = ArrayPrototypeSlice(result, 2); return getDirent(this[kDirPath], result[0], result[1]); } close(callback) { // Promise if (callback === undefined) { if (this[kDirClosed] === true) { return PromiseReject(new ERR_DIR_CLOSED()); } return this[kDirClosePromisified](); } // callback validateFunction(callback, 'callback'); if (this[kDirClosed] === true) { process.nextTick(callback, new ERR_DIR_CLOSED()); return; } if (this[kDirOperationQueue] !== null) { ArrayPrototypePush(this[kDirOperationQueue], () => { this.close(callback); }); return; } this[kDirClosed] = true; const req = new FSReqCallback(); req.oncomplete = callback; this[kDirHandle].close(req); } closeSync() { if (this[kDirClosed] === true) { throw new ERR_DIR_CLOSED(); } if (this[kDirOperationQueue] !== null) { throw new ERR_DIR_CONCURRENT_OPERATION(); } this[kDirClosed] = true; const ctx = { path: this[kDirPath] }; const result = this[kDirHandle].close(undefined, ctx); handleErrorFromBinding(ctx); return result; } async* entries() { try { while (true) { const result = await this[kDirReadPromisified](); if (result === null) { break; } yield result; } } finally { await this[kDirClosePromisified](); } } } ObjectDefineProperty(Dir.prototype, SymbolAsyncIterator, { value: Dir.prototype.entries, enumerable: false, writable: true, configurable: true, }); function opendir(path, options, callback) { callback = typeof options === 'function' ? options : callback; validateFunction(callback, 'callback'); path = getValidatedPath(path); options = getOptions(options, { encoding: 'utf8' }); function opendirCallback(error, handle) { if (error) { callback(error); } else { callback(null, new Dir(handle, path, options)); } } const req = new FSReqCallback(); req.oncomplete = opendirCallback; dirBinding.opendir( pathModule.toNamespacedPath(path), options.encoding, req ); } function opendirSync(path, options) { path = getValidatedPath(path); options = getOptions(options, { encoding: 'utf8' }); const ctx = { path }; const handle = dirBinding.opendir( pathModule.toNamespacedPath(path), options.encoding, undefined, ctx ); handleErrorFromBinding(ctx); return new Dir(handle, path, options); } module.exports = { Dir, opendir, opendirSync };