fix/plc-did-path-uri #48

Merged
Grandiras merged 3 commits from fix/plc-did-path-uri into main 2026-07-25 02:06:46 +00:00
Owner
fix: PlcClient DID-path requests bypassed BaseAddress (closes #47)
did:plc:… strings parse as absolute URIs (scheme 'did'), so every request
that put the DID in the path ignored the plc.directory BaseAddress and
failed with 'The did scheme is not supported'. Use RFC 3986 './'-prefixed
relative references for all five DID-path endpoints; add PlcClient unit
tests (previously none) incl. a BaseAddress-composition regression test.

Found by Mise's network backfill resolving 0/59 repos.

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

feat: Jetstream consumer — JSON event streaming with server-side filtering (closes #43)
  • JetstreamClient: single WebSocket to /subscribe with wantedCollections
    (NSIDs + prefix wildcards, max 100), wantedDids (max 10k), cursor
    (unix microseconds), maxMessageSizeBytes; https->wss scheme conversion
  • JetstreamConsumer: managed consumer with reconnect backoff, cursor
    persistence via existing IFirehoseCursorStore (cursor = time_us),
    reconnect rewind with duplicate suppression, at-least-once semantics
  • JetstreamEventParser: forward-tolerant commit/identity/account parsing;
    unknown kinds/operations/fields skipped instead of throwing
  • JetstreamCommitEvent.GetRecord() honours LexiconTypeRegistry; computed at:// Uri
  • IJetstreamDecompressor seam for optional zstd (no bundled dependency;
    ZstdSharp sample in docs)
  • 49 unit tests (parser frames, URL building, consumer resume/rewind/dedup);
    live smoke-tested against jetstream2.us-east.bsky.network incl. cursor replay
  • docs/jetstream.md with firehose comparison + non-verifiability caveat
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
fix: PlcClient DID-path requests bypassed BaseAddress (closes #47) : did:plc:… strings parse as absolute URIs (scheme 'did'), so every request that put the DID in the path ignored the plc.directory BaseAddress and failed with 'The did scheme is not supported'. Use RFC 3986 './'-prefixed relative references for all five DID-path endpoints; add PlcClient unit tests (previously none) incl. a BaseAddress-composition regression test. Found by Mise's network backfill resolving 0/59 repos. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> feat: Jetstream consumer — JSON event streaming with server-side filtering (closes #43) : - JetstreamClient: single WebSocket to /subscribe with wantedCollections (NSIDs + prefix wildcards, max 100), wantedDids (max 10k), cursor (unix microseconds), maxMessageSizeBytes; https->wss scheme conversion - JetstreamConsumer: managed consumer with reconnect backoff, cursor persistence via existing IFirehoseCursorStore (cursor = time_us), reconnect rewind with duplicate suppression, at-least-once semantics - JetstreamEventParser: forward-tolerant commit/identity/account parsing; unknown kinds/operations/fields skipped instead of throwing - JetstreamCommitEvent.GetRecord<T>() honours LexiconTypeRegistry; computed at:// Uri - IJetstreamDecompressor seam for optional zstd (no bundled dependency; ZstdSharp sample in docs) - 49 unit tests (parser frames, URL building, consumer resume/rewind/dedup); live smoke-tested against jetstream2.us-east.bsky.network incl. cursor replay - docs/jetstream.md with firehose comparison + non-verifiability caveat Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat: Jetstream consumer — JSON event streaming with server-side filtering (closes #43)
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
626f64c28f
- JetstreamClient: single WebSocket to /subscribe with wantedCollections
  (NSIDs + prefix wildcards, max 100), wantedDids (max 10k), cursor
  (unix microseconds), maxMessageSizeBytes; https->wss scheme conversion
- JetstreamConsumer: managed consumer with reconnect backoff, cursor
  persistence via existing IFirehoseCursorStore (cursor = time_us),
  reconnect rewind with duplicate suppression, at-least-once semantics
- JetstreamEventParser: forward-tolerant commit/identity/account parsing;
  unknown kinds/operations/fields skipped instead of throwing
- JetstreamCommitEvent.GetRecord<T>() honours LexiconTypeRegistry; computed at:// Uri
- IJetstreamDecompressor seam for optional zstd (no bundled dependency;
  ZstdSharp sample in docs)
- 49 unit tests (parser frames, URL building, consumer resume/rewind/dedup);
  live smoke-tested against jetstream2.us-east.bsky.network incl. cursor replay
- docs/jetstream.md with firehose comparison + non-verifiability caveat

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix: PlcClient DID-path requests bypassed BaseAddress (closes #47)
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
16c95425cc
did:plc:… strings parse as absolute URIs (scheme 'did'), so every request
that put the DID in the path ignored the plc.directory BaseAddress and
failed with 'The did scheme is not supported'. Use RFC 3986 './'-prefixed
relative references for all five DID-path endpoints; add PlcClient unit
tests (previously none) incl. a BaseAddress-composition regression test.

Found by Mise's network backfill resolving 0/59 repos.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
Owner

@claude-bot Please fix the conflict.

@claude-bot Please fix the conflict.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/32); the reply will link the full session transcript.
Merge branch 'main' into fix/plc-did-path-uri
All checks were successful
CI / build-and-test (pull_request) Successful in 38s
Sync Closures to GitHub / sync-closure (pull_request) Successful in 7s
f770e57c89
Resolved CHANGELOG.md: kept the PLC BaseAddress fix (#47) alongside main's
OAuth/serialization entries, and folded the duplicated `### Added` block
into a single section (Breaking changes / Added / Removed / Fixed / Security).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Collaborator

Conflict resolved and pushed.

What conflicted

Only CHANGELOG.md. Both sides had appended to ## [Unreleased] → ### Fixed: this branch added the PLC BaseAddress entry (#47), while main picked up three commits since this branch forked (#52 OAuth handle-resolution timeouts, #52 OAuth HttpClient options, #50 out-of-order $type). No source files conflicted.

Resolution

  • Kept all bullets from both sides — nothing dropped. The PLC entry (#47) now sits first under ### Fixed, followed by main's #52/#50 entries and the existing RepositoryUrl note.
  • The naive merge also left two separate ### Added sections under [Unreleased] (this branch's Jetstream block and main's #52 block, split by ### Removed). Folded them into one, so [Unreleased] is back to the canonical single-section-each order: Breaking changesAddedRemovedFixedSecurity.

Verified

Installed the .NET 10 SDK in the container (none was present), then on the merge result:

  • dotnet build -p:EnableSourceControlManagerQueries=false0 errors (warnings are pre-existing CS1591/NU19xx noise, unchanged).
  • dotnet test tests/ATProtoNet.Tests/ -p:EnableSourceControlManagerQueries=false994 passed, 0 failed, 0 skipped. That covers both sides' new tests — the PLC BaseAddress regression tests from this branch and main's HandleResolution*/OutOfOrderTypeMetadata tests — so the two changesets don't interact badly.

Pushed as merge commit f770e57 on fix/plc-did-path-uri (16c9542..f770e57). PR #48 should now show as mergeable.


⏱ 2m 13s · 20 turns · tokens: 32.4k in / 5.0k out (+734.6k cache-read)
📜 Full session transcript

Conflict resolved and pushed. ## What conflicted Only `CHANGELOG.md`. Both sides had appended to `## [Unreleased] → ### Fixed`: this branch added the PLC `BaseAddress` entry (#47), while `main` picked up three commits since this branch forked (#52 OAuth handle-resolution timeouts, #52 OAuth `HttpClient` options, #50 out-of-order `$type`). No source files conflicted. ## Resolution - Kept **all** bullets from both sides — nothing dropped. The PLC entry (#47) now sits first under `### Fixed`, followed by main's `#52`/`#50` entries and the existing `RepositoryUrl` note. - The naive merge also left **two separate `### Added` sections** under `[Unreleased]` (this branch's Jetstream block and main's `#52` block, split by `### Removed`). Folded them into one, so `[Unreleased]` is back to the canonical single-section-each order: `Breaking changes` → `Added` → `Removed` → `Fixed` → `Security`. ## Verified Installed the .NET 10 SDK in the container (none was present), then on the merge result: - `dotnet build -p:EnableSourceControlManagerQueries=false` → **0 errors** (warnings are pre-existing CS1591/NU19xx noise, unchanged). - `dotnet test tests/ATProtoNet.Tests/ -p:EnableSourceControlManagerQueries=false` → **994 passed, 0 failed, 0 skipped**. That covers both sides' new tests — the PLC `BaseAddress` regression tests from this branch and main's `HandleResolution*`/`OutOfOrderTypeMetadata` tests — so the two changesets don't interact badly. Pushed as merge commit `f770e57` on **`fix/plc-did-path-uri`** (`16c9542..f770e57`). PR #48 should now show as mergeable. --- ⏱ 2m 13s · 20 turns · tokens: 32.4k in / 5.0k out (+734.6k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/ATProto.NET/issue-48/run-32.md)
Grandiras deleted branch fix/plc-did-path-uri 2026-07-25 02:06:46 +00:00
Grandiras referenced this pull request from a commit 2026-07-25 02:06:48 +00:00
Sign in to join this conversation.
No description provided.