emscripten-core / emscripten-core/emscripten

Improvements to TTY

Open
#26,612 8 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

Currently TTY has a lot of flaws:
1. The TTY operations are character-based. This tends is hard to work with and requires extra buffers and code complexity and is slow. For instance, the default Node `getChar` implementation creates a temporary buffer, uses `readSync()` which writes into a buffer, and then has to return one character at a time from that buffer. But the stream API calls `read()` with a buffer, it's only TTY's `read` implementation that calls `getChar()` repeatedly and it is more complicated because of it.
2. In Node, stdin/stdout/stderr should default to having isatty reflect the value on `process.stdin`/ stdout/stderr.
3. `TTY.register()` always creates a TTY with `isatty()` returning `true` and requires `getChar()` / `putChar()`. If I want TTY to be false, I have to make read and write handlers instead. This makes (2) unnecessarily difficult.
4. If reading from stdin is implemented with `prompt()`, `isatty(stdin)` should be false, since prompt does not behave like a tty. If writing to stdout/stderr is implemented with `console.log()` or `console.warn()` `isatty` should be false since partial lines are not handled well.

I work around this in Pyodide by avoiding use of TTY, and instead using my own implementation: https://github.com/pyodide/pyodide/blob/main/src/js/streams.ts
But I keep having to copy parts of this into other projects, for instance CPython has its own copy here:
https://github.com/python/cpython/blob/main/Platforms/emscripten/streams.mjs
It would be helpful to solve this in Emscripten.

For the performance part of this, see #16755.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.