Files
git.stella-ops.org/src/StellaOps.Scanner.Queue/ScanQueueContracts.cs
2025-10-20 14:19:25 +03:00

116 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
namespace StellaOps.Scanner.Queue;
public sealed class ScanQueueMessage
{
private readonly byte[] _payload;
public ScanQueueMessage(string jobId, ReadOnlyMemory<byte> payload)
{
if (string.IsNullOrWhiteSpace(jobId))
{
throw new ArgumentException("Job identifier must be provided.", nameof(jobId));
}
JobId = jobId;
_payload = CopyPayload(payload);
}
public string JobId { get; }
public string? IdempotencyKey { get; init; }
public string? TraceId { get; init; }
public IReadOnlyDictionary<string, string>? Attributes { get; init; }
public ReadOnlyMemory<byte> Payload => _payload;
private static byte[] CopyPayload(ReadOnlyMemory<byte> payload)
{
if (payload.Length == 0)
{
return Array.Empty<byte>();
}
var copy = new byte[payload.Length];
payload.Span.CopyTo(copy);
return copy;
}
}
public readonly record struct QueueEnqueueResult(string MessageId, bool Deduplicated);
public sealed class QueueLeaseRequest
{
public QueueLeaseRequest(string consumer, int batchSize, TimeSpan leaseDuration)
{
if (string.IsNullOrWhiteSpace(consumer))
{
throw new ArgumentException("Consumer name must be provided.", nameof(consumer));
}
if (batchSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(batchSize), batchSize, "Batch size must be positive.");
}
if (leaseDuration <= TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException(nameof(leaseDuration), leaseDuration, "Lease duration must be positive.");
}
Consumer = consumer;
BatchSize = batchSize;
LeaseDuration = leaseDuration;
}
public string Consumer { get; }
public int BatchSize { get; }
public TimeSpan LeaseDuration { get; }
}
public sealed class QueueClaimOptions
{
public QueueClaimOptions(
string claimantConsumer,
int batchSize,
TimeSpan minIdleTime)
{
if (string.IsNullOrWhiteSpace(claimantConsumer))
{
throw new ArgumentException("Consumer must be provided.", nameof(claimantConsumer));
}
if (batchSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(batchSize), batchSize, "Batch size must be positive.");
}
if (minIdleTime < TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException(nameof(minIdleTime), minIdleTime, "Idle time cannot be negative.");
}
ClaimantConsumer = claimantConsumer;
BatchSize = batchSize;
MinIdleTime = minIdleTime;
}
public string ClaimantConsumer { get; }
public int BatchSize { get; }
public TimeSpan MinIdleTime { get; }
}
public enum QueueReleaseDisposition
{
Retry,
Abandon
}