aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2019-07-13 18:08:19 -0400
committerMichaƫl Zasso <targos@protonmail.com>2019-07-20 11:13:05 +0200
commit0f5af4430471ff157e8db23536f2c7fda7f449b2 (patch)
tree1a1a5a89a1c83b1311e302daec5941144874d48c
parent2308c7412a12d3d7a61a8b66ba236f8a17a1c699 (diff)
downloadandroid-node-v8-0f5af4430471ff157e8db23536f2c7fda7f449b2.tar.gz
android-node-v8-0f5af4430471ff157e8db23536f2c7fda7f449b2.tar.bz2
android-node-v8-0f5af4430471ff157e8db23536f2c7fda7f449b2.zip
readline: expose stream API in clearLine()
This commit adds an optional callback to clearLine(), which is passed to the stream's write() method. It also exposes the return value of write(). PR-URL: https://github.com/nodejs/node/pull/28674 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
-rw-r--r--doc/api/readline.md10
-rw-r--r--lib/readline.js22
-rw-r--r--test/parallel/test-readline-csi.js21
3 files changed, 37 insertions, 16 deletions
diff --git a/doc/api/readline.md b/doc/api/readline.md
index b295ace5b3..936ffb5d84 100644
--- a/doc/api/readline.md
+++ b/doc/api/readline.md
@@ -346,9 +346,13 @@ async function processLineByLine() {
}
```
-## readline.clearLine(stream, dir)
+## readline.clearLine(stream, dir[, callback])
<!-- YAML
added: v0.7.7
+changes:
+ - version: REPLACEME
+ pr-url: https://github.com/nodejs/node/pull/28674
+ description: The stream's write() callback and return value are exposed.
-->
* `stream` {stream.Writable}
@@ -356,6 +360,10 @@ added: v0.7.7
* `-1` - to the left from cursor
* `1` - to the right from cursor
* `0` - the entire line
+* `callback` {Function} Invoked once the operation completes.
+* Returns: {boolean} `false` if `stream` wishes for the calling code to wait for
+ the `'drain'` event to be emitted before continuing to write additional data;
+ otherwise `true`.
The `readline.clearLine()` method clears current line of given [TTY][] stream
in a specified direction identified by `dir`.
diff --git a/lib/readline.js b/lib/readline.js
index fe0c093a56..06e8581e7b 100644
--- a/lib/readline.js
+++ b/lib/readline.js
@@ -1234,20 +1234,18 @@ function moveCursor(stream, dx, dy) {
* 0 for the entire line
*/
-function clearLine(stream, dir) {
- if (stream === null || stream === undefined)
- return;
+function clearLine(stream, dir, callback) {
+ if (callback !== undefined && typeof callback !== 'function')
+ throw new ERR_INVALID_CALLBACK(callback);
- if (dir < 0) {
- // to the beginning
- stream.write(kClearToBeginning);
- } else if (dir > 0) {
- // to the end
- stream.write(kClearToEnd);
- } else {
- // entire line
- stream.write(kClearLine);
+ if (stream === null || stream === undefined) {
+ if (typeof callback === 'function')
+ process.nextTick(callback);
+ return true;
}
+
+ const type = dir < 0 ? kClearToBeginning : dir > 0 ? kClearToEnd : kClearLine;
+ return stream.write(type, callback);
}
/**
diff --git a/test/parallel/test-readline-csi.js b/test/parallel/test-readline-csi.js
index c753c5d93c..becd4cd8d4 100644
--- a/test/parallel/test-readline-csi.js
+++ b/test/parallel/test-readline-csi.js
@@ -44,17 +44,32 @@ assert.strictEqual(readline.clearScreenDown(undefined, common.mustCall()),
true);
writable.data = '';
-readline.clearLine(writable, -1);
+assert.strictEqual(readline.clearLine(writable, -1), true);
assert.deepStrictEqual(writable.data, CSI.kClearToBeginning);
writable.data = '';
-readline.clearLine(writable, 1);
+assert.strictEqual(readline.clearLine(writable, 1), true);
assert.deepStrictEqual(writable.data, CSI.kClearToEnd);
writable.data = '';
-readline.clearLine(writable, 0);
+assert.strictEqual(readline.clearLine(writable, 0), true);
assert.deepStrictEqual(writable.data, CSI.kClearLine);
+writable.data = '';
+assert.strictEqual(readline.clearLine(writable, -1, common.mustCall()), true);
+assert.deepStrictEqual(writable.data, CSI.kClearToBeginning);
+
+// Verify that clearLine() throws on invalid callback.
+assert.throws(() => {
+ readline.clearLine(writable, 0, null);
+}, /ERR_INVALID_CALLBACK/);
+
+// Verify that clearLine() does not throw on null or undefined stream.
+assert.strictEqual(readline.clearLine(null, 0), true);
+assert.strictEqual(readline.clearLine(undefined, 0), true);
+assert.strictEqual(readline.clearLine(null, 0, common.mustCall()), true);
+assert.strictEqual(readline.clearLine(undefined, 0, common.mustCall()), true);
+
// Nothing is written when moveCursor 0, 0
[
[0, 0, ''],