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