UNPKG

rtc-link

Version:

A library for managing WebRTC connections with multiplexed streams, anti-glare handling, and streamlined data channel setup.

34 lines (29 loc) 1.36 kB
import {waitForOffer} from "./waitForOffer.js"; import {extractFingerprint} from "./extractFingerprint.js"; import {connectAndSend, withEncoding} from "rxprotoplex"; import {CHANNEL} from "./constants.js"; export const listenForOffer = async (plex, rtc, close$, makeNewPeer) => { try { const offer = await waitForOffer(plex, close$); if (!offer) return; const incomingFingerprint = extractFingerprint(offer.sdp); // Glare handling: if we are making an offer and receive an incoming offer, we check fingerprints if (rtc.makingOffer || rtc.signalingState !== "stable") { if (rtc.localFingerprint && incomingFingerprint) { if (incomingFingerprint < rtc.localFingerprint) { return makeNewPeer(false); } } } // Check if rtc is still open before setting remote description if (rtc.signalingState !== "closed") { await rtc.setRemoteDescription(new RTCSessionDescription(offer)); const answer = await rtc.createAnswer(); await rtc.setLocalDescription(answer); connectAndSend(plex, CHANNEL.WEBRTC_ANSWER, withEncoding("json", {unique: false}))(answer); } } catch (error) { close$.next(); console.error("Error in listenForOffer:", error); } };