Skip to content

Commit b979b9b

Browse files
committed
Adds example of using preConnectionHandler, create OnConnectionHandler(preConnectionHandler), use WebSocketOptions for provides data
1 parent 8661e3e commit b979b9b

6 files changed

Lines changed: 40 additions & 9 deletions

File tree

Examples/Program.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using yawaflua.WebSockets;
1+
using System.Net.WebSockets;
2+
using yawaflua.WebSockets;
3+
using yawaflua.WebSockets.Core;
4+
using yawaflua.WebSockets.Models.Interfaces;
25

36
namespace Examples;
47

@@ -26,6 +29,19 @@ public void ConfigureServices(IServiceCollection services)
2629
services.AddHttpLogging();
2730
services.AddSingleton<TestWebSocketServer>();
2831
services.AddSingleton<ChatController>();
32+
services.AddSingleton(new WebSocketConfig()
33+
{
34+
OnOpenHandler = async (socket, context) =>
35+
{
36+
if (socket.WebSocketManager!.GetAllClients().Count(k =>
37+
Equals(k.ConnectionInfo!.RemoteIpAddress!.MapToIPv4(),
38+
socket.Client.ConnectionInfo!.RemoteIpAddress!.MapToIPv4())) >= 3)
39+
{
40+
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Too many users");
41+
}
42+
Console.WriteLine($"{socket.Client.Id} has been connected to {socket.Client.Path}");
43+
}
44+
});
2945
services.AddScoped<IConfiguration>(k => new ConfigurationBuilder()
3046
.AddJsonFile("appsettings.json", true)
3147
.Build());

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public class ChatController : WebSocketController
112112
}
113113
```
114114

115+
## Run any code on connection to
115116

116117
## Lifecycle Management
117118
1. **Connection** - Automatically handled by middleware

yawaflua.WebSockets/Core/WebSocket.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ internal class WebSocket : IWebSocket
1111
private readonly string? _message;
1212

1313
public WebSocketState State => _webSocket.State;
14+
public IWebSocketManager WebSocketManager { get; }
1415
public WebSocketCloseStatus? CloseStatus => _webSocket.CloseStatus;
1516
public string? SubProtocol => _webSocket.SubProtocol;
1617
public string? CloseStatusDescription => _webSocket.CloseStatusDescription;
1718
public string? Message => _message;
1819
public WebSocketMessageType? MessageType => _webSocketReceiveResult?.MessageType;
1920
public IWebSocketClient Client { get; }
20-
internal WebSocket(System.Net.WebSockets.WebSocket webSocket, WebSocketReceiveResult? webSocketReceiveResult, string? message, IWebSocketClient client)
21+
internal WebSocket(System.Net.WebSockets.WebSocket webSocket,
22+
IWebSocketClient client,
23+
IWebSocketManager webSocketManager,
24+
string? message = null,
25+
WebSocketReceiveResult? webSocketReceiveResult = null)
2126
{
2227
_webSocket = webSocket;
2328
_webSocketReceiveResult = webSocketReceiveResult;
2429
_message = message;
2530
Client = client;
31+
WebSocketManager = webSocketManager;
2632
}
2733

2834
public async Task SendAsync(string m, WebSocketMessageType messageType = WebSocketMessageType.Text, CancellationToken cts = default)

yawaflua.WebSockets/Core/WebSocketRouter.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ internal void DiscoverHandlers()
6565

6666
var parameters = func.GetParameters();
6767
if (parameters.Length != 2 ||
68-
parameters[0].ParameterType != typeof(WebSocket) ||
68+
parameters[0].ParameterType != typeof(IWebSocket) ||
6969
parameters[1].ParameterType != typeof(HttpContext) ||
7070
func.ReturnType != typeof(Task))
7171
{
@@ -147,13 +147,14 @@ await Task.Run(async () =>
147147
{
148148
try
149149
{
150+
var webSocketManager = new WebSocketManager();
150151
var client = new WebSocketClient(context, webSocket, path);
151152
Clients.Add(client);
152153

153154
await Task.Run(async () =>
154155
{
155156
if (_webSocketConfig?.OnOpenHandler != null)
156-
await _webSocketConfig.OnOpenHandler((webSocket as IWebSocket)!, context);
157+
await _webSocketConfig.OnOpenHandler(new WebSocket(webSocket, client, webSocketManager)!, context);
157158
}, cts);
158159

159160
var buffer = new byte[1024 * 4];
@@ -164,13 +165,16 @@ await Task.Run(async () =>
164165
await handler(
165166
new WebSocket(
166167
webSocket,
167-
result,
168+
client,
169+
webSocketManager,
168170
Encoding.UTF8.GetString(buffer, 0, result.Count),
169-
client),
170-
context);
171+
result), context);
171172
else
172173
Clients.Remove(client);
173174
}
175+
176+
if (Clients.Any(k => k.Id == client.Id))
177+
Clients.Remove(client);
174178
}
175179
catch (Exception ex)
176180
{

yawaflua.WebSockets/Models/Interfaces/IWebSocket.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System.Net.WebSockets;
2+
using yawaflua.WebSockets.Core;
23

34
namespace yawaflua.WebSockets.Models.Interfaces;
45

56
public interface IWebSocket : IDisposable
67
{
78
WebSocketState State { get; }
9+
IWebSocketManager WebSocketManager { get; }
810
WebSocketCloseStatus? CloseStatus { get; }
911
string? SubProtocol { get; }
1012
string? CloseStatusDescription { get; }

yawaflua.WebSockets/ServiceBindings.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ namespace yawaflua.WebSockets;
88

99
public static class ServiceBindings
1010
{
11-
public static IServiceCollection SettingUpWebSockets(this IServiceCollection isc, Action<WebSocketOptions>? socketOptions = null)
11+
public static IServiceCollection SettingUpWebSockets(this IServiceCollection isc, WebSocketConfig? socketOptions = null)
1212
{
1313
isc.AddSingleton<WebSocketRouter>();
14+
if (socketOptions != null) isc.AddSingleton(socketOptions);
15+
if (isc.All(k => k.ServiceType != typeof(WebSocketConfig)))
16+
isc.AddSingleton(new WebSocketConfig());
1417
isc.AddScoped<IWebSocketManager, WebSocketManager>();
1518
isc.AddSingleton<WebSocketMiddleware>();
16-
isc.Configure("WebSocketOptions", socketOptions);
1719
return isc;
1820
}
1921

0 commit comments

Comments
 (0)