Suggestion: Add Standard IO Streams

chetmichals at chetmichals at
Mon Apr 30 00:22:08 UTC 2018

Yeah, thinking of it a bit more carefully, we would need to define a Standard Stream Interface in order to have the 3 Standard IO Streams. I can start putting together some research and a sample interface to present my ideas in more depth, but it'll take some time to flesh everything out. But we can still start hashing out some ideas in the meantime, and making sure concerns are addressed. 


I believe we should define both an synchronous and asynchronous API day one, where the "normal" reads would be blocking and return the value, if the "normal" writes are blocking or not would be host environment specific, and the asynchronous versions of both would return promises. So if there is a read/write, there would also be a readAsync/writeAsync. Another option instead of doubling up all the functions for a single Stream Object, is to define both a Stream and Async Stream Object, and have a method to get the other kind from in both. So a normal synchronous Stream could have an Async() method to get the Async Stream version, and the Async version can have a Sync() method to get the normal Stream version. 


The easy out for how to deal with queueing and back pressure is that it is implementation details of the host environment. Ideally a user would be able to use both the synchronous and asynchronous functions on a Stream, even if the Host Environment only actually supports one kind. But I don't think it’s our place to solve for a user trying to write 100GB of data asynchronously or read a 100GB of data synchronously. I believe what we can do is define a Standard Exception that can be thrown if the buffers overflow, let the host environment define how large their buffers are, and maybe give them the option of throwing out data if desired (Maybe for some hypothetical host environment in the future, the Standard Error's Buffer overflowing and losing data is acceptable behavior and does not need to raise an exception)


One thing to note, just because the language defines standard Streams, does not mean we necessarily have to define how a user can create their own Streams at this time. The day one version could make Streams only something setup by host environment. Host Environments that don't want to support a standard in could have an object that just throws an exception if a user tries to output any data, and those that don't want to support a standard out/error could have the functions stubbed out. 


So, some things that come to mind also, should these Streams only support text data, or should they be usable for binary data too? And should there be a single Base Stream class, or should the Input Stream and Output Stream be different things (If they are a single base class, a function could be added to allow for code to check the Stream Type).


I think for the first passes, generators and async iteration don’t need to be considered, and can be taken into account for once it starts taking shape.


From: Michael J. Ryan <tracker1 at> 
Sent: Sunday, April 29, 2018 3:47 PM
To: Chet Michals <chetmichals at>
Cc: es-discuss <es-discuss at>
Subject: Re: Suggestion: Add Standard IO Streams


Why not create an npm module that represents what you'd like to see as an interface wrapping node's implementation and propose your new interface?


This way you can try building something with it.  You'll first need to implement how you see a synchronous stream in the first place.


Streams can be a complex beast though.  Do you want a synchronous or asynchronous implementation or both?  Will they consume like generators, async iteration (for await of)?  What about queueing and back pressure?


On Sat, Apr 28, 2018, 22:28 Chet Michals <chetmichals at <mailto:chetmichals at> > wrote:

Working between a number of different ECMAScript environments over the years, such as in Java with Rhino and Nashorn, Node.js, and various web browsers, one thing I have noticed is that there is no standard input/output/error stream like most other languages support, and each ecosystem tends to define their own host objects to deal with these, like the console object in most Web Browsers (Which is at least defined in a WHATWG Living Standard), the process object in Node.js, and the print object in Nashorn. 


I feel for long term portability, the 3 standard IO streams should be added to the spec in some way,


Is there a reason I am not seeing as to why this wouldn't be desired?

es-discuss mailing list
es-discuss at <mailto:es-discuss at>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the es-discuss mailing list