From 90fcd1b717fe67b802b395f993bb0e17ff07688e Mon Sep 17 00:00:00 2001 From: VinPropane Date: Wed, 8 Apr 2026 21:42:33 -0400 Subject: [PATCH] NEON-15: dispose shared NpgsqlDataSource on host shutdown --- .../InMemoryWebApplicationFactory.cs | 3 ++- .../NpgsqlDataSourceShutdownHostedService.cs | 15 +++++++++++++++ .../PositionStateServiceCollectionExtensions.cs | 3 ++- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 server/NeonSprawl.Server/Game/PositionState/NpgsqlDataSourceShutdownHostedService.cs diff --git a/server/NeonSprawl.Server.Tests/InMemoryWebApplicationFactory.cs b/server/NeonSprawl.Server.Tests/InMemoryWebApplicationFactory.cs index b4f4ccc..210d27a 100644 --- a/server/NeonSprawl.Server.Tests/InMemoryWebApplicationFactory.cs +++ b/server/NeonSprawl.Server.Tests/InMemoryWebApplicationFactory.cs @@ -21,7 +21,8 @@ public sealed class InMemoryWebApplicationFactory : WebApplicationFactoryDisposes the shared when the host stops. Registered before so runs last (NEON-15). +internal sealed class NpgsqlDataSourceShutdownHostedService(NpgsqlDataSource dataSource) : IHostedService +{ + public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; + + public async Task StopAsync(CancellationToken cancellationToken) + { + await dataSource.DisposeAsync(); + } +} diff --git a/server/NeonSprawl.Server/Game/PositionState/PositionStateServiceCollectionExtensions.cs b/server/NeonSprawl.Server/Game/PositionState/PositionStateServiceCollectionExtensions.cs index 6d309d4..0514272 100644 --- a/server/NeonSprawl.Server/Game/PositionState/PositionStateServiceCollectionExtensions.cs +++ b/server/NeonSprawl.Server/Game/PositionState/PositionStateServiceCollectionExtensions.cs @@ -13,7 +13,8 @@ public static class PositionStateServiceCollectionExtensions if (!string.IsNullOrWhiteSpace(cs)) { var trimmed = cs.Trim(); - services.AddSingleton(_ => Npgsql.NpgsqlDataSource.Create(trimmed)); + services.AddSingleton(_ => Npgsql.NpgsqlDataSource.Create(trimmed)); + services.AddHostedService(); services.AddHostedService(); services.AddSingleton(); }