launch.rs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //! Launch helper macros for fullstack apps
  2. #![allow(unused)]
  3. #[macro_export]
  4. /// Launch a server with a router
  5. macro_rules! launch_router {
  6. (@router_config) => {
  7. dioxus_fullstack::router::FullstackRouterConfig::default()
  8. };
  9. (@router_config $router_cfg:expr) => {
  10. $router_cfg
  11. };
  12. (@$address:expr, $route:ty, $(cfg: $router_cfg:expr,)? {$($rule:ident $(: $cfg:expr)?,)*}) => {
  13. dioxus_fullstack::launch!(
  14. @$address,
  15. dioxus_fullstack::router::RouteWithCfg::<$route>,
  16. (dioxus_fullstack::launch_router!(@router_config $($router_cfg)?)),
  17. {
  18. $($rule $(: $cfg)?,)*
  19. }
  20. )
  21. };
  22. }
  23. #[macro_export]
  24. /// Launch a server
  25. macro_rules! launch {
  26. (@web_cfg $server_cfg:ident $wcfg:expr) => {
  27. #[cfg(feature = "web")]
  28. let web_cfg = $wcfg;
  29. };
  30. (@web_cfg $server_cfg:ident) => {
  31. #[cfg(feature = "web")]
  32. let web_cfg = dioxus_web::Config::new();
  33. };
  34. (@serve_cfg $server_cfg:ident $cfg:expr) => {
  35. #[cfg(feature = "ssr")]
  36. let $server_cfg = $cfg;
  37. };
  38. (@hot_reload $server_cfg:ident) => {
  39. #[cfg(feature = "ssr")]
  40. {
  41. dioxus_fullstack::prelude::hot_reload_init!(dioxus_hot_reload::Config::new().with_rebuild_callback(|| {
  42. std::process::Command::new("cargo")
  43. .args(&["run", "--features", "ssr"])
  44. .spawn()
  45. .unwrap()
  46. .wait()
  47. .unwrap();
  48. std::process::Command::new("cargo")
  49. .args(&["run", "--features", "web"])
  50. .spawn()
  51. .unwrap()
  52. .wait()
  53. .unwrap();
  54. true
  55. }));
  56. }
  57. };
  58. (@hot_reload $server_cfg:ident $hot_reload_cfg:expr) => {
  59. #[cfg(feature = "ssr")]
  60. {
  61. dioxus_fullstack::prelude::hot_reload_init!($hot_reload_cfg);
  62. }
  63. };
  64. (@incremental $server_cfg:ident) => {
  65. #[cfg(feature = "ssr")]
  66. let $server_cfg = $server_cfg.incremental(dioxus_fullstack::prelude::IncrementalRendererConfig::default());
  67. };
  68. (@incremental $server_cfg:ident $cfg:expr) => {
  69. #[cfg(feature = "ssr")]
  70. let $server_cfg = $server_cfg.incremental($cfg);
  71. };
  72. (@props_type) => {
  73. Default::default()
  74. };
  75. (@props_type $props:expr) => {
  76. $props
  77. };
  78. (@ $address:expr, $comp:path, $(( $props:expr ),)? {$($rule:ident $(: $cfg:expr)?,)*}) => {
  79. #[cfg(feature = "web")]
  80. {
  81. #[allow(unused)]
  82. let web_cfg = dioxus_web::Config::new();
  83. $(
  84. dioxus_fullstack::prelude::launch!(@$rule server_cfg $($cfg)?);
  85. )*
  86. dioxus_web::launch_with_props(
  87. $comp,
  88. dioxus_fullstack::prelude::get_root_props_from_document().expect("Failed to get root props from document"),
  89. web_cfg.hydrate(true),
  90. );
  91. }
  92. #[cfg(feature = "ssr")]
  93. {
  94. let server_cfg = dioxus_fullstack::prelude::ServeConfigBuilder::new($comp, dioxus_fullstack::prelude::launch!(@props_type $($props)?));
  95. $(
  96. dioxus_fullstack::prelude::launch!(@$rule server_cfg $($cfg)?);
  97. )*
  98. tokio::runtime::Runtime::new()
  99. .unwrap()
  100. .block_on(async move {
  101. let addr = std::net::SocketAddr::from($address);
  102. dioxus_fullstack::launch::launch_server(addr, server_cfg.build()).await;
  103. });
  104. }
  105. };
  106. }
  107. /// Launch a server with the given configeration
  108. /// This will use the routing intigration of the currently enabled intigration feature
  109. #[cfg(feature = "ssr")]
  110. pub async fn launch_server<P: Clone + serde::Serialize + Send + Sync + 'static>(
  111. addr: std::net::SocketAddr,
  112. cfg: crate::prelude::ServeConfig<P>,
  113. ) {
  114. #[cfg(all(feature = "axum", not(feature = "warp"), not(feature = "salvo")))]
  115. {
  116. use crate::adapters::axum_adapter::DioxusRouterExt;
  117. use tower::ServiceBuilder;
  118. axum::Server::bind(&addr)
  119. .serve(
  120. axum::Router::new()
  121. .serve_dioxus_application("", cfg)
  122. .layer(
  123. ServiceBuilder::new()
  124. .layer(tower_http::compression::CompressionLayer::new().gzip(true)),
  125. )
  126. .into_make_service(),
  127. )
  128. .await
  129. .unwrap();
  130. }
  131. #[cfg(all(feature = "warp", not(feature = "axum"), not(feature = "salvo")))]
  132. {
  133. use warp::Filter;
  134. warp::serve(
  135. crate::prelude::serve_dioxus_application("", cfg)
  136. .with(warp::filters::compression::gzip()),
  137. )
  138. .run(addr)
  139. .await;
  140. }
  141. #[cfg(all(feature = "salvo", not(feature = "axum"), not(feature = "warp")))]
  142. {
  143. use crate::adapters::salvo_adapter::DioxusRouterExt;
  144. use salvo::conn::Listener;
  145. let router = salvo::Router::new().serve_dioxus_application("", cfg).hoop(
  146. salvo::compression::Compression::new()
  147. .enable_gzip(salvo::prelude::CompressionLevel::Default),
  148. );
  149. salvo::Server::new(salvo::conn::tcp::TcpListener::new(addr).bind().await)
  150. .serve(router)
  151. .await;
  152. }
  153. }