Every relay publishes a NIP-11 information document: an HTTPS GET to the relay's own address with Accept: application/nostr+json, answering with its name, supported_nips, limitation (including auth_required and payment_required) and its fees. Plaza has never read one. relayRow draws a coloured dot, the host, the R/W badge from relayBadgeText, and a round trip, and that is the whole of what Plaza knows about a relay.
Two things follow. Groups only exist on relays that implement NIP-29, and the honest gate is 29 appearing in supported_nips. Without it a Groups destination either appears on every relay and fails on most, or is hardcoded to hosts I happen to have heard of. Both are worse than saying no.
It also explains a class of failure Plaza reports as "offline". payment_required is the relay refusing the websocket handshake before a single Nostr message is exchanged, which the comment block above routed_refusal_strikes already documents from my own account. auth_required is the relay taking the socket and then closing the subscription. Neither is the relay being down.
No new transport is needed: fetchSlice already sends custom headers and fireLink already fetches a document body. Every field is written by a stranger, so cap each one the way parsePlace caps a place's fields.
Done
Each pool relay has a cached document with a refresh interval and a not-yet-answered state distinct from "does not support this"; the relay row can say paid or auth-required rather than only offline; and one function answers "does this relay declare NIP-N", which is what the groups interface is gated on.
Every relay publishes a NIP-11 information document: an HTTPS GET to the relay's own address with
Accept: application/nostr+json, answering with its name,supported_nips,limitation(includingauth_requiredandpayment_required) and its fees. Plaza has never read one.relayRowdraws a coloured dot, the host, the R/W badge fromrelayBadgeText, and a round trip, and that is the whole of what Plaza knows about a relay.Two things follow. Groups only exist on relays that implement NIP-29, and the honest gate is
29appearing insupported_nips. Without it a Groups destination either appears on every relay and fails on most, or is hardcoded to hosts I happen to have heard of. Both are worse than saying no.It also explains a class of failure Plaza reports as "offline".
payment_requiredis the relay refusing the websocket handshake before a single Nostr message is exchanged, which the comment block aboverouted_refusal_strikesalready documents from my own account.auth_requiredis the relay taking the socket and then closing the subscription. Neither is the relay being down.No new transport is needed:
fetchSlicealready sends custom headers andfireLinkalready fetches a document body. Every field is written by a stranger, so cap each one the wayparsePlacecaps a place's fields.Done
Each pool relay has a cached document with a refresh interval and a not-yet-answered state distinct from "does not support this"; the relay row can say paid or auth-required rather than only offline; and one function answers "does this relay declare NIP-N", which is what the groups interface is gated on.