KickSubscriberService.cs 917 B

12345678910111213141516171819202122232425262728
  1. using Application.Abstractions.Cache;
  2. using Application.Abstractions.Chat;
  3. using Microsoft.AspNetCore.SignalR;
  4. using StackExchange.Redis;
  5. using Web.Api.Hubs;
  6. namespace Web.Api.Services;
  7. public sealed class KickSubscriberService(
  8. IConnectionMultiplexer redis,
  9. IHubContext<ChatHub, IChatHubClient> hubContext
  10. ) : IHostedService
  11. {
  12. public async Task StartAsync(CancellationToken cancellationToken)
  13. {
  14. await redis.GetSubscriber().SubscribeAsync(
  15. RedisChannel.Literal(CacheKeys.ChatKickChannel),
  16. async (_, connectionId) =>
  17. {
  18. if (!connectionId.IsNullOrEmpty)
  19. await hubContext.Clients.Client(connectionId!).Kick();
  20. });
  21. }
  22. public async Task StopAsync(CancellationToken cancellationToken)
  23. => await redis.GetSubscriber().UnsubscribeAsync(
  24. RedisChannel.Literal(CacheKeys.ChatKickChannel));
  25. }