readline: remove max limit of crlfDelay

PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
Azard 2017-06-06 20:22:22 +08:00 committed by Anna Henningsen
parent 717a138b4a
commit b8e0a5ea23
No known key found for this signature in database
GPG Key ID: D8B9F5AEAE84E4CF
3 changed files with 70 additions and 10 deletions

View File

@ -369,7 +369,9 @@ changes:
* `crlfDelay` {number} If the delay between `\r` and `\n` exceeds * `crlfDelay` {number} If the delay between `\r` and `\n` exceeds
`crlfDelay` milliseconds, both `\r` and `\n` will be treated as separate `crlfDelay` milliseconds, both `\r` and `\n` will be treated as separate
end-of-line input. Default to `100` milliseconds. 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 * `removeHistoryDuplicates` {boolean} If `true`, when a new input line added
to the history list duplicates an older one, this removes the older line to the history list duplicates an older one, this removes the older line
from the list. Defaults to `false`. from the list. Defaults to `false`.

View File

@ -50,7 +50,6 @@ const {
const kHistorySize = 30; const kHistorySize = 30;
const kMincrlfDelay = 100; const kMincrlfDelay = 100;
const kMaxcrlfDelay = 2000;
// \r\n, \n, or \r followed by something other than \n // \r\n, \n, or \r followed by something other than \n
const lineEnding = /\r?\n|\r(?!\n)/; const lineEnding = /\r?\n|\r(?!\n)/;
@ -125,8 +124,8 @@ function Interface(input, output, completer, terminal) {
this.input = input; this.input = input;
this.historySize = historySize; this.historySize = historySize;
this.removeHistoryDuplicates = !!removeHistoryDuplicates; this.removeHistoryDuplicates = !!removeHistoryDuplicates;
this.crlfDelay = Math.max(kMincrlfDelay, this.crlfDelay = crlfDelay ?
Math.min(kMaxcrlfDelay, crlfDelay >>> 0)); Math.max(kMincrlfDelay, crlfDelay) : kMincrlfDelay;
// Check arity, 2 - for async, 1 for sync // Check arity, 2 - for async, 1 for sync
if (typeof completer === 'function') { if (typeof completer === 'function') {

View File

@ -63,14 +63,26 @@ function isWarned(emitter) {
} }
{ {
// Maximum crlfDelay is 2000ms // set crlfDelay to float 100.5ms
const fi = new FakeInput(); const fi = new FakeInput();
const rli = new readline.Interface({ const rli = new readline.Interface({
input: fi, input: fi,
output: 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(); rli.close();
} }
@ -270,6 +282,53 @@ function isWarned(emitter) {
}), delay * 2); }), 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 // \t when there is no completer function should behave like an ordinary
// character // character
fi = new FakeInput(); fi = new FakeInput();