diff --git a/src/__tests__/volume.test.ts b/src/__tests__/volume.test.ts index bc5ba0ff..5f132e8e 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,16 @@ 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', + }); + }); + }); }); 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;