A shim to insulate apps from WebRTC spec changes and browser prefix differences
Overall
score
98%
Common shims are universal WebRTC compatibility fixes applied across all browsers to handle differences in WebRTC specification implementations and ensure consistent behavior.
Normalizes RTCIceCandidate interface across browsers by parsing and augmenting candidate properties.
/**
* Shims RTCIceCandidate to parse and augment candidate properties
* Adds parsed fields from SDP candidate string to the candidate object
* @param window - Browser window object
*/
function shimRTCIceCandidate(window: Window): void;What it fixes:
Usage Examples:
import adapter from 'webrtc-adapter';
// RTCIceCandidate is automatically shimmed after import
const candidate = new RTCIceCandidate({
candidate: 'candidate:1 1 UDP 2113667327 192.168.1.100 54400 typ host',
sdpMid: '0',
sdpMLineIndex: 0
});
// Parsed properties are automatically available
console.log(candidate.foundation); // '1'
console.log(candidate.component); // 1
console.log(candidate.priority); // 2113667327
console.log(candidate.address); // '192.168.1.100'
console.log(candidate.port); // 54400
console.log(candidate.type); // 'host'Adds relayProtocol property to relay-type ICE candidates based on priority values.
/**
* Adds relayProtocol property to ICE candidates for relay connections
* Maps libwebrtc priority values to protocol names
* @param window - Browser window object
*/
function shimRTCIceCandidateRelayProtocol(window: Window): void;What it fixes:
Provides maxMessageSize property for SCTP data channels when not natively supported.
/**
* Shims maxMessageSize property for SCTP data channels
* Provides consistent way to query maximum message size limits
* @param window - Browser window object
* @param browserDetails - Browser detection information
*/
function shimMaxMessageSize(window: Window, browserDetails: IBrowserDetails): void;What it fixes:
Usage Examples:
import adapter from 'webrtc-adapter';
const pc = new RTCPeerConnection();
// Check maximum message size (automatically shimmed)
if (pc.sctp && pc.sctp.maxMessageSize) {
console.log('Max message size:', pc.sctp.maxMessageSize);
// Send data respecting size limits
const data = 'Large message content...';
if (data.length <= pc.sctp.maxMessageSize) {
dataChannel.send(data);
}
}Ensures DataChannel.send() throws TypeError for invalid data types.
/**
* Shims data channel send to throw TypeError for invalid data types
* Standardizes error handling across browser implementations
* @param window - Browser window object
*/
function shimSendThrowTypeError(window: Window): void;What it fixes:
Provides connectionState property for RTCPeerConnection when not natively available.
/**
* Shims RTCPeerConnection connectionState property
* Derives connection state from iceConnectionState when needed
* @param window - Browser window object
*/
function shimConnectionState(window: Window): void;What it fixes:
Usage Examples:
import adapter from 'webrtc-adapter';
const pc = new RTCPeerConnection();
// Connection state is automatically available
pc.addEventListener('connectionstatechange', () => {
console.log('Connection state:', pc.connectionState);
switch (pc.connectionState) {
case 'connected':
console.log('Peer connection established');
break;
case 'disconnected':
console.log('Peer connection lost');
break;
case 'failed':
console.log('Peer connection failed');
break;
}
});Removes problematic extmap-allow-mixed attribute from SDP.
/**
* Removes extmap-allow-mixed attribute from SDP
* Prevents compatibility issues with certain browsers
* @param window - Browser window object
* @param browserDetails - Browser detection information
*/
function removeExtmapAllowMixed(window: Window, browserDetails: IBrowserDetails): void;What it fixes:
Handles null or empty ICE candidate additions gracefully.
/**
* Handles null or empty ICE candidate additions gracefully
* Standardizes end-of-candidates signaling behavior
* @param window - Browser window object
* @param browserDetails - Browser detection information
*/
function shimAddIceCandidateNullOrEmpty(window: Window, browserDetails: IBrowserDetails): void;What it fixes:
Enables parameterless setLocalDescription() calls.
/**
* Supports parameterless setLocalDescription calls
* Automatically uses last created offer/answer when no parameters provided
* @param window - Browser window object
* @param browserDetails - Browser detection information
*/
function shimParameterlessSetLocalDescription(window: Window, browserDetails: IBrowserDetails): void;What it fixes:
Usage Examples:
import adapter from 'webrtc-adapter';
const pc = new RTCPeerConnection();
// Modern parameterless usage (automatically shimmed)
const offer = await pc.createOffer();
await pc.setLocalDescription(); // Uses created offer automatically
// Traditional explicit usage still works
await pc.setLocalDescription(offer);All common shims are available through the adapter object:
interface ICommonShim {
shimRTCIceCandidate: (window: Window, browserDetails?: IBrowserDetails) => void;
shimRTCIceCandidateRelayProtocol: (window: Window, browserDetails?: IBrowserDetails) => void;
shimMaxMessageSize: (window: Window, browserDetails: IBrowserDetails) => void;
shimSendThrowTypeError: (window: Window) => void;
shimConnectionState: (window: Window, browserDetails?: IBrowserDetails) => void;
removeExtmapAllowMixed: (window: Window, browserDetails: IBrowserDetails) => void;
shimAddIceCandidateNullOrEmpty: (window: Window, browserDetails: IBrowserDetails) => void;
shimParameterlessSetLocalDescription: (window: Window, browserDetails: IBrowserDetails) => void;
}These shims are automatically applied when importing webrtc-adapter, and are accessible via adapter.commonShim for manual application or testing purposes.
Install with Tessl CLI
npx tessl i tessl/npm-webrtc-adapterdocs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10