v0.1.0-pre.049

This commit is contained in:
2026-07-25 20:40:03 +02:00
parent a595fd920d
commit 717d97482a
7 changed files with 1089 additions and 31 deletions

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/tauri.rs
// version: 5
// version: 6
//! Tauri runtime assembly and private command wrappers.
@@ -45,6 +45,13 @@ pub fn run() -> kb_core::Result<()> {
demo_http_list_pool_clients,
demo_http_options,
demo_http_execute_request,
open_demo_ws_window,
demo_ws_list_pool_clients,
demo_ws_options,
demo_ws_status,
demo_ws_connect,
demo_ws_unsubscribe,
demo_ws_disconnect,
]);
builder = builder.plugin(tracing_builder.build::<tauri::Wry>());
builder = builder.setup(|app| {
@@ -89,6 +96,13 @@ pub fn run() -> kb_core::Result<()> {
std::option::Option::None,
std::option::Option::None,
);
crate::emit_splash_order(
&splash_window,
"add_log",
std::option::Option::Some("Pool WebSocket initialisé"),
std::option::Option::None,
std::option::Option::None,
);
crate::emit_splash_order(
&splash_window,
"fadein",
@@ -143,9 +157,9 @@ pub fn run() -> kb_core::Result<()> {
let run_result = builder.run(tauri::generate_context!());
return match run_result {
std::result::Result::Ok(()) => std::result::Result::Ok(()),
std::result::Result::Err(error) => std::result::Result::Err(kb_core::Error::tauri(
format!("cannot run desktop demo application: {error:?}"),
)),
std::result::Result::Err(error) => std::result::Result::Err(kb_core::Error::tauri(format!(
"cannot run desktop demo application: {error:?}"
))),
};
}
@@ -162,7 +176,9 @@ fn install_default_rustls_provider() -> kb_core::Result<()> {
};
}
fn into_ipc_result<T>(result: kb_core::Result<T>) -> std::result::Result<T, std::string::String> {
fn into_ipc_result<T>(
result: kb_core::Result<T>,
) -> std::result::Result<T, std::string::String> {
return match result {
std::result::Result::Ok(value) => std::result::Result::Ok(value),
std::result::Result::Err(error) => std::result::Result::Err(error.to_string()),
@@ -181,7 +197,9 @@ fn load_project_readme() -> std::result::Result<std::string::String, std::string
#[tauri::command]
fn demo_backfill_cancel(state: tauri::State<'_, crate::AppState>) -> bool {
let running = state.demo_backfill_running().load(std::sync::atomic::Ordering::Acquire);
let running = state
.demo_backfill_running()
.load(std::sync::atomic::Ordering::Acquire);
state
.demo_backfill_cancel_requested()
.store(true, std::sync::atomic::Ordering::Release);
@@ -240,12 +258,14 @@ fn demo_backfill_options(
default_max_pages: 20,
default_max_concurrent_requests: 4,
default_max_retries: 2,
running: state.demo_backfill_running().load(std::sync::atomic::Ordering::Acquire),
running: state
.demo_backfill_running()
.load(std::sync::atomic::Ordering::Acquire),
};
}
#[allow(clippy::question_mark_used)]
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_backfill_execute(
app_handle: tauri::AppHandle,
state: tauri::State<'_, crate::AppState>,
@@ -260,7 +280,9 @@ async fn demo_backfill_execute(
if acquire_result.is_err() {
return std::result::Result::Err("a backfill campaign is already running".to_string());
}
let _run_guard = crate::DemoBackfillRunGuard { running: state.demo_backfill_running() };
let _run_guard = crate::DemoBackfillRunGuard {
running: state.demo_backfill_running(),
};
state
.demo_backfill_cancel_requested()
.store(false, std::sync::atomic::Ordering::Release);
@@ -345,18 +367,124 @@ fn demo_http_list_pool_clients(
}
#[tauri::command]
fn demo_http_options(state: tauri::State<'_, crate::AppState>) -> crate::DemoHttpOptionsPayload {
fn demo_http_options(
state: tauri::State<'_, crate::AppState>,
) -> crate::DemoHttpOptionsPayload {
return crate::DemoHttpOptionsPayload {
roles: crate::build_http_role_options(state.http_pool().snapshot()),
methods: crate::build_http_method_options(),
};
}
#[allow(clippy::question_mark_used)]
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_http_execute_request(
state: tauri::State<'_, crate::AppState>,
request: crate::DemoHttpRequest,
) -> std::result::Result<crate::DemoHttpExecutionPayload, std::string::String> {
return crate::demo_http_execute_request_inner(state, request).await;
}
/// Opens or focuses the WebSocket demo window.
#[tauri::command]
fn open_demo_ws_window(
app_handle: tauri::AppHandle,
) -> std::result::Result<(), std::string::String> {
tracing::info!(target: crate::TRACING_TARGET, "open_demo_ws_window");
if let std::option::Option::Some(window) = app_handle.get_webview_window("demo_ws") {
if let std::result::Result::Err(error) = window.show() {
return std::result::Result::Err(
kb_core::Error::tauri(format!("cannot show demo_ws window: {error}")).to_string(),
);
}
if let std::result::Result::Err(error) = window.set_focus() {
return std::result::Result::Err(
kb_core::Error::tauri(format!("cannot focus demo_ws window: {error}")).to_string(),
);
}
return std::result::Result::Ok(());
}
let build_result = tauri::WebviewWindowBuilder::new(
&app_handle,
"demo_ws",
tauri::WebviewUrl::App("demo_ws.html".into()),
)
.title("Khadhroony Bot3 - WebSocket standard")
.inner_size(1200.0, 760.0)
.min_inner_size(920.0, 560.0)
.resizable(true)
.visible(true)
.build();
return match build_result {
std::result::Result::Ok(window) => match window.set_focus() {
std::result::Result::Ok(()) => std::result::Result::Ok(()),
std::result::Result::Err(error) => std::result::Result::Err(
kb_core::Error::tauri(format!("cannot focus created demo_ws window: {error}"))
.to_string(),
),
},
std::result::Result::Err(error) => std::result::Result::Err(
kb_core::Error::tauri(format!("cannot create demo_ws window: {error}")).to_string(),
),
};
}
/// Lists WebSocket endpoints available through the configured pool.
#[tauri::command]
fn demo_ws_list_pool_clients(
state: tauri::State<'_, crate::AppState>,
) -> std::result::Result<std::vec::Vec<kb_onchain_transport::WsPoolClientSnapshot>, std::string::String> {
return std::result::Result::Ok(state.ws_pool().snapshot());
}
/// Lists selectable WebSocket roles and methods for the demo UI.
#[tauri::command]
fn demo_ws_options(
state: tauri::State<'_, crate::AppState>,
) -> std::result::Result<crate::DemoWsOptionsPayload, std::string::String> {
return std::result::Result::Ok(crate::DemoWsOptionsPayload {
roles: crate::build_ws_role_options(state.ws_pool().snapshot()),
methods: crate::build_ws_method_options(),
});
}
/// Returns the current WebSocket demo session status.
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_ws_status(
state: tauri::State<'_, crate::AppState>,
) -> std::result::Result<crate::DemoWsStatusPayload, std::string::String> {
return crate::demo_ws_status_inner(state.inner()).await;
}
/// Connects if needed, then subscribes through `kb_onchain_transport::WsSession`.
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_ws_connect(
app_handle: tauri::AppHandle,
state: tauri::State<'_, crate::AppState>,
request: crate::DemoWsRequest,
) -> std::result::Result<crate::DemoWsExecutionPayload, std::string::String> {
return crate::demo_ws_connect_inner(app_handle, state.inner(), request).await;
}
/// Unsubscribes one subscription while keeping the WebSocket connection open.
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_ws_unsubscribe(
app_handle: tauri::AppHandle,
state: tauri::State<'_, crate::AppState>,
request: crate::DemoWsUnsubscribeRequest,
) -> std::result::Result<crate::DemoWsStatusPayload, std::string::String> {
return crate::demo_ws_unsubscribe_inner(app_handle, state.inner(), request.subscription_id)
.await;
}
/// Disconnects the current persistent WebSocket demo session.
#[tauri::command]
#[allow(clippy::question_mark_used)]
async fn demo_ws_disconnect(
state: tauri::State<'_, crate::AppState>,
) -> std::result::Result<crate::DemoWsStatusPayload, std::string::String> {
return crate::demo_ws_disconnect_inner(state.inner()).await;
}