From fb0b108c2198b56951f19cd65d0bf8bda8a12b1f Mon Sep 17 00:00:00 2001 From: jvyden Date: Thu, 20 Jan 2022 21:28:09 -0500 Subject: [PATCH] Automatically warmup website hot reload when starting up debug builds --- .../Startup/DebugWarmupLifetime.cs | 52 +++++++++++++++++++ ProjectLighthouse/Startup/Startup.cs | 7 +++ 2 files changed, 59 insertions(+) create mode 100644 ProjectLighthouse/Startup/DebugWarmupLifetime.cs diff --git a/ProjectLighthouse/Startup/DebugWarmupLifetime.cs b/ProjectLighthouse/Startup/DebugWarmupLifetime.cs new file mode 100644 index 00000000..7f50ae6d --- /dev/null +++ b/ProjectLighthouse/Startup/DebugWarmupLifetime.cs @@ -0,0 +1,52 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Kettu; +using LBPUnion.ProjectLighthouse.Logging; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Hosting.Internal; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace LBPUnion.ProjectLighthouse.Startup; + +public class DebugWarmupLifetime : IHostLifetime +{ + public IHostApplicationLifetime ApplicationLifetime { get; } + + private CancellationTokenRegistration applicationStartedRegistration; + + private readonly ConsoleLifetime consoleLifetime; + + public DebugWarmupLifetime + ( + IOptions options, + IHostEnvironment environment, + IHostApplicationLifetime applicationLifetime, + IOptions hostOptions, + ILoggerFactory loggerFactory + ) + { + this.consoleLifetime = new ConsoleLifetime(options, environment, applicationLifetime, hostOptions, loggerFactory); + this.ApplicationLifetime = applicationLifetime; + } + + public static void OnApplicationStarted() + { + using HttpClient client = new(); + + Logger.Log("Warming up Hot Reload...", LoggerLevelStartup.Instance); + client.GetAsync("http://localhost:10060/").Wait(); + Logger.Log("Hot Reload is ready to go!", LoggerLevelStartup.Instance); + } + + public Task StopAsync(CancellationToken cancellationToken) => this.consoleLifetime.StopAsync(cancellationToken); + + public Task WaitForStartAsync(CancellationToken cancellationToken) + { + this.applicationStartedRegistration = this.ApplicationLifetime.ApplicationStarted.Register((Action)(_ => OnApplicationStarted()), (object)this); + + return this.consoleLifetime.WaitForStartAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/ProjectLighthouse/Startup/Startup.cs b/ProjectLighthouse/Startup/Startup.cs index c959a6af..20e0115a 100644 --- a/ProjectLighthouse/Startup/Startup.cs +++ b/ProjectLighthouse/Startup/Startup.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Primitives; namespace LBPUnion.ProjectLighthouse.Startup; @@ -53,6 +54,12 @@ public class Startup options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; } ); + + #if DEBUG + services.AddSingleton(); + #else + services.AddSingleton(); + #endif } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.