WebSocketController.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using MediaBrowser.Common.Net;
  2. using MediaBrowser.Controller.Session;
  3. using MediaBrowser.Model.Net;
  4. using MediaBrowser.Model.Session;
  5. using System;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace MediaBrowser.Server.Implementations.Session
  10. {
  11. public class WebSocketController : ISessionRemoteController
  12. {
  13. public bool Supports(SessionInfo session)
  14. {
  15. return session.WebSockets.Any(i => i.State == WebSocketState.Open);
  16. }
  17. private IWebSocketConnection GetSocket(SessionInfo session)
  18. {
  19. var socket = session.WebSockets.OrderByDescending(i => i.LastActivityDate).FirstOrDefault(i => i.State == WebSocketState.Open);
  20. if (socket == null)
  21. {
  22. throw new InvalidOperationException("The requested session does not have an open web socket.");
  23. }
  24. return socket;
  25. }
  26. public Task SendSystemCommand(SessionInfo session, SystemCommand command, CancellationToken cancellationToken)
  27. {
  28. var socket = GetSocket(session);
  29. return socket.SendAsync(new WebSocketMessage<string>
  30. {
  31. MessageType = "SystemCommand",
  32. Data = command.ToString()
  33. }, cancellationToken);
  34. }
  35. public Task SendMessageCommand(SessionInfo session, MessageCommand command, CancellationToken cancellationToken)
  36. {
  37. var socket = GetSocket(session);
  38. return socket.SendAsync(new WebSocketMessage<MessageCommand>
  39. {
  40. MessageType = "MessageCommand",
  41. Data = command
  42. }, cancellationToken);
  43. }
  44. public Task SendPlayCommand(SessionInfo session, PlayRequest command, CancellationToken cancellationToken)
  45. {
  46. var socket = GetSocket(session);
  47. return socket.SendAsync(new WebSocketMessage<PlayRequest>
  48. {
  49. MessageType = "Play",
  50. Data = command
  51. }, cancellationToken);
  52. }
  53. public Task SendBrowseCommand(SessionInfo session, BrowseRequest command, CancellationToken cancellationToken)
  54. {
  55. var socket = GetSocket(session);
  56. return socket.SendAsync(new WebSocketMessage<BrowseRequest>
  57. {
  58. MessageType = "Browse",
  59. Data = command
  60. }, cancellationToken);
  61. }
  62. public Task SendPlaystateCommand(SessionInfo session, PlaystateRequest command, CancellationToken cancellationToken)
  63. {
  64. var socket = GetSocket(session);
  65. return socket.SendAsync(new WebSocketMessage<PlaystateRequest>
  66. {
  67. MessageType = "Playstate",
  68. Data = command
  69. }, cancellationToken);
  70. }
  71. }
  72. }