fix: auto-connect ws server
This commit is contained in:
1 parent
78980b2dbf
commit
7aeddba427
2 files changed
+77
-74
No files matched your search
+19
-21
@@ -1,24 +1,22 @@
|
|||||||
(function () {
|
(function () {
|
||||||
var protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
var protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||||
|
var url = protocol + '//' + window.location.host + '/_dioxus/ws';
|
||||||
var url = protocol + "//" + window.location.host + "/_dioxus/ws";
|
var poll_interval = 8080;
|
||||||
|
var reload_upon_connect = () => {
|
||||||
var poll_interval = 2000;
|
window.setTimeout(
|
||||||
|
() => {
|
||||||
|
var ws = new WebSocket(url);
|
||||||
|
ws.onopen = () => window.location.reload();
|
||||||
|
ws.onclose = reload_upon_connect;
|
||||||
|
},
|
||||||
|
poll_interval);
|
||||||
|
};
|
||||||
|
|
||||||
var ws = new WebSocket(url);
|
var ws = new WebSocket(url);
|
||||||
|
ws.onmessage = (ev) => {
|
||||||
ws.addEventListener("message", (ev) => {
|
if (ev.data == "reload") {
|
||||||
if (ev.data == "reload") {
|
window.location.reload();
|
||||||
window.location.reload();
|
}
|
||||||
}
|
};
|
||||||
});
|
ws.onclose = reload_upon_connect;
|
||||||
|
})()
|
||||||
ws.addEventListener("open", () => {
|
|
||||||
ws.send("init");
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.addEventListener("close", () => {
|
|
||||||
alert("Dev-Server Socket Closed.");
|
|
||||||
});
|
|
||||||
|
|
||||||
})();
|
|
||||||
+58
-53
@@ -36,6 +36,7 @@ pub async fn startup(config: CrateConfig) -> anyhow::Result<()> {
|
|||||||
.watch_path
|
.watch_path
|
||||||
.clone()
|
.clone()
|
||||||
.unwrap_or_else(|| vec![PathBuf::from("src")]);
|
.unwrap_or_else(|| vec![PathBuf::from("src")]);
|
||||||
|
|
||||||
for sub_path in allow_watch_path {
|
for sub_path in allow_watch_path {
|
||||||
watcher
|
watcher
|
||||||
.watch(
|
.watch(
|
||||||
@@ -46,60 +47,63 @@ pub async fn startup(config: CrateConfig) -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (reload_tx, _) = broadcast::channel(100);
|
let (reload_tx, _) = broadcast::channel(100);
|
||||||
let ws_reload_state = Arc::new(WsRelodState { update: reload_tx });
|
|
||||||
|
let ws_reload_state = Arc::new(WsRelodState {
|
||||||
|
update: reload_tx.clone(),
|
||||||
|
});
|
||||||
|
|
||||||
let watcher_conf = config.clone();
|
let watcher_conf = config.clone();
|
||||||
let watcher_ws_state = ws_reload_state.update.clone();
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
while let Ok(v) = watcher_rx.recv() {
|
||||||
if let Ok(v) = watcher_rx.recv() {
|
match v {
|
||||||
match v {
|
DebouncedEvent::Create(_)
|
||||||
DebouncedEvent::Create(_)
|
| DebouncedEvent::Write(_)
|
||||||
| DebouncedEvent::Write(_)
|
| DebouncedEvent::Remove(_)
|
||||||
| DebouncedEvent::Remove(_)
|
| DebouncedEvent::Rename(_, _) => {
|
||||||
| DebouncedEvent::Rename(_, _) => {
|
if builder::build(&watcher_conf).is_ok() {
|
||||||
if builder::build(&watcher_conf).is_ok() {
|
// change the websocket reload state to true;
|
||||||
// change the websocket reload state to true;
|
// the page will auto-reload.
|
||||||
// the page will auto-reload.
|
if watcher_conf
|
||||||
if watcher_conf
|
.dioxus_config
|
||||||
.dioxus_config
|
.web
|
||||||
.web
|
.watcher
|
||||||
.watcher
|
.reload_html
|
||||||
.reload_html
|
.unwrap_or(false)
|
||||||
.unwrap_or(false)
|
{
|
||||||
{
|
let _ = Serve::regen_dev_page(&watcher_conf);
|
||||||
let _ = Serve::regen_dev_page(&watcher_conf);
|
|
||||||
}
|
|
||||||
println!("send reload!");
|
|
||||||
watcher_ws_state.send("reload".into()).unwrap();
|
|
||||||
}
|
}
|
||||||
|
reload_tx.send("reload".into()).unwrap();
|
||||||
}
|
}
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let app = Router::new()
|
|
||||||
.route("/_dioxus/ws", get(ws_handler))
|
|
||||||
.fallback(
|
|
||||||
get_service(ServeDir::new(config.crate_dir.join(&dist_path))).handle_error(
|
|
||||||
|error: std::io::Error| async move {
|
|
||||||
(
|
|
||||||
StatusCode::INTERNAL_SERVER_ERROR,
|
|
||||||
format!("Unhandled internal error: {}", error),
|
|
||||||
)
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.layer(AddExtensionLayer::new(ws_reload_state.clone()));
|
|
||||||
|
|
||||||
// start serve dev-server at 0.0.0.0:8080
|
// start serve dev-server at 0.0.0.0:8080
|
||||||
let port = "8080";
|
let port = "8080";
|
||||||
log::info!("📡 Dev-Server is started at: http://127.0.0.1:{}/", port);
|
log::info!("📡 Dev-Server is started at: http://127.0.0.1:{}/", port);
|
||||||
|
|
||||||
axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap())
|
axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap())
|
||||||
.serve(app.into_make_service())
|
.serve(
|
||||||
|
Router::new()
|
||||||
|
.route("/_dioxus/ws", get(ws_handler))
|
||||||
|
.fallback(
|
||||||
|
get_service(ServeDir::new(config.crate_dir.join(&dist_path))).handle_error(
|
||||||
|
|error: std::io::Error| async move {
|
||||||
|
(
|
||||||
|
StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
|
format!("Unhandled internal error: {}", error),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.layer(AddExtensionLayer::new(ws_reload_state))
|
||||||
|
.into_make_service(),
|
||||||
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,23 +113,24 @@ async fn ws_handler(
|
|||||||
Extension(state): Extension<Arc<WsRelodState>>,
|
Extension(state): Extension<Arc<WsRelodState>>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
ws.on_upgrade(|mut socket| async move {
|
ws.on_upgrade(|mut socket| async move {
|
||||||
|
|
||||||
|
log::info!("New websocket conenct.");
|
||||||
|
|
||||||
let mut rx = state.update.subscribe();
|
let mut rx = state.update.subscribe();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
println!("wait");
|
let v = rx.recv().await.unwrap();
|
||||||
if let Ok(v) = rx.recv().await {
|
println!("trigger recv: {}", v);
|
||||||
println!("trigger recv: {}", v);
|
if v == "reload" {
|
||||||
if v == "reload" {
|
// ignore the error
|
||||||
// ignore the error
|
if socket
|
||||||
if socket
|
.send(Message::Text(String::from("reload")))
|
||||||
.send(Message::Text(String::from("reload")))
|
.await
|
||||||
.await
|
.is_err()
|
||||||
.is_err()
|
{
|
||||||
{
|
println!("send failed");
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
println!("SS");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in new issue
Block a user