Skip to content

Commit 60e5cba

Browse files
committed
feat: add nip11 limitation fields for created_at, default_limit, and restricted_writes
1 parent 6b2e9d7 commit 60e5cba

2 files changed

Lines changed: 55 additions & 1 deletion

File tree

src/handlers/request-handlers/root-request-handler.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,19 @@ export const rootRequestHandler = (request: Request, response: Response, next: N
2121
paymentsUrl.pathname = '/invoices'
2222

2323
const content = settings.limits?.event?.content
24+
const eventLimits = settings.limits?.event
25+
const createdAtLimits = eventLimits?.createdAt
26+
const hasAdmissionRestriction =
27+
settings.payments?.enabled === true &&
28+
Boolean(settings.payments?.feeSchedules?.admission?.some((feeSchedule) => feeSchedule.enabled))
29+
const hasWriteRestriction =
30+
hasAdmissionRestriction ||
31+
(eventLimits?.eventId?.minLeadingZeroBits ?? 0) > 0 ||
32+
(eventLimits?.pubkey?.minLeadingZeroBits ?? 0) > 0 ||
33+
(eventLimits?.pubkey?.whitelist?.length ?? 0) > 0 ||
34+
(eventLimits?.pubkey?.blacklist?.length ?? 0) > 0 ||
35+
(eventLimits?.kind?.whitelist?.length ?? 0) > 0 ||
36+
(eventLimits?.kind?.blacklist?.length ?? 0) > 0
2437

2538
const pubkey = rawPubkey.startsWith('npub1') ? fromBech32(rawPubkey) : rawPubkey
2639
const self = rawSelf?.startsWith('npub1') ? fromBech32(rawSelf) : rawSelf
@@ -49,9 +62,13 @@ export const rootRequestHandler = (request: Request, response: Response, next: N
4962
max_content_length: Array.isArray(content)
5063
? content[0].maxLength // best guess since we have per-kind limits
5164
: content?.maxLength,
52-
min_pow_difficulty: settings.limits?.event?.eventId?.minLeadingZeroBits,
65+
min_pow_difficulty: eventLimits?.eventId?.minLeadingZeroBits,
5366
auth_required: false,
5467
payment_required: settings.payments?.enabled,
68+
created_at_lower_limit: createdAtLimits?.maxNegativeDelta,
69+
created_at_upper_limit: createdAtLimits?.maxPositiveDelta,
70+
default_limit: 500,
71+
restricted_writes: hasWriteRestriction,
5572
},
5673
payments_url: paymentsUrl.toString(),
5774
fees: Object.getOwnPropertyNames(settings.payments.feeSchedules).reduce(

test/unit/handlers/request-handlers/root-request-handler.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,43 @@ describe('rootRequestHandler', () => {
124124
expect(doc.self).to.equal('f'.repeat(64))
125125
expect(doc.terms_of_service).to.equal('https://relay.example.com/terms')
126126
})
127+
128+
it('includes NIP-11 limitation created_at and default_limit fields', () => {
129+
createSettingsStub.returns({
130+
...baseSettings,
131+
limits: {
132+
...baseSettings.limits,
133+
event: {
134+
...baseSettings.limits.event,
135+
createdAt: {
136+
maxNegativeDelta: 86400,
137+
maxPositiveDelta: 300,
138+
},
139+
},
140+
},
141+
})
142+
143+
rootRequestHandler(req, res, next)
144+
145+
const doc = res.send.firstCall.args[0]
146+
expect(doc.limitation.created_at_lower_limit).to.equal(86400)
147+
expect(doc.limitation.created_at_upper_limit).to.equal(300)
148+
expect(doc.limitation.default_limit).to.equal(500)
149+
})
150+
151+
it('sets limitation.restricted_writes based on active write restrictions', () => {
152+
rootRequestHandler(req, res, next)
153+
const defaultDoc = res.send.firstCall.args[0]
154+
expect(defaultDoc.limitation.restricted_writes).to.equal(false)
155+
156+
res.send.resetHistory()
157+
createSettingsStub.returns(settingsWithFee)
158+
159+
rootRequestHandler(req, res, next)
160+
161+
const restrictedDoc = res.send.firstCall.args[0]
162+
expect(restrictedDoc.limitation.restricted_writes).to.equal(true)
163+
})
127164
})
128165

129166
describe('when serving HTML', () => {

0 commit comments

Comments
 (0)