Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

readline: remove max limit of crlfDelay #13497

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion doc/api/readline.md
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,9 @@ changes:
* `crlfDelay` {number} If the delay between `\r` and `\n` exceeds
`crlfDelay` milliseconds, both `\r` and `\n` will be treated as separate
end-of-line input. Default to `100` milliseconds.
`crlfDelay` will be coerced to `[100, 2000]` range.
`crlfDelay` will be coerced to a number no less than `100`. It can be set to
`Infinity`, in which case `\r` followed by `\n` will always be considered a
single newline.
* `removeHistoryDuplicates` {boolean} If `true`, when a new input line added
to the history list duplicates an older one, this removes the older line
from the list. Defaults to `false`.
Expand Down
5 changes: 2 additions & 3 deletions lib/readline.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ const {

const kHistorySize = 30;
const kMincrlfDelay = 100;
const kMaxcrlfDelay = 2000;
// \r\n, \n, or \r followed by something other than \n
const lineEnding = /\r?\n|\r(?!\n)/;

Expand Down Expand Up @@ -125,8 +124,8 @@ function Interface(input, output, completer, terminal) {
this.input = input;
this.historySize = historySize;
this.removeHistoryDuplicates = !!removeHistoryDuplicates;
this.crlfDelay = Math.max(kMincrlfDelay,
Math.min(kMaxcrlfDelay, crlfDelay >>> 0));
this.crlfDelay = crlfDelay ?
Math.max(kMincrlfDelay, crlfDelay) : kMincrlfDelay;

// Check arity, 2 - for async, 1 for sync
if (typeof completer === 'function') {
Expand Down
71 changes: 65 additions & 6 deletions test/parallel/test-readline-interface.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,26 @@ function isWarned(emitter) {
}

{
// Maximum crlfDelay is 2000ms
// set crlfDelay to float 100.5ms
const fi = new FakeInput();
const rli = new readline.Interface({
input: fi,
output: fi,
crlfDelay: 1 << 30
crlfDelay: 100.5
});
assert.strictEqual(rli.crlfDelay, 2000);
assert.strictEqual(rli.crlfDelay, 100.5);
rli.close();
}

{
// set crlfDelay to 5000ms
const fi = new FakeInput();
const rli = new readline.Interface({
input: fi,
output: fi,
crlfDelay: 5000
});
assert.strictEqual(rli.crlfDelay, 5000);
rli.close();
}

Expand Down Expand Up @@ -248,7 +260,7 @@ function isWarned(emitter) {
rli.close();

// Emit two line events when the delay
// between \r and \n exceeds crlfDelay
// between \r and \n exceeds crlfDelay
{
const fi = new FakeInput();
const delay = 200;
Expand All @@ -270,8 +282,55 @@ function isWarned(emitter) {
}), delay * 2);
}

// Emit one line events when the delay between \r and \n is
// over the default crlfDelay but within the setting value
{
const fi = new FakeInput();
const delay = 200;
const crlfDelay = 500;
const rli = new readline.Interface({
input: fi,
output: fi,
terminal: terminal,
crlfDelay
});
let callCount = 0;
rli.on('line', function(line) {
callCount++;
});
fi.emit('data', '\r');
setTimeout(common.mustCall(() => {
fi.emit('data', '\n');
assert.strictEqual(callCount, 1);
rli.close();
}), delay);
}

// set crlfDelay to `Infinity` is allowed
{
const fi = new FakeInput();
const delay = 200;
const crlfDelay = Infinity;
const rli = new readline.Interface({
input: fi,
output: fi,
terminal: terminal,
crlfDelay
});
let callCount = 0;
rli.on('line', function(line) {
callCount++;
});
fi.emit('data', '\r');
setTimeout(common.mustCall(() => {
fi.emit('data', '\n');
assert.strictEqual(callCount, 1);
rli.close();
}), delay);
}

// \t when there is no completer function should behave like an ordinary
// character
// character
fi = new FakeInput();
rli = new readline.Interface({ input: fi, output: fi, terminal: true });
called = false;
Expand Down Expand Up @@ -513,7 +572,7 @@ function isWarned(emitter) {
assert.strictEqual(isWarned(process.stdout._events), false);
}

//can create a new readline Interface with a null output arugument
// can create a new readline Interface with a null output arugument
fi = new FakeInput();
rli = new readline.Interface({ input: fi, output: null, terminal: terminal });

Expand Down