diff options
Diffstat (limited to 'cli/ops/worker_host.rs')
-rw-r--r-- | cli/ops/worker_host.rs | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/cli/ops/worker_host.rs b/cli/ops/worker_host.rs index dafd969b2..a4db5e27f 100644 --- a/cli/ops/worker_host.rs +++ b/cli/ops/worker_host.rs @@ -3,6 +3,7 @@ use super::dispatch_json::{Deserialize, JsonOp, Value}; use crate::fmt_errors::JSError; use crate::global_state::GlobalState; use crate::op_error::OpError; +use crate::ops::io::get_stdio; use crate::permissions::DenoPermissions; use crate::startup_data; use crate::state::State; @@ -37,17 +38,31 @@ fn create_web_worker( global_state: GlobalState, permissions: DenoPermissions, specifier: ModuleSpecifier, + has_deno_namespace: bool, ) -> Result<WebWorker, ErrBox> { let state = State::new_for_worker(global_state, Some(permissions), specifier)?; - let mut worker = - WebWorker::new(name.to_string(), startup_data::deno_isolate_init(), state); + if has_deno_namespace { + let mut s = state.borrow_mut(); + let (stdin, stdout, stderr) = get_stdio(); + s.resource_table.add("stdin", Box::new(stdin)); + s.resource_table.add("stdout", Box::new(stdout)); + s.resource_table.add("stderr", Box::new(stderr)); + } + + let mut worker = WebWorker::new( + name.clone(), + startup_data::deno_isolate_init(), + state, + has_deno_namespace, + ); + // Instead of using name for log we use `worker-${id}` because // WebWorkers can have empty string as name. let script = format!( - "bootstrapWorkerRuntime(\"{}\", \"worker-{}\")", - name, worker_id + "bootstrapWorkerRuntime(\"{}\", {}, \"worker-{}\")", + name, worker.has_deno_namespace, worker_id ); worker.execute(&script)?; @@ -61,8 +76,8 @@ fn run_worker_thread( global_state: GlobalState, permissions: DenoPermissions, specifier: ModuleSpecifier, - has_source_code: bool, - source_code: String, + has_deno_namespace: bool, + maybe_source_code: Option<String>, ) -> Result<(JoinHandle<()>, WebWorkerHandle), ErrBox> { let (handle_sender, handle_receiver) = std::sync::mpsc::sync_channel::<Result<WebWorkerHandle, ErrBox>>(1); @@ -80,6 +95,7 @@ fn run_worker_thread( global_state, permissions, specifier.clone(), + has_deno_namespace, ); if let Err(err) = result { @@ -108,7 +124,7 @@ fn run_worker_thread( // TODO: run with using select with terminate // Execute provided source code immediately - let result = if has_source_code { + let result = if let Some(source_code) = maybe_source_code { worker.execute(&source_code) } else { // TODO(bartlomieju): add "type": "classic", ie. ability to load @@ -146,6 +162,7 @@ struct CreateWorkerArgs { specifier: String, has_source_code: bool, source_code: String, + use_deno_namespace: bool, } /// Create worker as the host @@ -157,9 +174,13 @@ fn op_create_worker( let args: CreateWorkerArgs = serde_json::from_value(args)?; let specifier = args.specifier.clone(); - let has_source_code = args.has_source_code; - let source_code = args.source_code.clone(); + let maybe_source_code = if args.has_source_code { + Some(args.source_code.clone()) + } else { + None + }; let args_name = args.name; + let use_deno_namespace = args.use_deno_namespace; let parent_state = state.clone(); let mut state = state.borrow_mut(); let global_state = state.global_state.clone(); @@ -179,8 +200,8 @@ fn op_create_worker( global_state, permissions, module_specifier, - has_source_code, - source_code, + use_deno_namespace, + maybe_source_code, ) .map_err(|e| OpError::other(e.to_string()))?; // At this point all interactions with worker happen using thread |