summaryrefslogtreecommitdiff
path: root/cli/ops/fs_events.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/fs_events.rs')
-rw-r--r--cli/ops/fs_events.rs133
1 files changed, 0 insertions, 133 deletions
diff --git a/cli/ops/fs_events.rs b/cli/ops/fs_events.rs
deleted file mode 100644
index 4832c915c..000000000
--- a/cli/ops/fs_events.rs
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-
-use crate::permissions::Permissions;
-use deno_core::error::bad_resource_id;
-use deno_core::error::AnyError;
-use deno_core::futures::future::poll_fn;
-use deno_core::serde_json;
-use deno_core::serde_json::json;
-use deno_core::serde_json::Value;
-use deno_core::BufVec;
-use deno_core::OpState;
-use deno_core::ZeroCopyBuf;
-use notify::event::Event as NotifyEvent;
-use notify::Error as NotifyError;
-use notify::EventKind;
-use notify::RecommendedWatcher;
-use notify::RecursiveMode;
-use notify::Watcher;
-use serde::Deserialize;
-use serde::Serialize;
-use std::cell::RefCell;
-use std::convert::From;
-use std::path::PathBuf;
-use std::rc::Rc;
-use tokio::sync::mpsc;
-
-pub fn init(rt: &mut deno_core::JsRuntime) {
- super::reg_json_sync(rt, "op_fs_events_open", op_fs_events_open);
- super::reg_json_async(rt, "op_fs_events_poll", op_fs_events_poll);
-}
-
-struct FsEventsResource {
- #[allow(unused)]
- watcher: RecommendedWatcher,
- receiver: mpsc::Receiver<Result<FsEvent, AnyError>>,
-}
-
-/// Represents a file system event.
-///
-/// We do not use the event directly from the notify crate. We flatten
-/// the structure into this simpler structure. We want to only make it more
-/// complex as needed.
-///
-/// Feel free to expand this struct as long as you can add tests to demonstrate
-/// the complexity.
-#[derive(Serialize, Debug)]
-struct FsEvent {
- kind: String,
- paths: Vec<PathBuf>,
-}
-
-impl From<NotifyEvent> for FsEvent {
- fn from(e: NotifyEvent) -> Self {
- let kind = match e.kind {
- EventKind::Any => "any",
- EventKind::Access(_) => "access",
- EventKind::Create(_) => "create",
- EventKind::Modify(_) => "modify",
- EventKind::Remove(_) => "remove",
- EventKind::Other => todo!(), // What's this for? Leaving it out for now.
- }
- .to_string();
- FsEvent {
- kind,
- paths: e.paths,
- }
- }
-}
-
-fn op_fs_events_open(
- state: &mut OpState,
- args: Value,
- _zero_copy: &mut [ZeroCopyBuf],
-) -> Result<Value, AnyError> {
- #[derive(Deserialize)]
- struct OpenArgs {
- recursive: bool,
- paths: Vec<String>,
- }
- let args: OpenArgs = serde_json::from_value(args)?;
- let (sender, receiver) = mpsc::channel::<Result<FsEvent, AnyError>>(16);
- let sender = std::sync::Mutex::new(sender);
- let mut watcher: RecommendedWatcher =
- Watcher::new_immediate(move |res: Result<NotifyEvent, NotifyError>| {
- let res2 = res.map(FsEvent::from).map_err(AnyError::from);
- let mut sender = sender.lock().unwrap();
- // Ignore result, if send failed it means that watcher was already closed,
- // but not all messages have been flushed.
- let _ = sender.try_send(res2);
- })?;
- let recursive_mode = if args.recursive {
- RecursiveMode::Recursive
- } else {
- RecursiveMode::NonRecursive
- };
- for path in &args.paths {
- state
- .borrow::<Permissions>()
- .check_read(&PathBuf::from(path))?;
- watcher.watch(path, recursive_mode)?;
- }
- let resource = FsEventsResource { watcher, receiver };
- let rid = state.resource_table.add("fsEvents", Box::new(resource));
- Ok(json!(rid))
-}
-
-async fn op_fs_events_poll(
- state: Rc<RefCell<OpState>>,
- args: Value,
- _zero_copy: BufVec,
-) -> Result<Value, AnyError> {
- #[derive(Deserialize)]
- struct PollArgs {
- rid: u32,
- }
- let PollArgs { rid } = serde_json::from_value(args)?;
- poll_fn(move |cx| {
- let mut state = state.borrow_mut();
- let watcher = state
- .resource_table
- .get_mut::<FsEventsResource>(rid)
- .ok_or_else(bad_resource_id)?;
- watcher
- .receiver
- .poll_recv(cx)
- .map(|maybe_result| match maybe_result {
- Some(Ok(value)) => Ok(json!({ "value": value, "done": false })),
- Some(Err(err)) => Err(err),
- None => Ok(json!({ "done": true })),
- })
- })
- .await
-}