From 1ab3691b091e34ffa5a0b8f2cd18a87da8c4930c Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Mon, 10 Oct 2022 10:28:35 +0200 Subject: feat(core): add Deno.core.writeAll(rid, chunk) (#16228) This commit adds a new op_write_all to core that allows writing an entire chunk in a single async op call. Internally this calls `Resource::write_all`. The `writableStreamForRid` has been moved to `06_streams.js` now, and uses this new op. Various other code paths now also use this new op. Closes #16227 --- core/01_core.js | 1 + core/examples/http_bench_json_ops.js | 2 +- core/lib.deno_core.d.ts | 5 +++++ core/ops_builtin.rs | 13 +++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) (limited to 'core') diff --git a/core/01_core.js b/core/01_core.js index 655b4219e..b98e54160 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -329,6 +329,7 @@ tryClose: (rid) => ops.op_try_close(rid), read: opAsync.bind(null, "op_read"), write: opAsync.bind(null, "op_write"), + writeAll: opAsync.bind(null, "op_write_all"), shutdown: opAsync.bind(null, "op_shutdown"), print: (msg, isErr) => ops.op_print(msg, isErr), setMacrotaskCallback: (fn) => ops.op_set_macrotask_callback(fn), diff --git a/core/examples/http_bench_json_ops.js b/core/examples/http_bench_json_ops.js index cea344987..98b2f4ef8 100644 --- a/core/examples/http_bench_json_ops.js +++ b/core/examples/http_bench_json_ops.js @@ -23,7 +23,7 @@ async function serve(rid) { try { while (true) { await Deno.core.read(rid, requestBuf); - await Deno.core.write(rid, responseBuf); + await Deno.core.writeAll(rid, responseBuf); } } catch (e) { if ( diff --git a/core/lib.deno_core.d.ts b/core/lib.deno_core.d.ts index 7e46d0f14..2a3764730 100644 --- a/core/lib.deno_core.d.ts +++ b/core/lib.deno_core.d.ts @@ -61,6 +61,11 @@ declare namespace Deno { */ function write(rid: number, buf: Uint8Array): Promise; + /** + * Write to a (stream) resource that implements write() + */ + function writeAll(rid: number, buf: Uint8Array): Promise; + /** * Print a message to stdout or stderr */ diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index 41741bf28..3fc9d62d6 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -38,6 +38,7 @@ pub(crate) fn init_builtins() -> Extension { op_read::decl(), op_read_all::decl(), op_write::decl(), + op_write_all::decl(), op_shutdown::decl(), op_metrics::decl(), op_format_file_name::decl(), @@ -253,6 +254,18 @@ async fn op_write( Ok(resp.nwritten() as u32) } +#[op] +async fn op_write_all( + state: Rc>, + rid: ResourceId, + buf: ZeroCopyBuf, +) -> Result<(), Error> { + let resource = state.borrow().resource_table.get_any(rid)?; + let view = BufView::from(buf); + resource.write_all(view).await?; + Ok(()) +} + #[op] async fn op_shutdown( state: Rc>, -- cgit v1.2.3