diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index 8966a576ea8cd0..5184a28d326f3e 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -111,6 +111,7 @@ const kHandle = Symbol('kHandle'); const kFd = Symbol('kFd'); const kRefs = Symbol('kRefs'); const kClosePromise = Symbol('kClosePromise'); +const kCloseReason = Symbol('kCloseReason'); const kCloseResolve = Symbol('kCloseResolve'); const kCloseReject = Symbol('kCloseReject'); const kRef = Symbol('kRef'); @@ -389,6 +390,7 @@ class FileHandle extends EventEmitter { const handle = this[kHandle]; this[kFd] = -1; + this[kCloseReason] = 'The FileHandle has been transferred'; this[kHandle] = null; this[kRefs] = 0; @@ -455,7 +457,7 @@ async function fsCall(fn, handle, ...args) { if (handle.fd === -1) { // eslint-disable-next-line no-restricted-syntax - const err = new Error('file closed'); + const err = new Error(handle[kCloseReason] ?? 'file closed'); err.code = 'EBADF'; err.syscall = fn.name; throw err; diff --git a/test/parallel/test-worker-message-port-transfer-filehandle.js b/test/parallel/test-worker-message-port-transfer-filehandle.js index 3e6afe22a8c636..6052170c69f6e1 100644 --- a/test/parallel/test-worker-message-port-transfer-filehandle.js +++ b/test/parallel/test-worker-message-port-transfer-filehandle.js @@ -69,6 +69,11 @@ const { once } = require('events'); assert.strictEqual(fh.fd, -1); port1.postMessage('second message'); + await assert.rejects(() => fh.read(), { + code: 'EBADF', + message: 'The FileHandle has been transferred', + syscall: 'read' + }); })().then(common.mustCall()); (async function() {