- 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.
84 lines
2.4 KiB
C#
84 lines
2.4 KiB
C#
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;
|
|
}
|