Skip to content
This repository has been archived by the owner on Dec 21, 2024. It is now read-only.

chore(toolchain): add ability to hook to existing process manager tasks & clean up backend port choosing #375

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/cli/src/util/task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,15 @@ fn print_event(
eprintln!("failed to serialize output: {err:?}");
}
}
_ => {}
},
TaskOutputStyle::PlainNoResult => match event {
TaskEvent::Log(x) => {
if let Err(err) = writeln!(stderr, "{x}") {
eprintln!("failed to write output: {err:?}");
}
}
TaskEvent::Result { .. } => {}
_ => {}
},
}
}
Expand Down
5 changes: 5 additions & 0 deletions packages/toolchain/src/config/meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ pub struct ProjectMeta {
/// Key is the key in the `ProcessManager` config.
#[serde(default)]
pub processes: HashMap<String, ProcessState>,

/// Port which the dev server is running on for plugins.
#[serde(default)]
pub backend_dev_port: Option<u16>,
}

impl ProjectMeta {
Expand All @@ -35,6 +39,7 @@ impl ProjectMeta {
tokens: Tokens { cloud: cloud_token },
environments: HashMap::new(),
processes: HashMap::new(),
backend_dev_port: None,
}
}
}
Expand Down
28 changes: 0 additions & 28 deletions packages/toolchain/src/tasks/backend_choose_local_port.rs

This file was deleted.

93 changes: 61 additions & 32 deletions packages/toolchain/src/tasks/backend_start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ use serde::{Deserialize, Serialize};

use crate::{
backend::{self, build_opengb_command_raw},
config, paths,
util::{process_manager::StartOpts, task},
config::{self, meta},
paths,
util::{
process_manager::{CommandOpts, StartMode, StartOpts},
task,
},
};

#[derive(Deserialize)]
pub struct Input {
pub port: u16,
pub cwd: String,
pub start_mode: StartMode,
}

#[derive(Serialize)]
Expand All @@ -29,36 +32,62 @@ impl task::Task for Task {
}

async fn run(task: task::TaskCtx, input: Self::Input) -> Result<Self::Output> {
let (mut cmd_env, config_path) =
config::settings::try_read(&paths::data_dir()?, |settings| {
let mut env = settings.backend.command_environment.clone();
env.extend(settings.backend.dev.command_environment.clone());
Ok((env, settings.backend.dev.config_path.clone()))
})
.await?;
cmd_env.insert("OPENGB_PORT".into(), input.port.to_string());
cmd_env.insert("OPENGB_HOSTNAME".into(), "0.0.0.0".to_string());
cmd_env.insert("OPENGB_TERM_COLOR".into(), "never".into());
// HACK: Set backend port in case the process is already running. This will result in a
// duplicate port dispatch if the backend was stopped.
if let Some(port) = meta::read_project(&paths::data_dir()?, |x| x.backend_dev_port).await? {
task.event(task::TaskEvent::SetBackendPort { port });
}

// TODO: Does not support env
let cmd = build_opengb_command_raw(backend::BackendCommandOpts {
command: "dev",
opts: serde_json::json!({
"project": config_path,
"nonInteractive": true
}),
env: cmd_env,
})
.await?;
// Start or hook to backend
let task_inner = task.clone();
let exit_code = backend::PROCESS_MANAGER_DEV
.start(StartOpts {
task: task,
command: cmd.command.display().to_string(),
args: cmd.args,
envs: cmd.envs.into_iter().collect(),
current_dir: cmd.current_dir.display().to_string(),
base_data_dir: paths::data_dir()?,
})
.start(
StartOpts {
task,
start_mode: input.start_mode,
base_data_dir: paths::data_dir()?,
},
|| async move {
// Pick dev port
let port = portpicker::pick_unused_port().context("no free ports")?;
meta::mutate_project(&paths::data_dir()?, |x| x.backend_dev_port = Some(port))
.await?;

// Build env
let (mut cmd_env, config_path) =
config::settings::try_read(&paths::data_dir()?, |settings| {
let mut env = settings.backend.command_environment.clone();
env.extend(settings.backend.dev.command_environment.clone());
Ok((env, settings.backend.dev.config_path.clone()))
})
.await?;
cmd_env.insert("OPENGB_PORT".into(), port.to_string());
cmd_env.insert("OPENGB_HOSTNAME".into(), "0.0.0.0".to_string());
cmd_env.insert("OPENGB_TERM_COLOR".into(), "never".into());

// TODO: Does not support env
// Build command
let cmd = build_opengb_command_raw(backend::BackendCommandOpts {
command: "dev",
opts: serde_json::json!({
"project": config_path,
"nonInteractive": true
}),
env: cmd_env,
})
.await?;

// Publish commandevent
task_inner.event(task::TaskEvent::SetBackendPort { port });

Ok(CommandOpts {
command: cmd.command.display().to_string(),
args: cmd.args,
envs: cmd.envs.into_iter().collect(),
current_dir: cmd.current_dir.display().to_string(),
})
},
)
.await?;

Ok(Output { exit_code })
Expand Down
29 changes: 20 additions & 9 deletions packages/toolchain/src/tasks/game_server_start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ use serde::{Deserialize, Serialize};

use crate::{
paths,
util::{process_manager::StartOpts, task},
util::{
process_manager::{CommandOpts, StartMode, StartOpts},
task,
},
};

#[derive(Deserialize)]
pub struct Input {
pub start_mode: StartMode,
pub cmd: String,
pub args: Vec<String>,
pub cwd: String,
Expand All @@ -30,14 +34,21 @@ impl task::Task for Task {

async fn run(task: task::TaskCtx, input: Self::Input) -> Result<Self::Output> {
let exit_code = crate::game_server::PROCESS_MANAGER
.start(StartOpts {
task: task.clone(),
command: input.cmd,
args: input.args,
envs: Vec::new(),
current_dir: input.cwd,
base_data_dir: paths::data_dir()?,
})
.start(
StartOpts {
task: task.clone(),
base_data_dir: paths::data_dir()?,
start_mode: input.start_mode,
},
move || async move {
Ok(CommandOpts {
command: input.cmd,
args: input.args,
envs: Vec::new(),
current_dir: input.cwd,
})
},
)
.await?;
Ok(Output { exit_code })
}
Expand Down
3 changes: 1 addition & 2 deletions packages/toolchain/src/tasks/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
pub mod backend_choose_local_port;
pub mod backend_sdk_gen;
pub mod backend_start;
pub mod backend_stop;
Expand All @@ -18,7 +17,6 @@ pub mod unlink;
pub mod wait_for_login;

crate::task_registry!(
backend_choose_local_port::Task,
backend_sdk_gen::Task,
backend_start::Task,
backend_stop::Task,
Expand All @@ -27,6 +25,7 @@ crate::task_registry!(
deploy::Task,
exec_command::Task,
game_server_start::Task,
game_server_stop::Task,
get_bootstrap_data::Task,
get_hub_link::Task,
get_settings_paths::Task,
Expand Down
Loading
Loading