Claude: changes for issue #102 #104
No reviewers
Labels
No labels
breaking-change
bug
documentation
duplicate
enhancement
good first issue
help wanted
performance
question
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/ATProto.NET!104
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/issue-102"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #102.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
This PR adds durable/multi-instance implementations for the three space-server stores (Redis and EF Core replay stores, EF Core authority store, EF Core simplespace store), plus a startup warning hosted service and matching docs/changelog updates. The implementation is careful and internally consistent:
SET NX EX, EF Core via the(Issuer, TokenId, ExpiresAt)primary key with a post-failure existence check to distinguish a genuine storage fault from a real replay.EfCoreSpaceAuthorityStore's upsert-via-retry pattern (MutateAsync) correctly handles races between concurrentEnsureSpaceAsync/subscriber/writer upserts — verified the retry converges to the update path rather than double-inserting or looping.ISpaceReplayStoreregistration extensions correctly useservices.Replace(...)(notTryAdd) becauseAddAtProtoSpaces()eagerly registers the in-memory default;AddAtProtoEfCoreSpaceAuthority/AddAtProtoEfCoreSimpleSpacecorrectly rely on plainTryAddSingletoninside the existingAddSpaceAuthority<TStore>/AddSimpleSpace<TStore>methods, since those have no eager default to fight with — checked this againstSpaceServerExtensions.csand it lines up, andSpaceStoreRegistrationTestsexercises both call orders for the replay store.InMemorySpaceStoreWarningonly warns about a store type that's actually registered (GetService<T>() is InMemoryX), so services that don't register an authority/simplespace store (e.g. a bare repo host) won't get spurious warnings.StackExchange.Redis 2.13.17andSQLitePCLRaw.bundle_e_sqlite3 3.0.5(pinned to dodge GHSA-2m69-gcr7-jv3q, CVE-2025-6965, on the EF Core Sqlite provider's transitive 2.1.11 dependency) are both real, published package versions — the csproj comments check out.Minor, non-blocking observations: the Redis key format (
issuer|tokenId|exp) isn't escaped, so a|inside an issuer or token ID could theoretically collide with a different tuple — low risk given DIDs/JWTjtivalues don't contain it. Nothing here rises to a blocking finding.⏱ 2m 52s · 9 turns · tokens: 87.4k in / 14.8k out (+828.8k cache-read)
📜 Full session transcript