extern crate warp; use super::resolve; use crate::{ config::{Config, IVerge, DEFAULT_PAC}, logging_error, process::AsyncHandler, utils::logging::Type, }; use anyhow::Result; use std::convert::Infallible; use warp::Filter; #[derive(serde::Deserialize, Debug)] struct QueryParam { param: String, } /// The embed server only be used to implement singleton process /// maybe it can be used as pac server later pub fn embed_server() { let port = IVerge::get_singleton_port(); AsyncHandler::spawn(move || async move { let visible = warp::path!("commands" / "visible").map(move || { resolve::create_window(false); "ok" }); let pac = warp::path!("commands" / "pac").map(move || { let content = Config::verge() .latest() .pac_file_content .clone() .unwrap_or(DEFAULT_PAC.to_string()); let port = Config::verge() .latest() .verge_mixed_port .unwrap_or(Config::clash().data().get_mixed_port()); let content = content.replace("%mixed-port%", &format!("{port}")); warp::http::Response::builder() .header("Content-Type", "application/x-ns-proxy-autoconfig") .body(content) .unwrap_or_default() }); async fn scheme_handler(query: QueryParam) -> Result { logging_error!( Type::Setup, true, resolve::resolve_scheme(query.param).await ); Ok("ok") } let scheme = warp::path!("commands" / "scheme") .and(warp::query::()) .and_then(scheme_handler); let commands = visible.or(scheme).or(pac); warp::serve(commands).run(([127, 0, 0, 1], port)).await; }); }