Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WASI stdio (stdin, stdout) API not very useful #52614

Open
Timmmm opened this issue Apr 20, 2024 · 5 comments
Open

WASI stdio (stdin, stdout) API not very useful #52614

Timmmm opened this issue Apr 20, 2024 · 5 comments
Labels
feature request Issues that request new features to be added to Node.js. wasi Issues and PRs related to the WebAssembly System Interface.

Comments

@Timmmm
Copy link

Timmmm commented Apr 20, 2024

What is the problem this feature will solve?

Currently the WASI API only lets you give file descriptors for stdin, stdout and stderr. That's not very useful. In most cases I want to interact with these streams which doesn't seem possible - at least not without a ton of platform specific work - with just file descriptors.

What is the feature you are proposing to solve the problem?

You should be able to pass ReadableStream and WritableStream instead. You can do this when spawning subprocesses.

What alternatives have you considered?

Slightly ludicrously, spawning a new child process that just starts the WASI module and does nothing else seems to be the most reasonable workaround currently, though I haven't tried it.

@Timmmm Timmmm added the feature request Issues that request new features to be added to Node.js. label Apr 20, 2024
@RedYetiDev
Copy link
Member

Hi! Thanks for the feature request! Could you possible provide more context?

It'd be really helpful if you could give us a comparison of the current features vs the proposed ones.

Thank you!

@RedYetiDev RedYetiDev added the wasi Issues and PRs related to the WebAssembly System Interface. label Apr 20, 2024
@benjamingr
Copy link
Member

@nodejs/wasi

@Timmmm
Copy link
Author

Timmmm commented Apr 21, 2024

@RedYetiDev sure!

Currently the Node API for WASI is:

image

In other words when you start a WASI module, the only option for its stdin/out/err are to give real native file handles. This is quite weird and also inconvenient.

It's weird because WASI's environment is fully controlled by Node. When it writes to stdin it isn't executing native code that requires a file handle, it's calling some WASM interface function that Node provides. I presume this design is something to do with the big warning about WASI's filesystem access not being sandboxed at all at the moment. Presumably they've done the very simplest thing - just pass through WASI filesystem calls to the OS. So I think this is probably intended to be temporary anyway.

It's inconvenient because you can't interact with stdin/out/err except via a file descriptor. The only way to do this through Node is by making a file on disk which is not what you would usually want. My use case is a VSCode LSP server; stdio is used for communication.

Another option would be the pipe() C function, but unfortunately it does not seem to be exposed by Node.

The API should look more like the API for creating a child process, where you can tell it to "pipe" the streams and then retrieve a stream.Readable/Writable for each.

Hope that makes sense! The workaround I am considering is just to fork() node, and run a module which only starts my WASI program. I think fork() lets you pipe the stdio streams, but I haven't actually tried it yet.

@RedYetiDev
Copy link
Member

Thanks! That makes more sense. I'm not on the WASI team, but the context will help them when they review this.

Thanks again for your contribution to the community!

@mhdawson
Copy link
Member

@Timmmm you might want to check out - nodejs/uvwasi#255. I'm not sure how much preview 1 functionality wil be extended in that context so you might want to see if the preview 2 functionality provided via jco is something you want to use instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request Issues that request new features to be added to Node.js. wasi Issues and PRs related to the WebAssembly System Interface.
Projects
Status: Awaiting Triage
Development

No branches or pull requests

4 participants