aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/WebSocket
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/WebSocket')
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs9
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs31
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/FleckServer.cs54
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/FleckWebSocket.cs47
4 files changed, 121 insertions, 20 deletions
diff --git a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs b/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
index ba34bd22e..797c4a80c 100644
--- a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
+++ b/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
@@ -90,6 +90,10 @@ namespace MediaBrowser.Server.Implementations.WebSocket
/// </summary>
public void Stop()
{
+ if (WebSocketServer != null)
+ {
+ WebSocketServer.Stop();
+ }
}
/// <summary>
@@ -107,7 +111,10 @@ namespace MediaBrowser.Server.Implementations.WebSocket
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool dispose)
{
-
+ if (WebSocketServer != null)
+ {
+ WebSocketServer.Dispose();
+ }
}
}
}
diff --git a/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs b/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
index 0b6b14566..958201625 100644
--- a/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
+++ b/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using System;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -42,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.WebSocket
UserContext = context;
context.SetOnDisconnect(OnDisconnected);
- context.SetOnReceive(OnReceive);
+ context.SetOnReceive(OnReceiveContext);
_logger.Info("Client connected from {0}", context.ClientAddress);
}
@@ -50,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.WebSocket
/// <summary>
/// The _disconnected
/// </summary>
- private bool _disconnected = false;
+ private bool _disconnected;
/// <summary>
/// Gets or sets the state.
/// </summary>
@@ -73,25 +72,13 @@ namespace MediaBrowser.Server.Implementations.WebSocket
/// Called when [receive].
/// </summary>
/// <param name="context">The context.</param>
- private void OnReceive(UserContext context)
+ private void OnReceiveContext(UserContext context)
{
- if (OnReceiveDelegate != null)
+ if (OnReceive != null)
{
var json = context.DataFrame.ToString();
- if (!string.IsNullOrWhiteSpace(json))
- {
- try
- {
- var bytes = Encoding.UTF8.GetBytes(json);
-
- OnReceiveDelegate(bytes);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error processing web socket message", ex);
- }
- }
+ OnReceive(json);
}
}
@@ -128,6 +115,12 @@ namespace MediaBrowser.Server.Implementations.WebSocket
/// Gets or sets the receive action.
/// </summary>
/// <value>The receive action.</value>
- public Action<byte[]> OnReceiveDelegate { get; set; }
+ public Action<byte[]> OnReceiveBytes { get; set; }
+
+ /// <summary>
+ /// Gets or sets the on receive.
+ /// </summary>
+ /// <value>The on receive.</value>
+ public Action<string> OnReceive { get; set; }
}
}
diff --git a/MediaBrowser.Server.Implementations/WebSocket/FleckServer.cs b/MediaBrowser.Server.Implementations/WebSocket/FleckServer.cs
new file mode 100644
index 000000000..2c47a366e
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/WebSocket/FleckServer.cs
@@ -0,0 +1,54 @@
+using Fleck;
+using MediaBrowser.Common.Net;
+using System;
+using IWebSocketServer = MediaBrowser.Common.Net.IWebSocketServer;
+
+namespace MediaBrowser.Server.Implementations.WebSocket
+{
+ public class FleckServer : IWebSocketServer
+ {
+ private WebSocketServer _server;
+
+ public void Start(int portNumber)
+ {
+ var server = new WebSocketServer("ws://localhost:" + portNumber);
+
+ server.Start(socket =>
+ {
+ socket.OnOpen = () => OnClientConnected(socket);
+ });
+
+ _server = server;
+ }
+
+ public void Stop()
+ {
+ _server.Dispose();
+ }
+
+ private void OnClientConnected(Fleck.IWebSocketConnection context)
+ {
+ if (WebSocketConnected != null)
+ {
+ var socket = new FleckWebSocket(context);
+
+ WebSocketConnected(this, new WebSocketConnectEventArgs
+ {
+ WebSocket = socket,
+ Endpoint = context.ConnectionInfo.ClientIpAddress + ":" + context.ConnectionInfo.ClientPort
+ });
+ }
+ }
+ public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
+
+ public int Port
+ {
+ get { return _server.Port; }
+ }
+
+ public void Dispose()
+ {
+ _server.Dispose();
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/WebSocket/FleckWebSocket.cs b/MediaBrowser.Server.Implementations/WebSocket/FleckWebSocket.cs
new file mode 100644
index 000000000..3667fab07
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/WebSocket/FleckWebSocket.cs
@@ -0,0 +1,47 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Net;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using IWebSocketConnection = Fleck.IWebSocketConnection;
+
+namespace MediaBrowser.Server.Implementations.WebSocket
+{
+ public class FleckWebSocket : IWebSocket
+ {
+ private readonly IWebSocketConnection _connection;
+
+ public FleckWebSocket(IWebSocketConnection connection)
+ {
+ _connection = connection;
+
+ _connection.OnMessage = OnReceiveData;
+ }
+
+ public WebSocketState State
+ {
+ get { return _connection.IsAvailable ? WebSocketState.Open : WebSocketState.Closed; }
+ }
+
+ private void OnReceiveData(string data)
+ {
+ if (OnReceive != null)
+ {
+ OnReceive(data);
+ }
+ }
+
+ public Task SendAsync(byte[] bytes, WebSocketMessageType type, bool endOfMessage, CancellationToken cancellationToken)
+ {
+ return Task.Run(() => _connection.Send(bytes));
+ }
+
+ public void Dispose()
+ {
+ _connection.Close();
+ }
+
+ public Action<byte[]> OnReceiveBytes { get; set; }
+ public Action<string> OnReceive { get; set; }
+ }
+}