using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text.Json; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using MoonCore.Blazor.Tailwind.Extensions; using MoonCore.Blazor.Tailwind.Forms; using MoonCore.Blazor.Tailwind.Forms.Components; using MoonCore.Blazor.Tailwind.Services; using MoonCore.Extensions; using MoonCore.Helpers; using MoonCore.Models; using MoonCore.PluginFramework.Services; using Moonlight.Client.Implementations; using Moonlight.Client.Interfaces; using Moonlight.Client.UI; using Moonlight.Shared.Http.Requests.Auth; // Build pre run logger var providers = LoggerBuildHelper.BuildFromConfiguration(configuration => { configuration.Console.Enable = true; configuration.Console.EnableAnsiMode = true; configuration.FileLogging.Enable = false; }); using var loggerFactory = new LoggerFactory(providers); var logger = loggerFactory.CreateLogger("Startup"); // Fancy start console output... yes very fancy :> Console.Write("Running "); var rainbow = new Crayon.Rainbow(0.5); foreach (var c in "Moonlight") { Console.Write( rainbow .Next() .Bold() .Text(c.ToString()) ); } Console.WriteLine(); // Building app var builder = WebAssemblyHostBuilder.CreateDefault(args); // Configure application logging builder.Logging.ClearProviders(); builder.Logging.AddProviders(providers); builder.RootComponents.Add("#app"); builder.RootComponents.Add("head::after"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddScoped(sp => { var httpClient = sp.GetRequiredService(); var result = new HttpApiClient(httpClient); result.UseBearerTokenConsumer(async () => { var cookieService = sp.GetRequiredService(); return new TokenConsumer( await cookieService.GetValue("ml-access"), await cookieService.GetValue("ml-refresh"), DateTimeOffset.FromUnixTimeSeconds(long.Parse(await cookieService.GetValue("ml-timestamp"))).UtcDateTime, async refreshToken => { await httpClient.PostAsync("api/auth/refresh", new StringContent( JsonSerializer.Serialize(new RefreshRequest() { RefreshToken = refreshToken }), new MediaTypeHeaderValue("application/json") )); return new TokenPair() { AccessToken = await cookieService.GetValue("ml-access"), RefreshToken = await cookieService.GetValue("ml-refresh") }; } ); }); return result; }); builder.Services.AddMoonCoreBlazorTailwind(); builder.Services.AutoAddServices(); FormComponentRepository.Set(); FormComponentRepository.Set(); // Implementation service var implementationService = new ImplementationService(); implementationService.Register(); var authUiHandler = new AuthenticationUiHandler(); implementationService.Register(authUiHandler); implementationService.Register(authUiHandler); builder.Services.AddSingleton(implementationService); var app = builder.Build(); await app.RunAsync();