# Connection The `Connection` class is the core building block for relay communication in `@welshman/net`. It manages the complete lifecycle of a relay connection, including socket handling, message queuing, authentication, and statistics tracking. ## Overview A Connection handles: - WebSocket lifecycle - Message queuing and throttling - Connection state tracking - Relay authentication - Connection statistics ## Basic Usage ```typescript import {Connection} from '@welshman/net' // Create connection const connection = new Connection("wss://relay.example.com") // Listen for events connection.on('event', (conn, subId, event) => { console.log(`Got event from ${conn.url}`) }) // Send a subscription connection.send(["REQ", "my-sub", {kinds: [1], limit: 10}]) // Clean up when done connection.cleanup() ``` ## Handling Authentication The `connection.open()` promise resolves when the WebSocket connection is fully established and ready for communication. However, it's important to understand the authentication flow: ```typescript import {Connection} from '@welshman/net' const connection = new Connection("wss://relay.example.com") // Basic open await connection.open() // Promise resolves when WebSocket is connected // BUT might not be auth-ready yet! // Complete open with auth handling const openRelay = async (url: string) => { const connection = new Connection(url) // Open socket await connection.open() // Check if relay requires auth if (connection.auth.status === 'requested') { try { // Handle auth challenge await connection.auth.attempt(3000) // 3s timeout } catch (e) { console.error('Auth failed:', e) return null } } // NOW connection is fully ready return connection } ``` The key states after `open()` resolves: - Socket is connected - Messages can be queued - BUT relay might request authentication - AND authentication might fail Always check `connection.auth.status` if you need to ensure the connection is fully authenticated before use.