Request
Utilities for requesting events from Nostr relays with filtering, deduplication, and batching capabilities.
Functions
requestOne(options)
Requests events from a single relay using the given filters. Returns a promise that resolves with deduplicated events.
Options:
relay
- Relay URLfilters
- Array of Nostr filterssignal?
- AbortSignal for cancellationtracker?
- Event tracker for deduplicationcontext?
- Adapter contextautoClose?
- Auto-close subscription after EOSE- Validation functions:
isEventValid
,isEventDeleted
- Callback functions:
onEvent
,onDeleted
,onInvalid
,onFiltered
,onDuplicate
,onDisconnect
,onEose
,onClose
request(options)
Requests events from multiple relays in parallel. Returns a promise that resolves with all events from all relays.
Options:
relays
- Array of relay URLsfilters
- Array of Nostr filtersthreshold?
- Fraction of relays that must close before completing (default: 1)- All other options from
requestOne
makeLoader(options)
Creates a batched loader function that delays and combines requests for efficiency.
Options:
delay
- Batch delay in millisecondstimeout?
- Request timeoutthreshold?
- Relay completion threshold- Validation functions and context options
load(filters, relays, options)
Pre-configured loader with 200ms delay, 3s timeout, and 0.5 threshold.
Example
typescript
import {request, load} from "@welshman/net"
// Simple request - without autoClose or a signal this will continue to stream indefinitely.
// Default policies (see policy.ts) will also re-send the subscription when sockets reconnect
const events = await request({
relays: ["wss://relay1.com", "wss://relay2.com"],
filters: [{kinds: [1], limit: 10}],
onEvent: (event, url) => console.log(`Event from ${url}:`, event.id)
})
// Batched loading (more efficient for multiple requests)
const profileEvents = await load({
relays: ["wss://relay1.com"],
filters: [{kinds: [0], authors: ["pubkey1", "pubkey2"]}]
})