*** id: dbcca373-5951-4202-9866-009b87d4c670 title: Realtime Server SDK sidebar-title: Overview position: 0 slug: /node subtitle: Node.js server SDK for real-time communication through WebSocket connections description: >- Build real-time voice, video, messaging, and chat applications with the SignalWire Realtime SDK for Node.js. Event-driven WebSocket architecture with dedicated namespaces. keywords: >- SignalWire, Realtime SDK, Node.js, JavaScript, real-time communication, overview, introduction, getting started max-toc-depth: 3 ---------------- @signalwire/realtime-api signalwire/signalwire-js ```bash npm install @signalwire/realtime-api ``` The SignalWire Realtime SDK v4 is a Node.js server SDK that enables real-time communication through WebSocket connections. Built on an event-driven architecture, it provides dedicated namespaces for voice, video, messaging, chat, pub/sub, and task management. ## Getting Started ```bash npm install @signalwire/realtime-api ``` For Voice, Messaging, and Task namespaces, create a RELAY Application resource in your dashboard: 1. Set a name for your application 2. Choose a reference (e.g., "support", "sales") that matches your client's topics 3. Assign [phone numbers](/docs/platform/phone-numbers#phone-number-configuration) or [SIP addresses](/docs/platform/addresses) to route calls to this application Get your project credentials from the [SignalWire Dashboard](/docs/platform/your-signalwire-api-space): ```javascript import { SignalWire } from "@signalwire/realtime-api"; const client = await SignalWire({ project: "your-project-id", token: "your-api-token" }); // Access namespace clients const voiceClient = client.voice; ``` Create a simple inbound call handler to test your setup: ```javascript import { SignalWire } from "@signalwire/realtime-api"; const client = await SignalWire({ project: "your-project-id", token: "your-api-token" }); const voiceClient = client.voice; // Answer incoming calls and play a greeting await voiceClient.listen({ topics: ["support"], // Must match your RELAY Application reference onCallReceived: async (call) => { console.log("Incoming call from:", call.from); await call.answer(); await call.playTTS({ text: "Welcome to SignalWire!" }); } }); console.log("Waiting for calls..."); ``` Now call the SignalWire phone number or SIP address you assigned to your RELAY Application in step 2. Your application will answer and play the greeting! ## Core Concepts ### WebSocket Event Architecture The SDK operates on a bidirectional WebSocket connection between your application and SignalWire's servers. This enables real-time communication through a structured event system: ```mermaid graph LR A["SDK Client
(Your Application)"] <-->|"Method Calls
client.dialPhone(), client.send()
roomSession.join()"|B[WebSocket
Connection] <-->|"Process & Respond"| C[SignalWire] C -->|"Real-time Events
call.received, message.received
room.started"| B -->|"Event Data
client.listen(callbacks)"| A ``` When you call a method like `client.dialPhone()`, the SDK sends your request over the WebSocket connection and SignalWire processes it and responds immediately. These method calls follow a request-response pattern - the returned promise resolves with the result data, such as a `Call` object containing all the details of your newly created call. The `listen()` methods handle a different communication pattern: real-time event notifications. These are asynchronous events triggered by external actions - like when someone calls your number (`onCallReceived`), sends you a message (`onMessageReceived`), or when something happens in a video room you're monitoring (`onMemberJoined`). Unlike method responses, these events arrive whenever the triggering action occurs, not as a direct response to your code. ### Authentication and Access Control All SDK clients authenticate using project credentials. Voice, Messaging, and Task namespaces also require topic subscriptions that control event routing: ```javascript import { SignalWire } from "@signalwire/realtime-api"; const client = await SignalWire({ project: "your-project-id", // SignalWire project identifier token: "your-project-token" // API token from project settings }); const voiceClient = client.voice; // Voice, Messaging, and Task require topics for event routing await voiceClient.listen({ topics: ["support", "sales"], // Required for Voice, Messaging, Task onCallReceived: (call) => { /* handle call */ } }); ``` Your `project` ID and `token` are available in the [SignalWire Dashboard](/docs/platform/your-signalwire-api-space). These authenticate your WebSocket connection and establish your access permissions. Topics (formerly contexts) work with RELAY Application resources to route events. When you assign a phone number or a SIP address to a RELAY Application with reference "support", SignalWire routes all calls from that number or SIP address to SDK clients authenticated with the "support" topic. This creates strict access control - a client subscribed to "support" cannot receive events intended for "sales". The routing process is straightforward: incoming calls hit a phone number or a SIP address, SignalWire checks the RELAY Application's reference, then delivers the event only to clients with matching topics. This happens automatically based on your authentication. ```javascript // Topic-based client (receives events only for subscribed topics) await voiceClient.listen({ topics: ["support", "sales"], // Only receive calls for these topics onCallReceived: (call) => { /* handle call */ } }); // Non-topic client (receives all events for the project) await videoClient.listen({ onRoomStarted: (roomSession) => { /* handle room */ } // No topics needed }); ``` ## Available Namespaces Make and receive calls, play audio, record, and build IVRs Monitor video rooms, members, recordings, and streams Publish and subscribe to real-time message channels Build chat applications with members and messages Distribute tasks to workers via topic routing