- add npm dev:hot wrapper using cargo-watch and page reload polling - add mnote-web dev hot reload endpoint and coverage - record current architecture review and tracked bug findings across realtime, tree, editor, and AI runtimes Verification: - node scripts/task-dev-hot-plan-test.js - node --check scripts/dev-hot.js - cargo test -p mnote-web dev_hot -- --nocapture
52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
use axum::http::{HeaderMap, HeaderValue};
|
|
use axum::response::IntoResponse;
|
|
use axum::Json;
|
|
use serde::Serialize;
|
|
use std::sync::LazyLock;
|
|
use std::time::{SystemTime, UNIX_EPOCH};
|
|
|
|
const HEADER_MNOTE_WEB_OWNER: &str = "x-mnote-web-owner";
|
|
|
|
static DEV_HOT_BOOT_ID: LazyLock<String> = LazyLock::new(|| {
|
|
let now = SystemTime::now()
|
|
.duration_since(UNIX_EPOCH)
|
|
.map(|duration| duration.as_millis())
|
|
.unwrap_or_default();
|
|
format!("{}-{now}", std::process::id())
|
|
});
|
|
|
|
#[derive(Debug, Serialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct DevHotReloadPayload {
|
|
ok: bool,
|
|
enabled: bool,
|
|
boot_id: &'static str,
|
|
}
|
|
|
|
pub fn dev_hot_reload_enabled() -> bool {
|
|
matches!(
|
|
std::env::var("MNOTE_WEB_DEV_HOT_RELOAD")
|
|
.unwrap_or_default()
|
|
.trim()
|
|
.to_ascii_lowercase()
|
|
.as_str(),
|
|
"1" | "true" | "yes" | "on"
|
|
)
|
|
}
|
|
|
|
pub async fn hot_reload() -> impl IntoResponse {
|
|
let mut headers = HeaderMap::new();
|
|
headers.insert(
|
|
HEADER_MNOTE_WEB_OWNER,
|
|
HeaderValue::from_static("mnote-web"),
|
|
);
|
|
(
|
|
headers,
|
|
Json(DevHotReloadPayload {
|
|
ok: true,
|
|
enabled: dev_hot_reload_enabled(),
|
|
boot_id: DEV_HOT_BOOT_ID.as_str(),
|
|
}),
|
|
)
|
|
}
|