Add an option not to trap SIGINT (Ctrl + C) to `readline.creatInterface`
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 122k
- 派生
- 37.3k
- 平均合并
- 4 天 2 小时
- 30 天内合并 PR
- 283
描述
What is the problem this feature will solve?
Here is a typical code to accepts multiple lines from stdin:
import { stdin, stderr } from "node:process";
import { createInterface } from "node:readline/promises";
const rl = createInterface({ input: stdin, output: stderr });
for await (const line of rl) {
// process line
}
console.log("Done");
However, if you press Ctrl + C, it is treated as Ctrl + D—i.e. "Done" is displayed and you cannot cancel the multiline input. It is a ridiculous behavior.
await rl.question() throws AbortError and messes up your terminal:
$ node ./test.mjs
node:internal/readline/interface:1331
this[kQuestionReject]?.(new AbortError('Aborted with Ctrl+C'));
^
AbortError: Aborted with Ctrl+C
at [_ttyWrite] (node:internal/readline/interface:1331:37)
at ReadStream.onkeypress (node:internal/readline/interface:284:20)
at ReadStream.emit (node:events:508:28)
at emitKeys (node:internal/readline/utils:371:14)
at emitKeys.next (<anonymous>)
at ReadStream.onData (node:internal/readline/emitKeypressEvents:64:36)
at ReadStream.emit (node:events:508:28)
at addChunk (node:internal/streams/readable:559:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
at Readable.push (node:internal/streams/readable:390:5) {
code: 'ABORT_ERR'
}
It is not sophisticated.
What is the feature you are proposing to solve the problem?
Add an option to creatInterface to prevent it from trapping SIGINT by default.
const rl = createInterface({ input: stdin, output: stderr, noTrapSigInt: true });
With this, you will be able to press Ctrl + C to terminate the program immediately with the proper exit code.
What alternatives have you considered?
import { platform } from "node:process";
rl.on("SIGINT", () => {
process.exit(platform === "win32" ? -1073741510 : 130);
});
Why do I have to add such a code? Who the hell can remember such numbers for both platforms?
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 issue 中所示的 createInterface 入口点开始,跟踪 Ctrl+C 在多行迭代和问题提示期间的处理方式。验证所请求选项在所述平台上的行为,然后添加测试覆盖和文档,说明 Ctrl+C 可以正常终止,而不会触发当前的捕获行为。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, nodejs
- 领域
- cli
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100