104 lines
2.5 KiB
Markdown
104 lines
2.5 KiB
Markdown
# 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.
|