Re: [ServiceWorker] Backpressure on fetch integrated with Streams (#452)

Thanks, Yutaka, Domenic. The table (https://github.com/slightlyoff/ServiceWorker/issues/452#issuecomment-70795093) is already updated to reflect the agreement.

----

Now, all the columns (except for that `read()` is not allowed for a closed stream) are the same.

After making a little fix on Yutaka's algorithm in https://github.com/slightlyoff/ServiceWorker/issues/452#issuecomment-71579896, either of the following algorithms should work:

## Lock + `body neutered flag`

- a `Request` has a boolean `body neutered flag`
- `req.bodyUsed` = (`req.body` is locked) || `req`'s `body neutered flag` is set
- The following operations fail when `req.bodyUsed` is set. Otherwise, they acquire the lock of `req.body` and release it when done.
    - `req.arrayBuffer()`
    - `req.blob()`
    - `req.formData()`
    - `req.json()`
    - `req.text()`
- `req.clone()` fail when `req.bodyUsed` is set.
- The following operations fail when `req.bodyUsed` is set. Otherwise, set `req`'s `body neutered flag`, confiscate the underlying source and queue from `req.body` and error it.
    - `fetch(req)`
    - `new Request(req)`
    - `cache.put(req, res)`

- a `Response` has a boolean `body neutered flag`
- `res.bodyUsed` = (`res.body` is locked) || `res`'s `body neutered flag` is set
- The following operations fail when `res.bodyUsed` is set. Otherwise, they acquire the lock of `res.body` and release it when done.
    - `res.arrayBuffer()`
    - `res.blob()`
    - `res.formData()`
    - `res.json()`
    - `res.text()`
- `res.clone()` fail when `res.bodyUsed` is set.
- The following operations fail when `res.bodyUsed` is set. Otherwise, set `res`'s `body neutered flag`, confiscate the underlying source and queue from `res.body` and error it.
    - `e.respondWith(res)`
    - `cache.put(req, res)`

- a `Response`/`Request` with `body neutered flag` is unset but `.body` `"errored"` is considered to be one whose headers were received successfully but body wasn't
- a `Response`/`Request` with `body neutered flag` set is considered to be invalid

## Permanent lock

- `req.bodyUsed` = `req.body` is locked
- The following operations fail when `req.bodyUsed` is set. Otherwise, they acquire the lock of `req.body` and release it when done.
    - `req.arrayBuffer()`
    - `req.blob()`
    - `req.formData()`
    - `req.json()`
    - `req.text()`
- `req.clone()` fail when `req.bodyUsed` is set.
- The following operations fail when `req.bodyUsed` is set. Otherwise, they acquire the lock of `req.body` and never release it.
    - `fetch(req)`
    - `new Request(req)`
    - `cache.put(req, res)`

- `res.bodyUsed` = `res.body` is locked
- The following operations fail when `res.bodyUsed` is set. Otherwise, they acquire the lock of `res.body` and release it when done.
    - `res.arrayBuffer()`
    - `res.blob()`
    - `res.formData()`
    - `res.json()`
    - `res.text()`
- `res.clone()` fail when `res.bodyUsed` is set.
- The following operations fail when `res.bodyUsed` is set. Otherwise, they acquire the lock of `res.body` and never release it.
    - `e.respondWith(res)`
    - `cache.put(req, res)`

- Needs change on the Streams API spec to hold the lock of a stream even after draining it.


---
Reply to this email directly or view it on GitHub:
https://github.com/slightlyoff/ServiceWorker/issues/452#issuecomment-71971020

Received on Thursday, 29 January 2015 05:25:25 UTC