Hi Domenic,
              Thanks for your response. Please see my embedded remarks below 
(labeled with [GT]).
              Regards, Gomer
              --
              Gomer Thomas Consulting, LLC
              9810 132nd St NE
              Arlington, WA 98223
              Cell: 425-309-9933
              
              
              -----Original Message-----
       From: Domenic Denicola [mailto:d...@domenic.me] 
       Sent: Thursday, March 17, 2016 11:56 AM
       To: Gomer Thomas <go...@gomert-consulting.com>; 'Jonathan Garbee' 
<jonathan.gar...@gmail.com>; 'Hallvord Reiar Michaelsen Steen' 
<hst...@mozilla.com>
       Cc: 'WebApps WG' <public-webapps@w3.org>
       Subject: RE: [XHR]
              
              From: Gomer Thomas [mailto:go...@gomert-consulting.com] 
              
              > I looked at the Streams specification, and it seems pretty 
immature and underspecified. I’m not sure it is usable by someone who doesn’t 
already know how it is supposed to work before reading the specification. How 
many of the major web browsers are supporting it?
              
              Thanks for the feedback. Streams is intended to be a lower-level 
primitive used by other specifications, primarily. By reading it you're 
supposed to learn how to implement your own streams from basic underlying 
source APIs.
              [GT] It would be good to say this in the specification, and 
reference some sample source APIs. (This is an example of what I meant when I 
said it is very difficult to read the specification unless one already knows 
how it is supposed to work.)  
              
              > (1) The constructor of the ReadableStream object is “defined” 
by 
              > Constructor (underlyingSource = { }, {size, highWaterMark = 1 } 
= { } 
              > ) The “specification” states that the underlyingSource object 
“can” 
              > implement various methods, but it does not say anything about 
how to 
              > create or identify a particular underlyingSource
              
              As you noticed, specific underlying sources are left to other 
places. Those could be other specs, like Fetch:
              
              https://fetch.spec.whatwg.org/#concept-construct-readablestream
              
              or it could be used by authors directly:
              
              https://streams.spec.whatwg.org/#example-rs-push-no-backpressure
              
              > In my case I want to receive a stream from a remote HTTP 
server. What do I put in for the underlyingSource?
              
              This is similar to asking the question "I want to create a 
promise for an animation. What do I put in the `new Promise(...)` constructor?" 
In other words, a ReadableStream is a data type that can stream anything, and 
the actual capability needs to be supplied by your code. Fetch supplies one 
underlying source, for HTTP responses.
              
              > Also, what does the “highWaterMark” parameter mean? The 
“specification” says it is part of the queuing strategy object, but it does not 
say what it does.
              
              Hmm, I think the links (if you follow them) are fairly clear. 
https://streams.spec.whatwg.org/#queuing-strategy. Do you have any suggestions 
on how to make it clearer?
              [GT] I did follow the link before I sent in my questions. In 
section 2.5 it says "The queuing strategy assigns a size to each chunk, and 
compares the total size of all chunks in the queue to a specified number, known 
as the high water mark. The resulting difference, high water mark minus total 
size, is used to determine the desired size to fill the stream’s queue." It 
appears that this is incorrect. It does not seem to jibe with the default value 
and the examples. As far as I can tell from the default value and the examples, 
the high water mark is not the total size of all chunks in the queue. It is the 
number of chunks in the queue. Also, this is somewhat problematic as a measure 
unless the chunks are uniform in size. If the chunks are required to all be the 
same size, this greatly reduces the usefulness of the Streams concept. 
              
              > Is it the maximum number of bytes of unread data in the Stream? 
If so, it should say so.
              
              Close; it is the maximum number of bytes before a backpressure 
signal is sent. But, that is already exactly what the above link (which was 
found by clicking the links "queuing strategy" in the constructor definition) 
says, so I am not sure what you are asking for.
              
              > If the “size” parameter is omitted, is the underlyingSource 
free to send chunks of any size, including variable sizes?
              
              Upon re-reading, I agree it's not 100% clear that the size() 
function maps to "The queuing strategy assigns a size to each chunk". However, 
the behavior of how the stream uses the size() function is defined in a lot of 
detail if you follow the spec. I agree maybe it could use some more 
non-normative notes explaining, and will work to add some, but in the end if 
you really want to understand what happens you need to either read the spec's 
algorithms or wait for someone to write an in-depth tutorial somewhere like MDN.
              
              > (2) The ReadableStream class has a “getReader()” method, but 
the specification gives no hint as to the data type that this method returns. I 
suspect that it is an object of the ReadableStreamReader class, but if so it 
would be nice if the “specification” said so.
              
              This is actually normatively defined if you click the link in the 
step "Return AcquireReadableStreamReader(this)," whose first line tells you 
what it constructs (indeed, a ReadableStreamReader).
       
       [GT] My original question was directed at how an application can issue 
an XMLHttpRequest() call and retrieve the results piecewise as they arrive, 
rather than waiting for the entire response to arrive. It looks like Streams 
might meet this need, but It would take quite a lot of study to figure out how 
to make this solution work, and the actual code would be pretty complex. I 
would also not be able to use this approach as a mature technology in a 
cross-browser environment for quite a while -- years? I think we will need to 
implement a non-standard solution based on WebSocket messages for now. We can 
then revisit the issue later. Thanks again for your help. 
              


Reply via email to