diff options
Diffstat (limited to 'cli/ops/fs.rs')
-rw-r--r-- | cli/ops/fs.rs | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index 66487c41b..2e6f076a6 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -6,21 +6,29 @@ use super::io::{FileMetadata, StreamResource, StreamResourceHolder}; use crate::op_error::OpError; use crate::ops::dispatch_json::JsonResult; use crate::state::State; +use deno_core::BufVec; use deno_core::CoreIsolate; use deno_core::CoreIsolateState; +use deno_core::ResourceTable; use deno_core::ZeroCopyBuf; use futures::future::FutureExt; +use std::cell::RefCell; use std::convert::From; use std::env::{current_dir, set_current_dir, temp_dir}; use std::io; use std::path::{Path, PathBuf}; +use std::rc::Rc; use std::time::SystemTime; use std::time::UNIX_EPOCH; use rand::{thread_rng, Rng}; pub fn init(i: &mut CoreIsolate, s: &State) { - i.register_op("op_open", s.stateful_json_op2(op_open)); + let t = &CoreIsolate::state(i).borrow().resource_table.clone(); + + i.register_op("op_open_sync", s.stateful_json_op_sync(t, op_open_sync)); + i.register_op("op_open_async", s.stateful_json_op_async(t, op_open_async)); + i.register_op("op_seek", s.stateful_json_op2(op_seek)); i.register_op("op_fdatasync", s.stateful_json_op2(op_fdatasync)); i.register_op("op_fsync", s.stateful_json_op2(op_fsync)); @@ -54,10 +62,9 @@ fn into_string(s: std::ffi::OsString) -> Result<String, OpError> { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct OpenArgs { - promise_id: Option<u64>, path: String, - options: OpenOptions, mode: Option<u32>, + options: OpenOptions, } #[derive(Deserialize, Default, Debug)] @@ -72,15 +79,12 @@ struct OpenOptions { create_new: bool, } -fn op_open( - isolate_state: &mut CoreIsolateState, +fn open_helper( state: &State, args: Value, - _zero_copy: &mut [ZeroCopyBuf], -) -> Result<JsonOp, OpError> { +) -> Result<(PathBuf, std::fs::OpenOptions), OpError> { let args: OpenArgs = serde_json::from_value(args)?; let path = Path::new(&args.path).to_path_buf(); - let resource_table = isolate_state.resource_table.clone(); let mut open_options = std::fs::OpenOptions::new(); @@ -113,37 +117,46 @@ fn op_open( .append(options.append) .create_new(options.create_new); - let is_sync = args.promise_id.is_none(); + Ok((path, open_options)) +} - if is_sync { - let std_file = open_options.open(path)?; - let tokio_file = tokio::fs::File::from_std(std_file); - let mut resource_table = resource_table.borrow_mut(); - let rid = resource_table.add( - "fsFile", - Box::new(StreamResourceHolder::new(StreamResource::FsFile(Some(( - tokio_file, - FileMetadata::default(), - ))))), - ); - Ok(JsonOp::Sync(json!(rid))) - } else { - let fut = async move { - let tokio_file = tokio::fs::OpenOptions::from(open_options) - .open(path) - .await?; - let mut resource_table = resource_table.borrow_mut(); - let rid = resource_table.add( - "fsFile", - Box::new(StreamResourceHolder::new(StreamResource::FsFile(Some(( - tokio_file, - FileMetadata::default(), - ))))), - ); - Ok(json!(rid)) - }; - Ok(JsonOp::Async(fut.boxed_local())) - } +fn op_open_sync( + state: &State, + resource_table: &mut ResourceTable, + args: Value, + _zero_copy: &mut [ZeroCopyBuf], +) -> Result<Value, OpError> { + let (path, open_options) = open_helper(state, args)?; + let std_file = open_options.open(path)?; + let tokio_file = tokio::fs::File::from_std(std_file); + let rid = resource_table.add( + "fsFile", + Box::new(StreamResourceHolder::new(StreamResource::FsFile(Some(( + tokio_file, + FileMetadata::default(), + ))))), + ); + Ok(json!(rid)) +} + +async fn op_open_async( + state: State, + resource_table: Rc<RefCell<ResourceTable>>, + args: Value, + _zero_copy: BufVec, +) -> Result<Value, OpError> { + let (path, open_options) = open_helper(&state, args)?; + let tokio_file = tokio::fs::OpenOptions::from(open_options) + .open(path) + .await?; + let rid = resource_table.borrow_mut().add( + "fsFile", + Box::new(StreamResourceHolder::new(StreamResource::FsFile(Some(( + tokio_file, + FileMetadata::default(), + ))))), + ); + Ok(json!(rid)) } #[derive(Deserialize)] |