summaryrefslogtreecommitdiff
path: root/cli/ops/fs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/fs.rs')
-rw-r--r--cli/ops/fs.rs89
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)]