v0.1.0-pre.057
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: kb-app-demo-desktop/frontend/demo_http.html -->
|
||||
<!-- version: 4 -->
|
||||
<!-- version: 5 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
@@ -72,9 +72,12 @@
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||
<h2 class="h5 card-title mb-0">Résultat</h2>
|
||||
<button id="copyHttpResultButton" class="btn btn-sm btn-outline-secondary">Copier</button>
|
||||
<div class="d-flex gap-2">
|
||||
<button id="copyHttpResultButton" class="btn btn-sm btn-outline-secondary" type="button">Copier</button>
|
||||
<button id="clearHttpResultButton" class="btn btn-sm btn-outline-secondary" type="button">Effacer</button>
|
||||
</div>
|
||||
</div>
|
||||
<textarea id="httpResultOutput" class="form-control font-monospace" rows="18" readonly data-json-viewer="true">Aucune requête exécutée.</textarea>
|
||||
<textarea id="httpResultOutput" class="form-control font-monospace" style="height: 24rem; overflow-y: auto;" readonly>Aucune requête exécutée.</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -89,9 +89,12 @@
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||
<h2 class="h5 card-title mb-0">Messages</h2>
|
||||
<button id="copyWsResultButton" class="btn btn-sm btn-outline-secondary">Copier</button>
|
||||
<div class="d-flex gap-2">
|
||||
<button id="copyWsResultButton" class="btn btn-sm btn-outline-secondary" type="button">Copier</button>
|
||||
<button id="clearWsResultButton" class="btn btn-sm btn-outline-secondary" type="button">Effacer</button>
|
||||
</div>
|
||||
</div>
|
||||
<textarea id="wsResultOutput" class="form-control font-monospace" rows="16" readonly data-json-viewer="true">Aucune connexion active.</textarea>
|
||||
<textarea id="wsResultOutput" class="form-control font-monospace" style="height: 24rem; overflow-y: auto;" readonly>Aucune connexion active.</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
<li>
|
||||
<h6 class="dropdown-header">Stockage</h6>
|
||||
<h6 class="dropdown-header">SQL</h6>
|
||||
</li>
|
||||
<li><a id="openDemoSqlDiagLink" class="dropdown-item" href="#">SQL diagnostics</a></li>
|
||||
<li><a id="openDemoSqlPgRawLink" class="dropdown-item" href="#">SQL PostgreSQL raw</a></li>
|
||||
@@ -57,7 +57,7 @@
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
<li>
|
||||
<h6 class="dropdown-header">Exécution Devnet</h6>
|
||||
<h6 class="dropdown-header">Exécution</h6>
|
||||
</li>
|
||||
<li><a id="openDemoExecutionSolanaCoreLink" class="dropdown-item" href="#">Solana Core</a></li>
|
||||
<li><a id="openDemoExecutionSplLink" class="dropdown-item" href="#">SPL</a></li>
|
||||
@@ -98,4 +98,4 @@
|
||||
<script type="module" src="ts/main.ts" defer></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/frontend/ts/demo_http.ts
|
||||
// version: 4
|
||||
// version: 5
|
||||
|
||||
import * as bootstrap from "bootstrap";
|
||||
import "simplebar";
|
||||
@@ -17,6 +17,7 @@ import type { DemoHttpRoleOption } from "./bindings/kb_app_demo_desktop/demo_htt
|
||||
|
||||
let roleOptions: DemoHttpRoleOption[] = [];
|
||||
let methodOptions: DemoHttpMethodOption[] = [];
|
||||
let httpResultBuffer = "Aucune requête exécutée.";
|
||||
|
||||
function textInputValue(selector: string): string {
|
||||
const element = document.querySelector<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(selector);
|
||||
@@ -30,6 +31,16 @@ function writeTextarea(selector: string, value: string): void {
|
||||
}
|
||||
}
|
||||
|
||||
function writeHttpResult(value: string): void {
|
||||
httpResultBuffer = value;
|
||||
writeTextarea("#httpResultOutput", httpResultBuffer);
|
||||
}
|
||||
|
||||
function clearHttpResult(): void {
|
||||
httpResultBuffer = "";
|
||||
writeTextarea("#httpResultOutput", httpResultBuffer);
|
||||
}
|
||||
|
||||
function jsonText(value: unknown): string {
|
||||
if (typeof value === "string") {
|
||||
return value;
|
||||
@@ -121,7 +132,7 @@ async function refreshHttpOptions(): Promise<void> {
|
||||
refreshMethodList();
|
||||
} catch (caughtError) {
|
||||
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
||||
writeTextarea("#httpResultOutput", `Erreur options HTTP : ${message}`);
|
||||
writeHttpResult(`Erreur options HTTP : ${message}`);
|
||||
frontendError("kb-app-demo-desktop.frontend.demo_http", `HTTP options loading failed: ${message}`);
|
||||
}
|
||||
}
|
||||
@@ -145,14 +156,14 @@ async function executeHttpRequest(): Promise<void> {
|
||||
configJson: textInputValue("#httpConfigInput") || null,
|
||||
paramsJson: textInputValue("#httpParamsInput") || null,
|
||||
};
|
||||
writeTextarea("#httpResultOutput", "Exécution en cours...");
|
||||
writeHttpResult("Exécution en cours...");
|
||||
try {
|
||||
const response = await invoke<DemoHttpExecutionPayload>("demo_http_execute_request", { request });
|
||||
writeTextarea("#httpResultOutput", formatHttpExecutionPayload(response));
|
||||
writeHttpResult(formatHttpExecutionPayload(response));
|
||||
frontendDebug("kb-app-demo-desktop.frontend.demo_http", `HTTP request completed: ${response.method}`);
|
||||
} catch (caughtError) {
|
||||
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
||||
writeTextarea("#httpResultOutput", `Erreur : ${message}`);
|
||||
writeHttpResult(`Erreur : ${message}`);
|
||||
frontendError("kb-app-demo-desktop.frontend.demo_http", `HTTP request failed: ${message}`);
|
||||
}
|
||||
}
|
||||
@@ -176,6 +187,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
||||
document.querySelector<HTMLButtonElement>("#copyHttpResultButton")?.addEventListener("click", () => {
|
||||
void copyTextarea("#httpResultOutput");
|
||||
});
|
||||
document.querySelector<HTMLButtonElement>("#clearHttpResultButton")?.addEventListener("click", clearHttpResult);
|
||||
void refreshHttpOptions();
|
||||
void refreshHttpPool();
|
||||
});
|
||||
|
||||
@@ -21,6 +21,7 @@ import type {DemoWsUnsubscribeRequest} from "./bindings/kb_app_demo_desktop/demo
|
||||
|
||||
let roleOptions: DemoWsRoleOption[] = [];
|
||||
let methodOptions: DemoWsMethodOption[] = [];
|
||||
let wsMessageBuffer = "Aucune connexion active.";
|
||||
|
||||
const maxResultOutputCharacters = 200_000;
|
||||
const maxIncomingMessageCharacters = 25_000;
|
||||
@@ -51,16 +52,33 @@ function capTextareaValue(value: string): string {
|
||||
return `... historique tronqué côté UI ...\n${value.slice(value.length - maxResultOutputCharacters)}`;
|
||||
}
|
||||
|
||||
function writeWsMessages(value: string): void {
|
||||
wsMessageBuffer = capTextareaValue(value);
|
||||
writeTextarea("#wsResultOutput", wsMessageBuffer);
|
||||
const element = document.querySelector<HTMLTextAreaElement>("#wsResultOutput");
|
||||
if (element) {
|
||||
element.scrollTop = element.scrollHeight;
|
||||
}
|
||||
}
|
||||
|
||||
function appendTextarea(selector: string, value: string): void {
|
||||
const element = document.querySelector<HTMLTextAreaElement>(selector);
|
||||
if (!element) {
|
||||
if (selector !== "#wsResultOutput") {
|
||||
const element = document.querySelector<HTMLTextAreaElement>(selector);
|
||||
if (element) {
|
||||
const previous = element.value.trim();
|
||||
const safeValue = truncateIncomingMessage(value);
|
||||
element.value = capTextareaValue(previous.length > 0 ? `${previous}\n\n${safeValue}` : safeValue);
|
||||
element.scrollTop = element.scrollHeight;
|
||||
}
|
||||
return;
|
||||
}
|
||||
const previous = element.value.trim();
|
||||
const previous = wsMessageBuffer.trim();
|
||||
const safeValue = truncateIncomingMessage(value);
|
||||
const nextValue = previous.length > 0 ? `${previous}\n\n${safeValue}` : safeValue;
|
||||
element.value = capTextareaValue(nextValue);
|
||||
element.scrollTop = element.scrollHeight;
|
||||
writeWsMessages(previous.length > 0 ? `${previous}\n\n${safeValue}` : safeValue);
|
||||
}
|
||||
|
||||
function clearWsMessages(): void {
|
||||
writeWsMessages("");
|
||||
}
|
||||
|
||||
function jsonText(value: unknown): string {
|
||||
@@ -195,7 +213,7 @@ async function refreshWsOptions(): Promise<void> {
|
||||
refreshMethodList();
|
||||
} catch (caughtError) {
|
||||
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
||||
writeTextarea("#wsResultOutput", `Erreur options WebSocket : ${message}`);
|
||||
writeWsMessages(`Erreur options WebSocket : ${message}`);
|
||||
frontendError("kb-app-demo-desktop.frontend.demo_ws", `WebSocket options loading failed: ${message}`);
|
||||
}
|
||||
}
|
||||
@@ -230,15 +248,15 @@ async function connectWsRequest(): Promise<void> {
|
||||
filterJson: textInputValue("#wsFilterInput") || null,
|
||||
configJson: textInputValue("#wsConfigInput") || null,
|
||||
};
|
||||
writeTextarea("#wsResultOutput", "Souscription en cours sur la connexion WebSocket...");
|
||||
writeWsMessages("Souscription en cours sur la connexion WebSocket...");
|
||||
try {
|
||||
const response = await invoke<DemoWsExecutionPayload>("demo_ws_connect", { request });
|
||||
writeTextarea("#wsResultOutput", formatWsExecutionPayload(response));
|
||||
writeWsMessages(formatWsExecutionPayload(response));
|
||||
frontendDebug("kb-app-demo-desktop.frontend.demo_ws", `WebSocket subscribed: ${response.method}`);
|
||||
await refreshWsStatus();
|
||||
} catch (caughtError) {
|
||||
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
||||
writeTextarea("#wsResultOutput", `Erreur : ${message}`);
|
||||
writeWsMessages(`Erreur : ${message}`);
|
||||
frontendError("kb-app-demo-desktop.frontend.demo_ws", `WebSocket subscription failed: ${message}`);
|
||||
await refreshWsStatus();
|
||||
}
|
||||
@@ -318,6 +336,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
||||
document.querySelector<HTMLButtonElement>("#copyWsResultButton")?.addEventListener("click", () => {
|
||||
void copyTextarea("#wsResultOutput");
|
||||
});
|
||||
document.querySelector<HTMLButtonElement>("#clearWsResultButton")?.addEventListener("click", clearWsMessages);
|
||||
void installWsEventListeners();
|
||||
void refreshWsOptions();
|
||||
void refreshWsPool();
|
||||
|
||||
Reference in New Issue
Block a user