This commit is contained in:
949036910@qq.com
2026-05-29 00:42:56 +08:00
parent b50a463296
commit 4a9b65abe5
2 changed files with 37 additions and 8 deletions

View File

@@ -35,6 +35,14 @@ pub struct AppConfig {
fn is_dev() -> bool { fn is_dev() -> bool {
cfg!(debug_assertions) cfg!(debug_assertions)
} }
/// 开发态下注入的运行时环境变量(不走 desktop_configs 表)。
fn apply_node_runtime_env(env: &mut HashMap<String, String>) {
if is_dev() {
// 一键仿写等 Puppeteer 流程:开发时显示浏览器窗口,便于调试扫码/页面跳转。
env.insert("AICLIENT_PUPPETEER_HEADLESS".into(), "0".into());
}
}
pub fn api_base() -> String { pub fn api_base() -> String {
std::env::var("AICLIENT_API_BASE").unwrap_or_else(|_| { std::env::var("AICLIENT_API_BASE").unwrap_or_else(|_| {
if is_dev() { if is_dev() {
@@ -208,10 +216,12 @@ impl AppConfig {
pub async fn env_for_node(&self) -> HashMap<String, String> { pub async fn env_for_node(&self) -> HashMap<String, String> {
let g = self.inner.read().await; let g = self.inner.read().await;
let merged = merged_entries(&g.server_entries, &g.local_entries); let merged = merged_entries(&g.server_entries, &g.local_entries);
merged let mut env: HashMap<String, String> = merged
.iter() .iter()
.map(|(name, value)| (node_env_var_name(name), value.clone())) .map(|(name, value)| (node_env_var_name(name), value.clone()))
.collect() .collect();
apply_node_runtime_env(&mut env);
env
} }
pub async fn refresh_after_auth(&self, token: &str) -> Result<(), AppConfigError> { pub async fn refresh_after_auth(&self, token: &str) -> Result<(), AppConfigError> {

View File

@@ -511,8 +511,14 @@ async fn run_script_bundle(
let (status, cancelled, result_line, stdout_done) = tokio::select! { let (status, cancelled, result_line, stdout_done) = tokio::select! {
result = &mut stdout_task => { result = &mut stdout_task => {
let result_line = result.unwrap_or(None); let result_line = result.unwrap_or(None);
let _ = child.start_kill(); // 已收到结果时优先给脚本清理资源(如关闭浏览器)机会,超时再强制结束。
let status = child.wait().await?; let status = match timeout(Duration::from_secs(5), child.wait()).await {
Ok(status) => status?,
Err(_) => {
let _ = child.start_kill();
child.wait().await?
}
};
(status, false, result_line, true) (status, false, result_line, true)
} }
status = child.wait() => (status?, false, None, false), status = child.wait() => (status?, false, None, false),
@@ -552,16 +558,29 @@ async fn run_script_bundle(
return Err(NodeError::Cancelled); return Err(NodeError::Cancelled);
} }
if let Some(result_str) = result_line {
if !status.success() {
log::warn!(
target: "nodejs",
"node exited non-zero after __RESULT__: status={:?}, stderr_tail={}",
status.code(),
stderr_tail
);
}
let v: Value = serde_json::from_str(&result_str)?;
return Ok(v);
}
if !status.success() { if !status.success() {
return Err(NodeError::NonZero { return Err(NodeError::NonZero {
status: status.code(), status: status.code(),
stderr: stderr_tail, stderr: stderr_tail,
}); });
} }
// let result_str = result_line.ok_or(NodeError::NoResult)?;
let result_str = result_line.ok_or(NodeError::NoResult)?; // let v: Value = serde_json::from_str(&result_str)?;
let v: Value = serde_json::from_str(&result_str)?; // Ok(v)
Ok(v) Err(NodeError::NoResult)
} }
async fn wait_for_cancel(cancel_rx: &mut watch::Receiver<bool>) { async fn wait_for_cancel(cancel_rx: &mut watch::Receiver<bool>) {