- 全项目 .rs 统一 cargo fmt 排版(换行/缩进/参数分行/导入排序) - infra/docker: DOCKER_CLIENT 连接失败不 panic,降级返回 None (博客不依赖 Docker,panic=abort 下会导致整个进程崩溃) - infra/mod: 去除多余空行 - database/mod: 模块声明按字母序重新排序
83 lines
2.8 KiB
Rust
83 lines
2.8 KiB
Rust
//! 代码运行接口(Code Runner)。
|
||
//!
|
||
//! 三层架构的最上层 API 模块:
|
||
//! - [`mod@code_runner`] 本文件:双目标(server / wasm)共享的可序列化数据结构。
|
||
//! - `progress`:内存任务缓冲表(DashMap + GC),server-only。
|
||
//! - `languages`:语言注册表与围栏代码块 info 解析,server-only。
|
||
//! - `execute`:Dioxus server function(StartExec / GetExecResult),server-only。
|
||
//!
|
||
//! 为避免 WASM 构建引入 server 依赖,数据结构在模块顶层无 cfg 门禁定义,
|
||
//! 而引用的 `ResourceLimits` 同样位于无门禁的 [`crate::infra::runner_config`]。
|
||
|
||
use chrono::{DateTime, Utc};
|
||
use serde::{Deserialize, Serialize};
|
||
|
||
use crate::infra::runner_config::ResourceLimits;
|
||
|
||
/// 一次代码执行请求。
|
||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||
pub struct ExecRequest {
|
||
/// 语言标识(与 [`crate::api::code_runner::languages::LANGUAGES`] 的 key 对应)。
|
||
pub language: String,
|
||
/// 源代码文本。
|
||
pub source: String,
|
||
/// 作者/读者可覆盖的资源限制;最终仍会被 [`crate::infra::runner_config::clamp_limits`] 钳制。
|
||
pub overrides: Option<ResourceLimits>,
|
||
}
|
||
|
||
/// 执行状态枚举。
|
||
///
|
||
/// 既用于任务当前状态([`ExecTask::status`]),也用于最终结果([`ExecResult::status`])。
|
||
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
|
||
pub enum ExecStatus {
|
||
/// 已入队,等待并发槽位。
|
||
Queued,
|
||
/// 已获得槽位,容器运行中。
|
||
Running,
|
||
/// 正常结束且退出码为 0。
|
||
Success,
|
||
/// 超过 timeout_secs 被强制终止。
|
||
Timeout,
|
||
/// 触发内核 OOM killer。
|
||
OomKilled,
|
||
/// 容器执行出错(非 0 退出码)。
|
||
Error,
|
||
/// 系统层失败(拉起容器异常、排队超时等)。
|
||
Failed,
|
||
/// 触发速率限制。
|
||
RateLimited,
|
||
}
|
||
|
||
/// 一次执行的最终结果。
|
||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||
pub struct ExecResult {
|
||
pub status: ExecStatus,
|
||
pub stdout: String,
|
||
pub stderr: String,
|
||
pub exit_code: Option<i64>,
|
||
pub duration_ms: u64,
|
||
pub language: String,
|
||
}
|
||
|
||
/// 任务条目,供前端轮询查询执行进度。
|
||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||
pub struct ExecTask {
|
||
pub id: String,
|
||
pub status: ExecStatus,
|
||
/// 人类可读的当前阶段描述(如「启动容器」「执行完毕」)。
|
||
pub stage: String,
|
||
pub created_at: DateTime<Utc>,
|
||
/// 终态时填充。
|
||
pub result: Option<ExecResult>,
|
||
}
|
||
|
||
// execute.rs 含 server function,需对双目标可见(不能 cfg-gate);其 server-only
|
||
// 依赖在文件内单独 gate。languages / progress 是纯 server 辅助,整体 gate。
|
||
pub mod execute;
|
||
#[cfg(feature = "server")]
|
||
pub mod languages;
|
||
#[cfg(feature = "server")]
|
||
pub mod progress;
|
||
#[cfg(feature = "server")]
|
||
pub mod sse;
|