While working on lower-level byte streams we're encountering a number of
situations that need to return something along the lines of `{ buffer,
bytesRead }`. (In this setting "buffer" = ArrayBuffer.) In the most general
form the signature ends up being something like
{ sourceBuffer, offset, bytesDesired } -> { newBuffer, bytesRead }
where `sourceBuffer` gets detached, then (in some other thread, most likely) up
to `bytesDesired` bytes get written in at position `offset` to the backing
memory, then the backing memory gets [transferred][1] to `newBuffer`, and
`bytesRead` tells you how many bytes were actually read into the buffer.
I was hoping to get opinions on the most idiomatic way to represent this type
in JavaScript. So far I can think of a few options:
1. Just an object literal, probably with names `{ transferred, bytesRead }`
2. A Uint8Array view onto the new buffer, starting at `offset` and extending
`bytesRead`. I.e., `return new Uint8Array(result.transferred, input.offset,
result.bytesRead);`.
3. A DataView view onto the buffer, similar to 2.
4. An ArrayBuffer with an additional property added!? I.e.
`result.transferred.bytesRead = result.bytesRead; return result.transferred;`
1 is unambiguous, but a bit awkward, and in general does not compose well if we
try to make byte streams a special case of more general streams (which is a
goal).
Both 2 and 3 are essentially attempting to smuggle the two pieces of
information into one object. 2 takes the "byte" idea literally, whereas 3 uses
DataView since it feels more "agnostic." In both cases you can access the
underlying buffer using `view.buffer` so no generality is lost. I would be
especially interested in peoples' opinions on 2 vs 3.
4 I just thought up while composing this email and is probably not such a great
idea. But, I think it does work.
I wrote up a specialized version of 2 in some detail under a number of
different scenarios at: https://gist.github.com/domenic/65921459ef7a31ec2839.
Of particular interest might be
https://gist.github.com/domenic/65921459ef7a31ec2839#a-two-buffer-pool-for-a-file-stream
[1]:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/transfer
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss