diff options
author | Anna Henningsen <anna@addaleax.net> | 2020-12-18 14:57:59 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2020-12-21 12:52:02 +0100 |
commit | 82dd23f5eccac652898315c67b4ee648b18e9783 (patch) | |
tree | 42ba4855c15fc7daabeaa6e4056d67f88c4b568b | |
parent | ab895bd587ed47423a6baab0bd6934128aa8990d (diff) | |
download | ios-node-v8-82dd23f5eccac652898315c67b4ee648b18e9783.tar.gz ios-node-v8-82dd23f5eccac652898315c67b4ee648b18e9783.tar.bz2 ios-node-v8-82dd23f5eccac652898315c67b4ee648b18e9783.zip |
repl: disable blocking completions by default
It’s not okay for the REPL to be blocked for multiple seconds after
entering `require('` because the completion is performing blocking
fs operations on potentially huge directories. Turning the REPL
completion function asynchronous would be the right thing to do here,
but unfortunately the way the code is structured doesn’t play well
with that (in particular, it breaks the preview feature).
Therefore, disable these blocking calls by default.
Refs: https://github.com/nodejs/node/pull/33282#issuecomment-733646794
PR-URL: https://github.com/nodejs/node/pull/36564
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
-rw-r--r-- | lib/repl.js | 7 | ||||
-rw-r--r-- | test/parallel/test-repl-tab-complete.js | 7 |
2 files changed, 11 insertions, 3 deletions
diff --git a/lib/repl.js b/lib/repl.js index 3b95bd7f29..3368b5997a 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -298,6 +298,7 @@ function REPLServer(prompt, configurable: true }); + this.allowBlockingCompletions = !!options.allowBlockingCompletions; this.useColors = !!options.useColors; this._domain = options.domain || domain.create(); this.useGlobal = !!useGlobal; @@ -1204,7 +1205,8 @@ function complete(line, callback) { if (completeOn.length) { filter = completeOn; } - } else if (RegExpPrototypeTest(requireRE, line)) { + } else if (RegExpPrototypeTest(requireRE, line) && + this.allowBlockingCompletions) { // require('...<Tab>') const extensions = ObjectKeys(this.context.require.extensions); const indexes = ArrayPrototypeMap(extensions, @@ -1265,7 +1267,8 @@ function complete(line, callback) { if (!subdir) { ArrayPrototypePush(completionGroups, _builtinLibs); } - } else if (RegExpPrototypeTest(fsAutoCompleteRE, line)) { + } else if (RegExpPrototypeTest(fsAutoCompleteRE, line) && + this.allowBlockingCompletions) { [completionGroups, completeOn] = completeFSFunctions(line); // Handle variable member lookup. // We support simple chained expressions like the following (no function diff --git a/test/parallel/test-repl-tab-complete.js b/test/parallel/test-repl-tab-complete.js index cc3dce1093..bfcf810ddd 100644 --- a/test/parallel/test-repl-tab-complete.js +++ b/test/parallel/test-repl-tab-complete.js @@ -51,7 +51,12 @@ function getNoResultsFunction() { const works = [['inner.one'], 'inner.o']; const putIn = new ArrayStream(); -const testMe = repl.start('', putIn); +const testMe = repl.start({ + prompt: '', + input: putIn, + output: process.stdout, + allowBlockingCompletions: true +}); // Some errors are passed to the domain, but do not callback testMe._domain.on('error', assert.ifError); |