feat: route publishes to jetstream with puback

This commit is contained in:
Joseph Doherty
2026-02-23 06:03:24 -05:00
parent 5f530de2e4
commit 95691fa9e7
6 changed files with 116 additions and 4 deletions

View File

@@ -1,14 +1,51 @@
using System.Text;
using NATS.Server.JetStream;
using NATS.Server.JetStream.Api;
using NATS.Server.JetStream.Publish;
namespace NATS.Server.Tests;
internal static class JetStreamApiFixture
internal sealed class JetStreamApiFixture : IAsyncDisposable
{
private static readonly JetStreamApiRouter Router = new();
private static readonly StreamManager SharedStreamManager = new();
private static readonly JetStreamApiRouter SharedRouter = new(SharedStreamManager);
private readonly StreamManager _streamManager;
private readonly JetStreamApiRouter _router;
private readonly JetStreamPublisher _publisher;
private JetStreamApiFixture()
{
_streamManager = new StreamManager();
_router = new JetStreamApiRouter(_streamManager);
_publisher = new JetStreamPublisher(_streamManager);
}
public static Task<JetStreamApiResponse> RequestAsync(string subject, string payload)
{
return Task.FromResult(Router.Route(subject, Encoding.UTF8.GetBytes(payload)));
return Task.FromResult(SharedRouter.Route(subject, Encoding.UTF8.GetBytes(payload)));
}
public static async Task<JetStreamApiFixture> StartWithStreamAsync(string streamName, string subject, int maxMsgs = 0)
{
var fixture = new JetStreamApiFixture();
var payload = $"{{\"name\":\"{streamName}\",\"subjects\":[\"{subject}\"],\"max_msgs\":{maxMsgs}}}";
_ = await fixture.RequestLocalAsync($"$JS.API.STREAM.CREATE.{streamName}", payload);
return fixture;
}
public Task<PubAck> PublishAndGetAckAsync(string subject, string payload)
{
if (_publisher.TryCapture(subject, Encoding.UTF8.GetBytes(payload), out var ack))
return Task.FromResult(ack);
return Task.FromResult(new PubAck { ErrorCode = 404 });
}
public Task<JetStreamApiResponse> RequestLocalAsync(string subject, string payload)
{
return Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload)));
}
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}