summaryrefslogtreecommitdiff
path: root/core/ops_builtin.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/ops_builtin.rs')
-rw-r--r--core/ops_builtin.rs369
1 files changed, 0 insertions, 369 deletions
diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs
deleted file mode 100644
index eeb753d5a..000000000
--- a/core/ops_builtin.rs
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-use crate::error::format_file_name;
-use crate::error::type_error;
-use crate::io::BufMutView;
-use crate::io::BufView;
-use crate::ops_builtin_v8;
-use crate::ops_metrics::OpMetrics;
-use crate::resources::ResourceId;
-use crate::JsBuffer;
-use crate::OpState;
-use crate::Resource;
-use anyhow::Error;
-use deno_ops::op;
-use deno_ops::op2;
-use serde_v8::ToJsBuffer;
-use std::cell::RefCell;
-use std::io::stderr;
-use std::io::stdout;
-use std::io::Write;
-use std::rc::Rc;
-
-crate::extension!(
- core,
- ops = [
- op_close,
- op_try_close,
- op_print,
- op_resources,
- op_wasm_streaming_feed,
- op_wasm_streaming_set_url,
- op_void_sync,
- op_error_async,
- op_error_async_deferred,
- op_void_async,
- op_void_async_deferred,
- op_add,
- op_add_async,
- // TODO(@AaronO): track IO metrics for builtin streams
- op_read,
- op_read_all,
- op_write,
- op_read_sync,
- op_write_sync,
- op_write_all,
- op_shutdown,
- op_metrics,
- op_format_file_name,
- op_is_proxy,
- op_str_byte_length,
- ops_builtin_v8::op_ref_op,
- ops_builtin_v8::op_unref_op,
- ops_builtin_v8::op_set_promise_reject_callback,
- ops_builtin_v8::op_run_microtasks,
- ops_builtin_v8::op_has_tick_scheduled,
- ops_builtin_v8::op_set_has_tick_scheduled,
- ops_builtin_v8::op_eval_context,
- ops_builtin_v8::op_queue_microtask,
- ops_builtin_v8::op_create_host_object,
- ops_builtin_v8::op_encode,
- ops_builtin_v8::op_decode,
- ops_builtin_v8::op_serialize,
- ops_builtin_v8::op_deserialize,
- ops_builtin_v8::op_set_promise_hooks,
- ops_builtin_v8::op_get_promise_details,
- ops_builtin_v8::op_get_proxy_details,
- ops_builtin_v8::op_get_non_index_property_names,
- ops_builtin_v8::op_get_constructor_name,
- ops_builtin_v8::op_memory_usage,
- ops_builtin_v8::op_set_wasm_streaming_callback,
- ops_builtin_v8::op_abort_wasm_streaming,
- ops_builtin_v8::op_destructure_error,
- ops_builtin_v8::op_dispatch_exception,
- ops_builtin_v8::op_op_names,
- ops_builtin_v8::op_apply_source_map,
- ops_builtin_v8::op_set_format_exception_callback,
- ops_builtin_v8::op_event_loop_has_more_work,
- ops_builtin_v8::op_store_pending_promise_rejection,
- ops_builtin_v8::op_remove_pending_promise_rejection,
- ops_builtin_v8::op_has_pending_promise_rejection,
- ops_builtin_v8::op_arraybuffer_was_detached,
- ],
-);
-
-/// Return map of resources with id as key
-/// and string representation as value.
-#[op]
-pub fn op_resources(state: &mut OpState) -> Vec<(ResourceId, String)> {
- state
- .resource_table
- .names()
- .map(|(rid, name)| (rid, name.to_string()))
- .collect()
-}
-
-#[op2(core, fast)]
-fn op_add(a: i32, b: i32) -> i32 {
- a + b
-}
-
-#[op]
-pub async fn op_add_async(a: i32, b: i32) -> i32 {
- a + b
-}
-
-#[op(fast)]
-pub fn op_void_sync() {}
-
-#[op]
-pub async fn op_void_async() {}
-
-#[op]
-pub async fn op_error_async() -> Result<(), Error> {
- Err(Error::msg("error"))
-}
-
-#[op(deferred)]
-pub async fn op_error_async_deferred() -> Result<(), Error> {
- Err(Error::msg("error"))
-}
-
-#[op(deferred)]
-pub async fn op_void_async_deferred() {}
-
-/// Remove a resource from the resource table.
-#[op]
-pub fn op_close(
- state: &mut OpState,
- rid: Option<ResourceId>,
-) -> Result<(), Error> {
- // TODO(@AaronO): drop Option after improving type-strictness balance in
- // serde_v8
- let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?;
- state.resource_table.close(rid)?;
- Ok(())
-}
-
-/// Try to remove a resource from the resource table. If there is no resource
-/// with the specified `rid`, this is a no-op.
-#[op]
-pub fn op_try_close(
- state: &mut OpState,
- rid: Option<ResourceId>,
-) -> Result<(), Error> {
- // TODO(@AaronO): drop Option after improving type-strictness balance in
- // serde_v8.
- let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?;
- let _ = state.resource_table.close(rid);
- Ok(())
-}
-
-#[op]
-pub fn op_metrics(state: &mut OpState) -> (OpMetrics, Vec<OpMetrics>) {
- let aggregate = state.tracker.aggregate();
- let per_op = state.tracker.per_op();
- (aggregate, per_op)
-}
-
-/// Builtin utility to print to stdout/stderr
-#[op]
-pub fn op_print(msg: &str, is_err: bool) -> Result<(), Error> {
- if is_err {
- stderr().write_all(msg.as_bytes())?;
- stderr().flush().unwrap();
- } else {
- stdout().write_all(msg.as_bytes())?;
- stdout().flush().unwrap();
- }
- Ok(())
-}
-
-pub struct WasmStreamingResource(pub(crate) RefCell<v8::WasmStreaming>);
-
-impl Resource for WasmStreamingResource {
- fn close(self: Rc<Self>) {
- // At this point there are no clones of Rc<WasmStreamingResource> on the
- // resource table, and no one should own a reference outside of the stack.
- // Therefore, we can be sure `self` is the only reference.
- if let Ok(wsr) = Rc::try_unwrap(self) {
- wsr.0.into_inner().finish();
- } else {
- panic!("Couldn't consume WasmStreamingResource.");
- }
- }
-}
-
-/// Feed bytes to WasmStreamingResource.
-#[op]
-pub fn op_wasm_streaming_feed(
- state: &mut OpState,
- rid: ResourceId,
- bytes: &[u8],
-) -> Result<(), Error> {
- let wasm_streaming =
- state.resource_table.get::<WasmStreamingResource>(rid)?;
-
- wasm_streaming.0.borrow_mut().on_bytes_received(bytes);
-
- Ok(())
-}
-
-#[op]
-pub fn op_wasm_streaming_set_url(
- state: &mut OpState,
- rid: ResourceId,
- url: &str,
-) -> Result<(), Error> {
- let wasm_streaming =
- state.resource_table.get::<WasmStreamingResource>(rid)?;
-
- wasm_streaming.0.borrow_mut().set_url(url);
-
- Ok(())
-}
-
-#[op]
-async fn op_read(
- state: Rc<RefCell<OpState>>,
- rid: ResourceId,
- buf: JsBuffer,
-) -> Result<u32, Error> {
- let resource = state.borrow().resource_table.get_any(rid)?;
- let view = BufMutView::from(buf);
- resource.read_byob(view).await.map(|(n, _)| n as u32)
-}
-
-#[op]
-async fn op_read_all(
- state: Rc<RefCell<OpState>>,
- rid: ResourceId,
-) -> Result<ToJsBuffer, Error> {
- let resource = state.borrow().resource_table.get_any(rid)?;
-
- // The number of bytes we attempt to grow the buffer by each time it fills
- // up and we have more data to read. We start at 64 KB. The grow_len is
- // doubled if the nread returned from a single read is equal or greater than
- // the grow_len. This allows us to reduce allocations for resources that can
- // read large chunks of data at a time.
- let mut grow_len: usize = 64 * 1024;
-
- let (min, maybe_max) = resource.size_hint();
- // Try to determine an optimal starting buffer size for this resource based
- // on the size hint.
- let initial_size = match (min, maybe_max) {
- (min, Some(max)) if min == max => min as usize,
- (_min, Some(max)) if (max as usize) < grow_len => max as usize,
- (min, _) if (min as usize) < grow_len => grow_len,
- (min, _) => min as usize,
- };
-
- let mut buf = BufMutView::new(initial_size);
- loop {
- // if the buffer does not have much remaining space, we may have to grow it.
- if buf.len() < grow_len {
- let vec = buf.get_mut_vec();
- match maybe_max {
- Some(max) if vec.len() >= max as usize => {
- // no need to resize the vec, because the vec is already large enough
- // to accommodate the maximum size of the read data.
- }
- Some(max) if (max as usize) < vec.len() + grow_len => {
- // grow the vec to the maximum size of the read data
- vec.resize(max as usize, 0);
- }
- _ => {
- // grow the vec by grow_len
- vec.resize(vec.len() + grow_len, 0);
- }
- }
- }
- let (n, new_buf) = resource.clone().read_byob(buf).await?;
- buf = new_buf;
- buf.advance_cursor(n);
- if n == 0 {
- break;
- }
- if n >= grow_len {
- // we managed to read more or equal data than fits in a single grow_len in
- // a single go, so let's attempt to read even more next time. this reduces
- // allocations for resources that can read large chunks of data at a time.
- grow_len *= 2;
- }
- }
-
- let nread = buf.reset_cursor();
- let mut vec = buf.unwrap_vec();
- // If the buffer is larger than the amount of data read, shrink it to the
- // amount of data read.
- if nread < vec.len() {
- vec.truncate(nread);
- }
-
- Ok(ToJsBuffer::from(vec))
-}
-
-#[op]
-async fn op_write(
- state: Rc<RefCell<OpState>>,
- rid: ResourceId,
- buf: JsBuffer,
-) -> Result<u32, Error> {
- let resource = state.borrow().resource_table.get_any(rid)?;
- let view = BufView::from(buf);
- let resp = resource.write(view).await?;
- Ok(resp.nwritten() as u32)
-}
-
-#[op(fast)]
-fn op_read_sync(
- state: &mut OpState,
- rid: ResourceId,
- data: &mut [u8],
-) -> Result<u32, Error> {
- let resource = state.resource_table.get_any(rid)?;
- resource.read_byob_sync(data).map(|n| n as u32)
-}
-
-#[op]
-fn op_write_sync(
- state: &mut OpState,
- rid: ResourceId,
- data: &[u8],
-) -> Result<u32, Error> {
- let resource = state.resource_table.get_any(rid)?;
- let nwritten = resource.write_sync(data)?;
- Ok(nwritten as u32)
-}
-
-#[op]
-async fn op_write_all(
- state: Rc<RefCell<OpState>>,
- rid: ResourceId,
- buf: JsBuffer,
-) -> 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<RefCell<OpState>>,
- rid: ResourceId,
-) -> Result<(), Error> {
- let resource = state.borrow().resource_table.get_any(rid)?;
- resource.shutdown().await
-}
-
-#[op]
-fn op_format_file_name(file_name: String) -> String {
- format_file_name(&file_name)
-}
-
-#[op(fast)]
-fn op_is_proxy(value: serde_v8::Value) -> bool {
- value.v8_value.is_proxy()
-}
-
-#[op(v8)]
-fn op_str_byte_length(
- scope: &mut v8::HandleScope,
- value: serde_v8::Value,
-) -> u32 {
- if let Ok(string) = v8::Local::<v8::String>::try_from(value.v8_value) {
- string.utf8_length(scope) as u32
- } else {
- 0
- }
-}