server.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. extern crate warp;
  2. use super::resolve;
  3. use crate::config::IVerge;
  4. use anyhow::{bail, Result};
  5. use port_scanner::local_port_available;
  6. use tauri::AppHandle;
  7. use warp::Filter;
  8. /// check whether there is already exists
  9. pub fn check_singleton() -> Result<()> {
  10. let port = IVerge::get_singleton_port();
  11. if !local_port_available(port) {
  12. tauri::async_runtime::block_on(async {
  13. let url = format!("http://127.0.0.1:{port}/commands/visible");
  14. let resp = reqwest::get(url).await?.text().await?;
  15. if &resp == "ok" {
  16. bail!("app exists");
  17. }
  18. log::error!("failed to setup singleton listen server");
  19. Ok(())
  20. })
  21. } else {
  22. Ok(())
  23. }
  24. }
  25. /// The embed server only be used to implement singleton process
  26. /// maybe it can be used as pac server later
  27. pub fn embed_server(app_handle: AppHandle) {
  28. let port = IVerge::get_singleton_port();
  29. tauri::async_runtime::spawn(async move {
  30. let commands = warp::path!("commands" / "visible").map(move || {
  31. resolve::create_window(&app_handle);
  32. format!("ok")
  33. });
  34. warp::serve(commands).bind(([127, 0, 0, 1], port)).await;
  35. });
  36. }