Build / Build (push) Successful in 32s
PrivaPub's own types are read through the shared ClientModels context, and a type without generated metadata no longer falls back to reflection silently: it fails at once in development and on the pasture, and is reported on the console elsewhere. Startup outside production checks that every PrivaPub and Mastodon type the client knows has its metadata. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W4YtEJrgxG12Pc39Fai8Bd
91 lines
3.5 KiB
C#
91 lines
3.5 KiB
C#
using decePubClient;
|
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
|
using System.Net.Http.Headers;
|
|
using System.Text.Json;
|
|
using Blazored.LocalStorage;
|
|
using decePubClient.Extensions;
|
|
using decePubClient.Helpers;
|
|
using decePubClient.Models;
|
|
using decePubClient.Services;
|
|
using Toolbelt.Blazor.Extensions.DependencyInjection;
|
|
using Microsoft.AspNetCore.Components.Authorization;
|
|
using Microsoft.AspNetCore.Components.Web;
|
|
using PrivaPub.ClientModels;
|
|
|
|
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
|
builder.RootComponents.Add<App>("#app");
|
|
builder.RootComponents.Add<HeadOutlet>("head::after");
|
|
|
|
builder.Services.AddBlazorDownloadFile();
|
|
builder.Services.AddOptions()
|
|
.AddAuthorizationCore(options =>
|
|
{
|
|
options.AddPolicy(Policies.IsAdmin, ExtensionMethods.IsAdminPolicy());
|
|
options.AddPolicy(Policies.IsUser, ExtensionMethods.IsUserPolicy());
|
|
options.AddPolicy(Policies.IsModerator, ExtensionMethods.IsUserModeratorPolicy());
|
|
})
|
|
.AddTransient<AppStatusService>();
|
|
builder.Services.AddBlazoredLocalStorage(config =>
|
|
{
|
|
config.JsonSerializerOptions.WriteIndented = false;
|
|
config.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
|
|
config.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
|
|
config.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
|
|
config.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
|
config.JsonSerializerOptions.TypeInfoResolver = SUtility.DefaultSerializer.TypeInfoResolver;
|
|
})
|
|
.AddScoped<TokenAuthStateProvider>()
|
|
.AddScoped<AuthenticationStateProvider>(provider => provider.GetRequiredService<TokenAuthStateProvider>())
|
|
.AddScoped<RequestStats>()
|
|
.AddScoped<AuthService>()
|
|
.AddScoped<TimelineService>()
|
|
.AddScoped<FeedMemory>()
|
|
.AddScoped<StatusService>()
|
|
.AddScoped<AccountService>()
|
|
.AddScoped<PortabilityService>()
|
|
.AddScoped<AdminService>()
|
|
.AddScoped<InstanceAdminService>()
|
|
.AddScoped<ModerationService>()
|
|
.AddScoped<AboutService>()
|
|
.AddScoped<AnnouncementService>()
|
|
.AddScoped<EmojiService>()
|
|
.AddScoped<ArchiveService>()
|
|
.AddScoped<ListService>()
|
|
.AddScoped<FilterService>()
|
|
.AddScoped<DiscoveryService>()
|
|
.AddScoped<StreamingService>()
|
|
.AddScoped<PublicNoticeService>()
|
|
.AddScoped<PushService>()
|
|
.AddScoped<ConfirmService>()
|
|
.AddScoped<OverlayService>()
|
|
.AddScoped<MediaService>()
|
|
.AddScoped<GroupService>()
|
|
.AddScoped<InstanceService>()
|
|
.AddScoped<ProvenanceService>()
|
|
.AddScoped<ILoggingService, LoggingService>()
|
|
.AddScoped<ToastService>()
|
|
.AddSingleton(typeof(CoalescingStringLocalizer))
|
|
.AddTransient<IHttpService, HttpService>()
|
|
.AddHeadElementHelper(options => options.DisableClientScriptAutoInjection = true)
|
|
.AddLocalization()
|
|
.AddLogging(lb => lb.SetMinimumLevel(LogLevel.Debug));
|
|
|
|
var apiBaseAddress = builder.Configuration["AppConfiguration:ApiBaseAddress"];
|
|
builder.Services.AddHttpClient("default", client =>
|
|
{
|
|
client.BaseAddress = new Uri(string.IsNullOrEmpty(apiBaseAddress) ? builder.HostEnvironment.BaseAddress : apiBaseAddress.TrimEnd('/') + "/");
|
|
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
|
// each request has its own timeout (HttpService.Measure): an upload may take minutes, anything else 100 s
|
|
client.Timeout = Timeout.InfiniteTimeSpan;
|
|
});
|
|
|
|
builder.Services.AddSingleton(serviceProvider =>
|
|
{
|
|
var conf = serviceProvider.GetRequiredService<IConfiguration>();
|
|
return conf.GetSection(nameof(AppConfiguration)).Get<AppConfiguration>();
|
|
});
|
|
|
|
var host = builder.Build();
|
|
UnregisteredJson.Check(!builder.HostEnvironment.IsProduction());
|
|
await host.SetDefaultCulture();
|
|
await host.RunAsync(); |