pigeonrtc
Version:
Pluggable cross-browser compatible WebRTC library for PeerPigeon
118 lines (94 loc) • 3.09 kB
JavaScript
import { RTCAdapter } from './RTCAdapter.js';
/**
* Browser-native WebRTC adapter for use in web browsers.
* This adapter uses the browser's native WebRTC implementation.
*/
export class BrowserRTCAdapter extends RTCAdapter {
constructor() {
super();
this._checkSupport();
}
_checkSupport() {
// Check if we're in a browser environment
if (typeof window === 'undefined' || typeof navigator === 'undefined') {
return;
}
// Browser environment - check for WebRTC support
this.hasRTCPeerConnection = !!(
window.RTCPeerConnection ||
window.webkitRTCPeerConnection ||
window.mozRTCPeerConnection
);
this.hasGetUserMedia = !!(
navigator.mediaDevices?.getUserMedia ||
navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia
);
this.hasGetDisplayMedia = !!(
navigator.mediaDevices?.getDisplayMedia
);
}
getRTCPeerConnection() {
if (typeof window === 'undefined') {
throw new Error('BrowserRTCAdapter requires a browser environment');
}
return window.RTCPeerConnection ||
window.webkitRTCPeerConnection ||
window.mozRTCPeerConnection;
}
getRTCSessionDescription() {
if (typeof window === 'undefined') {
throw new Error('BrowserRTCAdapter requires a browser environment');
}
return window.RTCSessionDescription ||
window.mozRTCSessionDescription;
}
getRTCIceCandidate() {
if (typeof window === 'undefined') {
throw new Error('BrowserRTCAdapter requires a browser environment');
}
return window.RTCIceCandidate ||
window.mozRTCIceCandidate;
}
getMediaStream() {
if (typeof window === 'undefined') {
return null;
}
return window.MediaStream || window.webkitMediaStream;
}
isSupported() {
return typeof window !== 'undefined' && this.hasRTCPeerConnection;
}
getName() {
return 'BrowserRTCAdapter';
}
async getUserMedia(constraints) {
if (typeof navigator === 'undefined') {
throw new Error('getUserMedia requires a browser environment');
}
// Modern API
if (navigator.mediaDevices?.getUserMedia) {
return await navigator.mediaDevices.getUserMedia(constraints);
}
// Legacy API with Promise wrapper
const getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
if (!getUserMedia) {
throw new Error('getUserMedia is not supported in this browser');
}
return new Promise((resolve, reject) => {
getUserMedia.call(navigator, constraints, resolve, reject);
});
}
async getDisplayMedia(constraints) {
if (typeof navigator === 'undefined') {
throw new Error('getDisplayMedia requires a browser environment');
}
if (!navigator.mediaDevices?.getDisplayMedia) {
throw new Error('getDisplayMedia is not supported in this browser');
}
return await navigator.mediaDevices.getDisplayMedia(constraints);
}
}