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
JavaScript
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);
}
};