mirror of
https://github.com/MeiK2333/river.git
synced 2025-09-26 22:49:11 +08:00
70 lines
1.6 KiB
Rust
70 lines
1.6 KiB
Rust
#![recursion_limit = "256"]
|
|
#[macro_use]
|
|
extern crate log;
|
|
|
|
use env_logger::Env;
|
|
use futures_core::Stream;
|
|
use river::river_server::{River, RiverServer};
|
|
use river::{JudgeRequest, JudgeResponse};
|
|
use std::pin::Pin;
|
|
use tonic::transport::Server;
|
|
use tonic::{Request, Response, Status};
|
|
|
|
mod config;
|
|
mod error;
|
|
|
|
mod cgroup;
|
|
mod exec_args;
|
|
mod process;
|
|
mod seccomp;
|
|
|
|
pub mod river {
|
|
tonic::include_proto!("river");
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct RiverService {}
|
|
|
|
#[tonic::async_trait]
|
|
impl River for RiverService {
|
|
type JudgeStream =
|
|
Pin<Box<dyn Stream<Item = Result<JudgeResponse, Status>> + Send + Sync + 'static>>;
|
|
|
|
async fn judge(
|
|
&self,
|
|
request: Request<tonic::Streaming<JudgeRequest>>,
|
|
) -> Result<Response<Self::JudgeStream>, Status> {
|
|
let mut _stream = request.into_inner();
|
|
|
|
let output = async_stream::try_stream! {
|
|
yield JudgeResponse {
|
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
|
};
|
|
};
|
|
|
|
Ok(Response::new(Box::pin(output) as Self::JudgeStream))
|
|
}
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let env = Env::default()
|
|
.filter_or("LOG_LEVEL", "debug,h2=info,hyper=info")
|
|
.write_style_or("LOG_STYLE", "always");
|
|
|
|
env_logger::init_from_env(env);
|
|
|
|
let addr = "0.0.0.0:4003".parse()?;
|
|
let river = RiverService::default();
|
|
|
|
info!("listen on: {}", addr);
|
|
|
|
Server::builder()
|
|
.concurrency_limit_per_connection(5)
|
|
.add_service(RiverServer::new(river))
|
|
.serve(addr)
|
|
.await?;
|
|
|
|
Ok(())
|
|
}
|