// Flags: --experimental-vfs 'use strict'; // Error paths in VFS streams: missing files, EBADF on closed fds, // destroyed streams, and write to a path under a missing parent. const common = require('../common'); const vfs = require('node:vfs'); const myVfs = vfs.create(); // Read of a nonexistent file emits 'error' { const stream = myVfs.createReadStream('/missing.txt'); stream.on('error', common.expectsError({ code: 'ENOENT', })); } // Read on a stream whose fd has been pre-closed → EBADF on first _read { myVfs.writeFileSync('/x.txt', 'hi'); const fd = myVfs.openSync('/x.txt'); const rs = myVfs.createReadStream('/x.txt', { fd, autoClose: false }); myVfs.closeSync(fd); rs.on('error', common.expectsError({ code: 'EBADF', })); rs.resume(); } // Read stream with autoClose:true after the fd is invalidated — covers the // close-error swallow path inside the stream's #close. { myVfs.writeFileSync('/cl.txt', 'data'); const fd = myVfs.openSync('/cl.txt'); const rs = myVfs.createReadStream('/cl.txt', { fd, autoClose: true }); myVfs.closeSync(fd); rs.on('error', common.expectsError()); rs.resume(); } // WriteStream synchronously failing to open → destroys on next tick { const ws = myVfs.createWriteStream('/missing-dir/foo.txt', { flags: 'wx' }); ws.on('error', common.expectsError()); } // WriteStream destroyed before write() — covers the destroyed-true branch // in _write. { const ws = myVfs.createWriteStream('/wd.txt'); ws.on('error', () => {}); ws.destroy(new Error('boom')); } // _write errors when writeSync throws (closed fd) { myVfs.writeFileSync('/wfd.txt', ''); const fd = myVfs.openSync('/wfd.txt', 'w'); const ws = myVfs.createWriteStream('/wfd.txt', { fd, autoClose: false }); myVfs.closeSync(fd); ws.on('error', common.expectsError()); ws.write('x'); }