diff --git a/src/__tests__/volume.test.ts b/src/__tests__/volume.test.ts index bc5ba0ff..7c7798d1 100644 --- a/src/__tests__/volume.test.ts +++ b/src/__tests__/volume.test.ts @@ -1,3 +1,4 @@ +import { promisify } from 'util'; import { URL } from 'url'; import { Link } from '../node'; import Stats from '../Stats'; @@ -1431,4 +1432,41 @@ describe('volume', () => { expect(new StatWatcher(vol).vol).toBe(vol); }); }); + describe('.createWriteStream', () => { + it('accepts filehandle as fd option', async () => { + const vol = new Volume(); + const fh = await vol.promises.open('/test.txt', 'wx', 0o600); + const writeStream = vol.createWriteStream('', { fd: fh }); + await promisify(writeStream.write.bind(writeStream))(Buffer.from('Hello')); + await promisify(writeStream.close.bind(writeStream))(); + expect(vol.toJSON()).toEqual({ + '/test.txt': 'Hello', + }); + }); + }); + describe('.createReadStream', () => { + it('accepts filehandle as fd option', done => { + const vol = Volume.fromJSON({ + '/test.txt': 'Hello', + }); + vol.promises + .open('/test.txt', 'r') + .then(fh => { + const readStream = vol.createReadStream('/this/should/be/ignored', { fd: fh }); + readStream.setEncoding('utf8'); + let readData = ''; + readStream.on('readable', () => { + const chunk = readStream.read(); + if (chunk != null) readData += chunk; + }); + readStream.on('end', () => { + expect(readData).toEqual('Hello'); + done(); + }); + }) + .catch(err => { + expect(err).toBeNull(); + }); + }); + }); }); diff --git a/src/volume.ts b/src/volume.ts index 1baaa044..f685f610 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -2260,7 +2260,7 @@ function FsReadStream(vol, path, options) { Readable.call(this, options); this.path = pathToFilename(path); - this.fd = options.fd === undefined ? null : options.fd; + this.fd = options.fd === undefined ? null : typeof options.fd !== 'number' ? options.fd.fd : options.fd; this.flags = options.flags === undefined ? 'r' : options.flags; this.mode = options.mode === undefined ? 0o666 : options.mode; @@ -2429,7 +2429,7 @@ function FsWriteStream(vol, path, options) { Writable.call(this, options); this.path = pathToFilename(path); - this.fd = options.fd === undefined ? null : options.fd; + this.fd = options.fd === undefined ? null : typeof options.fd !== 'number' ? options.fd.fd : options.fd; this.flags = options.flags === undefined ? 'w' : options.flags; this.mode = options.mode === undefined ? 0o666 : options.mode;