Skip to content

Socket

The Socket class is exclusively used by the Connection class as its low-level WebSocket manager. It's not meant to be used directly by other classes. Its sole purpose is to provide a reliable, manageable WebSocket connection with nostr-specific handling.

Core Responsibilities

typescript
export class Socket {
  // Track connection state
  status: SocketStatus = "new" | "open" | "opening" | "closing" | "closed" | "error"

  // Handle nostr message queue
  worker: Worker<Message>

  // Core operations
  open = async () => {/* Initialize WebSocket */}
  close = async () => {/* Clean shutdown */}
  send = async (message: Message) => {/* Send with JSON serialization */}
}

Key features:

  • State tracking
  • Message queuing
  • JSON serialization
  • Error recovery
  • Connection lifecycle

Think of it as a thin wrapper that turns raw WebSocket connections into something more suitable for nostr:

typescript
// Raw WebSocket
ws.send(JSON.stringify(["REQ", "sub1", {kinds: [1]}]))

// With Socket
socket.send(["REQ", "sub1", {kinds: [1]}]) // Handles serialization

Usage Chain

typescript
// Hierarchy
Socket                    // WebSocket management
  ↳ Connection           // Uses Socket
    ↳ Relay Target      // Uses Connection
      ↳ Executor       // Uses Target
        ↳ Subscribe   // Uses Executor
        ↳ Publish    // Uses Executor

// In Connection.ts
export class Connection extends Emitter {
  socket: Socket

  constructor(url: string) {
    this.socket = new Socket(this)
  }
}

It's an internal implementation detail that you shouldn't need to use directly - always interact with the Connection class instead, which provides a higher-level interface.

typescript
// DON'T use Socket directly
const socket = new Socket(/*...*/) // ❌

// DO use Connection
const connection = new Connection(url) // ✅

This encapsulation ensures consistent connection management across the library.