@nostr-dev-kit/ndk
Version:
NDK - Nostr Development Kit. Includes AI Guardrails to catch common mistakes during development.
86 lines (80 loc) • 2.42 kB
text/typescript
/**
* NIP-11: Relay Information Document
* https://github.com/nostr-protocol/nips/blob/master/11.md
*/
export interface NDKRelayInformation {
name?: string;
description?: string;
banner?: string;
icon?: string;
pubkey?: string;
contact?: string;
supported_nips?: number[];
software?: string;
version?: string;
privacy_policy?: string;
terms_of_service?: string;
limitation?: {
max_message_length?: number;
max_subscriptions?: number;
max_subid_length?: number;
max_limit?: number;
max_event_tags?: number;
max_content_length?: number;
min_pow_difficulty?: number;
auth_required?: boolean;
payment_required?: boolean;
restricted_writes?: boolean;
created_at_lower_limit?: number;
created_at_upper_limit?: number;
default_limit?: number;
};
retention?: Array<{
kinds?: Array<number | [number, number]>;
time?: number | null;
count?: number;
}>;
relay_countries?: string[];
language_tags?: string[];
tags?: string[];
posting_policy?: string;
payments_url?: string;
fees?: {
admission?: Array<{
amount: number;
unit: string;
}>;
subscription?: Array<{
amount: number;
unit: string;
period: number;
}>;
publication?: Array<{
kinds?: number[];
amount: number;
unit: string;
}>;
};
[key: string]: unknown;
}
/**
* Fetches NIP-11 relay information document from a relay.
*
* @param relayUrl The WebSocket URL of the relay (e.g., "wss://relay.example.com")
* @returns The relay information document
* @throws Error if the fetch fails or returns invalid JSON
*/
export async function fetchRelayInformation(relayUrl: string): Promise<NDKRelayInformation> {
// Convert wss:// to https:// and ws:// to http://
const httpUrl = relayUrl.replace(/^wss:\/\//, "https://").replace(/^ws:\/\//, "http://");
const response = await fetch(httpUrl, {
headers: {
Accept: "application/nostr+json",
},
});
if (!response.ok) {
throw new Error(`Failed to fetch relay information: ${response.status} ${response.statusText}`);
}
const data = await response.json();
return data as NDKRelayInformation;
}