rw_deno_core/
lib.rs

1// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
2pub mod arena;
3mod async_cancel;
4mod async_cell;
5pub mod cppgc;
6pub mod error;
7mod error_codes;
8mod extension_set;
9mod extensions;
10mod external;
11mod fast_string;
12mod feature_checker;
13mod flags;
14mod gotham_state;
15mod inspector;
16mod io;
17mod module_specifier;
18mod modules;
19mod normalize_path;
20mod ops;
21mod ops_builtin;
22mod ops_builtin_types;
23mod ops_builtin_v8;
24mod ops_metrics;
25mod path;
26mod runtime;
27mod source_map;
28mod tasks;
29mod web_timeout;
30
31// Re-exports
32pub use anyhow;
33pub use deno_unsync as unsync;
34pub use futures;
35pub use parking_lot;
36pub use serde;
37pub use serde_json;
38pub use serde_v8;
39pub use serde_v8::ByteString;
40pub use serde_v8::DetachedBuffer;
41pub use serde_v8::JsBuffer;
42pub use serde_v8::StringOrBuffer;
43pub use serde_v8::ToJsBuffer;
44pub use serde_v8::U16String;
45pub use sourcemap;
46pub use url;
47pub use v8;
48
49pub use deno_ops::op2;
50
51pub use crate::async_cancel::CancelFuture;
52pub use crate::async_cancel::CancelHandle;
53pub use crate::async_cancel::CancelTryFuture;
54pub use crate::async_cancel::Cancelable;
55pub use crate::async_cancel::Canceled;
56pub use crate::async_cancel::TryCancelable;
57pub use crate::async_cell::AsyncMut;
58pub use crate::async_cell::AsyncMutFuture;
59pub use crate::async_cell::AsyncRef;
60pub use crate::async_cell::AsyncRefCell;
61pub use crate::async_cell::AsyncRefFuture;
62pub use crate::async_cell::RcLike;
63pub use crate::async_cell::RcRef;
64pub use crate::error::GetErrorClassFn;
65pub use crate::error::JsErrorCreateFn;
66pub use crate::extensions::Extension;
67pub use crate::extensions::ExtensionFileSource;
68pub use crate::extensions::ExtensionFileSourceCode;
69pub use crate::extensions::Op;
70pub use crate::extensions::OpDecl;
71pub use crate::extensions::OpMiddlewareFn;
72pub use crate::external::ExternalDefinition;
73pub use crate::external::ExternalPointer;
74pub use crate::external::Externalizable;
75pub use crate::fast_string::FastStaticString;
76pub use crate::fast_string::FastString;
77pub use crate::feature_checker::FeatureChecker;
78pub use crate::flags::v8_set_flags;
79pub use crate::inspector::InspectorMsg;
80pub use crate::inspector::InspectorMsgKind;
81pub use crate::inspector::InspectorSessionProxy;
82pub use crate::inspector::JsRuntimeInspector;
83pub use crate::inspector::LocalInspectorSession;
84pub use crate::io::AsyncResult;
85pub use crate::io::BufMutView;
86pub use crate::io::BufMutViewWhole;
87pub use crate::io::BufView;
88pub use crate::io::Resource;
89pub use crate::io::ResourceHandle;
90pub use crate::io::ResourceHandleFd;
91pub use crate::io::ResourceHandleSocket;
92pub use crate::io::ResourceId;
93pub use crate::io::ResourceTable;
94pub use crate::io::WriteOutcome;
95pub use crate::module_specifier::resolve_import;
96pub use crate::module_specifier::resolve_path;
97pub use crate::module_specifier::resolve_url;
98pub use crate::module_specifier::resolve_url_or_path;
99pub use crate::module_specifier::ModuleResolutionError;
100pub use crate::module_specifier::ModuleSpecifier;
101pub use crate::modules::CustomModuleEvaluationKind;
102pub use crate::modules::ExtModuleLoaderCb;
103pub use crate::modules::FsModuleLoader;
104pub use crate::modules::ModuleCodeBytes;
105pub use crate::modules::ModuleCodeString;
106pub use crate::modules::ModuleId;
107pub use crate::modules::ModuleLoadResponse;
108pub use crate::modules::ModuleLoader;
109pub use crate::modules::ModuleName;
110pub use crate::modules::ModuleSource;
111pub use crate::modules::ModuleSourceCode;
112pub use crate::modules::ModuleSourceFuture;
113pub use crate::modules::ModuleType;
114pub use crate::modules::NoopModuleLoader;
115pub use crate::modules::RequestedModuleType;
116pub use crate::modules::ResolutionKind;
117pub use crate::modules::StaticModuleLoader;
118pub use crate::modules::ValidateImportAttributesCb;
119pub use crate::normalize_path::normalize_path;
120pub use crate::ops::OpId;
121pub use crate::ops::OpMetadata;
122pub use crate::ops::OpState;
123pub use crate::ops::PromiseId;
124pub use crate::ops_builtin::op_close;
125pub use crate::ops_builtin::op_print;
126pub use crate::ops_builtin::op_resources;
127pub use crate::ops_builtin::op_void_async;
128pub use crate::ops_builtin::op_void_sync;
129pub use crate::ops_metrics::merge_op_metrics;
130pub use crate::ops_metrics::OpMetricsEvent;
131pub use crate::ops_metrics::OpMetricsFactoryFn;
132pub use crate::ops_metrics::OpMetricsFn;
133pub use crate::ops_metrics::OpMetricsSource;
134pub use crate::ops_metrics::OpMetricsSummary;
135pub use crate::ops_metrics::OpMetricsSummaryTracker;
136pub use crate::path::strip_unc_prefix;
137pub use crate::runtime::stats;
138pub use crate::runtime::CompiledWasmModuleStore;
139pub use crate::runtime::CreateRealmOptions;
140pub use crate::runtime::CrossIsolateStore;
141pub use crate::runtime::JsRuntime;
142pub use crate::runtime::JsRuntimeForSnapshot;
143pub use crate::runtime::PollEventLoopOptions;
144pub use crate::runtime::RuntimeOptions;
145pub use crate::runtime::SharedArrayBufferStore;
146pub use crate::runtime::V8_WRAPPER_OBJECT_INDEX;
147pub use crate::runtime::V8_WRAPPER_TYPE_INDEX;
148pub use crate::source_map::SourceMapData;
149pub use crate::source_map::SourceMapGetter;
150pub use crate::tasks::V8CrossThreadTaskSpawner;
151pub use crate::tasks::V8TaskSpawner;
152
153// Ensure we can use op2 in deno_core without any hackery.
154extern crate self as deno_core;
155
156pub fn v8_version() -> &'static str {
157  v8::V8::get_version()
158}
159
160/// An internal module re-exporting functions used by the #[op] (`deno_ops`) macro
161#[doc(hidden)]
162pub mod _ops {
163  pub use super::error::throw_type_error;
164  pub use super::error_codes::get_error_code;
165  pub use super::extensions::Op;
166  pub use super::extensions::OpDecl;
167  #[cfg(debug_assertions)]
168  pub use super::ops::reentrancy_check;
169  pub use super::ops::OpCtx;
170  pub use super::ops_metrics::dispatch_metrics_async;
171  pub use super::ops_metrics::dispatch_metrics_fast;
172  pub use super::ops_metrics::dispatch_metrics_slow;
173  pub use super::ops_metrics::OpMetricsEvent;
174  pub use super::runtime::ops::*;
175  pub use super::runtime::ops_rust_to_v8::*;
176  pub use super::runtime::V8_WRAPPER_OBJECT_INDEX;
177  pub use super::runtime::V8_WRAPPER_TYPE_INDEX;
178}
179
180pub mod snapshot {
181  pub use crate::runtime::create_snapshot;
182  pub use crate::runtime::get_js_files;
183  pub use crate::runtime::CreateSnapshotOptions;
184  pub use crate::runtime::CreateSnapshotOutput;
185  pub use crate::runtime::FilterFn;
186}
187
188/// A helper macro that will return a call site in Rust code. Should be
189/// used when executing internal one-line scripts for JsRuntime lifecycle.
190///
191/// Returns a string in form of: "`[ext:<filename>:<line>:<column>]`"
192#[macro_export]
193macro_rules! located_script_name {
194  () => {
195    concat!(
196      "[ext:",
197      ::std::file!(),
198      ":",
199      ::std::line!(),
200      ":",
201      ::std::column!(),
202      "]"
203    )
204  };
205}
206
207#[cfg(all(test, not(miri)))]
208mod tests {
209  use std::process::Command;
210  use std::process::Stdio;
211
212  use super::*;
213
214  #[test]
215  fn located_script_name() {
216    // Note that this test will fail if this file is moved. We don't
217    // test line locations because that's just too brittle.
218    let name = located_script_name!();
219    let expected = if cfg!(windows) {
220      "[ext:core\\lib.rs:"
221    } else {
222      "[ext:core/lib.rs:"
223    };
224    assert_eq!(&name[..expected.len()], expected);
225  }
226
227  #[test]
228  fn test_v8_version() {
229    assert!(v8_version().len() > 3);
230  }
231
232  // If the deno command is available, we ensure the async stubs are correctly rebuilt.
233  #[test]
234  fn test_rebuild_async_stubs() {
235    // Check for deno first
236    if let Err(e) = Command::new("deno")
237      .arg("--version")
238      .stderr(Stdio::null())
239      .stdout(Stdio::null())
240      .status()
241    {
242      eprintln!("Ignoring test because we couldn't find deno: {e:?}");
243    }
244    let status = Command::new("deno")
245      .args(["run", "-A", "rebuild_async_stubs.js", "--check"])
246      .stderr(Stdio::null())
247      .stdout(Stdio::null())
248      .status()
249      .unwrap();
250    assert!(status.success(), "Async stubs were not updated, or 'rebuild_async_stubs.js' failed for some other reason");
251  }
252}