1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use std::cell::RefCell; use std::rc::Rc; use futures::{FutureExt, TryFutureExt}; use ya_runtime_api::server::{ AsyncResponse, KillProcess, RunProcess, RunProcessResp, RuntimeService, }; use crate::runtime::RuntimeMode; use crate::{Context, Runtime, RuntimeDef}; pub struct Server<R: Runtime> { pub(crate) runtime: Rc<RefCell<R>>, pub(crate) ctx: Rc<RefCell<Context<R>>>, } impl<R: Runtime> Server<R> { pub fn new(runtime: R, ctx: Context<R>) -> Self { Self { runtime: Rc::new(RefCell::new(runtime)), ctx: Rc::new(RefCell::new(ctx)), } } } impl<R: Runtime> RuntimeService for Server<R> { fn hello(&self, _version: &str) -> AsyncResponse<'_, String> { async { Ok(<R as RuntimeDef>::VERSION.to_owned()) }.boxed_local() } fn run_process(&self, run: RunProcess) -> AsyncResponse<'_, RunProcessResp> { let mut runtime = self.runtime.borrow_mut(); let mut ctx = self.ctx.borrow_mut(); runtime .run_command(run, RuntimeMode::Server, &mut ctx) .then(|result| async move { match result { Ok(pid) => Ok(RunProcessResp { pid }), Err(err) => Err(err.into()), } }) .boxed_local() } fn kill_process(&self, kill: KillProcess) -> AsyncResponse<'_, ()> { let mut runtime = self.runtime.borrow_mut(); let mut ctx = self.ctx.borrow_mut(); runtime .kill_command(kill, &mut ctx) .map_err(Into::into) .boxed_local() } fn shutdown(&self) -> AsyncResponse<'_, ()> { let mut runtime = self.runtime.borrow_mut(); let mut ctx = self.ctx.borrow_mut(); runtime.stop(&mut ctx).map_err(Into::into).boxed_local() } }