@using LANCommander.Server.Logging @using Microsoft.AspNetCore.SignalR.Client @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(Microsoft.Extensions.Logging.LogLevel level) { return level switch { Microsoft.Extensions.Logging.LogLevel.Trace => TerminalColor.BrightBlack, Microsoft.Extensions.Logging.LogLevel.Debug => TerminalColor.BrightCyan, Microsoft.Extensions.Logging.LogLevel.Information => TerminalColor.BrightGreen, Microsoft.Extensions.Logging.LogLevel.Warning => TerminalColor.BrightYellow, Microsoft.Extensions.Logging.LogLevel.Error => TerminalColor.BrightRed, Microsoft.Extensions.Logging.LogLevel.Critical => TerminalColor.BrightMagenta, _ => TerminalColor.Default, }; } public async ValueTask DisposeAsync() { if (HubConnection is not null) await HubConnection.DisposeAsync(); } }