Skip to content

Commit

Permalink
fs: acknowledge signal option in filehandle.createReadStream()
Browse files Browse the repository at this point in the history
PR-URL: #55148
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
  • Loading branch information
LiviaMedeiros authored and marco-ippolito committed Nov 17, 2024
1 parent 226836c commit 0decaab
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 0 deletions.
1 change: 1 addition & 0 deletions doc/api/fs.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ added: v16.11.0
* `start` {integer}
* `end` {integer} **Default:** `Infinity`
* `highWaterMark` {integer} **Default:** `64 * 1024`
* `signal` {AbortSignal|undefined} **Default:** `undefined`
* Returns: {fs.ReadStream}
Unlike the 16 KiB default `highWaterMark` for a {stream.Readable}, the stream
Expand Down
72 changes: 72 additions & 0 deletions test/parallel/test-fs-read-stream-file-handle.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,75 @@ fs.promises.open(file, 'r').then((handle) => {
assert.strictEqual(output, input);
}));
}).then(common.mustCall());

// AbortSignal option test
fs.promises.open(file, 'r').then((handle) => {
const controller = new AbortController();
const { signal } = controller;
const stream = handle.createReadStream({ signal });

stream.on('data', common.mustNotCall());
stream.on('end', common.mustNotCall());

stream.on('error', common.mustCall((err) => {
assert.strictEqual(err.name, 'AbortError');
}));

stream.on('close', common.mustCall(() => {
handle.close();
}));

controller.abort();
}).then(common.mustCall());

// Already-aborted signal test
fs.promises.open(file, 'r').then((handle) => {
const signal = AbortSignal.abort();
const stream = handle.createReadStream({ signal });

stream.on('data', common.mustNotCall());
stream.on('end', common.mustNotCall());

stream.on('error', common.mustCall((err) => {
assert.strictEqual(err.name, 'AbortError');
}));

stream.on('close', common.mustCall(() => {
handle.close();
}));
}).then(common.mustCall());

// Invalid signal type test
fs.promises.open(file, 'r').then((handle) => {
for (const signal of [1, {}, [], '', null, NaN, 1n, () => {}, Symbol(), false, true]) {
assert.throws(() => {
handle.createReadStream({ signal });
}, {
code: 'ERR_INVALID_ARG_TYPE',
name: 'TypeError',
});
}
return handle.close();
}).then(common.mustCall());

// Custom abort reason test
fs.promises.open(file, 'r').then((handle) => {
const controller = new AbortController();
const { signal } = controller;
const reason = new Error('some silly abort reason');
const stream = handle.createReadStream({ signal });

stream.on('data', common.mustNotCall());
stream.on('end', common.mustNotCall());

stream.on('error', common.mustCall((err) => {
assert.strictEqual(err.name, 'AbortError');
assert.strictEqual(err.cause, reason);
}));

stream.on('close', common.mustCall(() => {
handle.close();
}));

controller.abort(reason);
}).then(common.mustCall());

0 comments on commit 0decaab

Please sign in to comment.