feat(core): streams (#12596)

This allows resources to be "streams" by implementing read/write/shutdown. These streams are implicit since their nature (read/write/duplex) isn't known until called, but we could easily add another method to explicitly tag resources as streams.

`op_read/op_write/op_shutdown` are now builtin ops provided by `deno_core`

Note: this current implementation is simple & straightforward but it results in an additional alloc per read/write call

Closes #12556
This commit is contained in:
Aaron O'Mullan 2021-11-09 19:26:17 +01:00 committed by GitHub
parent 1eae6c139e
commit 375ce63c63
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 258 additions and 304 deletions

View file

@ -73,24 +73,6 @@
return core.opAsync("op_fetch_send", rid);
}
/**
* @param {number} rid
* @param {Uint8Array} body
* @returns {Promise<void>}
*/
function opFetchRequestWrite(rid, body) {
return core.opAsync("op_fetch_request_write", rid, body);
}
/**
* @param {number} rid
* @param {Uint8Array} body
* @returns {Promise<number>}
*/
function opFetchResponseRead(rid, body) {
return core.opAsync("op_fetch_response_read", rid, body);
}
// A finalization registry to clean up underlying fetch resources that are GC'ed.
const RESOURCE_REGISTRY = new FinalizationRegistry((rid) => {
core.tryClose(rid);
@ -120,7 +102,8 @@
// This is the largest possible size for a single packet on a TLS
// stream.
const chunk = new Uint8Array(16 * 1024 + 256);
const read = await opFetchResponseRead(
// TODO(@AaronO): switch to handle nulls if that's moved to core
const read = await core.read(
responseBodyRid,
chunk,
);
@ -260,7 +243,7 @@
}
try {
await PromisePrototypeCatch(
opFetchRequestWrite(requestBodyRid, value),
core.write(requestBodyRid, value),
(err) => {
if (terminator.aborted) return;
throw err;