Open
Description
Node.js Version
v22.4.1
NPM Version
v10.8.1
Operating System
Windows 11
Subsystem
fs, process
Description
I am trying to fix some code for compatibility with node 22 that writes directly to the terminal. For unix-like OS's, things work fine due to /dev/tty
, but for Windows, the code uses process.binding('fs')
hackery to open the conout$
magic file. However, this no-longer works in node 22, which treats conout$
as a regular filename and of course cannot find it.
Is there a way to make something like this work for node 22? Is there finally a cleaner option to writing to the Windows console directly without using stdout?
const openWindowsConsole = () => {
// vX.X.X
const nodeVersion = parseInt(process.version.split('.')[0].slice(1), 10);
// For node 22, we seem to be unable to open CONOUT$
if (nodeVersion >= 22) {
// What do we do here?
throw new Error('This application is incompatible with Windows & node 22');
}
const openArgs = [
"CONOUT$",
// eslint-disable-next-line no-bitwise
fs.constants.O_RDWR | fs.constants.O_EXCL,
0o666
];
if (nodeVersion < 20) {
// Older version of node require null being passed explicitly for the
// optional arguments, but this breaks node 20.
openArgs.push(null, null)
}
return new tty.WriteStream(
process.binding("fs").open(...openArgs)
);
}
Minimal Reproduction
Using node 22, on Windows run this code:
const fs = require('fs');
process.binding("fs").open('conout$', fs.constants.O_RDWR | fs.constants.O_EXCL, 0o666);
Output
Uncaught [Error: ENOENT: no such file or directory, open 'C:\Users\jpage\conout$'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\jpage\\conout$'
}
Before You Submit
- I have looked for issues that already exist before submitting this
- My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask