feat: complete remaining jetstream parity implementation plan

This commit is contained in:
Joseph Doherty
2026-02-23 10:16:16 -05:00
parent c7bbf45c8f
commit f46b331921
59 changed files with 1734 additions and 54 deletions

View File

@@ -63,6 +63,13 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
return fixture;
}
public static async Task<JetStreamApiFixture> StartWithAckAllConsumerAsync()
{
var fixture = await StartWithStreamAsync("ORDERS", "orders.*");
_ = await fixture.CreateConsumerAsync("ORDERS", "ACKALL", "orders.created", ackPolicy: AckPolicy.All);
return fixture;
}
public static async Task<JetStreamApiFixture> StartWithMirrorSetupAsync()
{
var fixture = await StartWithStreamAsync("ORDERS", "orders.*");
@@ -111,6 +118,16 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
return PublishAndGetAckAsync(subject, payload);
}
public Task<PubAck> PublishWithExpectedLastSeqAsync(string subject, string payload, ulong expectedLastSeq)
{
if (_publisher.TryCaptureWithOptions(subject, Encoding.UTF8.GetBytes(payload), new PublishOptions { ExpectedLastSeq = expectedLastSeq }, 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)));
@@ -148,6 +165,15 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
return _consumerManager.FetchAsync(stream, durableName, batch, _streamManager, default).AsTask();
}
public Task<PullFetchBatch> FetchWithNoWaitAsync(string stream, string durableName, int batch)
{
return _consumerManager.FetchAsync(stream, durableName, new PullFetchRequest
{
Batch = batch,
NoWait = true,
}, _streamManager, default).AsTask();
}
public async Task<PullFetchBatch> FetchAfterDelayAsync(string stream, string durableName, int delayMs, int batch)
{
await Task.Delay(delayMs);
@@ -174,5 +200,22 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
}
}
public async Task PublishManyAsync(string subject, IReadOnlyList<string> payloads)
{
foreach (var payload in payloads)
_ = await PublishAndGetAckAsync(subject, payload);
}
public Task AckAllAsync(string stream, string durableName, ulong sequence)
{
_consumerManager.AckAll(stream, durableName, sequence);
return Task.CompletedTask;
}
public Task<int> GetPendingCountAsync(string stream, string durableName)
{
return Task.FromResult(_consumerManager.GetPendingCount(stream, durableName));
}
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}