v1.0 with SW PWA enabled

This commit is contained in:
Blomios
2026-01-01 17:40:53 +01:00
parent 1c0e22aac1
commit 3c8bebb2ad
29775 changed files with 2197201 additions and 119080 deletions

1953
node/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

17
node/Cargo.toml Normal file
View File

@ -0,0 +1,17 @@
[package]
name = "node"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.7"
dotenv = "0.15.0"
ipconfig = "0.3.2"
reqwest = { version = "0.11", features = ["blocking","json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
clap = { version = "4", features = ["derive"] }
serde_json = "1"
chrono = { version = "0.4", features = ["serde"] }
tower-http = { version = "0.5", features = ["cors"] }

40
node/Dockerfile Normal file
View File

@ -0,0 +1,40 @@
# ---- Build Stage ----
FROM debian:bookworm AS builder
# Install Rust and build tools
RUN apt-get update && apt-get install -y curl build-essential pkg-config libssl-dev \
&& rm -rf /var/lib/apt/lists/*
# Install rustup (stable toolchain)
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
WORKDIR /app
# Cache Rust dependencies
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release || true
# Copy sources and build the real binary
COPY . .
RUN cargo build --release
# ---- Runtime Stage ----
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y libssl3 procps iputils-ping curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy data file
COPY processes.json /app/processes.json
# Copy compiled binary
COPY --from=builder /app/target/release/node /usr/local/bin/node-service
EXPOSE 8081
EXPOSE 8080
CMD ["node-service"]

0
node/processes.json Normal file
View File

417
node/src/main.rs Normal file
View File

@ -0,0 +1,417 @@
// src/main.rs
use std::{fs, time::Duration};
use serde::{Serialize, Deserialize};
use std::process::Command;
use std::sync::{Arc};
use axum::{routing::post, routing::get, routing::delete, Json, Router, extract::Path, http::Method, http::HeaderValue};
use tokio::task;
use tokio::time::{self, interval};
use tokio::sync::Mutex as AsyncMutex;
use clap::{Parser, Subcommand};
use reqwest;
use chrono::{DateTime, Utc};
use std::env;
use tower_http::cors::{Any, CorsLayer};
const GO_SERVER_URL: &str = "http://192.168.1.75:8082/api";
const NODE_NAME: &str = "MyRustNode-01";
const NODE_PORT: &str = "8081";
#[derive(Deserialize)]
struct DeleteRequest {
service_id: i32,
}
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(Subcommand, Debug)]
enum Commands {
AddProcess {
#[arg(short, long)]
name: String,
#[arg(short, long)]
cmd: String,
},
StartMonitor,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct StatusRecord {
pub timestamp: DateTime<Utc>,
pub status: u8,
}
impl Default for StatusRecord {
fn default() -> Self {
StatusRecord {
timestamp: Utc::now(), // Vec::new() est Vec::default()
status: 0,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
struct ProcessConfig {
#[serde(default)]
id: i32,
name: String,
command: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct FileData {
node_id: i32,
processes: Vec<ProcessConfig>,
}
static PROCESSES_FILE: &str = "processes.json";
async fn list_processes(state: axum::extract::State<AppState>) -> Json<Vec<ProcessConfig>> {
let guard = state.processes.lock().await;
Json(guard.clone())
}
#[derive(Clone)]
struct AppState {
node_id: Arc<AsyncMutex<i32>>,
processes: Arc<AsyncMutex<Vec<ProcessConfig>>>,
}
#[derive(Serialize)]
struct RegistrationRequest {
id: i32,
name: String,
address: String,
}
#[derive(Serialize)]
struct RegistrationServiceRequest {
node_id: i32,
service: ProcessConfig,
}
#[derive(Deserialize)]
struct RegisterResponse {
id: i32,
}
#[derive(Serialize)]
struct ServiceUpdateRequest {
service_id: i32,
service_status: StatusRecord,
}
#[derive(Serialize)]
struct UpdateRequest {
node_id: String,
#[serde(default)]
services: Vec<ServiceUpdateRequest>,
}
async fn add_process(
state: axum::extract::State<AppState>,
Json(payload): Json<ProcessConfig>,
) -> Json<String> {
let mut vec_guard: tokio::sync::MutexGuard<'_, Vec<ProcessConfig>> = state.processes.lock().await;
let id_guard: tokio::sync::MutexGuard<'_, i32> = state.node_id.lock().await;
let mut new_process = payload.clone();
let client = reqwest::Client::new();
let request_payload = RegistrationServiceRequest {
node_id: id_guard.clone(),
service: new_process.clone(),
};
match client
.post(format!("{}/registerService", GO_SERVER_URL))
.json(&request_payload)
.send()
.await
{
Ok(response) => {
if response.status().is_success() {
match response.json::<RegisterResponse>().await {
Ok(data) => {
new_process.id = data.id;
vec_guard.push(new_process.clone());
save_to_disk(&FileData { node_id: data.id, processes: vec_guard.clone() });
return Json(format!("✅ Enregistrement réussi. ID du service attribué : {}", data.id));
}
Err(_) => { return Json(format!("Process error on json received")); },
}
} else {
return Json(format!("⚠️ Échec de l'enregistrement, statut: {}", response.status()));
}
}
Err(e) => {
return Json(format!("❌ Impossible de joindre le serveur Go : {}. Nouvelle tentative dans 5s...", e));
}
}
}
async fn delete_service(
state: axum::extract::State<AppState>,
Json(payload): Json<DeleteRequest>,
) -> impl axum::response::IntoResponse {
let mut guard = state.processes.lock().await;
let id_guard: tokio::sync::MutexGuard<'_, i32> = state.node_id.lock().await;
let service_id = payload.service_id;
let index_to_remove = guard.iter().position(|service| {
// service est de type &Service
service.id == service_id
});
match index_to_remove {
Some(index) => {
// ÉTAPE 2: La suppression
// On n'emprunte 'guard' qu'ici, après que l'itérateur soit terminé.
let removed_service = guard.remove(index);
println!("Service supprimé avec succès: {}", removed_service.name);
save_to_disk(&FileData { node_id: id_guard.clone(), processes: guard.clone() });
return axum::http::StatusCode::NO_CONTENT;
// Retourner removed_service ou un statut de succès
}
None => {
// L'élément n'a pas été trouvé
println!("Erreur: Service ID {} non trouvé.", service_id);
return axum::http::StatusCode::NOT_FOUND;
}
}
}
async fn register_with_server(state: AppState) {
let mut id_guard: tokio::sync::MutexGuard<'_, i32> = state.node_id.lock().await;
let guard = state.processes.lock().await;
let host_ip = env::var("HOST_IP").unwrap_or_else(|_| String::from("0.0.0.0"));
let address_full = format!( "http://{}:{}", host_ip, NODE_PORT );
eprintln!("full ip is {}", address_full);
let client = reqwest::Client::new();
let payload = RegistrationRequest {
id: id_guard.clone(),
name: NODE_NAME.to_string(),
address: address_full,
};
// Tenter la déclaration (réessayer si le serveur n'est pas prêt)
loop {
match client
.post(format!("{}/register", GO_SERVER_URL))
.json(&payload)
.send()
.await
{
Ok(response) => {
if response.status().is_success() {
match response.json::<RegisterResponse>().await {
Ok(data) => {
println!("✅ Enregistrement réussi. ID du node attribué : {}", data.id);
*id_guard = data.id;
save_to_disk(&FileData { node_id: data.id, processes: guard.clone() });
}
Err(_) => eprintln!("⚠️ Réponse réussie mais format JSON invalide"),
}
break;
} else {
eprintln!("⚠️ Échec de l'enregistrement, statut: {}", response.status());
}
}
Err(e) => {
eprintln!("❌ Impossible de joindre le serveur Go : {}. Nouvelle tentative dans 5s...", e);
}
}
time::sleep(Duration::from_secs(5)).await;
}
}
fn save_to_disk(data: &FileData) {
let json = serde_json::to_string_pretty(&data).unwrap();
fs::write(PROCESSES_FILE, json).unwrap();
}
fn initialize_processes_file() {
let path = "processes.json";
if !std::path::Path::new(path).exists() {
println!("No processes.json found, creating an empty one...");
std::fs::write(path, "[]").expect("Failed to create processes.json");
}
else
{
println!("processes.json found");
}
}
fn load_from_disk() -> FileData{
if let Ok(content) = fs::read_to_string(PROCESSES_FILE) {
if let Ok(parsed) = serde_json::from_str::<FileData>(&content) {
return parsed;
}
}
FileData{ node_id: 0, processes: vec![] }
}
fn check_process_running(cmd: &str) -> bool {
let output_result = Command::new("sh").arg("-c").arg(cmd).output();
match output_result {
Ok(output) => {
// S'assurer que le processus a techniquement réussi (exit code 0),
// bien que nous nous concentrions sur le stdout
if !output.status.success() {
let stdout_str = match str::from_utf8(&output.stderr) {
Ok(s) => s, // Supprimer les espaces et retours à la ligne
Err(_) => "",
};
println!("error: {}",stdout_str.to_string());
return false;
}
// 2. Convertir stdout (Vec<u8>) en chaîne de caractères
let stdout_str = match str::from_utf8(&output.stdout) {
Ok(s) => s.trim(), // Supprimer les espaces et retours à la ligne
Err(_) => {
return false;
}
};
println!("result: {}",stdout_str.to_string());
// 3. Analyser la chaîne
if stdout_str == "1" {
return true;
} else if stdout_str == "0" {
return false;
} else {
// La sortie n'est pas celle attendue ("0" ou "1")
return false;
}
}
Err(_) => {
// Erreur système (ex: sh introuvable ou erreur I/O)
return false;
}
}
}
async fn start_monitor(state: AppState) {
let mut interval = interval(Duration::from_mins(1) );
interval.tick().await;
loop {
{
interval.tick().await;
let mut update_request = UpdateRequest{ node_id: NODE_NAME.to_string(), services: Vec::new() };
let mut guard = state.processes.lock().await;
println!("--- Checking processes ---");
for p in guard.iter_mut() {
let running = check_process_running(&p.command);
println!("{} => {}", p.name, if running { "RUNNING" } else { "STOPPED" });
let mut status = StatusRecord{ status: 0, timestamp: Utc::now() };
if running == true {
status.status = 1;
}
update_request.services.push(ServiceUpdateRequest{ service_id: p.id.clone(), service_status: status.clone() });
}
if update_request.services.len() > 0 {
let client = reqwest::Client::new();
let payload = update_request;
match client
.post(format!("{}/updateServiceStatus", GO_SERVER_URL ))
.json(&payload)
.send()
.await
{
Ok(response) => {
if response.status().is_success() {
println!("✅ Update success");
} else {
eprintln!("⚠️ Update failed {}", response.status());
}
}
Err(e) => {
eprintln!("❌ Error : {}", e);
}
}
}
}
}
}
#[tokio::main]
async fn main() {
initialize_processes_file();
let initial = load_from_disk();
println!("initial node_id: {}", initial.node_id);
let mut state = AppState {
node_id: Arc::new(AsyncMutex::new(initial.node_id)),
processes: Arc::new(AsyncMutex::new(initial.processes)),
};
let state_monitor = state.clone();
task::spawn(async move {
start_monitor(state_monitor).await;
});
let state_register = state.clone();
tokio::task::spawn(async move {
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
register_with_server(state_register).await;
});
let cors = CorsLayer::new()
// Autorise ton frontend (ex: http://localhost:3000)
// ou Any pour autoriser tout le monde en développement
.allow_origin(GO_SERVER_URL.parse::<HeaderValue>().unwrap())
.allow_methods([Method::GET, Method::POST, Method::DELETE, Method::OPTIONS])
.allow_headers(Any);
let app = Router::new()
.route("/add", post(add_process))
.route("/list", get(list_processes))
.route("/services", delete(delete_service))
.with_state(state)
.layer(cors);
let listener = tokio::net::TcpListener::bind("0.0.0.0:8081").await.unwrap();
println!("Node service running on port 8081");
axum::serve(listener,app.into_make_service())
.await
.unwrap();
}

View File

@ -0,0 +1 @@
{"rustc_fingerprint":8449941166825244164,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.91.1 (ed61e7d7e 2025-11-07)\nbinary: rustc\ncommit-hash: ed61e7d7e242494fb7057f2657300d9e77bb4fcb\ncommit-date: 2025-11-07\nhost: x86_64-unknown-linux-gnu\nrelease: 1.91.1\nLLVM version: 21.1.2\n","stderr":""},"11857020428658561806":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/anthony/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/anthony/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}

3
node/target/CACHEDIR.TAG Normal file
View File

@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

View File

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
6e2a5b74cbd441f1

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":16899585518569254677,"profile":2241668132362809309,"path":221054313371515997,"deps":[[16663112653657417109,"memchr",false,17980926835023524054]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/aho-corasick-a3e390e90831c20c/dep-lib-aho_corasick","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
caf5d1e934a7e383

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"auto\", \"default\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":3955859983594325544,"path":16034286655242744790,"deps":[[384403243491392785,"colorchoice",false,8579276834385774516],[5652275617566266604,"anstyle_query",false,4316912339472686656],[7483871650937086505,"anstyle",false,12588083267055857663],[7727459912076845739,"is_terminal_polyfill",false,12081721928293145656],[11410867133969439143,"anstyle_parse",false,8616438207247527667],[17716308468579268865,"utf8parse",false,14696060444374715434]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-4ed5b3aeb8552f47/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
ff2fe76f09dbb1ae

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":6165884447290141869,"profile":3955859983594325544,"path":10989873113970679231,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-d068366c97dda582/dep-lib-anstyle","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
f3ae17cce5bc9377

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":3955859983594325544,"path":3596540595443631798,"deps":[[17716308468579268865,"utf8parse",false,14696060444374715434]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-40330a4e93aaa149/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
401ec598e6c0e83b

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":10705714425685373190,"profile":112744067883639982,"path":13181024591629680320,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-query-6bc78d2609fb12de/dep-lib-anstyle_query","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
cbe7fd4c0df82f59

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":5116616278641129243,"profile":2225463790103693989,"path":14100120738872482550,"deps":[[7988640081342112296,"syn",false,10518346154245283481],[9869581871423326951,"quote",false,10930855351152538105],[14285738760999836560,"proc_macro2",false,6288935601904914475]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/async-trait-149a9008cbb5761d/dep-lib-async_trait","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
3cf41463efae9e71

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":5116616278641129243,"profile":2225463790103693989,"path":14100120738872482550,"deps":[[7988640081342112296,"syn",false,2408021444553038449],[9869581871423326951,"quote",false,10930855351152538105],[14285738760999836560,"proc_macro2",false,6288935601904914475]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/async-trait-79ca877b2122ff72/dep-lib-async_trait","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
5e7bd4f6e4c28a44

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":15657897354478470176,"path":2575028810060356877,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/atomic-waker-89c60d269487fc92/dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
bd5c8b7a2e792959

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":2241668132362809309,"path":2575028810060356877,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/atomic-waker-f3167f6290799b7b/dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
2f32b38765dc85cd

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":6962977057026645649,"profile":2225463790103693989,"path":13979199299026014629,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/autocfg-2baaa58c24c54262/dep-lib-autocfg","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
097154575ce9f94f

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"form\", \"http1\", \"json\", \"matched-path\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\"]","declared_features":"[\"__private_docs\", \"default\", \"form\", \"http1\", \"http2\", \"json\", \"macros\", \"matched-path\", \"multipart\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\", \"ws\"]","target":13920321295547257648,"profile":15657897354478470176,"path":12404978346866441323,"deps":[[198136567835728122,"memchr",false,3987552212380423780],[554721338292256162,"hyper_util",false,13411574152438004083],[784494742817713399,"tower_service",false,8134384588404803760],[1906322745568073236,"pin_project_lite",false,12068133803668317189],[2517136641825875337,"sync_wrapper",false,437922437050380649],[2620434475832828286,"http",false,17113847270893463203],[4160778395972110362,"hyper",false,10110268933514685873],[4359148418957042248,"axum_core",false,5267395621911893545],[5695049318159433696,"tower",false,9160986685855871425],[6355489020061627772,"bytes",false,5364193350608274193],[6803352382179706244,"percent_encoding",false,655350544514109287],[7695812897323945497,"itoa",false,9102692687969529304],[7712452662827335977,"tower_layer",false,2198562776253589997],[7720834239451334583,"tokio",false,13687679943241718597],[8606274917505247608,"tracing",false,9547093448620040490],[9678799920983747518,"matchit",false,7307823248198767095],[10229185211513642314,"mime",false,1548310334123736828],[10629569228670356391,"futures_util",false,17469554657464950275],[12832915883349295919,"serde_json",false,17720543834500735880],[13548984313718623784,"serde",false,170894172512012929],[14084095096285906100,"http_body",false,11284024956954277424],[14156967978702956262,"rustversion",false,8020532191525138792],[14814583949208169760,"serde_path_to_error",false,4654335325366716334],[16542808166767769916,"serde_urlencoded",false,1663776208011807762],[16611674984963787466,"async_trait",false,6426627929290958795],[16900715236047033623,"http_body_util",false,276353094598227688]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-5c2c89db8a01cd79/dep-lib-axum","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
abad9370e73b837e

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"form\", \"http1\", \"json\", \"matched-path\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\"]","declared_features":"[\"__private_docs\", \"default\", \"form\", \"http1\", \"http2\", \"json\", \"macros\", \"matched-path\", \"multipart\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\", \"ws\"]","target":13920321295547257648,"profile":2241668132362809309,"path":12404978346866441323,"deps":[[198136567835728122,"memchr",false,2755089752261348750],[554721338292256162,"hyper_util",false,9882500183580492548],[784494742817713399,"tower_service",false,16838462340455092984],[1906322745568073236,"pin_project_lite",false,6249669774534908934],[2517136641825875337,"sync_wrapper",false,8826394665860900325],[2620434475832828286,"http",false,15183386098294978445],[4160778395972110362,"hyper",false,7675215773771879868],[4359148418957042248,"axum_core",false,2619112771480883853],[5695049318159433696,"tower",false,7232771496456055674],[6355489020061627772,"bytes",false,3314858703316807550],[6803352382179706244,"percent_encoding",false,17807329134582723533],[7695812897323945497,"itoa",false,12160068492277661588],[7712452662827335977,"tower_layer",false,15018623416881674184],[7720834239451334583,"tokio",false,17724633880879204557],[8606274917505247608,"tracing",false,14749164708538724138],[9678799920983747518,"matchit",false,1080395176451577984],[10229185211513642314,"mime",false,15956818676832916061],[10629569228670356391,"futures_util",false,823916938778830939],[12832915883349295919,"serde_json",false,10360140265075656339],[13548984313718623784,"serde",false,12994906538476515629],[14084095096285906100,"http_body",false,4063468085349179633],[14156967978702956262,"rustversion",false,8020532191525138792],[14814583949208169760,"serde_path_to_error",false,11925433237429675498],[16542808166767769916,"serde_urlencoded",false,7998258298517444692],[16611674984963787466,"async_trait",false,8187173515788874812],[16900715236047033623,"http_body_util",false,4809759142633859353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-74b0d6a71b8a9b17/dep-lib-axum","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
596d247217e4d3af

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"form\", \"http1\", \"json\", \"matched-path\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\"]","declared_features":"[\"__private_docs\", \"default\", \"form\", \"http1\", \"http2\", \"json\", \"macros\", \"matched-path\", \"multipart\", \"original-uri\", \"query\", \"tokio\", \"tower-log\", \"tracing\", \"ws\"]","target":13920321295547257648,"profile":2241668132362809309,"path":12404978346866441323,"deps":[[198136567835728122,"memchr",false,2755089752261348750],[554721338292256162,"hyper_util",false,9882500183580492548],[784494742817713399,"tower_service",false,16838462340455092984],[1906322745568073236,"pin_project_lite",false,6249669774534908934],[2517136641825875337,"sync_wrapper",false,8826394665860900325],[2620434475832828286,"http",false,15183386098294978445],[4160778395972110362,"hyper",false,7675215773771879868],[4359148418957042248,"axum_core",false,10705754767525617599],[5695049318159433696,"tower",false,14983564438772965036],[6355489020061627772,"bytes",false,3314858703316807550],[6803352382179706244,"percent_encoding",false,17807329134582723533],[7695812897323945497,"itoa",false,12160068492277661588],[7712452662827335977,"tower_layer",false,15018623416881674184],[7720834239451334583,"tokio",false,17724633880879204557],[8606274917505247608,"tracing",false,14749164708538724138],[9678799920983747518,"matchit",false,1080395176451577984],[10229185211513642314,"mime",false,15956818676832916061],[10629569228670356391,"futures_util",false,13045057386678458549],[12832915883349295919,"serde_json",false,10360140265075656339],[13548984313718623784,"serde",false,12994906538476515629],[14084095096285906100,"http_body",false,4063468085349179633],[14156967978702956262,"rustversion",false,8020532191525138792],[14814583949208169760,"serde_path_to_error",false,11925433237429675498],[16542808166767769916,"serde_urlencoded",false,7998258298517444692],[16611674984963787466,"async_trait",false,8187173515788874812],[16900715236047033623,"http_body_util",false,4809759142633859353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-7e40d0279c673abe/dep-lib-axum","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
8d92ce6230f55824

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"tracing\"]","declared_features":"[\"__private_docs\", \"tracing\"]","target":2565713999752801252,"profile":2241668132362809309,"path":1058343128679894001,"deps":[[784494742817713399,"tower_service",false,16838462340455092984],[1906322745568073236,"pin_project_lite",false,6249669774534908934],[2517136641825875337,"sync_wrapper",false,8826394665860900325],[2620434475832828286,"http",false,15183386098294978445],[6355489020061627772,"bytes",false,3314858703316807550],[7712452662827335977,"tower_layer",false,15018623416881674184],[8606274917505247608,"tracing",false,14749164708538724138],[10229185211513642314,"mime",false,15956818676832916061],[10629569228670356391,"futures_util",false,823916938778830939],[14084095096285906100,"http_body",false,4063468085349179633],[14156967978702956262,"rustversion",false,8020532191525138792],[16611674984963787466,"async_trait",false,8187173515788874812],[16900715236047033623,"http_body_util",false,4809759142633859353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-core-5125d4763ca01214/dep-lib-axum_core","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
bf1fcf523d7b9294

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"tracing\"]","declared_features":"[\"__private_docs\", \"tracing\"]","target":2565713999752801252,"profile":2241668132362809309,"path":1058343128679894001,"deps":[[784494742817713399,"tower_service",false,16838462340455092984],[1906322745568073236,"pin_project_lite",false,6249669774534908934],[2517136641825875337,"sync_wrapper",false,8826394665860900325],[2620434475832828286,"http",false,15183386098294978445],[6355489020061627772,"bytes",false,3314858703316807550],[7712452662827335977,"tower_layer",false,15018623416881674184],[8606274917505247608,"tracing",false,14749164708538724138],[10229185211513642314,"mime",false,15956818676832916061],[10629569228670356391,"futures_util",false,13045057386678458549],[14084095096285906100,"http_body",false,4063468085349179633],[14156967978702956262,"rustversion",false,8020532191525138792],[16611674984963787466,"async_trait",false,8187173515788874812],[16900715236047033623,"http_body_util",false,4809759142633859353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-core-5b51df8e8013bddc/dep-lib-axum_core","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
29968107698c1949

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"tracing\"]","declared_features":"[\"__private_docs\", \"tracing\"]","target":2565713999752801252,"profile":15657897354478470176,"path":1058343128679894001,"deps":[[784494742817713399,"tower_service",false,8134384588404803760],[1906322745568073236,"pin_project_lite",false,12068133803668317189],[2517136641825875337,"sync_wrapper",false,437922437050380649],[2620434475832828286,"http",false,17113847270893463203],[6355489020061627772,"bytes",false,5364193350608274193],[7712452662827335977,"tower_layer",false,2198562776253589997],[8606274917505247608,"tracing",false,9547093448620040490],[10229185211513642314,"mime",false,1548310334123736828],[10629569228670356391,"futures_util",false,17469554657464950275],[14084095096285906100,"http_body",false,11284024956954277424],[14156967978702956262,"rustversion",false,8020532191525138792],[16611674984963787466,"async_trait",false,6426627929290958795],[16900715236047033623,"http_body_util",false,276353094598227688]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/axum-core-8324f06f27f2fe00/dep-lib-axum_core","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
559da7314fb75821

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":13060062996227388079,"profile":2241668132362809309,"path":11646749495843425567,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/base64-28c267c1a3480fea/dep-lib-base64","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
99449878b241ed33

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":2241668132362809309,"path":7519094921482578732,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-671ea6a37e4edc94/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
72ebd883ef46ee4f

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"i128\", \"std\"]","target":8344828840634961491,"profile":2241668132362809309,"path":3103124886816143908,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-0e217e6e271d82a4/dep-lib-byteorder","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
11c384816e71714a

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":5585765287293540646,"path":558920955434037341,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bytes-510667a8089da4fe/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
7e6fcf836dbe002e

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":13827760451848848284,"path":558920955434037341,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bytes-72be4f06be751943/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
d2c57955eebd3f67

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"jobserver\", \"parallel\"]","target":11042037588551934598,"profile":4333757155065362140,"path":6936992873170635012,"deps":[[3099554076084276815,"find_msvc_tools",false,7592486956529793930],[8410525223747752176,"shlex",false,13771686747577266252]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cc-78e5873ac08c7490/dep-lib-cc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
ab45702a5a95d99b

View File

@ -0,0 +1 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":2241668132362809309,"path":5867855440960859670,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-8a61fb9a152698a3/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

Some files were not shown because too many files have changed in this diff Show More