| | | 1 | | namespace AsiBackbone.Core.Outbox; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// Represents a successful claim over a governance outbox entry. |
| | | 5 | | /// </summary> |
| | | 6 | | /// <remarks> |
| | | 7 | | /// A claim proves that a worker acquired a lease before provider emission. It reduces duplicate selection risk for coop |
| | | 8 | | /// </remarks> |
| | | 9 | | public sealed class GovernanceOutboxClaim |
| | | 10 | | { |
| | 510 | 11 | | private GovernanceOutboxClaim( |
| | 510 | 12 | | GovernanceOutboxEntry entry, |
| | 510 | 13 | | string workerId, |
| | 510 | 14 | | string claimToken, |
| | 510 | 15 | | DateTimeOffset claimedUtc, |
| | 510 | 16 | | DateTimeOffset claimExpiresUtc) |
| | | 17 | | { |
| | 510 | 18 | | ArgumentNullException.ThrowIfNull(entry); |
| | 510 | 19 | | ArgumentException.ThrowIfNullOrWhiteSpace(workerId); |
| | 510 | 20 | | ArgumentException.ThrowIfNullOrWhiteSpace(claimToken); |
| | | 21 | | |
| | 510 | 22 | | if (claimExpiresUtc.ToUniversalTime() <= claimedUtc.ToUniversalTime()) |
| | | 23 | | { |
| | 4 | 24 | | throw new ArgumentOutOfRangeException(nameof(claimExpiresUtc), claimExpiresUtc, "Claim expiration must be af |
| | | 25 | | } |
| | | 26 | | |
| | 506 | 27 | | Entry = entry; |
| | 506 | 28 | | WorkerId = workerId.Trim(); |
| | 506 | 29 | | ClaimToken = claimToken.Trim(); |
| | 506 | 30 | | ClaimedUtc = claimedUtc.ToUniversalTime(); |
| | 506 | 31 | | ClaimExpiresUtc = claimExpiresUtc.ToUniversalTime(); |
| | 506 | 32 | | } |
| | | 33 | | |
| | | 34 | | /// <summary> |
| | | 35 | | /// Gets the claimed outbox entry snapshot. |
| | | 36 | | /// </summary> |
| | 1148 | 37 | | public GovernanceOutboxEntry Entry { get; } |
| | | 38 | | |
| | | 39 | | /// <summary> |
| | | 40 | | /// Gets the stable outbox entry identifier. |
| | | 41 | | /// </summary> |
| | 728 | 42 | | public string OutboxEntryId => Entry.OutboxEntryId; |
| | | 43 | | |
| | | 44 | | /// <summary> |
| | | 45 | | /// Gets the worker, process, node, or partition owner that acquired the claim. |
| | | 46 | | /// </summary> |
| | 496 | 47 | | public string WorkerId { get; } |
| | | 48 | | |
| | | 49 | | /// <summary> |
| | | 50 | | /// Gets the opaque token that identifies this lease instance. |
| | | 51 | | /// </summary> |
| | 456 | 52 | | public string ClaimToken { get; } |
| | | 53 | | |
| | | 54 | | /// <summary> |
| | | 55 | | /// Gets the UTC timestamp when the claim was acquired. |
| | | 56 | | /// </summary> |
| | 350 | 57 | | public DateTimeOffset ClaimedUtc { get; } |
| | | 58 | | |
| | | 59 | | /// <summary> |
| | | 60 | | /// Gets the UTC timestamp when the claim lease expires. |
| | | 61 | | /// </summary> |
| | 360 | 62 | | public DateTimeOffset ClaimExpiresUtc { get; } |
| | | 63 | | |
| | | 64 | | /// <summary> |
| | | 65 | | /// Determines whether the claim lease is expired at the supplied UTC timestamp. |
| | | 66 | | /// </summary> |
| | | 67 | | public bool IsExpired(DateTimeOffset utcNow) |
| | | 68 | | { |
| | 10 | 69 | | return ClaimExpiresUtc <= utcNow.ToUniversalTime(); |
| | | 70 | | } |
| | | 71 | | |
| | | 72 | | /// <summary> |
| | | 73 | | /// Creates a claim from a claimed entry snapshot. |
| | | 74 | | /// </summary> |
| | | 75 | | public static GovernanceOutboxClaim Create( |
| | | 76 | | GovernanceOutboxEntry entry, |
| | | 77 | | string workerId, |
| | | 78 | | string claimToken, |
| | | 79 | | DateTimeOffset claimedUtc, |
| | | 80 | | DateTimeOffset claimExpiresUtc) |
| | | 81 | | { |
| | 510 | 82 | | return new GovernanceOutboxClaim(entry, workerId, claimToken, claimedUtc, claimExpiresUtc); |
| | | 83 | | } |
| | | 84 | | } |