From e051007ecdb3097bc9942fd9db369101a9568a0d Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Sat, 23 Dec 2023 08:54:55 +0100 Subject: Basic test --- ModAS.Server/Program.cs | 111 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 ModAS.Server/Program.cs (limited to 'ModAS.Server/Program.cs') diff --git a/ModAS.Server/Program.cs b/ModAS.Server/Program.cs new file mode 100644 index 0000000..cba8d69 --- /dev/null +++ b/ModAS.Server/Program.cs @@ -0,0 +1,111 @@ +using Microsoft.AspNetCore.Http.Timeouts; +using Microsoft.OpenApi.Models; +using ModAS.Server; +using System.Diagnostics; +using System.Text.Json; +using LibMatrix; +using LibMatrix.Services; +using ModAS.Server.Services; +using MxApiExtensions.Services; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.WriteIndented = true; }); +///add wwwroot +// builder.Services.AddDirectoryBrowser(); +// Add services to the container. +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(c => { + c.SwaggerDoc("v1", new OpenApiInfo() { + Version = "v1", + Title = "Rory&::ModAS", + Description = "Moderation tooling, embracing the power of AppServices" + }); + c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "ModAS.Server.xml")); +}); + +builder.Services.AddSingleton(); + +builder.Services.AddSingleton(); + +builder.Services.AddScoped(); +builder.Services.AddScoped(); +// builder.Services.AddScoped(); + +builder.Services.AddSingleton(x => { + var config = x.GetRequiredService(); + return new TieredStorageService( + cacheStorageProvider: new FileStorageProvider("/run"), + dataStorageProvider: new FileStorageProvider("/run") + ); +}); +builder.Services.AddRoryLibMatrixServices(); + +//trace init time for app service registration +if (File.Exists("appservice_registration.yaml")) { + await using var stream = File.OpenRead("appservice_registration.yaml"); + builder.Services.AddSingleton(await JsonSerializer.DeserializeAsync(stream) ?? + throw new Exception("Failed to deserialize appservice registration file")); +} +else { + var sw = Stopwatch.StartNew(); + var asr = new AppServiceRegistration(); + File.WriteAllText("appservice_registration.yaml", JsonSerializer.Serialize(asr, new JsonSerializerOptions() { WriteIndented = true })); + sw.Stop(); + Console.WriteLine($"Generated AppService registration file in {sw.Elapsed}!"); + builder.Services.AddSingleton(asr); +} + +builder.Services.AddRequestTimeouts(x => { + x.DefaultPolicy = new RequestTimeoutPolicy { + Timeout = TimeSpan.FromMinutes(10), + WriteTimeoutResponse = async context => { + context.Response.StatusCode = 504; + context.Response.ContentType = "application/json"; + await context.Response.StartAsync(); + await context.Response.WriteAsJsonAsync(new MatrixException() { + ErrorCode = "M_TIMEOUT", + Error = "Request timed out" + }.GetAsJson()); + await context.Response.CompleteAsync(); + } + }; +}); + +// builder.Services.AddCors(x => x.AddDefaultPolicy(y => y.AllowAnyHeader().AllowCredentials().AllowAnyOrigin().AllowAnyMethod())); +builder.Services.AddCors(options => { + options.AddPolicy( + "Open", + policy => policy.AllowAnyOrigin().AllowAnyHeader()); +}); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +// if (app.Environment.IsDevelopment()) { +app.UseSwagger(); +app.UseSwaggerUI(c => { + c.EnableTryItOutByDefault(); +}); +app.UseReDoc(c => { + c.EnableUntrustedSpec(); + c.ScrollYOffset(10); + c.HideHostname(); + c.HideDownloadButton(); + c.HideLoading(); + c.ExpandResponses("200,201"); + c.RequiredPropsFirst(); +}); +// } + +///wwwroot +app.UseFileServer(); +// app.UseStaticFiles(); +// app.UseDirectoryBrowser(); + +app.UseCors("Open"); + +app.MapControllers(); + +app.Run(); \ No newline at end of file -- cgit 1.5.1