From d0a6c59c62a24fbbcd1d34ab61e773a2c666da7f Mon Sep 17 00:00:00 2001 From: Valerio Ageno <51341197+Valerioageno@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:25:00 +0200 Subject: [PATCH] Add response time to SSR GET log (#29) * feat: add response time to SSR GET log * feat: update version to v0.10.1 --- crates/tuono/Cargo.toml | 3 +-- crates/tuono/src/source_builder.rs | 4 ++++ crates/tuono/src/watch.rs | 3 +-- crates/tuono_lib/Cargo.toml | 5 +++-- crates/tuono_lib/src/request.rs | 2 +- crates/tuono_lib/src/response.rs | 18 ++++++++++++++++-- crates/tuono_lib/src/server.rs | 8 ++++++-- crates/tuono_lib_macros/Cargo.toml | 2 +- packages/fs-router-vite-plugin/package.json | 2 +- packages/lazy-fn-vite-plugin/package.json | 2 +- packages/router/package.json | 2 +- packages/tuono/package.json | 2 +- 12 files changed, 37 insertions(+), 16 deletions(-) diff --git a/crates/tuono/Cargo.toml b/crates/tuono/Cargo.toml index 78912526..c6cef5f6 100644 --- a/crates/tuono/Cargo.toml +++ b/crates/tuono/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono" -version = "0.10.0" +version = "0.10.1" edition = "2021" authors = ["V. Ageno "] description = "The react/rust fullstack framework" @@ -31,4 +31,3 @@ regex = "1.10.4" reqwest = {version = "0.12.4", features =["blocking", "json"]} serde_json = "1.0" fs_extra = "1.3.0" - diff --git a/crates/tuono/src/source_builder.rs b/crates/tuono/src/source_builder.rs index b6227564..c7744cc5 100644 --- a/crates/tuono/src/source_builder.rs +++ b/crates/tuono/src/source_builder.rs @@ -4,6 +4,8 @@ use std::io; use std::io::prelude::*; use std::path::Path; +use clap::crate_version; + use crate::app::App; use crate::mode::Mode; use crate::route::AxumInfo; @@ -42,6 +44,7 @@ const MODE: Mode = /*MODE*/; #[tokio::main] async fn main() { + println!("\n ⚡ Tuono v/*VERSION*/"); let router = Router::new() // ROUTE_BUILDER ; @@ -127,6 +130,7 @@ fn generate_axum_source(app: &App, mode: Mode) -> String { "// MODULE_IMPORTS\n", &create_modules_declaration(&app.route_map), ) + .replace("/*VERSION*/", crate_version!()) .replace("/*MODE*/", mode.as_str()); let has_server_handlers = app diff --git a/crates/tuono/src/watch.rs b/crates/tuono/src/watch.rs index a7e9594f..8a1b1dc9 100644 --- a/crates/tuono/src/watch.rs +++ b/crates/tuono/src/watch.rs @@ -44,7 +44,6 @@ fn build_react_ssr_src() -> Job { #[tokio::main] pub async fn watch() -> Result<()> { - println!("Starting development environment..."); watch_react_src().start().await; let run_server = build_rust_src(); @@ -76,7 +75,7 @@ pub async fn watch() -> Result<()> { } if should_reload_rust_server { - println!("Reloading..."); + println!(" Reloading..."); run_server.stop(); bundle_axum_source(Mode::Dev).expect("Failed to bunlde rust source"); run_server.start(); diff --git a/crates/tuono_lib/Cargo.toml b/crates/tuono_lib/Cargo.toml index 9b4b53a5..cff06cb3 100644 --- a/crates/tuono_lib/Cargo.toml +++ b/crates/tuono_lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono_lib" -version = "0.10.0" +version = "0.10.1" edition = "2021" authors = ["V. Ageno "] description = "The react/rust fullstack framework" @@ -31,8 +31,9 @@ once_cell = "1.19.0" regex = "1.10.5" either = "1.13.0" tower-http = {version = "0.5.2", features = ["fs"]} +colored = "2.1.0" -tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.10.0"} +tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.10.1"} # Match the same version used by axum tokio-tungstenite = "0.21.0" futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } diff --git a/crates/tuono_lib/src/request.rs b/crates/tuono_lib/src/request.rs index 1a36c46f..e915bb72 100644 --- a/crates/tuono_lib/src/request.rs +++ b/crates/tuono_lib/src/request.rs @@ -34,7 +34,7 @@ impl From for Location { #[derive(Debug, Clone)] pub struct Request { - uri: Uri, + pub uri: Uri, pub headers: HeaderMap, pub params: HashMap, } diff --git a/crates/tuono_lib/src/response.rs b/crates/tuono_lib/src/response.rs index 5e43c1ac..054e6e25 100644 --- a/crates/tuono_lib/src/response.rs +++ b/crates/tuono_lib/src/response.rs @@ -3,7 +3,9 @@ use crate::{ssr::Js, Payload}; use axum::http::{HeaderMap, StatusCode}; use axum::response::{Html, IntoResponse, Redirect}; use axum::Json; +use colored::*; use erased_serde::Serialize; +use tokio::time::Instant; pub struct Props { data: Box, @@ -72,13 +74,25 @@ impl Response { pub fn render_to_string(&self, req: Request) -> impl IntoResponse { match self { Self::Props(Props { data, http_code }) => { + let start = Instant::now(); let payload = Payload::new(&req, data).client_payload().unwrap(); - match Js::render_to_string(Some(&payload)) { + let response = match Js::render_to_string(Some(&payload)) { Ok(html) => (*http_code, Html(html)), Err(_) => (*http_code, Html("500 Internal server error".to_string())), } - .into_response() + .into_response(); + + let duration = start.elapsed(); + + println!( + " GET {} {} in {}ms", + req.uri.path(), + http_code.as_str().green(), + duration.as_millis() + ); + + response } Self::Redirect(to) => Redirect::permanent(to).into_response(), Self::Custom(response) => response.clone().into_response(), diff --git a/crates/tuono_lib/src/server.rs b/crates/tuono_lib/src/server.rs index f3e00632..052becdf 100644 --- a/crates/tuono_lib/src/server.rs +++ b/crates/tuono_lib/src/server.rs @@ -2,6 +2,7 @@ use crate::mode::{Mode, GLOBAL_MODE}; use crate::manifest::load_manifest; use axum::routing::{get, Router}; +use colored::Colorize; use ssr_rs::Ssr; use tower_http::services::ServeDir; @@ -37,7 +38,7 @@ impl Server { let fetch = reqwest::Client::new(); if self.mode == Mode::Dev { - println!("\nDevelopment app ready at http://localhost:3000/"); + println!(" Ready at: {}\n", "http://localhost:3000".blue().bold()); let router = self .router .to_owned() @@ -50,7 +51,10 @@ impl Server { .await .expect("Failed to serve development server"); } else { - println!("\nProduction app ready at http://localhost:3000/"); + println!( + " Production server at: {}\n", + "http://localhost:3000".blue().bold() + ); let router = self .router .to_owned() diff --git a/crates/tuono_lib_macros/Cargo.toml b/crates/tuono_lib_macros/Cargo.toml index 1e3395a8..2c263b3c 100644 --- a/crates/tuono_lib_macros/Cargo.toml +++ b/crates/tuono_lib_macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono_lib_macros" -version = "0.10.0" +version = "0.10.1" edition = "2021" description = "The react/rust fullstack framework" keywords = [ "react", "typescript", "fullstack", "web", "ssr"] diff --git a/packages/fs-router-vite-plugin/package.json b/packages/fs-router-vite-plugin/package.json index 4829d34f..4b9f5d79 100644 --- a/packages/fs-router-vite-plugin/package.json +++ b/packages/fs-router-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "tuono-fs-router-vite-plugin", - "version": "0.10.0", + "version": "0.10.1", "description": "Plugin for the tuono's file system router. Tuono is the react/rust fullstack framework", "scripts": { "dev": "vite build --watch", diff --git a/packages/lazy-fn-vite-plugin/package.json b/packages/lazy-fn-vite-plugin/package.json index 33feca51..4c97410f 100644 --- a/packages/lazy-fn-vite-plugin/package.json +++ b/packages/lazy-fn-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "tuono-lazy-fn-vite-plugin", - "version": "0.10.0", + "version": "0.10.1", "description": "Plugin for the tuono's lazy fn. Tuono is the react/rust fullstack framework", "scripts": { "dev": "vite build --watch", diff --git a/packages/router/package.json b/packages/router/package.json index 2d3413da..8a739245 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "tuono-router", - "version": "0.10.0", + "version": "0.10.1", "description": "React routing component for the framework tuono. Tuono is the react/rust fullstack framework", "scripts": { "dev": "vite build --watch", diff --git a/packages/tuono/package.json b/packages/tuono/package.json index 84165399..a2ca176e 100644 --- a/packages/tuono/package.json +++ b/packages/tuono/package.json @@ -1,6 +1,6 @@ { "name": "tuono", - "version": "0.10.0", + "version": "0.10.1", "description": "The react/rust fullstack framework", "scripts": { "dev": "vite build --watch",