[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
{
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 rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage
@ -82,7 +84,9 @@ public class PublicChannel(
try
{
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 rendered = await renderer.RenderAsync(note, connection.Token.User);
var message = new StreamingUpdateMessage

View file

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

View file

@ -16,11 +16,12 @@ public sealed class WebSocketConnection(
CancellationToken ct
) : IDisposable
{
private readonly SemaphoreSlim _lock = new(1);
public readonly List<IChannel> Channels = [];
public readonly EventService EventService = eventSvc;
public readonly IServiceScope Scope = scopeFactory.CreateScope();
public readonly OauthToken Token = token;
private readonly SemaphoreSlim _lock = new(1);
public readonly List<IChannel> Channels = [];
public readonly EventService EventService = eventSvc;
public readonly IServiceScope Scope = scopeFactory.CreateScope();
public readonly IServiceScopeFactory ScopeFactory = scopeFactory;
public readonly OauthToken Token = token;
public void Dispose()
{