Files
welshman/docs/net/targets.md
T
2025-02-25 14:07:44 -08:00

138 lines
3.1 KiB
Markdown

# Targets
The targets system provides different strategies for message routing.
Each target type implements a common interface for handling nostr messages but with different routing behaviors.
## Overview
Targets are used by the [Executor](/net/executor.md) class to:
- Route messages to connections
- Handle responses
- Manage connection lifecycles
- Combine multiple routing strategies
## Available Targets
### Echo Target
Simple target that echoes messages back. Useful for testing.
```typescript
import {Echo} from '@welshman/net'
const echo = new Echo()
echo.on('EVENT', (url, event) => {
console.log('Echo received:', event)
})
```
### Local Target
Connects to an in-memory relay implementation.
```typescript
import {Local} from '@welshman/net'
import {Repository, Relay} from '@welshman/util'
// Create local relay
const repository = new Repository()
const relay = new Relay(repository)
const local = new Local(relay)
// Use like any other target
local.send(['REQ', 'sub1', {kinds: [1]}])
```
### Relay Target
Single relay connection target.
```typescript
import {Relay} from '@welshman/net'
const target = new Relay(connection)
target.on('EVENT', (url, event) => {
console.log(`Event from ${url}:`, event)
})
```
### Relays Target
Manages multiple relay connections.
```typescript
import {Relays} from '@welshman/net'
const target = new Relays([
connection1,
connection2,
connection3
])
```
### Multi Target
Combines multiple targets into one.
```typescript
import {Multi, Local, Relays} from '@welshman/net'
// Create multi-target with local and remote relays
const target = new Multi([
new Local(localRelay),
new Relays(remoteConnections)
])
```
## Real World Example
Here's how Coracle might set up its relay infrastructure:
```typescript
import {
Executor,
Multi,
Local,
Relays
} from '@welshman/net'
import {Repository, Relay} from '@welshman/util'
// Setup
const setupRelayInfrastructure = () => {
// Create local repository & relay
const repository = new Repository()
const localRelay = new Relay(repository)
// Get remote connections from pool
const remoteConnections = [
pool.get("wss://relay1.example.com"),
pool.get("wss://relay2.example.com")
]
// Create multi-target executor
const executor = new Executor(
new Multi([
// Local relay for immediate responses
new Local(localRelay),
// Remote relays for network queries
new Relays(remoteConnections)
])
)
// Subscribe using combined target
const sub = executor.subscribe(
[{kinds: [1], limit: 10}],
{
onEvent: (url, event) => {
if (url === LOCAL_RELAY_URL) {
console.log('Got from cache:', event)
} else {
console.log('Got from network:', url, event)
}
}
}
)
return {executor, sub}
}
```
The target system allows for flexible relay configurations while maintaining a consistent interface for the rest of the application. This is particularly useful for:
- Caching with local relays
- Load balancing across relays
- Fallback strategies
- Testing and simulation
Each target type serves a specific purpose but can be combined using `Multi` for complex routing scenarios.