Add WebSocket listener support to NatsServer alongside the existing TCP listener. When WebSocketOptions.Port >= 0, the server binds a second socket, performs HTTP upgrade via WsUpgrade.TryUpgradeAsync, wraps the connection in WsConnection for transparent frame/deframe, and hands it to the standard NatsClient pipeline. Changes: - NatsClient: add IsWebSocket and WsInfo properties - NatsServer: add RunWebSocketAcceptLoopAsync and AcceptWebSocketClientAsync, WS listener lifecycle in StartAsync/ShutdownAsync/Dispose - NatsOptions: change WebSocketOptions.Port default from 0 to -1 (disabled) - WsConnection.ReadAsync: fix premature end-of-stream when ReadFrames returns no payloads by looping until data is available - Add WsIntegration tests (connect, ping, pub/sub over WebSocket) - Add WsConnection masked frame and end-of-stream unit tests
27 lines
693 B
C#
27 lines
693 B
C#
using Shouldly;
|
|
|
|
namespace NATS.Server.Tests.WebSocket;
|
|
|
|
public class WebSocketOptionsTests
|
|
{
|
|
[Fact]
|
|
public void DefaultOptions_PortIsNegativeOne_Disabled()
|
|
{
|
|
var opts = new WebSocketOptions();
|
|
opts.Port.ShouldBe(-1);
|
|
opts.Host.ShouldBe("0.0.0.0");
|
|
opts.Compression.ShouldBeFalse();
|
|
opts.NoTls.ShouldBeFalse();
|
|
opts.HandshakeTimeout.ShouldBe(TimeSpan.FromSeconds(2));
|
|
opts.AuthTimeout.ShouldBe(TimeSpan.FromSeconds(2));
|
|
}
|
|
|
|
[Fact]
|
|
public void NatsOptions_HasWebSocketProperty()
|
|
{
|
|
var opts = new NatsOptions();
|
|
opts.WebSocket.ShouldNotBeNull();
|
|
opts.WebSocket.Port.ShouldBe(-1);
|
|
}
|
|
}
|