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;