diff --git a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs index bfb856a4..431664ff 100644 --- a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs @@ -22,7 +22,7 @@ public static class ServiceExtensions public static void AddServices(this IServiceCollection services) { // Transient = instantiated per request and class - //services.AddTransient(); + services.AddTransient(); // Scoped = instantiated per request services diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/UserResolver.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/UserResolver.cs index 48fa9012..31637f8b 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/UserResolver.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/UserResolver.cs @@ -5,7 +5,12 @@ using Iceshrimp.Backend.Core.Services; namespace Iceshrimp.Backend.Core.Federation.ActivityPub; -public class UserResolver(ILogger logger, UserService userSvc, WebFingerService webFingerSvc) +public class UserResolver( + ILogger logger, + UserService userSvc, + WebFingerService webFingerSvc, + FollowupTaskService followupTaskSvc +) { /* * The full web finger algorithm: @@ -110,7 +115,14 @@ public class UserResolver(ILogger logger, UserService userSvc, Web try { - return await userSvc.UpdateUserAsync(user).WaitAsync(TimeSpan.FromMilliseconds(1500)); + var task = followupTaskSvc.ExecuteTask("UpdateUserAsync", async provider => + { + var bgUserSvc = provider.GetRequiredService(); + await bgUserSvc.UpdateUserAsync(user); + }); + + // Return early, but continue execution in background + await task.WaitAsync(TimeSpan.FromMilliseconds(1500)); } catch (Exception e) { diff --git a/Iceshrimp.Backend/Core/Services/FollowupTaskService.cs b/Iceshrimp.Backend/Core/Services/FollowupTaskService.cs new file mode 100644 index 00000000..c5b149eb --- /dev/null +++ b/Iceshrimp.Backend/Core/Services/FollowupTaskService.cs @@ -0,0 +1,22 @@ +namespace Iceshrimp.Backend.Core.Services; + +public class FollowupTaskService(IServiceScopeFactory serviceScopeFactory) +{ + public Task ExecuteTask(string taskName, Func work) + { + return Task.Run(async () => + { + using var scope = serviceScopeFactory.CreateScope(); + try + { + var provider = scope.ServiceProvider; + await work(provider); + } + catch (Exception e) + { + var logger = scope.ServiceProvider.GetRequiredService>(); + logger.LogError("Failed to execute background task {name}: {error}", taskName, e.ToString()); + } + }); + } +} \ No newline at end of file