Skip to content

Relays ​

Relays are WebSocket servers that store and forward Nostr events. nostr-core provides two classes for working with them: Relay for single connections and RelayPool for multiple relays.

TIP

If you're only using the NWC class, relay management is handled automatically. This guide is for building custom Nostr applications.

Relay ​

Connect to a single relay:

ts
import { Relay } from 'nostr-core'

const relay = new Relay('wss://relay.example.com')
await relay.connect()

console.log('Connected:', relay.connected)

Publishing Events ​

ts
import { finalizeEvent, generateSecretKey } from 'nostr-core'

const sk = generateSecretKey()
const event = finalizeEvent({
  kind: 1,
  tags: [],
  content: 'Hello from nostr-core!',
  created_at: Math.floor(Date.now() / 1000),
}, sk)

const reason = await relay.publish(event)
console.log('Published:', reason)

Subscribing to Events ​

ts
const sub = relay.subscribe(
  [{ kinds: [1], limit: 10 }],
  {
    onevent(event) {
      console.log('Received:', event.content)
    },
    oneose() {
      console.log('End of stored events')
    },
    onclose(reason) {
      console.log('Subscription closed:', reason)
    },
  }
)

// Close subscription when done
sub.close()

Connection Options ​

ts
// With connection timeout
await relay.connect({ timeout: 5000 })

// Custom WebSocket implementation (useful for testing or Node.js)
const relay = new Relay('wss://relay.example.com', {
  websocketImplementation: MyWebSocket,
})

Closing ​

ts
relay.close() // Closes all subscriptions and the WebSocket

RelayPool ​

Manage connections to multiple relays:

ts
import { RelayPool } from 'nostr-core'

const pool = new RelayPool()

Subscribing Across Relays ​

ts
const relays = ['wss://relay1.example.com', 'wss://relay2.example.com']

const sub = pool.subscribe(
  relays,
  { kinds: [1], limit: 10 },
  {
    onevent(event) {
      console.log('Event from any relay:', event.content)
    },
    oneose() {
      // Called when ALL relays have sent EOSE
      console.log('All relays finished')
    },
  }
)

// Close all subscriptions
sub.close()

Publishing to Multiple Relays ​

ts
const results = await pool.publish(relays, event)
// results is an array of successful relay responses

Querying ​

Fetch events synchronously from multiple relays:

ts
const events = await pool.querySync(relays, {
  kinds: [1],
  authors: ['pubkey...'],
  limit: 50,
})

Pool Options ​

ts
const pool = new RelayPool({
  // Custom WebSocket implementation
  websocketImplementation: MyWebSocket,
  // Max time to wait for relay connections (default: 3000ms)
  maxWaitForConnection: 5000,
})

Connection Management ​

ts
// Get or create a relay connection
const relay = await pool.ensureRelay('wss://relay.example.com')

// Check connection status
const status = pool.listConnectionStatus()
// Map { 'wss://relay.example.com' => true, ... }

// Close specific relays
pool.close(['wss://relay1.example.com'])

// Close all relays
pool.close()

Released under the MIT License.