config.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //! Launch helper macros for fullstack apps
  2. #![allow(unused)]
  3. use crate::prelude::*;
  4. use dioxus_lib::prelude::*;
  5. use std::sync::Arc;
  6. /// Settings for a fullstack app.
  7. pub struct Config {
  8. #[cfg(feature = "server")]
  9. pub(crate) server_fn_route: &'static str,
  10. #[cfg(feature = "server")]
  11. pub(crate) server_cfg: ServeConfigBuilder,
  12. #[cfg(feature = "server")]
  13. pub(crate) addr: std::net::SocketAddr,
  14. #[cfg(feature = "web")]
  15. pub(crate) web_cfg: dioxus_web::Config,
  16. #[cfg(feature = "desktop")]
  17. pub(crate) desktop_cfg: dioxus_desktop::Config,
  18. #[cfg(feature = "mobile")]
  19. pub(crate) mobile_cfg: dioxus_mobile::Config,
  20. }
  21. #[allow(clippy::derivable_impls)]
  22. impl Default for Config {
  23. fn default() -> Self {
  24. Self {
  25. #[cfg(feature = "server")]
  26. server_fn_route: "",
  27. #[cfg(feature = "server")]
  28. addr: std::net::SocketAddr::from(([127, 0, 0, 1], 8080)),
  29. #[cfg(feature = "server")]
  30. server_cfg: ServeConfigBuilder::new(),
  31. #[cfg(feature = "web")]
  32. web_cfg: dioxus_web::Config::default(),
  33. #[cfg(feature = "desktop")]
  34. desktop_cfg: dioxus_desktop::Config::default(),
  35. #[cfg(feature = "mobile")]
  36. mobile_cfg: dioxus_mobile::Config::default(),
  37. }
  38. }
  39. }
  40. impl Config {
  41. /// Create a new config for a fullstack app.
  42. pub fn new() -> Self {
  43. Self::default()
  44. }
  45. /// Set the address to serve the app on.
  46. #[cfg(feature = "server")]
  47. #[cfg_attr(docsrs, doc(cfg(feature = "server")))]
  48. pub fn addr(self, addr: impl Into<std::net::SocketAddr>) -> Self {
  49. let addr = addr.into();
  50. Self { addr, ..self }
  51. }
  52. /// Set the route to the server functions.
  53. #[cfg(feature = "server")]
  54. #[cfg_attr(docsrs, doc(cfg(feature = "server")))]
  55. pub fn server_fn_route(self, server_fn_route: &'static str) -> Self {
  56. Self {
  57. server_fn_route,
  58. ..self
  59. }
  60. }
  61. /// Set the incremental renderer config.
  62. #[cfg(feature = "server")]
  63. #[cfg_attr(docsrs, doc(cfg(feature = "server")))]
  64. pub fn incremental(self, cfg: IncrementalRendererConfig) -> Self {
  65. Self {
  66. server_cfg: self.server_cfg.incremental(cfg),
  67. ..self
  68. }
  69. }
  70. /// Set the server config.
  71. #[cfg(feature = "server")]
  72. #[cfg_attr(docsrs, doc(cfg(feature = "server")))]
  73. pub fn server_cfg(self, server_cfg: ServeConfigBuilder) -> Self {
  74. Self { server_cfg, ..self }
  75. }
  76. /// Set the web config.
  77. #[cfg(feature = "web")]
  78. #[cfg_attr(docsrs, doc(cfg(feature = "web")))]
  79. pub fn web_cfg(self, web_cfg: dioxus_web::Config) -> Self {
  80. Self { web_cfg, ..self }
  81. }
  82. /// Set the desktop config.
  83. #[cfg(feature = "desktop")]
  84. #[cfg_attr(docsrs, doc(cfg(feature = "desktop")))]
  85. pub fn desktop_cfg(self, desktop_cfg: dioxus_desktop::Config) -> Self {
  86. Self {
  87. desktop_cfg,
  88. ..self
  89. }
  90. }
  91. /// Set the mobile config.
  92. #[cfg(feature = "mobile")]
  93. #[cfg_attr(docsrs, doc(cfg(feature = "mobile")))]
  94. pub fn mobile_cfg(self, mobile_cfg: dioxus_mobile::Config) -> Self {
  95. Self { mobile_cfg, ..self }
  96. }
  97. #[cfg(feature = "server")]
  98. #[cfg_attr(docsrs, doc(cfg(feature = "server")))]
  99. /// Launch a server application
  100. pub async fn launch_server(
  101. self,
  102. build_virtual_dom: impl Fn() -> VirtualDom + Send + Sync + 'static,
  103. ) {
  104. let addr = self.addr;
  105. println!("Listening on {}", addr);
  106. let cfg = self.server_cfg.build();
  107. let server_fn_route = self.server_fn_route;
  108. #[cfg(feature = "axum")]
  109. {
  110. use crate::axum_adapter::{render_handler, DioxusRouterExt};
  111. use axum::routing::get;
  112. use tower::ServiceBuilder;
  113. let ssr_state = SSRState::new(&cfg);
  114. let router = axum::Router::new().register_server_fns();
  115. #[cfg(not(any(feature = "desktop", feature = "mobile")))]
  116. let router = router
  117. .serve_static_assets(cfg.assets_path.clone())
  118. .connect_hot_reload()
  119. .fallback(get(render_handler).with_state((
  120. cfg,
  121. Arc::new(build_virtual_dom),
  122. ssr_state,
  123. )));
  124. let router = router
  125. .layer(
  126. ServiceBuilder::new()
  127. .layer(tower_http::compression::CompressionLayer::new().gzip(true)),
  128. )
  129. .into_make_service();
  130. let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
  131. axum::serve(listener, router).await.unwrap();
  132. }
  133. }
  134. }