- From: Adam Rice <notifications@github.com>
- Date: Fri, 05 Aug 2016 00:39:05 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Message-ID: <whatwg/streams/pull/504/c237778288@github.com>
This is more along the lines of moving the deckchairs around than actually moving closer to the C API, but fwiw here's an alternative: start(controller) { socket.setTCPWindowSize(Math.max(0, controller.desiredSize)); readRepeatedly().catch(e => controller.error(e)); function readOnce(buffer, offset, size) { return socket.read(buffer, offset, size) .then((bytesRead) => { if (bytesRead == 0) { controller.close(); } else { // The internal queue size has changed, so propagate // the backpressure signal to the underlying source. socket.setTCPWindowSize(Math.max(0, controller.desiredSize)); readRepeatedly(); } return bytesRead; }); } function readRepeatedly() { // Since the socket can become readable even when there's // no pending BYOB requests, we need to handle both cases. if (controller.byobRequest) { const v = controller.byobRequest.view; readOnce(v.buffer, v.byteOffset, b.byteLength) .then(bytesRead => controller.byobRequest.respond(bytesRead)); } else { const buffer = new ArrayBuffer(DEFAULT_WINDOW_SIZE); readOnce(buffer, 0, DEFAULT_WINDOW_SIZE) .then(bytesRead => controller.enqueue( new Uint8Array(buffer, 0, bytesRead))); } } } I've renamed readInto() to read() and made it return a Promise. It also returns 0 for EOF rather than throwing an exception. I feel like this is closer in spirit to the C API. If we were going to be closer to the C API we could call read() in a loop until it throws an EWOULDWAIT exception, and then call select() as in your version. But I suspect that would be really hard to read. --- 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/pull/504#issuecomment-237778288
Received on Friday, 5 August 2016 07:41:53 UTC