v1.0 with SW PWA enabled
This commit is contained in:
1953
node/Cargo.lock
generated
Normal file
1953
node/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
node/Cargo.toml
Normal file
17
node/Cargo.toml
Normal 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
40
node/Dockerfile
Normal 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
0
node/processes.json
Normal file
417
node/src/main.rs
Normal file
417
node/src/main.rs
Normal 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();
|
||||
|
||||
}
|
||||
1
node/target/.rustc_info.json
Normal file
1
node/target/.rustc_info.json
Normal 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
3
node/target/CACHEDIR.TAG
Normal 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/
|
||||
0
node/target/debug/.cargo-lock
Normal file
0
node/target/debug/.cargo-lock
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
6e2a5b74cbd441f1
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
caf5d1e934a7e383
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
ff2fe76f09dbb1ae
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
f3ae17cce5bc9377
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
401ec598e6c0e83b
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
cbe7fd4c0df82f59
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
3cf41463efae9e71
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
5e7bd4f6e4c28a44
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
bd5c8b7a2e792959
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
2f32b38765dc85cd
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
097154575ce9f94f
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
abad9370e73b837e
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
596d247217e4d3af
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
8d92ce6230f55824
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
bf1fcf523d7b9294
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
29968107698c1949
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
559da7314fb75821
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
99449878b241ed33
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
72ebd883ef46ee4f
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
11c384816e71714a
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
7e6fcf836dbe002e
|
||||
@ -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}
|
||||
BIN
node/target/debug/.fingerprint/cc-78e5873ac08c7490/dep-lib-cc
Normal file
BIN
node/target/debug/.fingerprint/cc-78e5873ac08c7490/dep-lib-cc
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
d2c57955eebd3f67
|
||||
@ -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}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
ab45702a5a95d99b
|
||||
@ -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
Reference in New Issue
Block a user