using Bts.DataStreamCore.Services; using Bts.PubSub.Services; using Bts.SharedStreams.Services; using Spark.Api.Services; using Spark.Core.Services; using System.Reactive.Linq; using System.Reflection; var builder = WebApplication.CreateBuilder(new WebApplicationOptions { Args = args, ApplicationName = "Bts.DataStreamWebApp.Server", }); ConfigureApp(builder.Configuration, builder.Environment.EnvironmentName); ConfigureServices(builder.Services, builder.Configuration); var app = builder.Build(); var wsOpts = new WebSocketOptions { KeepAliveInterval = TimeSpan.FromMinutes(2) }; if (app.Environment.IsDevelopment()) { app.UseDirectoryBrowser("/browse"); app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseWebSockets(wsOpts); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseAuthorization(); app.MapControllers(); try { Console.Write($"Starting Application"); app.Run(); Console.Write($"Application exited gracefully."); } catch (Exception ex) { Console.Error.Write($"Application crashed: {ex}"); return 1; } return 0; static void ConfigureApp(ConfigurationManager configBuilder, string environment) { // We prefix appsettings with the exe name because multiple exes will usually be in the build dir // (this way, each exe can still load its own appsettings files from the current directory). var exeName = Assembly.GetCallingAssembly().GetName().Name; AddJsonFile($"{exeName}.appsettings.json"); AddJsonFile($"{exeName}.appsettings.{environment}.json"); var cfg = configBuilder.GetSection("config")?.Value; if (!SetBasePath(cfg)) { AddJsonFile(cfg); } bool SetBasePath(string? path) { if (!Directory.Exists(path)) { return false; } configBuilder.SetBasePath(path); return true; } bool AddJsonFile(string? path) { if (!File.Exists(path)) { return false; } configBuilder.AddJsonFile(path); return true; } } static void ConfigureServices(IServiceCollection services, IConfiguration config) { services.AddDirectoryBrowser() .AddControllers().Services .AddEndpointsApiExplorer() .AddSwaggerGen(); services.AddSpaStaticFiles(); services.AddSpark(config.GetSection("Spark")) .AddSparkApi(config.GetSection("SparkApi")) .AddMasterWorker(config.GetSection("MasterWorker")) .AddViewStreamDatabase() .AddPrimitiveDataStreamFactory(config.GetSection("PrimitiveStreams")) .AddOhlcvStreams(config.GetSection("StreamDatabase")) .AddNaturalLanguageStreams(config.GetSection("NaturalLanguageStream")) .AddCompositeDataStreamFactory() .AddPubSubClient(config.GetSection("PubSub")); }