Skip to main content

soma_codemode/
runner.rs

1pub mod jail;
2pub mod js_args;
3pub mod limits;
4pub mod runtime;
5pub mod steps;
6
7#[cfg(test)]
8mod jail_tests;
9#[cfg(test)]
10mod js_args_tests;
11#[cfg(test)]
12mod limits_tests;
13#[cfg(test)]
14mod runtime_tests;
15#[cfg(test)]
16mod steps_tests;
17
18use std::io::{BufReader, BufWriter};
19
20use crate::protocol::{
21    CodeModeRunnerInput, CodeModeRunnerOutput, CodeModeRunnerResult, CodeModeRunnerState,
22    RUNNER_STATE,
23};
24
25pub fn run_code_mode_runner_stdio_blocking() -> Result<(), String> {
26    #[cfg(all(unix, target_os = "linux"))]
27    {
28        let _ = nix::sys::prctl::set_dumpable(false);
29    }
30    RUNNER_STATE.with(|state| {
31        *state.borrow_mut() = Some(CodeModeRunnerState {
32            reader: BufReader::new(std::io::stdin()),
33            writer: BufWriter::new(std::io::stdout()),
34            next_seq: 0,
35        });
36    });
37    loop {
38        match runtime::run_next() {
39            Ok(runtime::RunnerLoopOutcome::Completed) => {
40                runtime::cleanup_execution_jail(false);
41                runtime::reset_sequence();
42            }
43            Ok(runtime::RunnerLoopOutcome::InputClosed) => {
44                runtime::cleanup_execution_jail(true);
45                return Ok(());
46            }
47            Err(error) => {
48                runtime::emit_error(error);
49                runtime::cleanup_execution_jail(false);
50                runtime::reset_sequence();
51            }
52        }
53    }
54}
55
56pub fn run_code_mode_runner_once(
57    input: CodeModeRunnerInput,
58) -> Result<CodeModeRunnerOutput, String> {
59    runtime::run_start_without_io(input)
60}
61
62pub fn result_from_value(value: Option<serde_json::Value>) -> CodeModeRunnerResult {
63    CodeModeRunnerResult::from_response_result(value)
64}