@using LANCommander.Server.Logging @using Microsoft.AspNetCore.SignalR.Client @using Serilog.Events @using XtermBlazor @inject ILogger Logger @inject MessageService MessageService @inject NavigationManager NavigationManager @code { Xterm? Terminal; HubConnection? HubConnection; TerminalOptions TerminalOptions = new TerminalOptions { CursorBlink = true, CursorStyle = CursorStyle.Bar }; HashSet Addons = new HashSet() { "addon-fit" }; protected override async Task OnInitializedAsync() { try { await Connect(); } catch (Exception ex) { Logger.LogError(ex, "Log viewer failed to connect"); MessageService.Error("Log viewer failed to connect"); } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await Task.Delay(100); await Terminal.Addon("addon-fit").InvokeVoidAsync("fit"); } } async Task Connect() { HubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/logging")) .Build(); HubConnection.On("Log", (message, level, timestamp) => { var parts = new string[] { TerminalColor.BrightBlack, "[", TerminalColor.White, timestamp.ToString("HH:mm:ss"), TerminalColor.BrightBlack, "]", GetColorCode(level), " ", message, TerminalColor.Default }; Terminal?.WriteLine(String.Join("", parts)); }); await HubConnection.StartAsync(); } string GetColorCode(LogEventLevel level) { return level switch { LogEventLevel.Verbose => TerminalColor.BrightBlack, LogEventLevel.Debug => TerminalColor.BrightCyan, LogEventLevel.Information => TerminalColor.BrightGreen, LogEventLevel.Warning => TerminalColor.BrightYellow, LogEventLevel.Error => TerminalColor.BrightRed, LogEventLevel.Fatal => TerminalColor.BrightMagenta, _ => TerminalColor.Default, }; } public async ValueTask DisposeAsync() { if (HubConnection is not null) await HubConnection.DisposeAsync(); } }