> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # Technical Reference > **Deprecated** > > This version of the SDK will be end of life and unsupported starting June 2027. Please consider using the [latest version](/docs/browser-sdk). #### [npm](https://www.npmjs.com/package/@signalwire/js) @signalwire/js #### [GitHub](https://github.com/signalwire/signalwire-js) signalwire-js ```bash npm install @signalwire/js@3 ``` The SignalWire Browser SDK is a JavaScript library that enables WebRTC-based voice, video, and chat applications directly in web browsers. Built on WebSocket architecture, it provides real-time communication capabilities without plugins or downloads. #### Getting Started #### Install the SDK Choose your preferred installation method: ```bash npm install @signalwire/js@3 ``` Or include it via CDN: ```html ``` #### Obtain tokens from your server Browser applications require tokens from SignalWire's REST APIs for security. Create these server-side: ```javascript // Server-side: Get a Video Room token // Replace , , and with your actual values const response = await fetch('https://.signalwire.com/api/video/room_tokens', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Basic ' + btoa(':') // Your SignalWire credentials }, body: JSON.stringify({ room_name: "my_room", user_name: "John Smith", permissions: [ "room.self.audio_mute", "room.self.audio_unmute", "room.self.video_mute", "room.self.video_unmute", "room.self.deaf", "room.self.undeaf", "room.self.set_input_volume", "room.self.set_output_volume", "room.self.set_input_sensitivity" ], room_display_name: "My Room", join_as: "member" }) }); const { token } = await response.json(); ``` #### Test your setup Create a simple video room to test your setup: #### NPM Package ```javascript import { Video } from "@signalwire/js"; // Join a video room const roomSession = new Video.RoomSession({ token: "your-room-token", // From your server rootElement: document.getElementById("video-container") }); // Listen for events roomSession.on("member.joined", (e) => { console.log(`${e.member.name} joined the room`); }); roomSession.on("room.joined", () => { console.log("Successfully joined the room!"); }); // Join the room await roomSession.join(); ``` #### CDN ```html ``` Add this HTML element to your page: ```html
``` ## Core Concepts The SDK operates through WebSocket connections that handle both method calls and real-time events. When you call methods like `join()` or `publish()`, the SDK sends requests and returns promises. Simultaneously, you can listen for real-time events like new members joining or messages arriving using the `.on()` method. ## Namespaces #### [Video](/docs/browser-sdk/v3/js/reference/video) Create and display video rooms, members, recordings, and streams #### [Chat](/docs/browser-sdk/v3/js/reference/chat) Build chat applications with members and messages #### [PubSub](/docs/browser-sdk/v3/js/reference/pubsub) Publish and subscribe to real-time message channels #### [SignalWire Client](/docs/browser-sdk/v3/js/reference/signalwire) The client for making and receiving calls, playing audio, and recording. #### [WebRTC](/docs/browser-sdk/v3/js/reference/webrtc) A wrapper for browser's device and media stream management ### WebSocket Event Architecture The SDK operates on a bidirectional WebSocket connection between your browser application and SignalWire's servers. This enables real-time communication through a structured event system: ```mermaid graph LR A["Browser Application
(Your Web App)"] <-->|"Method Calls
roomSession.join(), client.publish()
chat.subscribe()"| B[WebSocket
Connection] <-->|"Process & Respond"| C[SignalWire] C -->|"Real-time Events
member.joined, message.received
call.state"| B -->|"Event Data
client.on('events')"| A ``` When you call a method like `roomSession.join()`, 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 joining a video room or publishing a message. The `.on()` methods handle a different communication pattern: real-time event notifications. These are asynchronous events triggered by external actions - like when someone joins your video room (`member.joined`), sends you a message (`message.received`), or when device states change (`call.state`). Unlike method responses, these events arrive whenever the triggering action occurs, not as a direct response to your code. ### Authentication and Access Control Browser SDK clients use token-based authentication for security. Since web browsers are untrusted environments where secrets can be exposed, API tokens must be kept on your server and used to generate limited-scope tokens for client use. #### Server-to-Browser Authentication Flow ```mermaid sequenceDiagram participant SW as SignalWire Servers participant YS as Your Server participant B as Browser (Client) B->>YS: Request token for room/channel access YS->>SW: POST /api/video/room_tokens
(with Project ID & API Token) SW-->>YS: { "token": "limited-scope-token" } YS-->>B: { "token": "limited-scope-token" } B->>SW: Connect with Browser SDK
(using limited token) SW-->>B: WebSocket connection established SW-->>B: Real-time events & media streams ``` #### Token Types by Namespace Different namespaces require specific token types: ```javascript // Video Room Session - requires Room Token const roomSession = new SignalWire.Video.RoomSession({ token: "room-token-from-rest-api", // Get from /api/video/room_tokens rootElement: document.getElementById("video-container") }); // Chat Client - requires Chat Token const chatClient = new SignalWire.Chat.Client({ token: "chat-token-from-rest-api" // Get from /api/chat/tokens }); // PubSub Client - requires PubSub Token const pubSubClient = new SignalWire.PubSub.Client({ token: "pubsub-token-from-rest-api" // Get from /api/fabric/subscriber_tokens }); ``` #### Server-Side Token Generation Your server uses Project ID and API Token to generate limited-scope tokens: ```javascript // Example: Generate a Video Room Token const response = await fetch('https://.signalwire.com/api/video/room_tokens', { method: 'POST', headers: { 'Authorization': 'Basic ' + btoa(':'), 'Content-Type': 'application/json' }, body: JSON.stringify({ room_name: "my_room", user_name: "John Smith", permissions: ["room.self.audio_mute", "room.self.video_mute"] }) }); const { token } = await response.json(); // Send this token to your browser client ``` This approach ensures your project credentials never expose to client-side code while providing scoped access to specific rooms, channels, or resources.