From 708e1b4168a6dffce9744fe8ac5324ee3f80656d Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 23 Feb 2026 04:29:45 -0500 Subject: [PATCH] feat: add WebSocketOptions configuration class --- src/NATS.Server/NatsOptions.cs | 28 +++++++++++++++++++ .../WebSocket/WebSocketOptionsTests.cs | 26 +++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 tests/NATS.Server.Tests/WebSocket/WebSocketOptionsTests.cs diff --git a/src/NATS.Server/NatsOptions.cs b/src/NATS.Server/NatsOptions.cs index 8a9b56d..97ec196 100644 --- a/src/NATS.Server/NatsOptions.cs +++ b/src/NATS.Server/NatsOptions.cs @@ -86,4 +86,32 @@ public sealed class NatsOptions public SslProtocols TlsMinVersion { get; set; } = SslProtocols.Tls12; public bool HasTls => TlsCert != null && TlsKey != null; + + // WebSocket + public WebSocketOptions WebSocket { get; set; } = new(); +} + +public sealed class WebSocketOptions +{ + public string Host { get; set; } = "0.0.0.0"; + public int Port { get; set; } + public string? Advertise { get; set; } + public string? NoAuthUser { get; set; } + public string? JwtCookie { get; set; } + public string? UsernameCookie { get; set; } + public string? PasswordCookie { get; set; } + public string? TokenCookie { get; set; } + public string? Username { get; set; } + public string? Password { get; set; } + public string? Token { get; set; } + public TimeSpan AuthTimeout { get; set; } = TimeSpan.FromSeconds(2); + public bool NoTls { get; set; } + public string? TlsCert { get; set; } + public string? TlsKey { get; set; } + public bool SameOrigin { get; set; } + public List? AllowedOrigins { get; set; } + public bool Compression { get; set; } + public TimeSpan HandshakeTimeout { get; set; } = TimeSpan.FromSeconds(2); + public TimeSpan? PingInterval { get; set; } + public Dictionary? Headers { get; set; } } diff --git a/tests/NATS.Server.Tests/WebSocket/WebSocketOptionsTests.cs b/tests/NATS.Server.Tests/WebSocket/WebSocketOptionsTests.cs new file mode 100644 index 0000000..dba1d0e --- /dev/null +++ b/tests/NATS.Server.Tests/WebSocket/WebSocketOptionsTests.cs @@ -0,0 +1,26 @@ +using Shouldly; + +namespace NATS.Server.Tests.WebSocket; + +public class WebSocketOptionsTests +{ + [Fact] + public void DefaultOptions_PortIsZero_Disabled() + { + var opts = new WebSocketOptions(); + opts.Port.ShouldBe(0); + 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(0); + } +}