summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/build.rs6
-rw-r--r--runtime/ops/process.rs6
-rw-r--r--runtime/ops/tty.rs125
-rw-r--r--runtime/web_worker.rs5
-rw-r--r--runtime/worker.rs6
5 files changed, 84 insertions, 64 deletions
diff --git a/runtime/build.rs b/runtime/build.rs
index bba2eae55..d096df7db 100644
--- a/runtime/build.rs
+++ b/runtime/build.rs
@@ -18,7 +18,6 @@ mod startup_snapshot {
use deno_core::Extension;
use deno_core::ExtensionFileSource;
use deno_core::ModuleCode;
- use deno_fs::StdFs;
use std::path::Path;
fn transpile_ts_for_snapshotting(
@@ -310,7 +309,10 @@ mod startup_snapshot {
deno_napi::deno_napi::init_ops_and_esm::<Permissions>(),
deno_http::deno_http::init_ops_and_esm(),
deno_io::deno_io::init_ops_and_esm(Default::default()),
- deno_fs::deno_fs::init_ops_and_esm::<_, Permissions>(false, StdFs),
+ deno_fs::deno_fs::init_ops_and_esm::<Permissions>(
+ false,
+ std::sync::Arc::new(deno_fs::RealFs),
+ ),
runtime::init_ops_and_esm(),
// FIXME(bartlomieju): these extensions are specified last, because they
// depend on `runtime`, even though it should be other way around
diff --git a/runtime/ops/process.rs b/runtime/ops/process.rs
index cf8740255..d991c961f 100644
--- a/runtime/ops/process.rs
+++ b/runtime/ops/process.rs
@@ -12,10 +12,10 @@ use deno_core::RcRef;
use deno_core::Resource;
use deno_core::ResourceId;
use deno_core::ZeroCopyBuf;
+use deno_io::fs::FileResource;
use deno_io::ChildStderrResource;
use deno_io::ChildStdinResource;
use deno_io::ChildStdoutResource;
-use deno_io::StdFileResource;
use serde::Deserialize;
use serde::Serialize;
use std::borrow::Cow;
@@ -93,7 +93,9 @@ impl StdioOrRid {
) -> Result<std::process::Stdio, AnyError> {
match &self {
StdioOrRid::Stdio(val) => Ok(val.as_stdio()),
- StdioOrRid::Rid(rid) => StdFileResource::as_stdio(state, *rid),
+ StdioOrRid::Rid(rid) => {
+ FileResource::with_file(state, *rid, |file| Ok(file.as_stdio()?))
+ }
}
}
}
diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs
index a3dc03a6f..7f24daec4 100644
--- a/runtime/ops/tty.rs
+++ b/runtime/ops/tty.rs
@@ -1,10 +1,14 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+use std::io::Error;
+use std::rc::Rc;
+
+use deno_core::error::resource_unavailable;
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::OpState;
-use deno_io::StdFileResource;
-use std::io::Error;
+use deno_core::Resource;
+use deno_io::fs::FileResource;
#[cfg(unix)]
use deno_core::ResourceId;
@@ -14,8 +18,6 @@ use nix::sys::termios;
use std::cell::RefCell;
#[cfg(unix)]
use std::collections::HashMap;
-#[cfg(unix)]
-use std::rc::Rc;
#[cfg(unix)]
#[derive(Default, Clone)]
@@ -44,13 +46,14 @@ use winapi::shared::minwindef::DWORD;
use winapi::um::wincon;
#[cfg(windows)]
-fn get_windows_handle(
- f: &std::fs::File,
+fn get_fd_from_resource(
+ resource: Rc<FileResource>,
) -> Result<std::os::windows::io::RawHandle, AnyError> {
- use std::os::windows::io::AsRawHandle;
use winapi::um::handleapi;
- let handle = f.as_raw_handle();
+ let Some(handle) = resource.backing_fd() else {
+ return Err(resource_unavailable());
+ };
if handle == handleapi::INVALID_HANDLE_VALUE {
return Err(Error::last_os_error().into());
} else if handle.is_null() {
@@ -59,6 +62,16 @@ fn get_windows_handle(
Ok(handle)
}
+#[cfg(not(windows))]
+fn get_fd_from_resource(
+ resource: Rc<FileResource>,
+) -> Result<std::os::unix::prelude::RawFd, AnyError> {
+ match resource.backing_fd() {
+ Some(fd) => Ok(fd),
+ None => Err(resource_unavailable()),
+ }
+}
+
deno_core::extension!(
deno_tty,
ops = [op_stdin_set_raw, op_isatty, op_console_size],
@@ -106,23 +119,15 @@ fn op_stdin_set_raw(
// Copyright (c) 2019 Timon. MIT license.
#[cfg(windows)]
{
- use std::os::windows::io::AsRawHandle;
use winapi::shared::minwindef::FALSE;
use winapi::um::consoleapi;
- use winapi::um::handleapi;
if cbreak {
return Err(deno_core::error::not_supported());
}
- StdFileResource::with_file(state, rid, move |std_file| {
- let handle = std_file.as_raw_handle();
-
- if handle == handleapi::INVALID_HANDLE_VALUE {
- return Err(Error::last_os_error().into());
- } else if handle.is_null() {
- return Err(custom_error("ReferenceError", "null handle"));
- }
+ FileResource::with_resource(state, rid, move |resource| {
+ let handle = get_fd_from_resource(resource)?;
let mut original_mode: DWORD = 0;
// SAFETY: winapi call
if unsafe { consoleapi::GetConsoleMode(handle, &mut original_mode) }
@@ -147,13 +152,11 @@ fn op_stdin_set_raw(
}
#[cfg(unix)]
{
- use std::os::unix::io::AsRawFd;
-
let tty_mode_store = state.borrow::<TtyModeStore>().clone();
let previous_mode = tty_mode_store.get(rid);
- StdFileResource::with_file(state, rid, move |std_file| {
- let raw_fd = std_file.as_raw_fd();
+ FileResource::with_resource(state, rid, move |resource| {
+ let raw_fd = get_fd_from_resource(resource)?;
if is_raw {
let mut raw = match previous_mode {
@@ -201,13 +204,14 @@ fn op_isatty(
rid: u32,
out: &mut [u8],
) -> Result<(), AnyError> {
- StdFileResource::with_file(state, rid, move |std_file| {
+ FileResource::with_resource(state, rid, move |resource| {
+ let raw_fd = get_fd_from_resource(resource)?;
#[cfg(windows)]
{
use winapi::shared::minwindef::FALSE;
use winapi::um::consoleapi;
- let handle = get_windows_handle(std_file)?;
+ let handle = raw_fd;
let mut test_mode: DWORD = 0;
// If I cannot get mode out of console, it is not a console.
// TODO(bartlomieju):
@@ -220,8 +224,6 @@ fn op_isatty(
}
#[cfg(unix)]
{
- use std::os::unix::io::AsRawFd;
- let raw_fd = std_file.as_raw_fd();
// TODO(bartlomieju):
#[allow(clippy::undocumented_unsafe_blocks)]
{
@@ -242,8 +244,9 @@ fn op_console_size(
result: &mut [u32],
rid: u32,
) -> Result<(), AnyError> {
- StdFileResource::with_file(state, rid, move |std_file| {
- let size = console_size(std_file)?;
+ FileResource::with_resource(state, rid, move |resource| {
+ let fd = get_fd_from_resource(resource)?;
+ let size = console_size_from_fd(fd)?;
result[0] = size.cols;
result[1] = size.rows;
Ok(())
@@ -276,40 +279,50 @@ pub fn console_size(
{
use std::os::windows::io::AsRawHandle;
let handle = std_file.as_raw_handle();
-
- // SAFETY: winapi calls
- unsafe {
- let mut bufinfo: winapi::um::wincon::CONSOLE_SCREEN_BUFFER_INFO =
- std::mem::zeroed();
-
- if winapi::um::wincon::GetConsoleScreenBufferInfo(handle, &mut bufinfo)
- == 0
- {
- return Err(Error::last_os_error());
- }
- Ok(ConsoleSize {
- cols: bufinfo.dwSize.X as u32,
- rows: bufinfo.dwSize.Y as u32,
- })
- }
+ console_size_from_fd(handle)
}
-
#[cfg(unix)]
{
use std::os::unix::io::AsRawFd;
-
let fd = std_file.as_raw_fd();
- // SAFETY: libc calls
- unsafe {
- let mut size: libc::winsize = std::mem::zeroed();
- if libc::ioctl(fd, libc::TIOCGWINSZ, &mut size as *mut _) != 0 {
- return Err(Error::last_os_error());
- }
- Ok(ConsoleSize {
- cols: size.ws_col as u32,
- rows: size.ws_row as u32,
- })
+ console_size_from_fd(fd)
+ }
+}
+
+#[cfg(windows)]
+fn console_size_from_fd(
+ handle: std::os::windows::io::RawHandle,
+) -> Result<ConsoleSize, std::io::Error> {
+ // SAFETY: winapi calls
+ unsafe {
+ let mut bufinfo: winapi::um::wincon::CONSOLE_SCREEN_BUFFER_INFO =
+ std::mem::zeroed();
+
+ if winapi::um::wincon::GetConsoleScreenBufferInfo(handle, &mut bufinfo) == 0
+ {
+ return Err(Error::last_os_error());
}
+ Ok(ConsoleSize {
+ cols: bufinfo.dwSize.X as u32,
+ rows: bufinfo.dwSize.Y as u32,
+ })
+ }
+}
+
+#[cfg(not(windows))]
+fn console_size_from_fd(
+ fd: std::os::unix::prelude::RawFd,
+) -> Result<ConsoleSize, std::io::Error> {
+ // SAFETY: libc calls
+ unsafe {
+ let mut size: libc::winsize = std::mem::zeroed();
+ if libc::ioctl(fd, libc::TIOCGWINSZ, &mut size as *mut _) != 0 {
+ return Err(Error::last_os_error());
+ }
+ Ok(ConsoleSize {
+ cols: size.ws_col as u32,
+ rows: size.ws_row as u32,
+ })
}
}
diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs
index 1b3dd2809..e485c0c35 100644
--- a/runtime/web_worker.rs
+++ b/runtime/web_worker.rs
@@ -34,7 +34,7 @@ use deno_core::RuntimeOptions;
use deno_core::SharedArrayBufferStore;
use deno_core::Snapshot;
use deno_core::SourceMapGetter;
-use deno_fs::StdFs;
+use deno_fs::FileSystem;
use deno_io::Stdio;
use deno_kv::sqlite::SqliteDbHandler;
use deno_tls::RootCertStoreProvider;
@@ -331,6 +331,7 @@ pub struct WebWorkerOptions {
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
pub root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>,
pub seed: Option<u64>,
+ pub fs: Arc<dyn FileSystem>,
pub module_loader: Rc<dyn ModuleLoader>,
pub node_fs: Option<Arc<dyn deno_node::NodeFs>>,
pub npm_resolver: Option<Arc<dyn deno_node::NpmResolver>>,
@@ -441,7 +442,7 @@ impl WebWorker {
deno_napi::deno_napi::init_ops::<PermissionsContainer>(),
deno_http::deno_http::init_ops(),
deno_io::deno_io::init_ops(Some(options.stdio)),
- deno_fs::deno_fs::init_ops::<_, PermissionsContainer>(unstable, StdFs),
+ deno_fs::deno_fs::init_ops::<PermissionsContainer>(unstable, options.fs),
deno_node::deno_node::init_ops::<PermissionsContainer>(
options.npm_resolver,
options.node_fs,
diff --git a/runtime/worker.rs b/runtime/worker.rs
index ac67011f0..b9db21780 100644
--- a/runtime/worker.rs
+++ b/runtime/worker.rs
@@ -30,7 +30,7 @@ use deno_core::RuntimeOptions;
use deno_core::SharedArrayBufferStore;
use deno_core::Snapshot;
use deno_core::SourceMapGetter;
-use deno_fs::StdFs;
+use deno_fs::FileSystem;
use deno_io::Stdio;
use deno_kv::sqlite::SqliteDbHandler;
use deno_tls::RootCertStoreProvider;
@@ -87,6 +87,7 @@ pub struct WorkerOptions {
pub root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>,
pub seed: Option<u64>,
+ pub fs: Arc<dyn FileSystem>,
/// Implementation of `ModuleLoader` which will be
/// called when V8 requests to load ES modules.
///
@@ -149,6 +150,7 @@ impl Default for WorkerOptions {
create_web_worker_cb: Arc::new(|_| {
unimplemented!("web workers are not supported")
}),
+ fs: Arc::new(deno_fs::RealFs),
module_loader: Rc::new(FsModuleLoader),
seed: None,
unsafely_ignore_certificate_errors: Default::default(),
@@ -266,7 +268,7 @@ impl MainWorker {
deno_napi::deno_napi::init_ops::<PermissionsContainer>(),
deno_http::deno_http::init_ops(),
deno_io::deno_io::init_ops(Some(options.stdio)),
- deno_fs::deno_fs::init_ops::<_, PermissionsContainer>(unstable, StdFs),
+ deno_fs::deno_fs::init_ops::<PermissionsContainer>(unstable, options.fs),
deno_node::deno_node::init_ops::<PermissionsContainer>(
options.npm_resolver,
options.node_fs,