|
23 | 23 |
|
24 | 24 | FlurlHttp.Clients.UseNewtonsoft(); |
25 | 25 |
|
26 | | -builder.Host.UseSerilog((context, cfg) => cfg.ReadFrom.Configuration(context.Configuration)); |
| 26 | +builder.Host.UseSerilog((ctx, cfg) => cfg.ReadFrom.Configuration(ctx.Configuration)); |
27 | 27 |
|
28 | 28 | Log.Logger.Information(MathNet.Numerics.Control.Describe().Trim('\r', '\n')); |
29 | 29 |
|
30 | | -var configDir = Environment.GetEnvironmentVariable("CONFIG_DIR") ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".espresense"); |
| 30 | +var configDir = Environment.GetEnvironmentVariable("CONFIG_DIR") |
| 31 | + ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".espresense"); |
31 | 32 | var storageDir = Path.Combine(configDir, ".storage"); |
32 | 33 | Directory.CreateDirectory(storageDir); |
33 | 34 |
|
34 | 35 | var configLoader = new ConfigLoader(configDir); |
35 | | - |
36 | | -builder.Services.AddSingleton(a => configLoader); |
37 | | -builder.Services.AddHostedService(a => configLoader); |
| 36 | +builder.Services.AddSingleton(_ => configLoader); |
| 37 | +builder.Services.AddHostedService(_ => configLoader); |
38 | 38 |
|
39 | 39 | builder.Services.AddDataProtection() |
40 | | - .UseEphemeralDataProtectionProvider(); |
| 40 | + .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(storageDir, "keys"))); |
41 | 41 |
|
42 | | -builder.Services.AddSingleton(a => |
| 42 | +builder.Services.AddSingleton(_ => |
43 | 43 | { |
44 | 44 | SQLitePCL.Batteries.Init(); |
45 | | - var databasePath = Path.Combine(storageDir, "history.db"); |
46 | | - Directory.CreateDirectory(Path.GetDirectoryName(databasePath) ?? throw new InvalidOperationException("HOME not found")); |
47 | | - var sqLiteConnection = new SQLiteAsyncConnection(databasePath) |
| 45 | + var dbPath = Path.Combine(storageDir, "history.db"); |
| 46 | + Directory.CreateDirectory(Path.GetDirectoryName(dbPath)!); |
| 47 | + return new SQLiteAsyncConnection(dbPath) |
48 | 48 | { |
49 | 49 | Trace = true, |
50 | 50 | Tracer = Log.Debug |
51 | 51 | }; |
52 | | - |
53 | | - return sqLiteConnection; |
54 | 52 | }); |
55 | 53 |
|
56 | 54 | builder.Services.AddAutoMapper(cfg => |
|
60 | 58 |
|
61 | 59 | builder.Services.AddSingleton<HttpClient>(); |
62 | 60 | builder.Services.AddSingleton<DatabaseFactory>(); |
63 | | -builder.Services.AddSingleton<IMqttNetLogger>(a => new MqttNetLogger()); |
| 61 | +builder.Services.AddSingleton<IMqttNetLogger>(_ => new MqttNetLogger()); |
64 | 62 | builder.Services.AddSingleton<MqttCoordinator>(); |
65 | | -builder.Services.AddSingleton<IMqttCoordinator>(provider => provider.GetRequiredService<MqttCoordinator>()); |
| 63 | +builder.Services.AddSingleton<IMqttCoordinator>(p => p.GetRequiredService<MqttCoordinator>()); |
66 | 64 | builder.Services.AddSingleton<TelemetryService>(); |
67 | 65 | builder.Services.AddSingleton<GlobalEventDispatcher>(); |
68 | 66 | builder.Services.AddSingleton<DeviceTracker>(); |
|
78 | 76 |
|
79 | 77 | builder.Services.AddHostedService<MultiScenarioLocator>(); |
80 | 78 | builder.Services.AddHostedService<OptimizationRunner>(); |
81 | | -builder.Services.AddHostedService(provider => provider.GetRequiredService<DeviceTracker>()); |
82 | | -builder.Services.AddHostedService(provider => provider.GetRequiredService<DeviceSettingsStore>()); |
83 | | -builder.Services.AddHostedService(provider => provider.GetRequiredService<NodeSettingsStore>()); |
84 | | -builder.Services.AddHostedService(provider => provider.GetRequiredService<NodeTelemetryStore>()); |
85 | | -builder.Services.AddHostedService(provider => provider.GetRequiredService<TelemetryService>()); |
| 79 | +builder.Services.AddHostedService(p => p.GetRequiredService<DeviceTracker>()); |
| 80 | +builder.Services.AddHostedService(p => p.GetRequiredService<DeviceSettingsStore>()); |
| 81 | +builder.Services.AddHostedService(p => p.GetRequiredService<NodeSettingsStore>()); |
| 82 | +builder.Services.AddHostedService(p => p.GetRequiredService<NodeTelemetryStore>()); |
| 83 | +builder.Services.AddHostedService(p => p.GetRequiredService<TelemetryService>()); |
86 | 84 | builder.Services.AddHostedService<DeviceCleanupService>(); |
87 | 85 | builder.Services.AddSingleton<State>(); |
88 | 86 | builder.Services.AddControllersWithViews().AddJsonOptions(opt => |
|
103 | 101 |
|
104 | 102 | var app = builder.Build(); |
105 | 103 |
|
106 | | -app.UseWebSockets(new WebSocketOptions |
107 | | -{ |
108 | | - KeepAliveInterval = TimeSpan.FromMinutes(15) |
109 | | -}); |
| 104 | +app.UseWebSockets(new WebSocketOptions { KeepAliveInterval = TimeSpan.FromMinutes(15) }); |
110 | 105 |
|
111 | 106 | app.UseSerilogRequestLogging(o => |
112 | 107 | { |
113 | | - o.EnrichDiagnosticContext = (dc, ctx) => dc.Set("UserAgent", ctx?.Request.Headers.UserAgent); |
114 | | - o.GetLevel = (ctx, ms, ex) => ex != null ? LogEventLevel.Error : ctx.Response.StatusCode > 499 ? LogEventLevel.Error : ms > 500 ? LogEventLevel.Warning : ctx.Request.Path.Value.IndexOf("/state", StringComparison.OrdinalIgnoreCase) > 0 ? LogEventLevel.Verbose : LogEventLevel.Debug; |
| 108 | + o.EnrichDiagnosticContext = (dc, ctx) => dc.Set("UserAgent", ctx.Request.Headers.UserAgent); |
| 109 | + o.GetLevel = (ctx, elapsedMs, ex) => |
| 110 | + ex != null ? LogEventLevel.Error : |
| 111 | + ctx.Response.StatusCode > 499 ? LogEventLevel.Error : |
| 112 | + elapsedMs > 500 ? LogEventLevel.Warning : |
| 113 | + ctx.Request.Path.Value?.Contains("/state", StringComparison.OrdinalIgnoreCase) == true |
| 114 | + ? LogEventLevel.Verbose |
| 115 | + : LogEventLevel.Debug; |
115 | 116 | }); |
116 | 117 |
|
117 | 118 | app.UseSwagger(c => c.RouteTemplate = "api/swagger/{documentName}/swagger.{json|yaml}"); |
118 | | -app.UseSwaggerUI(c => c.RoutePrefix = "api/swagger"); |
| 119 | +app.UseSwaggerUI(c => |
| 120 | +{ |
| 121 | + c.SwaggerEndpoint("/api/swagger/v1/swagger.json", "v1"); |
| 122 | + c.RoutePrefix = "api/swagger"; |
| 123 | +}); |
119 | 124 |
|
120 | | -app.UseStaticFiles(); |
121 | | -app.UseRouting(); |
| 125 | +app.MapStaticAssets(); |
122 | 126 | app.MapMcp("/api/mcp"); |
123 | | - |
124 | | -app.MapControllerRoute( |
125 | | - name: "default", |
126 | | - pattern: "{controller}/{action=Index}/{id?}"); |
| 127 | +app.MapControllers(); |
127 | 128 |
|
128 | 129 | app.MapFallbackToFile("index.html"); |
129 | 130 |
|
|
0 commit comments