stop/resume:

Indeed as I mentioned this is related to WebCrypto Issue22 but I don't think this is a unique case. Issue22 was closed because of lack of proposals to solve it, apparently I was the only one to care about it (but I saw recently some other messages that seem to be related), and finally this would involve a public clone method with associated security concerns.

But with Streams it could be different, the application will internally clone the state of the operation probably eliminating the security issues, as simple as that.

To describe simply the use case, let's take a progressive hash computing 4 bytes by 4 bytes:

incoming stream: ABCDE bytes
hash operation: process ABCD, keep E for the next computation
incoming stream: FGHI bytes + STOP-EOF
hash operation: process EFGH, process STOP-EOF: clone the state of the hash, close the operation: digest hash with I

resume:
incoming stream: JKLF
hash operation (clone): process IJKL, keep F for next computation
etc...

So you do not restart the operation as if it was the first time it was receiving data, you just continue it from the state it was when stop was received.

That's not so unusual to do this, it has been requested many times in node.

pipe/fork: I think b is better.

Regards

Aymeric



Le 06/11/2013 20:15, Takeshi Yoshino a écrit :
On Wed, Nov 6, 2013 at 7:33 PM, Aymeric Vitte <vitteayme...@gmail.com <mailto:vitteayme...@gmail.com>> wrote:

    I have seen the different bugs too, some comments:

    - maybe I have missed some explaination or some obvious thing but
    I don't understand very well right now the difference/use between
    readable/writablebytestream and bytestream


ReadableByteStream and WritableByteStream are defining interfaces not only for ByteStream but more generally for other APIs. For example, we discussed how WebCrypto's encryption method should work with Stream concept recently, and one idea you showed was making WebCrypto.subtle return an object (which I called "filter") to which we can pipe data. By defining a protocol how to pass data to consumer as the WritableByteStream interface, we can reuse it later for defining IDL for those filters. Similarly, ReadableByteStream can provide uniform protocol how data producing APIs should communicate with consumers.

ByteStream is now a class inheriting both ReadableByteStream and WritableByteStream (sorry, I forgot to include inheritance info in the IDL).

    - pause/unpause: as far as I understand the whatwg spec does not
    recommend it but I don't understand the reasons. As I previously
    mentionned the idea is to INSERT a pause signal in the stream, you
    can not control the stream and therefore know when you are pausing it.


Maybe after decoupling the interface, pause/unpause are things to be added to ByteStream? IIUC, pause prevents data from being read from a ByteStream, and unpause removes the dam?

    - stop/resume: same, see my previous post, the difference is that
    the consuming API should clone the state of the operation and
    close the current operation as if eof was received, then restart
    from the clone on resume


Sorry that I haven't replied to your one.

Your post about those methods: http://lists.w3.org/Archives/Public/public-webapps/2013OctDec/0343.html
WebCrypto ISSUE-22: http://www.w3.org/2012/webcrypto/track/issues/22

Maybe I still don't quite understand your ideas. Let me confirm.

stop() tells the consumer API implementing WritableByteStream that it should behave as if it received EOF, but when resume() is called, restart processing the data written between stop() call and resume() call as if the API received data for the first time?

How should stop() work for ByteStream? ByteStream's read() method will receive EOF at least once when all data written before stop() call has been read, and it keeps returning EOF until resume() tells the ByteStream to restart outputting?

I've been feeling that your use case is very specific to WebCrypto. Saving state and restoring it sounds more like feature request for WebCrypto, not a Stream.

But I'm a bit interested in what your stop()/resume() enables. With this feature, ByteStream becomes message stream which is convenient for handling WebSocket.

    - pipe []/fork: I don't see why the fast stream should wait for
    the slow one, so maybe the stream is forked and pause can be used
    for the slow one


There could be apps that want to limit memory usage strictly. We think there're two strategies fork() can take.
a) wait until the slowest substream consumes
b) grow not to block the fastest substream while keeping data for the slowest

a) is useful to limit memory usage. b) is more performance oriented.


    - flow control: could it be possible to advertise a maximum
    bandwidth rate for a stream?


It's currently communicated as window similar to TCP. Consumer can adjust size argument of read() and frequency of read() call to match the consumer's processing speed.

--
Peersm : http://www.peersm.com
node-Tor : https://www.github.com/Ayms/node-Tor
GitHub : https://www.github.com/Ayms

Reply via email to