Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bandwidth WebRTC Browser Dialer Sample

WebRTC Icon

A sample application demonstrating how to build a browser-based Bandwidth RTC dialer using the Bandwidth Real-Time Communications (BRTC) JavaScript SDK. This application showcases the BRTC product by allowing you to place calls to phone numbers of your choice. The connection to arbitrary call-ids and endpoints is in progress.

Overview

This sample application consists of two main components:

Frontend (React)

  • Bandwidth RTC Integration: Uses the bandwidth-rtc SDK to establish Bandwidth RTC connections
  • Media Controls: Capture and manage audio input/output devices
  • Call Controls: Dial phone numbers, accept incoming calls, and manage call state
  • Endpoint Management: Create and manage WebRTC endpoints for phone number connections

Backend (Node.js/Express)

  • Endpoint Management: Creates and manages Bandwidth RTC endpoints
  • Call Orchestration: Handles inbound and outbound call routing via Bandwidth Voice API
  • Callback Handling: Processes webhooks for call and endpoint events
  • Token Management: Manages OAuth2 authentication with Bandwidth API

Features

Currently Supported

  • Make outbound calls from browser to phone numbers
  • Receive inbound calls on browser endpoints
  • Real-time audio streaming via Bandwidth RTC
  • Dynamic endpoint creation and management
  • Call state management and event handling
  • Audio device selection and control

In Progress

  • Connection to arbitrary call-ids and endpoints

Architecture

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Browser Client │ ◄─────► │ Express Server │ ◄─────► │ Bandwidth API │
│ (React App) │ │ (Node.js) │ │ (Voice/BRTC) │
│ localhost:5000 │ │ localhost:3000 │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Bandwidth RTC HTTPS
│
│ Webhooks
▼
┌──────────────────┐
│ ngrok/Public │
│ Callback URL │
└──────────────────┘
ServicePortDescription
Express Server3000Backend API and webhook handler
React Dev Server5000Frontend development server

Prerequisites

  • Node.js 16+ and npm
  • A Bandwidth account with:
    • Account ID
    • API credentials (username/password or client ID/secret)
    • A Bandwidth phone number
    • A configured Voice Application
    • Access to the BRTC role on your credentials
  • ngrok or similar tunneling service for webhook callbacks

Development Setup

1. Clone the Repository

git clone <repository-url>cd javascript-brtc-sdk-sample-app

2. Install Dependencies

npm install

3. Configure Environment Variables

Copy the example environment file and fill in your Bandwidth credentials:

cp .env.example .env.local

Edit .env.local with your values:

# Bandwidth API ConfigurationHTTP_BASE_URL=https://api.bandwidth.com/v2# Bandwidth Account Credentials (use either username/password OR client credentials)ACCOUNT_ID=your_account_idBW_USERNAME=your_usernameBW_PASSWORD=your_password# OR# BW_ID_CLIENT_ID=your_client_id# BW_ID_CLIENT_SECRET=your_client_secret# Bandwidth Application SettingsAPPLICATION_ID=your_application_idFROM_NUMBER=+1XXXXXXXXXX# Bandwidth RTC Gateway URL# The Programmable Voice team will provide the customer with a gateway URL to connect toREACT_APP_WSS_URL=wss://your-webrtc-gateway-url# Public Callback URL (ngrok or similar)CALLBACK_BASE_URL=https://your-callback-url.ngrok-free.app

4. Set Up Callback URL

Start ngrok to expose your local server:

ngrok http 3000

Copy the ngrok URL and update CALLBACK_BASE_URL in .env.local.

Update your Bandwidth Voice Application settings:

  • Callback URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth
  • Call-initiated callback method: POST
  • Status URL: https://your-ngrok-url.ngrok-free.app/callbacks/bandwidth/status
  • Status callback method: POST

5. Run the Application

The application requires two processes running simultaneously:

Terminal 1 - Start the Backend Server:

npm start

This starts the Express server on port 3000.

Terminal 2 - Start the React Development Server:

npm run react

This starts the React app on port 5000.

6. Access the Application

Open your browser and navigate to:

http://localhost:5000

How to Use

  1. Create an Endpoint: Click "Create Endpoint" to establish a Bandwidth RTC connection
  2. Select Audio Devices: Choose your microphone and speakers from the available devices
  3. Make a Call: Enter a phone number (with country code, e.g., +1234567890) and click "Call"
  4. Receive a Call: When someone calls your Bandwidth number, the call will be routed to your browser
  5. End Call: Click "Hang Up" to disconnect the call
  6. Delete Endpoint: Click "Disconnect & Delete Endpoint" when done

Note: Currently, the application supports calling phone numbers. Connection to arbitrary call-ids and endpoints is under development.

Project Structure

├── server/
│ ├── index.ts # Express server with API endpoints and webhook handlers
│ └── types.ts # TypeScript type definitions
├── src/
│ ├── components/
│ │ ├── CallController.tsx # Call control UI (dial, hang up)
│ │ ├── EndpointHandler.tsx # Endpoint creation and management
│ │ ├── MediaCapture.tsx # Audio input device selection
│ │ ├── MediaPlayer.tsx # Audio output device selection
│ │ └── Navbar.tsx # Navigation bar
│ ├── css/ # Styles
│ └── App.tsx # Main application component
├── .env.example # Example environment variables
└── package.json

Key API Endpoints

Frontend → Backend

  • GET /token - Create a new Bandwidth RTC endpoint and get JWT
  • DELETE /api/endpoint/:endpointId - Delete an endpoint
  • POST /simulate-incoming-call - Place a test call

Bandwidth → Backend (Webhooks)

  • POST /callbacks/bandwidth - BRTC endpoint events and incoming PSTN calls
  • POST /callbacks/bandwidth/status - Voice API status events (disconnect)
  • POST /calls/answer - Outbound call answer BXML callback
  • POST /calls/status - Call status updates

Utility

  • GET /health - Health check
  • GET /debug/endpoints - Inspect endpoint pool status

Troubleshooting

Issue: "Missing required environment variable"

  • Solution: Ensure all required variables in .env.local are set

Issue: Calls not connecting

  • Solution: Verify your ngrok URL is set correctly and your Bandwidth Voice Application is configured with the correct callback URLs

Issue: No audio in calls

  • Solution: Check browser permissions for microphone access and verify correct audio devices are selected

Issue: "Failed to fetch auth token"

  • Solution: Verify your Bandwidth API credentials are correct

Learn More

Questions and Feedback

Reach out to support@bandwidth.com for any questions or feedback regarding this product.

License

See repository license file for details.

About

Sample application that implements the BRTC JS SDK to make demo calls

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages