I'm more and more convinced that need to go back and read all the available info about streams2. Answering these detail semantics questions is pretty important.
:Marco On Mon, Mar 25, 2013 at 2:29 PM, Michael Jackson <mjijack...@gmail.com>wrote: > If stream.read returns null that could mean one of two things: > > 1) the stream doesn't currently have any data, but still might have some > in the future > 2) the stream is already ended > > AFAICT, the only way you can know which state you're in is by checking the > stream.readable property which is marked as being a "legacy" property in > the > code<https://github.com/joyent/node/blob/master/lib/_stream_readable.js#L98-L99>, > so it seems like it's not a good idea to rely on that property either. > > -- > Michael Jackson > @mjackson > > > On Mon, Mar 25, 2013 at 1:50 PM, Dan Milon <danmi...@gmail.com> wrote: > >> You're right, my bad. >> >> But still, data stay in the buffer until someone tries to `.read()`. >> So, if you're being passed a stream that you dont know whether the >> first `readable` event has fired, you can try to actually read from >> it. If it returns null, then you wait for `readable`. >> >> On 03/25/13 22:42, Michael Jackson wrote: >> > readable is emitted after you've actually started reading. >> > >> > >> > That's not what it says in the docs >> > <http://nodejs.org/api/stream.html#stream_event_readable>. >> > >> > ### Event: 'readable' When there is data ready to be consumed, >> > this event will fire. When this event emits, call the read() method >> > to consume the data. ### >> > >> > Calling stream.read *before* you get the "readable" event is >> > totally counterintuitive. >> > >> > -- Michael Jackson @mjackson >> > >> > In your example, you dont ever `response.read()`, so no readable >> > event is ever emitted. >> > >> > As you said, streams start in paused state and ready to be read. >> > >> > On 03/25/13 22:28, Michael Jackson wrote: >> >> Is it correct to assume that a Readable won't emit the >> >> "readable" >> > event >> >> until you're registered for it? >> >> >> >> Reading through the streams2 docs, I was under the impression >> >> that all streams start out paused and don't start emitting data >> >> until you add either a "data" (for old streams) or a "readable" >> >> listener. For new streams, this should mean that they don't emit >> >> "readable" until at >> > least >> >> one listener is registered. Otherwise we still need to do some >> > buffering >> >> in order to capture all the data. >> >> >> >> For example, this code misses the readable event on node 0.10: >> >> >> >> var http = require('http'); >> >> >> >> http.get('http://www.google.com', function (response) { >> >> console.log('got response with status ' + response.statusCode); >> >> >> >> setTimeout(function () { response.on('readable', function () { >> >> console.log('readable'); }); >> >> >> >> response.on('end', function () { console.log('end'); }); }, 5); >> >> }); >> >> >> >> Here's my shell session: >> >> >> >> $ node -v v0.10.0 $ node http-test.js got response with status >> >> 200 $ >> >> >> >> Is this the correct behavior? >> >> >> >> -- Michael Jackson @mjackson >> >> >> >> >> >> On Thu, Mar 21, 2013 at 4:27 PM, Isaac Schlueter <i...@izs.me >> > <mailto:i...@izs.me> >> >> <mailto:i...@izs.me <mailto:i...@izs.me>>> wrote: >> >> >> >> re old-mode >> >> >> >> Yes, that's fine. If you just want to get all the data asap, use >> >> on('data', handler). It'll work great, and it's still very fast. >> >> pause()/resume(), the whole bit. (The difference is that it >> >> won't emit data until you're listening, and pause() will >> >> *actually* >> > pause.) >> >> >> >> >> >> Re read(cb) >> >> >> >> It's problematic for reasons that I've discussed all of the >> >> places where it's been brought up. That horse is dead, let's >> >> stop >> > beating >> >> it. (There were a few other proposals as well, btw. >> > Reducibles and >> >> some other monadic approaches come to mind.) >> >> >> >> >> >> Re pipe() vs looping around read() vs custom Writable vs >> > on('data') >> >> >> >> Whatever works for your case is fine. It's flexible on >> > purpose, and >> >> allows more types of consumption than streams1, and creating >> > custom >> >> writables is easier than it was in streams1. >> >> >> >> If you find something that the API can't do for you, or find >> > yourself >> >> doing a lot of backflips or overriding a lot of methods to get >> > your >> >> stuff working, then let's chat about it in a github issue. >> > You might >> >> be missing something, or you might have found a genuine >> > shortcoming in >> >> the API. >> >> >> >> >> >> >> >> On Thu, Mar 21, 2013 at 2:01 PM, Sigurgeir Jonsson >> >> <ziggy.jonsson....@gmail.com >> > <mailto:ziggy.jonsson....@gmail.com> >> > <mailto:ziggy.jonsson....@gmail.com >> > <mailto:ziggy.jonsson....@gmail.com>>> >> >> wrote: >> >>> Thanks for all the answers. I almost forgot to look back at >> >>> this >> >> thread as >> >>> the custom writeStreams have exceeded the high expectation I >> >>> had >> >> already for >> >>> Streams 2. For me, the reference manual was a little >> >>> confusing, as >> > there are >> >> complete >> >>> examples on using the read method, no mention of "reading" >> > through a >> >>> writeStream endpoint. >> >>> >> >>> Marco, I agree that that read has more detailed control of >> > minimum >> >> incoming >> >>> content. However I wonder if it would be more efficient to >> > default >> >>> pipe.chunkSize to a "lowWatermark" of the receiver (if >> >>> defined). >> >> This >> >>> lowWatermark could be adjusted dynamically and the callback >> > in the >> >> writable >> >>> should keep sequence of events under control? >> >>> >> >>> Anyway, thanks Node team, I'm very impressed! >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> On Wednesday, March 20, 2013 4:45:32 AM UTC-4, Marco Rogers >> > wrote: >> >>>> >> >>>> @Nathan's response is right. Creating a writable stream is >> >> preferable in >> >>>> most cases. But I wanted to add a little context to that. If >> >> you're dealing >> >>>> with a base readable stream, it's just pushing chunks of >> > data at >> >> you off the >> >>>> wire. Your first task is to collect those chunks into >> > meaningful >> >> data. So >> >>>> IMO the reason creating a writable stream is preferable is >> > because it >> >>>> prompts you not just read off the stream, but to create >> > semantics >> >> around >> >>>> what the new stream is supposed to be. The api reflects this >> >> opinion and >> >>>> that's why creating writable streams feels like the more >> > natural >> >> way, and >> >>>> the ugliness of dealing with read() is wrapped up in the >> >>>> pipe() >> >> method. It >> >>>> was kind of designed that way. >> >>>> >> >>>> But the read() api was also designed for a use case. It's >> >>>> meant >> >> to handle >> >>>> low/high water marks effectively, as well as enable more >> >> optimized special >> >>>> parsing by reading off specific lengths of chunks. These >> >>>> were >> >> things that >> >>>> people kept needing, but the old api didn't support well. >> > If you were >> >>>> writing a library for a special parser, you might write a >> > custom >> >> Writable >> >>>> stream and inside it you would be using the read(n) api to >> >> control *how* you >> >>>> read data off the socket. I hope that makes sense. >> >>>> >> >>>> :Marco >> >>>> >> >>>> On Monday, March 18, 2013 11:06:48 AM UTC-7, Sigurgeir >> > Jonsson wrote: >> >>>>> >> >>>>> The new streams have excellent support for high/low >> > watermarks and >> >>>>> auto-pausing/resuming, but the documentation confuses me a >> > little... >> >>>>> particularly the read method. >> >>>>> >> >>>>> When I read the new docs for the first time I was under >> >>>>> the >> >> impression >> >>>>> that the optimal way to become a user of a stream is to >> >>>>> write >> >> loops around >> >>>>> the read functio. However in practice I find myself >> >>>>> simply >> >> writing custom >> >>>>> writeStreams and use the callback to control upstream >> >>>>> pressure >> >> (in addition >> >>>>> to source Watermarks if needed). Here is an example >> >>>>> where I >> >> move the >> >>>>> output to a queue that executes a custom function in >> > parallel (i.e. >> >>>>> uploading to a database) >> > https://gist.github.com/ZJONSSON/5189249 >> >>>>> >> >>>>> Are there any benefits to using the read method directly >> >>>>> on a >> >> stream vs. >> >>>>> piping to a custom Writable stream? >> >>> >> >>> -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: >> >>> >> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> > >> > >> > >> >> You received this message because you are subscribed to the >> > Google >> >>> Groups "nodejs" group. To post to this group, send email to >> >>> nodejs@googlegroups.com >> > <mailto:nodejs@googlegroups.com> >> >> <mailto:nodejs@googlegroups.com >> >> <mailto:nodejs@googlegroups.com>> >> >>> To unsubscribe from this group, send email to >> >>> nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com> >> >> <mailto:nodejs%2bunsubscr...@googlegroups.com >> > <mailto:nodejs%252bunsubscr...@googlegroups.com>> >> >>> For more options, visit this group at >> >>> http://groups.google.com/group/nodejs?hl=en?hl=en >> >>> >> >>> --- You received this message because you are subscribed to >> >>> the >> > Google >> >> Groups >> >>> "nodejs" group. To unsubscribe from this group and stop >> >>> receiving emails >> > from it, >> >> send an >> >>> email to nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com> >> >> <mailto:nodejs%2bunsubscr...@googlegroups.com >> > <mailto:nodejs%252bunsubscr...@googlegroups.com>>. >> >>> For more options, visit >> > https://groups.google.com/groups/opt_out. >> >>> >> >>> >> >> >> >> -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: >> >> >> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> > >> > >> > >> You received this message because you are subscribed to the >> > Google >> >> Groups "nodejs" group. To post to this group, send email to >> >> nodejs@googlegroups.com >> > <mailto:nodejs@googlegroups.com> >> >> <mailto:nodejs@googlegroups.com <mailto:nodejs@googlegroups.com>> >> >> To unsubscribe from this group, send email to >> >> nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com> >> >> <mailto:nodejs%2bunsubscr...@googlegroups.com >> > <mailto:nodejs%252bunsubscr...@googlegroups.com>> >> >> For more options, visit this group at >> >> http://groups.google.com/group/nodejs?hl=en?hl=en >> >> >> >> --- You received this message because you are subscribed to the >> >> Google Groups "nodejs" group. To unsubscribe from this group and >> >> stop receiving emails from it, send an email to >> >> nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com> >> >> <mailto:nodejs%2bunsubscr...@googlegroups.com >> > <mailto:nodejs%252bunsubscr...@googlegroups.com>>. >> >> For more options, visit >> >> https://groups.google.com/groups/opt_out. >> >> >> >> >> >> >> >> -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: >> >> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> > >> >> >> >> >> > You received this message because you are subscribed to the Google >> >> Groups "nodejs" group. To post to this group, send email to >> >> nodejs@googlegroups.com >> > <mailto:nodejs@googlegroups.com> >> >> To unsubscribe from this group, send email to >> >> nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com> >> >> For more options, visit this group at >> >> http://groups.google.com/group/nodejs?hl=en?hl=en >> >> >> >> --- You received this message because you are subscribed to the >> >> Google Groups "nodejs" group. To unsubscribe from this group and >> >> stop receiving emails from it, send an email to >> >> nodejs+unsubscr...@googlegroups.com >> > <mailto:nodejs%2bunsubscr...@googlegroups.com>. >> >> For more options, visit >> >> https://groups.google.com/groups/opt_out. >> >> >> >> >> > >> > >> >> > -- > -- > Job Board: http://jobs.nodejs.org/ > Posting guidelines: > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines > You received this message because you are subscribed to the Google > Groups "nodejs" group. > To post to this group, send email to nodejs@googlegroups.com > To unsubscribe from this group, send email to > nodejs+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/nodejs?hl=en?hl=en > > --- > You received this message because you are subscribed to a topic in the > Google Groups "nodejs" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/nodejs/8VGu32aczR0/unsubscribe?hl=en. > To unsubscribe from this group and all its topics, send an email to > nodejs+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- Marco Rogers marco.rog...@gmail.com | https://twitter.com/polotek Life is ten percent what happens to you and ninety percent how you respond to it. - Lou Holtz -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines You received this message because you are subscribed to the Google Groups "nodejs" group. To post to this group, send email to nodejs@googlegroups.com To unsubscribe from this group, send email to nodejs+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/nodejs?hl=en?hl=en --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.