RelayClient
RelayClient manages a persistent WebSocket connection to SignalWire’s RELAY
service. It handles authentication, automatic reconnection with exponential
backoff, inbound event dispatch, outbound dialing, and SMS/MMS messaging.
Use it when you need imperative, event-driven control over calls rather than
the declarative AI agent approach.
The client supports two authentication modes: project ID + API token, or JWT token. Credentials can be passed directly or read from environment variables.
Properties
project
SignalWire project ID. Set via constructor or SIGNALWIRE_PROJECT_ID environment variable.
token
API token for authentication. Set via constructor or SIGNALWIRE_API_TOKEN environment variable.
jwtToken
JWT token for alternative authentication. Set via constructor or SIGNALWIRE_JWT_TOKEN environment variable.
When provided, project and token are not required.
host
SignalWire space hostname (e.g., your-space.signalwire.com). Set via constructor or SIGNALWIRE_SPACE
environment variable.
contexts
List of contexts to subscribe to for inbound call and message events.
maxActiveCalls
Maximum number of concurrent inbound calls the client will track. Calls
arriving beyond this limit are dropped with a log warning. Set via constructor
or RELAY_MAX_ACTIVE_CALLS environment variable. Constructor-only — not
accessible as a public attribute after initialization.
relayProtocol
Server-assigned protocol string from the connect response. Read-only. Used internally for session resumption on reconnect.
Methods
Register an inbound call handler.
Register an inbound message handler.
Establish the WebSocket connection and authenticate.
Close the WebSocket connection cleanly.
Start the client with automatic reconnection.
Initiate an outbound call.
Send an outbound SMS or MMS message.
Subscribe to additional contexts for inbound events.
Unsubscribe from inbound event contexts.
Send a raw JSON-RPC request to RELAY.
Async Disposable
RelayClient implements Symbol.asyncDispose, so it can be used with the
await using statement for scoped connections. The client disconnects
automatically when the scope exits.
For environments without await using support, use try/finally with
disconnect().