fix: prevent crash in NIP-11 response when payments settings are absent#682
Conversation
rootRequestHandler accessed settings.payments.feeSchedules unconditionally Signed-off-by: Priyanshubhartistm <bhartipriyanshustm@gmail.com>
🦋 Changeset detectedLatest commit: 1db20d7 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Pull request overview
Fixes a crash in rootRequestHandler when serving the NIP-11 relay information document and the payments settings block is absent, ensuring the handler returns an empty fees object instead of throwing. Adds a unit test to cover the regression and includes a changeset for the patch release.
Changes:
- Guard
feesconstruction behind asettings.paymentspresence check to avoidTypeErroron NIP-11 requests. - Add a unit test asserting
fees: {}and no throw whenpaymentsis omitted from settings. - Add a patch changeset documenting the fix.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/handlers/request-handlers/root-request-handler.ts | Adds a guard so NIP-11 fees resolves safely when payments is missing. |
| test/unit/handlers/request-handlers/root-request-handler.spec.ts | Adds regression coverage for missing payments block. |
| .changeset/root-handler-crash-payments-disabled.md | Adds release note for the bugfix. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@cameri, could you please take another look |
Description
rootRequestHandlerbuilds the NIP-11 relay information document'sfeesfield by callingObject.getOwnPropertyNames(settings.payments.feeSchedules)with no guard onsettings.paymentsbeing present. Sincepaymentsis an optional field onSettings, any relay running without apaymentsblock insettings.yamlthrows aTypeErroron every request with anAccept: application/nostr+jsonheader. The fix mirrors the optional-chaining pattern already used elsewhere in this same file (e.g.hasAdmissionRestriction,payment_required): whensettings.paymentsis absent,feesnow resolves to{}instead of crashing.Related Issue
Issue #681
Motivation and Context
Any relay operator who omits the
paymentsblock fromsettings.yaml(rather than settingpayments.enabled: false, which ships with a full block by default) has their worker crash on every NIP-11 discovery request, sincepayments?: Paymentsis typed as optional but was accessed without a null check.How Has This Been Tested?
returns empty fees instead of crashing when the payments block is absent)that strips
paymentsfrom the stubbed settings object and assertsrootRequestHandlerdoes notthrow and returns
fees: {}.pnpm run test:unit— 1394 passing (up from 1393 with the new test).pnpm run test:cli— 73 passing.pnpm run cover:unit— passes;root-request-handler.tsat 98.21% statement coverage.pnpm run docker:test:integration— 99 scenarios / 489steps passing, including the existing umber features that exercise
this handler.
pnpm lint,pnpm exec biome format(on the touched files),pnpm check:deps,pnpm run build:check,pnpm run build, andpnpm run verify:cli:build— all clean.Screenshots (if appropriate):
N/A — backend-only change, no UI impact.
Types of changes
Checklist: