EventManager.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Threading.Tasks;
  3. using MediaBrowser.Controller;
  4. using MediaBrowser.Controller.Events;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Microsoft.Extensions.Logging;
  7. namespace Jellyfin.Server.Implementations.Events
  8. {
  9. /// <summary>
  10. /// Handles the firing of events.
  11. /// </summary>
  12. public class EventManager : IEventManager
  13. {
  14. private readonly ILogger<EventManager> _logger;
  15. private readonly IServerApplicationHost _appHost;
  16. /// <summary>
  17. /// Initializes a new instance of the <see cref="EventManager"/> class.
  18. /// </summary>
  19. /// <param name="logger">The logger.</param>
  20. /// <param name="appHost">The application host.</param>
  21. public EventManager(ILogger<EventManager> logger, IServerApplicationHost appHost)
  22. {
  23. _logger = logger;
  24. _appHost = appHost;
  25. }
  26. /// <inheritdoc />
  27. public void Publish<T>(T eventArgs)
  28. where T : EventArgs
  29. {
  30. PublishInternal(eventArgs).GetAwaiter().GetResult();
  31. }
  32. /// <inheritdoc />
  33. public async Task PublishAsync<T>(T eventArgs)
  34. where T : EventArgs
  35. {
  36. await PublishInternal(eventArgs).ConfigureAwait(false);
  37. }
  38. private async Task PublishInternal<T>(T eventArgs)
  39. where T : EventArgs
  40. {
  41. using var scope = _appHost.ServiceProvider?.CreateScope();
  42. if (scope is null)
  43. {
  44. return;
  45. }
  46. foreach (var service in scope.ServiceProvider.GetServices<IEventConsumer<T>>())
  47. {
  48. try
  49. {
  50. await service.OnEvent(eventArgs).ConfigureAwait(false);
  51. }
  52. catch (Exception e)
  53. {
  54. _logger.LogError(e, "Uncaught exception in EventConsumer {Type}: ", service.GetType());
  55. }
  56. }
  57. }
  58. }
  59. }