You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
nostream@3.12.0
Minor Changes
#1034e410a75 Thanks @Ferryx349! - feat(peering): treat authenticated peers as feeds, not clients
Adds limits.peer, a separate limit set for connections that have proven a
configured peering.peers pubkey with NIP-42 AUTH. Peer subscriptions use limits.peer.subscription instead of limits.client.subscription, and peer
messages use limits.peer.message in a separate rate-limit bucket, so a
full-feed subscription cannot trip the client EWMA limiter or the client max_subscriptions cap.
Peers are eligible for full feeds by default: maxLimit is uncapped and the
subscription caps are higher. An omitted peer REQ limit queries the full
stored feed instead of the client 500-event default, and peer filter counts are
not rejected by the protocol's former fixed ten-filter cap. Raw filter counts are
still bounded before deduplication, and stored reads wait for the socket's
send-flush callback so a slow peer cannot grow worker memory. Deleted and expired rows
are excluded in SQL before the limit, so they cannot consume a page slot.
A high but finite peer message rate keeps the credential from becoming an
unbounded egress path. Unauthenticated or unconfigured connections keep the
existing client limits exactly as before. The new limits are validated with the
rest of the settings document and documented in CONFIGURATION.md and docs/PEERING.md.
#10437090cbb Thanks @Ferryx349! - feat(peering): sync configured peers over NIP-77 and a live feed
Adds an outbound peering-sync worker. For every enabled peering.peers
entry it reads the peer's NIP-11 peering.scopes, authenticates with NIP-42
using the relay's own keypair, reconciles each scope over NIP-77 negentropy,
fetches only the missing ids, and keeps a live subscription for the same
scopes. Periodic reconciliation and reconnect-and-resync close gaps the live
feed can miss, and a new or restarted peer converges without a full dump.
Fetched and live events are accepted only when they match the agreed scope,
were requested by id, and pass id/signature verification. They are applied with
the same kind rules as local writes (addressable d-tag keys, kind-5 deletes,
kind-62 vanishes, ephemeral broadcast-only), and authors under an active vanish
request are skipped. Live events are broadcast to local subscribers; backfill is
not, so a full sync does not fan out a dump. Wide scopes are split by kind and
time, overflowed fetch batches are retried in smaller pieces, live re-checks use
the scope bounds rather than the subscription overlap, and fetch/live buffers are
bounded by count and bytes. Per-peer sync state (status, last reconciliation,
lag, missing count) is heartbeat-refreshed during long reconciliations, recorded
in Redis, exposed at GET /admin/peering, shown in the admin console's
Operations view, and included in diagnostics exports.
Summary by CodeRabbit
New Features
Added peer-specific subscription and message limits, with unauthenticated or unconfigured connections retaining client limits.
Added outbound peer synchronization through NIP-77 reconciliation and live feeds, with per-peer sync status.
Feed queries now support more filters, pace reads with socket flushing, and exclude deleted or expired events before applying limits.
No actionable comments were generated in the recent review.
Walkthrough
The package version changes from 3.11.0 to 3.12.0. The changelog adds release notes for peer-specific feed handling and outbound peering synchronization. Three changeset files are removed.
Changes: 3.12.0 Release Metadata
Layer / File(s)
Summary
Record peer feed changes CHANGELOG.md, .changeset/peering-feed-treatment.md
The changelog adds notes on authenticated-peer feed limits and handling. The peer-feed changeset is removed.
Record peering sync changes CHANGELOG.md, .changeset/peering-sync.md
The changelog adds notes on outbound synchronization, event checks, and sync status reporting. The peering-sync changeset is removed.
Set release version and remove website changeset package.json, .changeset/astro-7-website.md
The package version changes to 3.12.0. The Astro and Sharp website changeset is removed.
cameri/nostream#859: The changelog adds curated release notes for nostream 3.12.0.
cameri/nostream#935: The release notes describe NIP-77 reconciliation, live subscriptions, and per-peer sync state.
cameri/nostream#939: The release notes describe peer sync status exposed through admin and diagnostics surfaces.
Possibly related PRs
cameri/nostream#1038: This PR added the Astro website changeset that this release removes.
cameri/nostream#1034: This PR implements the peer-feed behavior recorded in the changelog.
cameri/nostream#1043: This PR implements the outbound synchronization recorded in the changelog.
Merge Risk: Minimal · up to 6c06d
No actionable release-metadata issue was identified; the PR appears mergeable after normal checks.
Architecture risk: Low · up to 888d9
The change affects 2 systems.
Changed systems:CHANGELOG.md, package.json
Architecture concerns
No architecture-level concerns identified.
Review details
Systems and components
observed — CHANGELOG.md (service) was modified; 1 changed file maps to changed impact.
observed — package.json (service) was modified; 1 changed file maps to changed impact.
Before / after behavior
observed — Modified behavior in CHANGELOG.md: Adds the 3.12.0 release notes for authenticated-peer feed treatment, separate peer limits and rate limiting, full-feed defaults, filter and storage-read constraints, finite peer message rates, and configuration validation and documentation. The entry states that unauthenticated or unconfigured connections retain existing client limits.
observed — Modified behavior in package.json: The package version is updated from 3.11.0 to 3.12.0.
observed — Modified behavior in .changeset/astro-7-website.md: The changeset entry describing the Astro and Sharp dependency update, its private-workspace and release-set status, and the cited advisories was removed.
observed — Modified behavior in .changeset/peering-feed-treatment.md: Removed the changeset declaring a minor nostream release and describing the authenticated-peer feed behavior and related limits, query defaults, filtering, read pacing, row exclusions, and documentation updates.
Pre-merge checks: 4 · 1
Failed checks: 1 inconclusive
Check name
Status
Explanation
Resolution
Title check
The title identifies a release but is too generic. It does not specify the released version or the peer limits and peering-sync changes described in the pull request.
Replace the title with a concise, specific summary, such as "chore: release nostream 3.12.0 with peering updates".
Passed checks: 4 passed
Check name
Status
Explanation
Description Check
Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage
No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat…
Linked Issues check
Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check
Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage
Explanation
No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 0 files. (1 skipped: 1 unsupported.)
Finishing Touches
Generate unit tests (beta)
Commit to this branch
Create a new PR
Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Tip
🎯 Customize your risk assessments
Guide how CodeRabbit assesses merge risk and security architecture risk. Highlight sensitive changes and explain your security boundaries using Merge Risk Instructions and Security Risk Instructions in your review settings. Security architecture risk assessments require the Advanced plan or above.
✅ Automatic approvals, with your rules
Let CodeRabbit approve pull requests once required threads are resolved, pre-merge checks pass, and your risk limits are met. Enable Automatic approvals in review settings, with overrides for teams or file paths.
A rabbit reads the release notes by moonlit clover, Peer feeds and sync now have their place. Three changesets hop away from the page, While version twelve takes center stage. Soft paws turn the final leaf.
CodeRabbit Verify
Run CodeRabbit Verify to test the changes in this pull request.
Recent review info
Automatic approval policy
Commit: 6c06da79e4e5.
Setting
Effective value
Source
Automatic approvals
Enabled
Global configuration
Merge risk
Minimal
Global configuration
Security risk
Not set
Global configuration
Not set means no limit was configured after inheritance. Use @coderabbitai configuration to inspect the resolved settings and their sources.
Run configuration
Source mode: Auto
Repository: Unavailable
Branch: Unavailable
File: No configuration file from this repository applied
Commit: Unavailable
Layers: Organization UI
Review profile: CHILL
Plan: Advanced
Run ID: fe6ad417-0df4-4552-9a43-8e89b0392abc
Commits
Reviewing files that changed from the base of the PR and between 888d9d8 and 6c06da7.
Files selected for processing: 2
.changeset/peering-sync.md
CHANGELOG.md
Files with no reviewable changes: 1
.changeset/peering-sync.md
Files skipped from review as they are similar to previous changes: 1
CHANGELOG.md
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
nostream@3.12.0
Minor Changes
#1034
e410a75Thanks @Ferryx349! - feat(peering): treat authenticated peers as feeds, not clientsAdds
limits.peer, a separate limit set for connections that have proven aconfigured
peering.peerspubkey with NIP-42 AUTH. Peer subscriptions uselimits.peer.subscriptioninstead oflimits.client.subscription, and peermessages use
limits.peer.messagein a separate rate-limit bucket, so afull-feed subscription cannot trip the client EWMA limiter or the client
max_subscriptionscap.Peers are eligible for full feeds by default:
maxLimitis uncapped and thesubscription caps are higher. An omitted peer REQ
limitqueries the fullstored feed instead of the client 500-event default, and peer filter counts are
not rejected by the protocol's former fixed ten-filter cap. Raw filter counts are
still bounded before deduplication, and stored reads wait for the socket's
send-flush callback so a slow peer cannot grow worker memory. Deleted and expired rows
are excluded in SQL before the limit, so they cannot consume a page slot.
A high but finite peer message rate keeps the credential from becoming an
unbounded egress path. Unauthenticated or unconfigured connections keep the
existing client limits exactly as before. The new limits are validated with the
rest of the settings document and documented in
CONFIGURATION.mdanddocs/PEERING.md.#1043
7090cbbThanks @Ferryx349! - feat(peering): sync configured peers over NIP-77 and a live feedAdds an outbound peering-sync worker. For every enabled
peering.peersentry it reads the peer's NIP-11
peering.scopes, authenticates with NIP-42using the relay's own keypair, reconciles each scope over NIP-77 negentropy,
fetches only the missing ids, and keeps a live subscription for the same
scopes. Periodic reconciliation and reconnect-and-resync close gaps the live
feed can miss, and a new or restarted peer converges without a full dump.
Fetched and live events are accepted only when they match the agreed scope,
were requested by id, and pass id/signature verification. They are applied with
the same kind rules as local writes (addressable
d-tag keys, kind-5 deletes,kind-62 vanishes, ephemeral broadcast-only), and authors under an active vanish
request are skipped. Live events are broadcast to local subscribers; backfill is
not, so a full sync does not fan out a dump. Wide scopes are split by kind and
time, overflowed fetch batches are retried in smaller pieces, live re-checks use
the scope bounds rather than the subscription overlap, and fetch/live buffers are
bounded by count and bytes. Per-peer sync state (status, last reconciliation,
lag, missing count) is heartbeat-refreshed during long reconciliations, recorded
in Redis, exposed at
GET /admin/peering, shown in the admin console'sOperations view, and included in diagnostics exports.
Summary by CodeRabbit