feat(providers): NatsConnectionProvider (NATS.Net)

This commit is contained in:
Claude
2026-08-28 15:09:13 +00:00
parent 5137591b8a
commit b9097b1812
2 changed files with 59 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
using System.Text.Json;
using NATS.Client.Core;
using VolcanicCore.Core;
namespace VolcanicCore.Providers;
public sealed class NatsConnectionProvider : IConnectionProvider
{
public string Id => "nats";
public string DisplayName => "NATS";
public JsonSchema ConfigSchema { get; } = new(JsonDocument.Parse("""
{
"type": "object",
"required": ["url"],
"properties": {
"url": { "type": "string", "title": "Server URL", "default": "nats://127.0.0.1:4222" },
"user": { "type": "string", "title": "User" },
"pass": { "type": "string", "title": "Password", "format": "password" }
},
"secretFields": ["pass"]
}
""").RootElement);
public IReadOnlySet<string> SecretFields { get; } =
new HashSet<string>(StringComparer.Ordinal) { "pass" };
public async Task<object> OpenAsync(JsonElement config, CancellationToken ct)
{
var url = config.GetProperty("url").GetString()!;
var opts = new NatsOpts { Url = url };
if (config.TryGetProperty("user", out var u) && u.ValueKind == JsonValueKind.String
&& config.TryGetProperty("pass", out var p) && p.ValueKind == JsonValueKind.String)
{
opts = opts with { AuthOpts = new NatsAuthOpts { Username = u.GetString(), Password = p.GetString() } };
}
var conn = new NatsConnection(opts);
await conn.ConnectAsync();
return conn;
}
public async Task CloseAsync(object handle)
{
if (handle is NatsConnection conn) await conn.DisposeAsync();
}
}

View File

@@ -0,0 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
using VolcanicCore.Core;
namespace VolcanicCore.Providers;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddVolcanicProviders(this IServiceCollection services)
{
services.AddSingleton<IConnectionProvider, NatsConnectionProvider>();
return services;
}
}