Skip to main content

yggdrasil/api/code_runner/
mod.rs

1//! 代码运行接口(Code Runner)。
2//!
3//! 三层架构的最上层 API 模块:
4//! - [`mod@code_runner`] 本文件:双目标(server / wasm)共享的可序列化数据结构。
5//! - `progress`:内存任务缓冲表(DashMap + GC),server-only。
6//! - `languages`:语言注册表与围栏代码块 info 解析,server-only。
7//! - `execute`:Dioxus server function(StartExec / GetExecResult),server-only。
8//!
9//! 为避免 WASM 构建引入 server 依赖,数据结构在模块顶层无 cfg 门禁定义,
10//! 而引用的 `ResourceLimits` 同样位于无门禁的 [`crate::infra::runner_config`]。
11
12use chrono::{DateTime, Utc};
13use serde::{Deserialize, Serialize};
14
15use crate::infra::runner_config::ResourceLimits;
16
17/// 一次代码执行请求。
18#[derive(Clone, Serialize, Deserialize, Debug)]
19pub struct ExecRequest {
20    /// 语言标识(与 [`crate::api::code_runner::languages::LANGUAGES`] 的 key 对应)。
21    pub language: String,
22    /// 源代码文本。
23    pub source: String,
24    /// 作者/读者可覆盖的资源限制;最终仍会被 [`crate::infra::runner_config::clamp_limits`] 钳制。
25    pub overrides: Option<ResourceLimits>,
26}
27
28/// 执行状态枚举。
29///
30/// 既用于任务当前状态([`ExecTask::status`]),也用于最终结果([`ExecResult::status`])。
31#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
32pub enum ExecStatus {
33    /// 已入队,等待并发槽位。
34    Queued,
35    /// 已获得槽位,容器运行中。
36    Running,
37    /// 正常结束且退出码为 0。
38    Success,
39    /// 超过 timeout_secs 被强制终止。
40    Timeout,
41    /// 触发内核 OOM killer。
42    OomKilled,
43    /// 容器执行出错(非 0 退出码)。
44    Error,
45    /// 系统层失败(拉起容器异常、排队超时等)。
46    Failed,
47    /// 触发速率限制。
48    ///
49    /// D8:服务端从不构造此变体(限流在 insert 前直接拒绝,返回 429)。
50    /// 保留供前端 ExecStatus label 反序列化兼容;勿在服务端 match 依赖它。
51    RateLimited,
52}
53
54/// 一次执行的最终结果。
55#[derive(Clone, Serialize, Deserialize, Debug)]
56pub struct ExecResult {
57    pub status: ExecStatus,
58    pub stdout: String,
59    pub stderr: String,
60    pub exit_code: Option<i64>,
61    pub duration_ms: u64,
62    pub language: String,
63}
64
65/// 任务条目,供前端轮询查询执行进度。
66#[derive(Clone, Serialize, Deserialize, Debug)]
67pub struct ExecTask {
68    pub id: String,
69    pub status: ExecStatus,
70    /// 人类可读的当前阶段描述(如「启动容器」「执行完毕」)。
71    pub stage: String,
72    pub created_at: DateTime<Utc>,
73    /// 终态时填充。
74    pub result: Option<ExecResult>,
75}
76
77// execute.rs 含 server function,需对双目标可见(不能 cfg-gate);其 server-only
78// 依赖在文件内单独 gate。languages / progress 是纯 server 辅助,整体 gate。
79pub mod execute;
80#[cfg(feature = "server")]
81pub mod languages;
82#[cfg(feature = "server")]
83pub mod progress;
84#[cfg(feature = "server")]
85pub mod sse;