Add tests and implement timeline ingestion options with NATS and Redis subscribers
- Introduced `BinaryReachabilityLifterTests` to validate binary lifting functionality. - Created `PackRunWorkerOptions` for configuring worker paths and execution persistence. - Added `TimelineIngestionOptions` for configuring NATS and Redis ingestion transports. - Implemented `NatsTimelineEventSubscriber` for subscribing to NATS events. - Developed `RedisTimelineEventSubscriber` for reading from Redis Streams. - Added `TimelineEnvelopeParser` to normalize incoming event envelopes. - Created unit tests for `TimelineEnvelopeParser` to ensure correct field mapping. - Implemented `TimelineAuthorizationAuditSink` for logging authorization outcomes.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
using System;
|
||||
|
||||
namespace StellaOps.TimelineIndexer.Infrastructure.Options;
|
||||
|
||||
/// <summary>
|
||||
/// Configuration for timeline ingestion transports (NATS, Redis).
|
||||
/// </summary>
|
||||
public sealed class TimelineIngestionOptions
|
||||
{
|
||||
public NatsIngestionOptions Nats { get; init; } = new();
|
||||
public RedisIngestionOptions Redis { get; init; } = new();
|
||||
}
|
||||
|
||||
public sealed class NatsIngestionOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Enables NATS subscription when true.
|
||||
/// </summary>
|
||||
public bool Enabled { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NATS server URL (e.g., nats://localhost:4222).
|
||||
/// </summary>
|
||||
public string Url { get; init; } = "nats://localhost:4222";
|
||||
|
||||
/// <summary>
|
||||
/// Subject to subscribe to for orchestrator events.
|
||||
/// </summary>
|
||||
public string Subject { get; init; } = "orch.event";
|
||||
|
||||
/// <summary>
|
||||
/// Queue group for shared subscriptions to preserve ordering per subject.
|
||||
/// </summary>
|
||||
public string QueueGroup { get; init; } = "timeline-indexer";
|
||||
|
||||
/// <summary>
|
||||
/// Maximum in-flight messages per subscriber.
|
||||
/// </summary>
|
||||
public int Prefetch { get; init; } = 64;
|
||||
}
|
||||
|
||||
public sealed class RedisIngestionOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Enables Redis Stream subscription when true.
|
||||
/// </summary>
|
||||
public bool Enabled { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Redis connection string (e.g., localhost:6379 or rediss://...).
|
||||
/// </summary>
|
||||
public string ConnectionString { get; init; } = "localhost:6379";
|
||||
|
||||
/// <summary>
|
||||
/// Stream name carrying timeline events.
|
||||
/// </summary>
|
||||
public string Stream { get; init; } = "timeline.events";
|
||||
|
||||
/// <summary>
|
||||
/// Consumer group used for ordered consumption.
|
||||
/// </summary>
|
||||
public string ConsumerGroup { get; init; } = "timeline-indexer";
|
||||
|
||||
/// <summary>
|
||||
/// Consumer name used when reading from the group.
|
||||
/// </summary>
|
||||
public string ConsumerName { get; init; } = Environment.MachineName ?? "timeline-indexer";
|
||||
|
||||
/// <summary>
|
||||
/// Field that contains the JSON payload within the stream entry.
|
||||
/// </summary>
|
||||
public string ValueField { get; init; } = "data";
|
||||
|
||||
/// <summary>
|
||||
/// Maximum entries fetched per polling iteration.
|
||||
/// </summary>
|
||||
public int MaxBatchSize { get; init; } = 128;
|
||||
|
||||
/// <summary>
|
||||
/// Polling interval in milliseconds when no entries are available.
|
||||
/// </summary>
|
||||
public int PollIntervalMilliseconds { get; init; } = 250;
|
||||
}
|
||||
Reference in New Issue
Block a user