[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
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue