[backend/core] Dispose service scopes properly for long-running connections (WebSocket)

This commit is contained in:
Laura Hausmann 2024-03-24 14:34:07 +01:00
parent 736328078d
commit 6d49eb07ca
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
3 changed files with 23 additions and 15 deletions

View file

@ -60,7 +60,9 @@ public class PublicChannel(
try try
{ {
if (!IsApplicable(note)) return; if (!IsApplicable(note)) return;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var provider = scope.ServiceProvider;
var renderer = provider.GetRequiredService<NoteRenderer>(); var renderer = provider.GetRequiredService<NoteRenderer>();
var rendered = await renderer.RenderAsync(note, connection.Token.User); var rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage var message = new StreamingUpdateMessage
@ -82,7 +84,9 @@ public class PublicChannel(
try try
{ {
if (!IsApplicable(note)) return; if (!IsApplicable(note)) return;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var provider = scope.ServiceProvider;
var renderer = provider.GetRequiredService<NoteRenderer>(); var renderer = provider.GetRequiredService<NoteRenderer>();
var rendered = await renderer.RenderAsync(note, connection.Token.User); var rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage var message = new StreamingUpdateMessage

View file

@ -23,8 +23,8 @@ public class UserChannel(WebSocketConnection connection, bool notificationsOnly)
if (IsSubscribed) return; if (IsSubscribed) return;
IsSubscribed = true; IsSubscribed = true;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var db = provider.GetRequiredService<DatabaseContext>(); await using var db = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
_followedUsers = await db.Users.Where(p => p == connection.Token.User) _followedUsers = await db.Users.Where(p => p == connection.Token.User)
.SelectMany(p => p.Following) .SelectMany(p => p.Following)
@ -69,8 +69,9 @@ public class UserChannel(WebSocketConnection connection, bool notificationsOnly)
try try
{ {
if (!IsApplicable(note)) return; if (!IsApplicable(note)) return;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var renderer = provider.GetRequiredService<NoteRenderer>();
var renderer = scope.ServiceProvider.GetRequiredService<NoteRenderer>();
var rendered = await renderer.RenderAsync(note, connection.Token.User); var rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage var message = new StreamingUpdateMessage
{ {
@ -91,8 +92,9 @@ public class UserChannel(WebSocketConnection connection, bool notificationsOnly)
try try
{ {
if (!IsApplicable(note)) return; if (!IsApplicable(note)) return;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var renderer = provider.GetRequiredService<NoteRenderer>();
var renderer = scope.ServiceProvider.GetRequiredService<NoteRenderer>();
var rendered = await renderer.RenderAsync(note, connection.Token.User); var rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage var message = new StreamingUpdateMessage
{ {
@ -132,8 +134,9 @@ public class UserChannel(WebSocketConnection connection, bool notificationsOnly)
try try
{ {
if (!IsApplicable(notification)) return; if (!IsApplicable(notification)) return;
var provider = connection.Scope.ServiceProvider; await using var scope = connection.ScopeFactory.CreateAsyncScope();
var renderer = provider.GetRequiredService<NotificationRenderer>();
var renderer = scope.ServiceProvider.GetRequiredService<NotificationRenderer>();
NotificationEntity rendered; NotificationEntity rendered;
try try

View file

@ -20,6 +20,7 @@ public sealed class WebSocketConnection(
public readonly List<IChannel> Channels = []; public readonly List<IChannel> Channels = [];
public readonly EventService EventService = eventSvc; public readonly EventService EventService = eventSvc;
public readonly IServiceScope Scope = scopeFactory.CreateScope(); public readonly IServiceScope Scope = scopeFactory.CreateScope();
public readonly IServiceScopeFactory ScopeFactory = scopeFactory;
public readonly OauthToken Token = token; public readonly OauthToken Token = token;
public void Dispose() public void Dispose()