Skip to content

Commit

Permalink
readline: remove max limit of crlfDelay
Browse files Browse the repository at this point in the history
PR-URL: #13497
Reviewed-By: Prince John Wesley <princejohnwesley@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Refael Ackermann <refack@gmail.com>
  • Loading branch information
Azard authored and addaleax committed Aug 1, 2017
1 parent fffd8f5 commit 37e55bf
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 10 deletions.
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 @@ -48,7 +48,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 @@ -120,8 +119,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 @@ -517,7 +576,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

0 comments on commit 37e55bf

Please sign in to comment.