Releases: peteroettl/Cadence
Releases · peteroettl/Cadence
Release list
Cadence 1.0.0
Initial public release. Cadence's request scheduling, coalescing, and rate limiting were
extracted and generalized from a production weather app and decoupled from any HTTP client.
Added
RequestScheduleractor with three entry points:schedule,debounce, andcoordinate.RequestSchedulingprotocol to allow injecting a pass-through scheduler in tests.RequestCombinableprotocol for describing how concurrent requests are keyed, merged, and split.SlidingWindowRateLimiteractor enforcing any number of layeredRateLimitRules.RateLimitRulewith.perSecond/.perMinute/.perHour/.perDayconvenience
constructors and per-rule.wait/.throwbehavior.RateLimiterprotocol for custom limiting strategies.RateLimiterStoragewithUserDefaultsRateLimiterStorageandInMemoryRateLimiterStorage
implementations for persisting the rate-limit window across launches.CadenceLoggerpluggable diagnostics sink (NoopLoggerdefault,PrintLoggerhelper).CadenceClocktime abstraction (SystemClockdefault) for deterministic tests.Array.unique()helper for buildingcombineimplementations.- Full test suite (92% line coverage, verified with mutation analysis), GitHub Actions CI, and
the Apache 2.0 license. - Mutation-testing tooling:
muter.conf.yml, the/mutation-reviewskill, and the read-only
mutation-survivor-triageagent. - Documentation covering Xcode consumption (remote + local packages, multi-target linking) and
HTTP-client integration with kean/Get.
Security
- Coalescing tracks each batch's task and parameters under a single
AnyHashable(key), so two
distinct coordination keys whoseString(describing:)collide cannot cross-contaminate callers. SlidingWindowRateLimiterandUserDefaultsRateLimiterStoragedrop non-finite and future-dated
persisted timestamps, so a tampered or corrupted backing store cannot permanently jam the limiter.SystemClock.sleep(for:)guardsisFiniteand clamps magnitude before theDouble → UInt64
conversion, so a non-finite or astronomically large interval cannot trap the process.- CI runs with least-privilege
permissions: contents: readand digest-pinned container images.