185 lines
7.2 KiB
Swift
185 lines
7.2 KiB
Swift
import CodexBarCore
|
|
import Foundation
|
|
|
|
struct CodexWeeklyResetConfirmation: Sendable {
|
|
enum InitialDecision: Equatable, Sendable {
|
|
case publishInitial
|
|
case requiresConfirmation
|
|
case preservePrevious
|
|
}
|
|
|
|
enum ConfirmationDecision: Equatable, Sendable {
|
|
case publishConfirmation
|
|
case preservePrevious
|
|
}
|
|
|
|
private static let resetEquivalenceToleranceSeconds: TimeInterval = 2 * 60
|
|
private static let resetThreshold = 1.0
|
|
|
|
static func initialDecision(
|
|
previous: UsageSnapshot?,
|
|
initial: UsageSnapshot) -> InitialDecision
|
|
{
|
|
guard self.isFinite(initial.updatedAt) else { return .preservePrevious }
|
|
guard let previous else {
|
|
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: initial)
|
|
else {
|
|
return .publishInitial
|
|
}
|
|
return self.initialDecisionWithoutWeeklyBaseline(
|
|
initialWeekly: initialWeekly,
|
|
capturedAt: initial.updatedAt)
|
|
}
|
|
guard Self.isFinite(previous.updatedAt), initial.updatedAt > previous.updatedAt else {
|
|
return .preservePrevious
|
|
}
|
|
|
|
guard let previousWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: previous)
|
|
else {
|
|
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: initial)
|
|
else {
|
|
return .publishInitial
|
|
}
|
|
return self.initialDecisionWithoutWeeklyBaseline(
|
|
initialWeekly: initialWeekly,
|
|
capturedAt: initial.updatedAt)
|
|
}
|
|
guard previousWeekly.usedPercent.isFinite else {
|
|
return .preservePrevious
|
|
}
|
|
// A source can legitimately omit the weekly lane and rely on the existing
|
|
// reset-window backfill path. Only gate an explicit weekly observation.
|
|
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: initial)
|
|
else {
|
|
return .preservePrevious
|
|
}
|
|
guard initialWeekly.usedPercent.isFinite else { return .preservePrevious }
|
|
let previousBoundary = Self.finiteResetBoundary(previousWeekly)
|
|
let initialBoundary = Self.finiteResetBoundary(initialWeekly)
|
|
if initialWeekly.resetsAt != nil,
|
|
Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) == nil
|
|
{
|
|
return .preservePrevious
|
|
}
|
|
if let previousBoundary, let initialBoundary,
|
|
initialBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds
|
|
{
|
|
return .preservePrevious
|
|
}
|
|
|
|
guard previousWeekly.usedPercent > Self.resetThreshold,
|
|
initialWeekly.usedPercent <= Self.resetThreshold
|
|
else {
|
|
return .publishInitial
|
|
}
|
|
guard Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) != nil else {
|
|
return .preservePrevious
|
|
}
|
|
return .requiresConfirmation
|
|
}
|
|
|
|
static func confirmationDecision(
|
|
previous: UsageSnapshot?,
|
|
initial: UsageSnapshot,
|
|
confirmation: UsageSnapshot) -> ConfirmationDecision
|
|
{
|
|
guard previous.map({ self.isFinite($0.updatedAt) }) ?? true,
|
|
self.isFinite(initial.updatedAt),
|
|
self.isFinite(confirmation.updatedAt),
|
|
confirmation.updatedAt > initial.updatedAt,
|
|
let initialWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: initial),
|
|
let confirmationWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: confirmation),
|
|
initialWeekly.usedPercent.isFinite,
|
|
confirmationWeekly.usedPercent.isFinite
|
|
else {
|
|
return .preservePrevious
|
|
}
|
|
let previousWeekly = CodexConsumerProjection.sourceRateWindow(
|
|
for: .weekly,
|
|
snapshot: previous)
|
|
guard previousWeekly?.usedPercent.isFinite ?? true else { return .preservePrevious }
|
|
let previousBoundary = previousWeekly.flatMap(Self.finiteResetBoundary)
|
|
let confirmationBoundary = Self.finiteResetBoundary(confirmationWeekly)
|
|
if confirmationWeekly.resetsAt != nil,
|
|
Self.validResetBoundary(confirmationWeekly, capturedAt: confirmation.updatedAt) == nil
|
|
{
|
|
return .preservePrevious
|
|
}
|
|
if let previousBoundary, let confirmationBoundary,
|
|
confirmationBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds
|
|
{
|
|
return .preservePrevious
|
|
}
|
|
|
|
if confirmationWeekly.usedPercent > Self.resetThreshold {
|
|
return .publishConfirmation
|
|
}
|
|
|
|
guard initialWeekly.usedPercent <= Self.resetThreshold,
|
|
let initialBoundary = Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt),
|
|
let confirmationBoundary = Self.validResetBoundary(
|
|
confirmationWeekly,
|
|
capturedAt: confirmation.updatedAt),
|
|
abs(initialBoundary.timeIntervalSince(confirmationBoundary))
|
|
< Self.resetEquivalenceToleranceSeconds
|
|
else {
|
|
return .preservePrevious
|
|
}
|
|
if let previous,
|
|
let previousWeekly,
|
|
let previousBoundary = Self.validResetBoundary(
|
|
previousWeekly,
|
|
capturedAt: previous.updatedAt)
|
|
{
|
|
guard initialBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds,
|
|
confirmationBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds
|
|
else {
|
|
return .preservePrevious
|
|
}
|
|
}
|
|
return .publishConfirmation
|
|
}
|
|
|
|
private static func initialDecisionWithoutWeeklyBaseline(
|
|
initialWeekly: RateWindow,
|
|
capturedAt: Date) -> InitialDecision
|
|
{
|
|
guard initialWeekly.usedPercent.isFinite else { return .preservePrevious }
|
|
if initialWeekly.resetsAt != nil,
|
|
self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil
|
|
{
|
|
return .preservePrevious
|
|
}
|
|
guard initialWeekly.usedPercent <= self.resetThreshold else { return .publishInitial }
|
|
return self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil
|
|
? .preservePrevious
|
|
: .requiresConfirmation
|
|
}
|
|
|
|
private static func finiteResetBoundary(_ window: RateWindow) -> Date? {
|
|
guard let boundary = window.resetsAt, isFinite(boundary) else { return nil }
|
|
return boundary
|
|
}
|
|
|
|
private static func validResetBoundary(_ window: RateWindow, capturedAt: Date) -> Date? {
|
|
guard let boundary = self.finiteResetBoundary(window), boundary > capturedAt else { return nil }
|
|
return boundary
|
|
}
|
|
|
|
private static func isFinite(_ date: Date) -> Bool {
|
|
date.timeIntervalSinceReferenceDate.isFinite
|
|
}
|
|
}
|