Skip to content

Router

The Router is the critical component to efficiently enable the outbox model in your Nostr application. It handles relay selection for reading, writing, and discovering events while considering relay quality, user preferences, and network conditions.

Overview

The router provides scenarios for common Nostr operations:

  • Reading user profiles
  • Publishing events
  • Following threads
  • Handling DMs
  • Searching content

Each scenario considers:

  • User's relay preferences (NIP-65)
  • Event hints in tags
  • Relay quality scores
  • Fallback policies
  • Connection status

Basic Usage

typescript
import {ctx, setContext} from '@welshman/lib'
import {getDefaultAppContext} from '@welshman/app'

// Initialize router
setContext({
  app: getDefaultAppContext()
})

// Use router scenarios
const router = ctx.app.router

// Get relays for reading a profile
const readRelays = router.ForPubkey(pubkey).getUrls()

// Get relays for publishing
const writeRelays = router.FromUser().getUrls()

// Get relays for a thread
const threadRelays = router.Replies(event).getUrls()

Thread Navigation

typescript
import {ctx} from '@welshman/lib'
import {createEvent, NOTE} from '@welshman/util'
import {publishThunk} from '@welshman/app'

const loadThread = async (event: TrustedEvent) => {
  // Get relays for root event
  const rootRelays = ctx.app.router
    .EventRoots(event)
    .getUrls()

  // Get relays for replies
  const replyRelays = ctx.app.router
    .EventParents(event)
    .getUrls()

  // Get relays for mentions
  const mentionRelays = ctx.app.router
    .EventMentions(event)
    .getUrls()

  // Load from all relevant relays
  await Promise.all([
    subscribe({filters, relays: rootRelays}),
    subscribe({filters, relays: replyRelays}),
    subscribe({filters, relays: mentionRelays})
  ])
}

// Posting a reply
const reply = async (parent: TrustedEvent, content: string) => {
  const event = createEvent(NOTE, {content})

  // Get optimal relays for publishing
  const relays = ctx.app.router
    .PublishEvent(event)
    // Skip .onion relays
    .allowOnion(false)
    // Allow up to 5 relays
    .limit(5)
    .getUrls()

  return publishThunk({event, relays})
}

Router Features

  • Smart relay selection based on context
  • Quality scoring of relays
  • Fallback strategies
  • Handling of special relay types (.onion, local)
  • Automatic weight calculation
  • Connection state awareness
  • NIP-65 compliance

The router is central to efficient nostr operations, ensuring events reach their intended audience while minimizing unnecessary network traffic.