[backend/core] Dispose service scopes properly for long-running connections (WebSocket)
This commit is contained in:
parent
736328078d
commit
6d49eb07ca
3 changed files with 23 additions and 15 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue