Re: [whatwg/streams] strategy.size() can reenter WritableStream logic before its caller finishes all the work (#675)

I found an assertion failure:

```javascript
promise_test(() => {
  let writer;
  const strategy = {
    size() {
      writer.close('C');
      return 1;
    }
  };

  const ws = recordingWritableStream({}, strategy);
  writer = ws.getWriter();
  return writer.write('W')
      .then(() => {
        assert_array_equals(ws.events, ['write', 'W', 'close', 'C'], 'close should happen after write');
      });
}, 'close() should be work when called from within strategy.size()');
```

I get this output with the reference implementation:

```
whatwg/streams/reference-implementation/lib/utils.js:10
      throw e;
      ^
AssertionError: queue must be empty once the final write record is dequeued
    at WritableStreamDefaultControllerProcessClose (whatwg/streams/reference-implementation/lib/writable-stream.js:854:3)
    at WritableStreamDefaultControllerAdvanceQueueIfNeeded (whatwg/streams/reference-implementation/lib/writable-stream.js:835:5)
    at WritableStreamDefaultController.Promise.resolve.then (whatwg/streams/reference-implementation/lib/writable-stream.js:712:9)
```

I expected this test to pass. I did not spot the issue when I manually inspected the standard. There are so many code paths that it is difficult to have certainty that there are no issues.

I suggest we hoist the call to strategySize to be the very first thing in WritableStreamDefaultWriterWrite, before the state checks.The state checks that are currently in `write()` should be moved into WritableStreamDefaultWriterWrite so that they can happen after the call to strategySize. This would leave no way for strategySize to put us in a bad state.

You can see the rest of my work-in-progress tests at https://github.com/ricea/web-platform-tests/blob/9380b44bf34132e145be508d7a0847781e3b7a62/streams/writable-streams/reentrant-strategy.js.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/675#issuecomment-278879979

Received on Friday, 10 February 2017 07:53:33 UTC