summaryrefslogtreecommitdiff
path: root/cli/isolate_state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/isolate_state.rs')
-rw-r--r--cli/isolate_state.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/cli/isolate_state.rs b/cli/isolate_state.rs
index 8b7745f9e..6435b2e8b 100644
--- a/cli/isolate_state.rs
+++ b/cli/isolate_state.rs
@@ -1,13 +1,17 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use crate::deno_dir;
+use crate::errors::DenoResult;
use crate::flags;
use crate::global_timer::GlobalTimer;
use crate::modules::Modules;
+use crate::permissions::DenoPermissions;
+use deno_core::deno_mod;
use deno_core::Buf;
use futures::sync::mpsc as async_mpsc;
use std;
use std::env;
use std::sync::atomic::{AtomicUsize, Ordering};
+use std::sync::Arc;
use std::sync::Mutex;
pub type WorkerSender = async_mpsc::Sender<Buf>;
@@ -33,6 +37,7 @@ pub struct Metrics {
pub struct IsolateState {
pub dir: deno_dir::DenoDir,
pub argv: Vec<String>,
+ pub permissions: DenoPermissions,
pub flags: flags::DenoFlags,
pub metrics: Metrics,
pub modules: Mutex<Modules>,
@@ -52,6 +57,7 @@ impl IsolateState {
dir: deno_dir::DenoDir::new(flags.reload, flags.recompile, custom_root)
.unwrap(),
argv: argv_rest,
+ permissions: DenoPermissions::from_flags(&flags),
flags,
metrics: Metrics::default(),
modules: Mutex::new(Modules::new()),
@@ -76,6 +82,31 @@ impl IsolateState {
}
}
+ #[inline]
+ pub fn check_read(&self, filename: &str) -> DenoResult<()> {
+ self.permissions.check_read(filename)
+ }
+
+ #[inline]
+ pub fn check_write(&self, filename: &str) -> DenoResult<()> {
+ self.permissions.check_write(filename)
+ }
+
+ #[inline]
+ pub fn check_env(&self) -> DenoResult<()> {
+ self.permissions.check_env()
+ }
+
+ #[inline]
+ pub fn check_net(&self, filename: &str) -> DenoResult<()> {
+ self.permissions.check_net(filename)
+ }
+
+ #[inline]
+ pub fn check_run(&self) -> DenoResult<()> {
+ self.permissions.check_run()
+ }
+
#[cfg(test)]
pub fn mock() -> IsolateState {
let argv = vec![String::from("./deno"), String::from("hello.js")];
@@ -108,3 +139,21 @@ impl IsolateState {
.fetch_add(bytes_received, Ordering::SeqCst);
}
}
+
+/// Provides state getter function
+pub trait IsolateStateContainer {
+ fn state(&self) -> Arc<IsolateState>;
+}
+
+/// Provides state_resolve function for IsolateStateContainer implementors
+pub trait IsolateStateModuleResolution: IsolateStateContainer {
+ fn state_resolve(&mut self, specifier: &str, referrer: deno_mod) -> deno_mod {
+ let state = self.state();
+ state.metrics.resolve_count.fetch_add(1, Ordering::Relaxed);
+ let mut modules = state.modules.lock().unwrap();
+ modules.resolve_cb(&state.dir, specifier, referrer)
+ }
+}
+
+// Auto implementation for all IsolateStateContainer implementors
+impl<T> IsolateStateModuleResolution for T where T: IsolateStateContainer {}