UNPKG

fire-rtc

Version:

serverless webRTC, using firebase's database as the sdp-broker

68 lines (56 loc) 2.27 kB
import Peer from 'simple-peer'; export default function createFireRTC({ firebase, // firebase instance initiator, // whether you initiate the connection firebaseNameSpace, // optional firebase namespace peerConfig = {}, // further simple-peer configurations debug, // log debug outputs id, // peer id to identify the webRTC connection onError = () => {}, // error callback onConnect = () => {}, // callback when connected onData = () => {}, // callback when data was received onSignal = () => {} // callback when own signal is ready (from this point on you can join }) { let ownSignal; const p = new Peer({ ...peerConfig, initiator, trickle: false }); p.on('error', function (err) { console.error('error', err) }); p.on('signal', function (signal) { if (ownSignal) return; debug && console.log('SIGNAL', signal); ownSignal = signal; join(); onSignal(signal); }); p.on('connect', function () { debug && console.log('CONNECTED'); firebase.app(firebaseNameSpace).database().ref(`sdp/${id}`).remove(); onConnect(p); }); p.on('data', function (data) { debug && console.log('data: ' + data); onData(data); }); if(!initiator) listen(); function listen() { const relevantType = initiator ? 'answer' : 'offer'; const sdpRef = firebase.app(firebaseNameSpace).database().ref(`sdp/${id}`); sdpRef.on('value', s => { if(s.val() && s.val()[relevantType]) p.signal(s.val()[relevantType]); }); } function join() { if(!ownSignal) throw new Error('join failed, due to missing signal'); if(initiator) listen(); firebase.app(firebaseNameSpace).database().ref(`sdp/${id}/${ownSignal.type}`).set(ownSignal); } function send(data) { try{ p.send(data); } catch ( e) { onError(e); } } return { send }; }