How does the Node.js REPL display previews?

When typing in the node repl, you get instant previews as you type, like this:

Clearly, the REPL is executing your code every time you hit a key. But how can this be safe?! Imagine the chaos if you typed rm -rf /foo/bar/baz and your shell tried to execute it at every keystroke!

The Node.js REPL implementation uses the inspector module, which is an interface to V8. Here’s a basic REPL for Node.js:

const readline = require('readline');
const inspector = require('inspector');
const session = new inspector.Session();
session.connect();
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', function(line) {
  session.post(
    'Runtime.evaluate', 
    { expression: line }, 
    function cb(err, res) {
      console.log(res.result.value);
    }
  );
});

The key is that, for previews, the REPL passes throwOnSideEffect: true to V8. I’m not sure exactly what V8 considers a side-effect, but apparently it doesn’t consider Math.random() to have side-effects. I’m like 99% sure it would consider “deleting all my files” to be a side-effect, though.

Tagged #programming, #javascript.

Similar posts

More by Jim

Want to build a fantastic product using LLMs? I work at Granola where we're building the future IDE for knowledge work. Come and work with us! Read more or get in touch!

This page copyright James Fisher 2020. Content is not associated with my employer. Found an error? Edit this page.