server: fix all compile errors — main.rs static paths, CORS !Clone, ws handler API, route vs service, Debug derives, unused imports
This commit is contained in:
parent
b2f4f7ffa6
commit
fb5027b667
2297
server/Cargo.lock
generated
Normal file
2297
server/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -7,11 +7,11 @@ use actix_web::web;
|
||||
pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(
|
||||
web::scope("/api")
|
||||
.service(health::health)
|
||||
.service(sessions::list_sessions)
|
||||
.service(sessions::create_session)
|
||||
.service(sessions::get_session)
|
||||
.service(sessions::delete_session)
|
||||
.service(sessions::send_hud_command),
|
||||
.route("/health", web::get().to(health::health))
|
||||
.route("/sessions", web::get().to(sessions::list_sessions))
|
||||
.route("/sessions", web::post().to(sessions::create_session))
|
||||
.route("/sessions/{id}", web::get().to(sessions::get_session))
|
||||
.route("/sessions/{id}", web::delete().to(sessions::delete_session))
|
||||
.route("/sessions/{id}/hud", web::post().to(sessions::send_hud_command)),
|
||||
);
|
||||
}
|
||||
|
||||
@ -5,8 +5,6 @@ mod state;
|
||||
mod stream;
|
||||
mod ws;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use actix_cors::Cors;
|
||||
use actix_web::{web, App, HttpServer, middleware};
|
||||
use log::info;
|
||||
@ -22,7 +20,7 @@ async fn main() -> std::io::Result<()> {
|
||||
let config = Config::from_env();
|
||||
let bind_addr = config.bind_addr();
|
||||
|
||||
info!("🦋 Butterfly Server v{}", env!("CARGO_PKG_VERSION"));
|
||||
info!("Butterfly Server v{}", env!("CARGO_PKG_VERSION"));
|
||||
info!(" config: {:?}", &config);
|
||||
|
||||
let app_state = AppState::new(
|
||||
@ -31,19 +29,7 @@ async fn main() -> std::io::Result<()> {
|
||||
config.frame_buffer_size,
|
||||
);
|
||||
|
||||
// Build CORS middleware.
|
||||
let cors = if config.cors_origins.iter().any(|o| o == "*") {
|
||||
Cors::permissive()
|
||||
} else {
|
||||
let mut cors = Cors::default();
|
||||
for origin in &config.cors_origins {
|
||||
cors = cors.allowed_origin(origin);
|
||||
}
|
||||
cors
|
||||
};
|
||||
|
||||
// Path to the Angular frontend build output (relative to server/).
|
||||
// Falls back to "static" if the Angular dist dir doesn't exist yet.
|
||||
let frontend_dir = std::path::Path::new("../desktop/dist/browser");
|
||||
let static_dir = if frontend_dir.exists() {
|
||||
frontend_dir.to_path_buf()
|
||||
@ -53,9 +39,23 @@ async fn main() -> std::io::Result<()> {
|
||||
|
||||
info!(" serving static files from: {:?}", static_dir);
|
||||
|
||||
// Store CORS origins for recreation inside HttpServer::new (Cors is !Clone).
|
||||
let cors_origins = config.cors_origins.clone();
|
||||
|
||||
HttpServer::new(move || {
|
||||
// Recreate CORS per worker since it is !Clone.
|
||||
let cors = if cors_origins.iter().any(|o| o == "*") {
|
||||
Cors::permissive()
|
||||
} else {
|
||||
let mut c = Cors::default();
|
||||
for origin in &cors_origins {
|
||||
c = c.allowed_origin(origin);
|
||||
}
|
||||
c
|
||||
};
|
||||
|
||||
let json_cfg = web::JsonConfig::default()
|
||||
.limit(1024 * 1024) // 1 MB max JSON payload
|
||||
.limit(1024 * 1024)
|
||||
.error_handler(|err, _req| {
|
||||
let resp = actix_web::HttpResponse::BadRequest().json(
|
||||
models::ApiResponse::<()>::err(format!("invalid JSON: {}", err)),
|
||||
@ -63,29 +63,29 @@ async fn main() -> std::io::Result<()> {
|
||||
actix_web::error::InternalError::from_response(err, resp).into()
|
||||
});
|
||||
|
||||
let static_dir = static_dir.clone();
|
||||
|
||||
App::new()
|
||||
.app_data(web::Data::new(app_state.clone()))
|
||||
.app_data(json_cfg)
|
||||
.wrap(cors.clone())
|
||||
.wrap(cors)
|
||||
.wrap(middleware::Logger::default())
|
||||
.wrap(middleware::Compress::default())
|
||||
.configure(api::configure)
|
||||
.configure(ws::configure)
|
||||
// Serve Angular static assets; falls back to index.html for SPA routing.
|
||||
.service(actix_files::Files::new("/assets", &static_dir.join("assets")).show_files_listing())
|
||||
.route("/", web::get().to(|| async {
|
||||
actix_web::HttpResponse::Ok()
|
||||
.content_type("text/html; charset=utf-8")
|
||||
.body(include_str!("../../static/index.html"))
|
||||
}))
|
||||
.default_service(web::route().to(|| async {
|
||||
actix_web::HttpResponse::Ok()
|
||||
.content_type("text/html; charset=utf-8")
|
||||
.body(include_str!("../../static/index.html"))
|
||||
}))
|
||||
.service(actix_files::Files::new("/assets", static_dir.join("assets")).show_files_listing())
|
||||
.route("/", web::get().to(spa_index))
|
||||
.default_service(web::route().to(spa_index))
|
||||
})
|
||||
.bind(&bind_addr)?
|
||||
.workers(4)
|
||||
.run()
|
||||
.await
|
||||
}
|
||||
|
||||
/// SPA fallback — serves static/index.html for any unmatched GET route.
|
||||
async fn spa_index() -> actix_web::HttpResponse {
|
||||
actix_web::HttpResponse::Ok()
|
||||
.content_type("text/html; charset=utf-8")
|
||||
.body(include_str!("../static/index.html"))
|
||||
}
|
||||
|
||||
@ -28,6 +28,7 @@ pub struct AppState {
|
||||
/// Simple circular buffer that keeps the *N* most recent display frames.
|
||||
/// Viewers that connect mid-stream can pull the latest frame immediately
|
||||
/// instead of waiting for the next one from the agent.
|
||||
#[derive(Debug)]
|
||||
pub struct FrameBuffer {
|
||||
frames: parking_lot::Mutex<Vec<String>>,
|
||||
capacity: usize,
|
||||
@ -143,7 +144,7 @@ impl AppState {
|
||||
|
||||
/// Return counts for health-check.
|
||||
pub fn stats(&self) -> (usize, usize) {
|
||||
let active: usize = self
|
||||
let _active: usize = self
|
||||
.sessions
|
||||
.iter()
|
||||
.filter(|r| r.status == SessionStatus::Active)
|
||||
|
||||
@ -2,8 +2,6 @@ use std::sync::atomic::{AtomicU64, Ordering};
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
|
||||
use log::debug;
|
||||
|
||||
/// Tracks streaming statistics for a single session.
|
||||
#[derive(Debug)]
|
||||
pub struct StreamStats {
|
||||
@ -38,7 +36,6 @@ impl StreamStats {
|
||||
self.display_frames.fetch_add(1, Ordering::Relaxed);
|
||||
self.bytes_relayed.fetch_add(byte_len as u64, Ordering::Relaxed);
|
||||
*self.last_frame_at.lock() = Some(Instant::now());
|
||||
self.update_fps();
|
||||
}
|
||||
|
||||
/// Record that an audio chunk was received.
|
||||
@ -47,12 +44,6 @@ impl StreamStats {
|
||||
self.bytes_relayed.fetch_add(byte_len as u64, Ordering::Relaxed);
|
||||
}
|
||||
|
||||
/// Simple rolling FPS estimate based on the last 1 second of frames.
|
||||
fn update_fps(&self) {
|
||||
// We just store a simple count; a real implementation would use a
|
||||
// circular buffer of timestamps. This is sufficient for monitoring.
|
||||
}
|
||||
|
||||
/// Snapshot of current stats for API responses.
|
||||
pub fn snapshot(&self) -> StreamStatsSnapshot {
|
||||
StreamStatsSnapshot {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
use std::sync::Arc;
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use actix_ws::{Message, SessionExt};
|
||||
use actix_ws::{Message, Session};
|
||||
use futures::StreamExt;
|
||||
use log::{info, warn};
|
||||
|
||||
@ -9,9 +9,8 @@ use crate::models::{ClientType, WsMessage};
|
||||
|
||||
/// ACTIX-WEB HTTP HANDLER
|
||||
///
|
||||
/// Upgrades the HTTP connection to a WebSocket and spawns two async tasks:
|
||||
/// • **reader** – reads frames from the client and dispatches them.
|
||||
/// • **writer** – pulls messages from a broadcast channel and sends them.
|
||||
/// Upgrades the HTTP connection to a WebSocket and spawns an async task
|
||||
/// that reads frames from the client and dispatches them.
|
||||
///
|
||||
/// The query parameter `client_type` must be `"viewer"` or `"agent"`.
|
||||
pub async fn ws_index(
|
||||
@ -30,13 +29,11 @@ pub async fn ws_index(
|
||||
}
|
||||
|
||||
// Determine client type from query string.
|
||||
let client_type = req
|
||||
.query_param::<String>("client_type")
|
||||
.unwrap_or_else(|_| "viewer".to_string());
|
||||
|
||||
let client_type = match client_type.as_str() {
|
||||
"agent" => ClientType::Agent,
|
||||
_ => ClientType::Viewer,
|
||||
let query_str = req.query_string();
|
||||
let client_type = if query_str.contains("client_type=agent") {
|
||||
ClientType::Agent
|
||||
} else {
|
||||
ClientType::Viewer
|
||||
};
|
||||
|
||||
let ip = req
|
||||
@ -73,7 +70,7 @@ pub async fn ws_index(
|
||||
state.register_agent(agent);
|
||||
}
|
||||
|
||||
// Clone references for the spawned tasks.
|
||||
// Clone references for the spawned task.
|
||||
let state_clone = state.clone();
|
||||
let session_id_clone = session_id.clone();
|
||||
let client_type_clone = client_type.clone();
|
||||
@ -98,7 +95,7 @@ pub async fn ws_index(
|
||||
}
|
||||
Message::Ping(bytes) => {
|
||||
last_heartbeat = Instant::now();
|
||||
let _ = session.pong(&bytes).await;
|
||||
let _ = session.pong(bytes).await;
|
||||
}
|
||||
Message::Close(reason) => {
|
||||
info!(
|
||||
@ -141,7 +138,7 @@ async fn handle_text_message(
|
||||
session_id: &str,
|
||||
client_type: &ClientType,
|
||||
state: &Arc<crate::state::AppState>,
|
||||
ws_session: &mut actix_ws::Session,
|
||||
ws_session: &mut Session,
|
||||
) {
|
||||
let msg: WsMessage = match serde_json::from_str(raw) {
|
||||
Ok(m) => m,
|
||||
@ -159,7 +156,6 @@ async fn handle_text_message(
|
||||
match msg {
|
||||
// ── From Agent ────────────────────────────────────────────────────
|
||||
WsMessage::DisplayFrame { data, .. } if *client_type == ClientType::Agent => {
|
||||
// Store in frame buffer for late-joiners, then broadcast.
|
||||
state.push_frame(session_id, data.clone());
|
||||
broadcast_to_viewers(state, session_id, &WsMessage::FrameBroadcast {
|
||||
data,
|
||||
@ -176,7 +172,6 @@ async fn handle_text_message(
|
||||
|
||||
WsMessage::AgentInfo { agent_id, resolution, .. } if *client_type == ClientType::Agent => {
|
||||
state.activate_session(session_id, resolution.as_deref());
|
||||
// Broadcast session update to all viewers.
|
||||
if let Some(session) = state.get_session(session_id) {
|
||||
broadcast_to_viewers(state, session_id, &WsMessage::SessionUpdate {
|
||||
session_id: session_id.to_string(),
|
||||
@ -191,12 +186,11 @@ async fn handle_text_message(
|
||||
}
|
||||
|
||||
WsMessage::Heartbeat if *client_type == ClientType::Agent => {
|
||||
// Just a keepalive; nothing to do.
|
||||
// Keepalive — nothing to do.
|
||||
}
|
||||
|
||||
// ── From Viewer ───────────────────────────────────────────────────
|
||||
WsMessage::HudCommand { command, params, .. } if *client_type == ClientType::Viewer => {
|
||||
// Forward to the agent for this session.
|
||||
forward_to_agent(state, session_id, &WsMessage::ForwardHudCommand { command, params }).await;
|
||||
}
|
||||
|
||||
@ -213,18 +207,24 @@ async fn handle_text_message(
|
||||
|
||||
/// Broadcast a message to all **viewer** WebSocket connections for a session.
|
||||
///
|
||||
/// In the current implementation we use the frame buffer for display and
|
||||
/// the broadcast is logged. Once the viewer registry is wired up with per-WS
|
||||
/// senders, this will fan out to every connected viewer.
|
||||
async fn broadcast_to_viewers(state: &Arc<crate::state::AppState>, session_id: &str, msg: &WsMessage) {
|
||||
// TODO: maintain a registry of per-viewer actix_ws::Session senders in AppState.
|
||||
// For now we log and rely on the frame buffer for new viewers.
|
||||
/// TODO: maintain a registry of per-viewer Session senders in AppState.
|
||||
/// For now we log and rely on the frame buffer for new viewers.
|
||||
async fn broadcast_to_viewers(
|
||||
_state: &Arc<crate::state::AppState>,
|
||||
session_id: &str,
|
||||
msg: &WsMessage,
|
||||
) {
|
||||
log::debug!("[ws] broadcast to viewers of session {}: {:?}", session_id, msg.msg_type_debug());
|
||||
}
|
||||
|
||||
/// Forward a message to the agent connected to a session.
|
||||
async fn forward_to_agent(state: &Arc<crate::state::AppState>, session_id: &str, msg: &WsMessage) {
|
||||
// TODO: maintain per-agent mpsc channel in AppState. For now just log.
|
||||
///
|
||||
/// TODO: maintain per-agent mpsc channel in AppState.
|
||||
async fn forward_to_agent(
|
||||
_state: &Arc<crate::state::AppState>,
|
||||
session_id: &str,
|
||||
msg: &WsMessage,
|
||||
) {
|
||||
log::info!(
|
||||
"[ws] forward to agent in session {}: {:?}",
|
||||
session_id,
|
||||
@ -235,7 +235,6 @@ async fn forward_to_agent(state: &Arc<crate::state::AppState>, session_id: &str,
|
||||
/// Clean up when a client disconnects.
|
||||
fn cleanup(state: &Arc<crate::state::AppState>, session_id: &str, client_type: &ClientType) {
|
||||
if *client_type == ClientType::Agent {
|
||||
// Find and unregister the first agent for this session.
|
||||
let agent_id = state
|
||||
.agents
|
||||
.iter()
|
||||
|
||||
1
server/target/.rustc_info.json
Normal file
1
server/target/.rustc_info.json
Normal file
@ -0,0 +1 @@
|
||||
{"rustc_fingerprint":5640951906056883168,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/z/.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":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8\n","stderr":""}},"successes":{}}
|
||||
3
server/target/CACHEDIR.TAG
Normal file
3
server/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
server/target/debug/.cargo-lock
Normal file
0
server/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 @@
|
||||
f2bd9f90f6ac3776
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[]","target":17825769038046261360,"profile":2241668132362809309,"path":2111144489340652808,"deps":[[270634688040536827,"futures_sink",false,10518964324922000320],[302948626015856208,"futures_core",false,13411290377882743454],[1363051979936526615,"memchr",false,9034228811413583865],[2251399859588827949,"pin_project_lite",false,15566550207223256564],[3163899731817361221,"tokio_util",false,16827006354653726028],[3870702314125662939,"bytes",false,16948387749507789063],[14757622794040968908,"tracing",false,4994296470301651821],[16909888598953886583,"bitflags",false,351452341284058446],[17541620359049798014,"tokio",false,1041505307722513993]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-codec-9be49efe4be5f405/dep-lib-actix_codec","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
7e19a34eee83c113
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"draft-private-network-access\"]","target":11156619329086439986,"profile":10084214257639516596,"path":13042083808787496766,"deps":[[595566797399950287,"derive_more",false,15974423763050899474],[3666196340704888985,"smallvec",false,5778069751535923719],[5384016313853579615,"actix_utils",false,8099528041380835822],[5855319743879205494,"once_cell",false,11127587921477898461],[5898568623609459682,"futures_util",false,9030658141603746226],[10630857666389190470,"log",false,3024114030112994732],[13944207109742299874,"actix_web",false,7714336643103689080]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-cors-4ab34fad240ef626/dep-lib-actix_cors","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
010601ee56132adb
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"actix-server\", \"experimental-io-uring\", \"tokio-uring\"]","target":13418831855529891677,"profile":3133228388854823247,"path":8853473111459237316,"deps":[[302948626015856208,"futures_core",false,13411290377882743454],[595566797399950287,"derive_more",false,15974423763050899474],[2251399859588827949,"pin_project_lite",false,15566550207223256564],[3064692270587553479,"actix_service",false,6288656540412859622],[3870702314125662939,"bytes",false,16948387749507789063],[3936459032874673992,"actix_http",false,6440892538286187312],[5384016313853579615,"actix_utils",false,8099528041380835822],[6803352382179706244,"percent_encoding",false,12394381217160922707],[8866577183823226611,"http_range",false,1756894597300055029],[10229185211513642314,"mime",false,9501964963348565344],[10630857666389190470,"log",false,3024114030112994732],[13944207109742299874,"actix_web",false,7714336643103689080],[14335890238902064286,"v_htmlescape",false,6171600771910162109],[16909888598953886583,"bitflags",false,351452341284058446],[18071510856783138481,"mime_guess",false,18308173854331111245]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-files-6cb6fd7a505e8e12/dep-lib-actix_files","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
30230365a3a56259
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"__compress\", \"compress-brotli\", \"compress-gzip\", \"compress-zstd\", \"default\", \"http2\", \"ws\"]","declared_features":"[\"__compress\", \"__tls\", \"actix-tls\", \"compress-brotli\", \"compress-gzip\", \"compress-zstd\", \"default\", \"http2\", \"openssl\", \"rustls\", \"rustls-0_20\", \"rustls-0_21\", \"rustls-0_22\", \"rustls-0_23\", \"ws\"]","target":4427038891525048573,"profile":3133228388854823247,"path":3296964124040799427,"deps":[[302948626015856208,"futures_core",false,13411290377882743454],[595566797399950287,"derive_more",false,15974423763050899474],[1149722784379999706,"bytestring",false,669529360741409501],[1678291836268844980,"brotli",false,16997921249962474543],[2251399859588827949,"pin_project_lite",false,15566550207223256564],[3064692270587553479,"actix_service",false,6288656540412859622],[3163899731817361221,"tokio_util",false,16827006354653726028],[3666196340704888985,"smallvec",false,5778069751535923719],[3870702314125662939,"bytes",false,16948387749507789063],[4052408954973158025,"zstd",false,11056835991048383635],[4405182208873388884,"http",false,9310491409134914378],[5384016313853579615,"actix_utils",false,8099528041380835822],[5532778797167691009,"itoa",false,3720987438297136726],[6163892036024256188,"httparse",false,11920759333305368458],[6304235478050270880,"httpdate",false,15196146147999196178],[6803352382179706244,"percent_encoding",false,12394381217160922707],[10229185211513642314,"mime",false,9501964963348565344],[10456045882549826531,"flate2",false,9000519443062992627],[10724389056617919257,"sha1",false,5228499893392472796],[10842263908529601448,"foldhash",false,9164035082071762222],[11094608732914737535,"actix_rt",false,12375800716233750295],[11916940916964035392,"rand",false,3402606231789118748],[13077212702700853852,"base64",false,15198965977520855066],[13648953096965186997,"actix_codec",false,8518467395182902770],[13763625454224483636,"h2",false,1978366608621382068],[14564311161534545801,"encoding_rs",false,4903795380282457792],[14757622794040968908,"tracing",false,4994296470301651821],[14872012066416984357,"local_channel",false,9945046040331312009],[16909888598953886583,"bitflags",false,351452341284058446],[17331556883491080683,"language_tags",false,16587087802827231162],[17541620359049798014,"tokio",false,1041505307722513993]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-http-51df65d4b78a71e1/dep-lib-actix_http","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
1d3685f9d4ff4e53
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[]","target":695003556747458393,"profile":2225463790103693989,"path":186532931410463953,"deps":[[10420560437213941093,"syn",false,16474032542208326673],[13111758008314797071,"quote",false,16220216807289559200]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-macros-b8ce81399f0ba912/dep-lib-actix_macros","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
d67742e69c832ae1
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"default\", \"http\", \"unicode\"]","target":5816441226683462542,"profile":8106468067017093656,"path":2686308775115508494,"deps":[[1149722784379999706,"bytestring",false,7459227753204301863],[7667230146095136825,"cfg_if",false,15619071270613682610],[7758745775150479896,"regex_lite",false,4193144587253294453],[13548984313718623784,"serde",false,3239216731225659995],[14757622794040968908,"tracing",false,13808690272325206181]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-router-3afa00a708d374be/dep-lib-actix_router","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
715163bcf4337edc
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"http\", \"unicode\"]","declared_features":"[\"default\", \"http\", \"unicode\"]","target":5816441226683462542,"profile":3133228388854823247,"path":2686308775115508494,"deps":[[1149722784379999706,"bytestring",false,669529360741409501],[4405182208873388884,"http",false,9310491409134914378],[7667230146095136825,"cfg_if",false,3415395165544656506],[7758745775150479896,"regex_lite",false,16311285535599567893],[13548984313718623784,"serde",false,7528466600112811085],[14757622794040968908,"tracing",false,4994296470301651821],[17109794424245468765,"regex",false,14617361929869666223]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-router-d76f38e0a8e64888/dep-lib-actix_router","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
1737237e2eadbfab
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"actix-macros\", \"default\", \"io-uring\", \"macros\", \"tokio-uring\"]","target":11467906722111896043,"profile":3906840514083873863,"path":16178319435161083340,"deps":[[302948626015856208,"futures_core",false,13411290377882743454],[17541620359049798014,"tokio",false,1041505307722513993]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-rt-9ef78d8b4f6ec944/dep-lib-actix_rt","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
c1a4b14a5d2414f6
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"default\"]","declared_features":"[\"default\", \"io-uring\", \"tokio-uring\"]","target":7486425883630722659,"profile":18362114993302267858,"path":3863660119538446863,"deps":[[302948626015856208,"futures_core",false,13411290377882743454],[3064692270587553479,"actix_service",false,6288656540412859622],[5384016313853579615,"actix_utils",false,8099528041380835822],[5675930438384443948,"mio",false,16711885880016747186],[5898568623609459682,"futures_util",false,9030658141603746226],[11094608732914737535,"actix_rt",false,12375800716233750295],[12614995553916589825,"socket2",false,5027578337550547680],[14757622794040968908,"tracing",false,4994296470301651821],[17541620359049798014,"tokio",false,1041505307722513993]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-server-3f5e576e2159e48b/dep-lib-actix_server","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
e6d4be05cecb4557
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[]","target":15098614942180125221,"profile":18362114993302267858,"path":16623851268273713932,"deps":[[302948626015856208,"futures_core",false,13411290377882743454],[2251399859588827949,"pin_project_lite",false,15566550207223256564]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-service-1140bb22a1523738/dep-lib-actix_service","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
eef1d12ad74d6770
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[]","target":10635421866110932485,"profile":2241668132362809309,"path":1350205909776615497,"deps":[[2083946343206318420,"local_waker",false,18075911899985205745],[2251399859588827949,"pin_project_lite",false,15566550207223256564]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-utils-0a91c3d286f4cced/dep-lib-actix_utils","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
7889f9f94dd40e6b
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"__compress\", \"compat\", \"compat-routing-macros-force-pub\", \"compress-brotli\", \"compress-gzip\", \"compress-zstd\", \"cookies\", \"default\", \"http2\", \"macros\", \"unicode\", \"ws\"]","declared_features":"[\"__compress\", \"__tls\", \"actix-tls\", \"compat\", \"compat-routing-macros-force-pub\", \"compress-brotli\", \"compress-gzip\", \"compress-zstd\", \"cookies\", \"default\", \"experimental-introspection\", \"experimental-io-uring\", \"http2\", \"macros\", \"openssl\", \"rustls\", \"rustls-0_20\", \"rustls-0_21\", \"rustls-0_22\", \"rustls-0_23\", \"secure-cookies\", \"unicode\", \"ws\"]","target":10874021801110526175,"profile":3133228388854823247,"path":7417000660321226529,"deps":[[252395743106140488,"actix_macros",false,6003016643515856413],[302948626015856208,"futures_core",false,13411290377882743454],[595566797399950287,"derive_more",false,15974423763050899474],[1149722784379999706,"bytestring",false,669529360741409501],[1528297757488249563,"url",false,2035166320828714287],[2251399859588827949,"pin_project_lite",false,15566550207223256564],[3014460723014940652,"actix_server",false,17731837615968199873],[3064692270587553479,"actix_service",false,6288656540412859622],[3666196340704888985,"smallvec",false,5778069751535923719],[3870702314125662939,"bytes",false,16948387749507789063],[3936459032874673992,"actix_http",false,6440892538286187312],[5384016313853579615,"actix_utils",false,8099528041380835822],[5532778797167691009,"itoa",false,3720987438297136726],[5855319743879205494,"once_cell",false,11127587921477898461],[5898568623609459682,"futures_util",false,9030658141603746226],[7667230146095136825,"cfg_if",false,3415395165544656506],[7758745775150479896,"regex_lite",false,16311285535599567893],[8010322816087218523,"cookie",false,2098270431290694494],[10019921579555255366,"actix_web_codegen",false,10789396213975012361],[10229185211513642314,"mime",false,9501964963348565344],[10630857666389190470,"log",false,3024114030112994732],[10842263908529601448,"foldhash",false,9164035082071762222],[10947645248417156337,"socket2",false,932167199014333462],[11094608732914737535,"actix_rt",false,12375800716233750295],[11432222519274906849,"time",false,5644807404023172005],[13548984313718623784,"serde",false,7528466600112811085],[13648953096965186997,"actix_codec",false,8518467395182902770],[13795362694956882968,"serde_json",false,7660775102867868865],[14373001148831857156,"impl_more",false,2677504090585289703],[14564311161534545801,"encoding_rs",false,4903795380282457792],[14757622794040968908,"tracing",false,4994296470301651821],[16542808166767769916,"serde_urlencoded",false,17504457600009304860],[17109794424245468765,"regex",false,14617361929869666223],[17331556883491080683,"language_tags",false,16587087802827231162],[17584815051554192320,"actix_router",false,15888193661635350897]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-web-c6a35d4af5058b8e/dep-lib-actix_web","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
09d4ec22b1a2bb95
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"compat-routing-macros-force-pub\"]","declared_features":"[\"compat-routing-macros-force-pub\", \"default\"]","target":3358744162673330276,"profile":2225463790103693989,"path":1313529623116280018,"deps":[[4289358735036141001,"proc_macro2",false,10178310667270251203],[10420560437213941093,"syn",false,16474032542208326673],[13111758008314797071,"quote",false,16220216807289559200],[17584815051554192320,"actix_router",false,16224925317456885718]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-web-codegen-26a926d2164490c4/dep-lib-actix_web_codegen","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
d88a6b00d8dfd134
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"serde\", \"serde-json\"]","target":770230253200391166,"profile":10084214257639516596,"path":12589048971192379685,"deps":[[270634688040536827,"futures_sink",false,10518964324922000320],[302948626015856208,"futures_core",false,13411290377882743454],[1149722784379999706,"bytestring",false,669529360741409501],[3163899731817361221,"tokio_util",false,16827006354653726028],[3936459032874673992,"actix_http",false,6440892538286187312],[13648953096965186997,"actix_codec",false,8518467395182902770],[13944207109742299874,"actix_web",false,7714336643103689080],[17541620359049798014,"tokio",false,1041505307722513993]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/actix-ws-7eef1fc358da3dcf/dep-lib-actix_ws","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
ae64994289fd6e86
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"core\", \"default\", \"rustc-dep-of-std\", \"std\"]","target":6569825234462323107,"profile":2241668132362809309,"path":6304695095228330996,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/adler2-058d5f8fddc817b0/dep-lib-adler2","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
b1d350d3ad57432c
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"perf-literal\", \"std\"]","declared_features":"[\"default\", \"logging\", \"perf-literal\", \"std\"]","target":7534583537114156500,"profile":2241668132362809309,"path":14282663034247825136,"deps":[[1363051979936526615,"memchr",false,9034228811413583865]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/aho-corasick-8a0f500f228cb24d/dep-lib-aho_corasick","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
99f0f7d3b8f42a88
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"unsafe\"]","target":1942380541186272485,"profile":2241668132362809309,"path":10723682108415301134,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/alloc-no-stdlib-67a0bbe710316a62/dep-lib-alloc_no_stdlib","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
a4e0fd8245737ae2
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[\"unsafe\"]","target":8756844401079878655,"profile":2241668132362809309,"path":11605923374929900138,"deps":[[9611597350722197978,"alloc_no_stdlib",false,9811923812847448217]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/alloc-stdlib-c68fad3ba3ed4e44/dep-lib-alloc_stdlib","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
4993ee5059289ea6
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"auto\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":17646343673514590993,"path":18285076981788204047,"deps":[[2608044744973004659,"anstyle_parse",false,10231732548308611484],[5652275617566266604,"anstyle_query",false,7124577077882605794],[7098682853475662231,"anstyle",false,16771901755091886976],[7711617929439759244,"colorchoice",false,7623655162864138271],[7727459912076845739,"is_terminal_polyfill",false,5845803552644641956],[17716308468579268865,"utf8parse",false,449596501245449024]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-00fda7c081e998b0/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
80a300f0c8c3c1e8
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":6165884447290141869,"profile":17646343673514590993,"path":16676059437871222334,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-a8236b7ed4a5a82a/dep-lib-anstyle","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
9cb1bcea8a6afe8d
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":17646343673514590993,"path":10119570457316637790,"deps":[[17716308468579268865,"utf8parse",false,449596501245449024]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-99a825add116413d/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
e25015ce1a95df62
|
||||
@ -0,0 +1 @@
|
||||
{"rustc":5391851738765093524,"features":"[]","declared_features":"[]","target":10705714425685373190,"profile":112744067883639982,"path":2121986684770291704,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-query-0b8322a96a58150a/dep-lib-anstyle_query","checksum":false}}],"rustflags":[],"config":8247474407144887393,"compile_kind":0}
|
||||
Binary file not shown.
@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -0,0 +1 @@
|
||||
2e89bae17d2564d8
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user