Skip to content

Instantly share code, notes, and snippets.

@argggh
Last active March 21, 2019 15:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save argggh/677154f5001f1407c1f08e3d95e10de5 to your computer and use it in GitHub Desktop.
Save argggh/677154f5001f1407c1f08e3d95e10de5 to your computer and use it in GitHub Desktop.
Test offerer/answerer role reversal
const webdriver = require('selenium-webdriver');
const webdriverChrome = require('selenium-webdriver/chrome');
const chromedriverPath = require('chromedriver').path;
const geckodriver = require('geckodriver');
webdriverChrome.setDefaultService(new webdriverChrome.ServiceBuilder(chromedriverPath).build());
async function test() {
const browser1 = new webdriver.Builder()
.withCapabilities(webdriver.Capabilities.firefox())
.build();
const browser2 = new webdriver.Builder()
.withCapabilities(webdriver.Capabilities.chrome())
.build();
console.log("*** Browser 1:", await browser1.executeScript("return navigator.userAgent;"));
console.log("*** Browser 2:", await browser2.executeScript("return navigator.userAgent;"));
browser1.get('https://appear.in');
browser2.get('https://appear.in');
const offer1 = await browser1.wait(() => browser1.executeAsyncScript((cb) => {
const pc = window.__pc = new RTCPeerConnection({sdpSemantics: "unified-plan"});
const c = document.createElement("canvas");
c.getContext("2d");
const s = c.captureStream(1);
pc.addTrack(s.getTracks()[0], s);
const candidates = [];
const icePromise = new Promise(
resolve => pc.onicecandidate = (event) =>
(event.candidate ? candidates.push(event.candidate) : resolve(candidates)));
pc.createOffer()
.then(offer => pc.setLocalDescription(offer)
.then(() => icePromise)
.then(ice => cb({offer, ice})));
}), 1000);
console.log("*** Initial offer from browser 1:\n" + offer1.offer.sdp);
const answer1 = await browser2.wait(() => browser2.executeAsyncScript((offer, cb) => {
const pc = window.__pc = new RTCPeerConnection({sdpSemantics: "unified-plan"});
const candidates = [];
const icePromise = new Promise(
resolve => pc.onicecandidate = (event) =>
(event.candidate ? candidates.push(event.candidate) : resolve(candidates)));
pc.setRemoteDescription(offer.offer)
.then(() => offer.ice.map(candidate => pc.addIceCandidate(new RTCIceCandidate(candidate))))
.then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer)
.then(() => icePromise)
.then(ice => cb({answer, ice})));
}, offer1), 1000);
console.log("*** Initial answer from browser 2:\n" + answer1.answer.sdp);
const connected = await browser1.wait(() => browser1.executeAsyncScript((answer, cb) => {
const pc = window.__pc;
const connectedPromise = new Promise(
resolve => pc.oniceconnectionstatechange = (event) =>
(pc.iceConnectionState === "connected" ? resolve() : false));
pc.setRemoteDescription(answer.answer)
.then(() => answer.ice.map(candidate => pc.addIceCandidate(new RTCIceCandidate(candidate))))
.then(() => connectedPromise)
.then(() => cb(true));
}, answer1), 5000);
console.log("*** Connected");
const offer2 = await browser2.wait(() => browser2.executeAsyncScript((cb) => {
const pc = window.__pc;
const c = document.createElement("canvas");
c.getContext("2d");
const s = c.captureStream(1);
pc.addTrack(s.getTracks()[0], s);
pc.createOffer()
.then(offer => pc.setLocalDescription(offer)
.then(() => cb({offer})));
}), 1000);
console.log("*** Add track offer from browser 2:\n" + offer2.offer.sdp);
const answer2 = await browser1.wait(() => browser1.executeAsyncScript((offer, cb) => {
const pc = window.__pc;
pc.setRemoteDescription(offer.offer)
.then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer)
.then(() => cb({answer})));
}, offer2), 1000);
console.log("*** Final answer from browser 1:\n" + answer2.answer.sdp);
const finished = await browser2.wait(() => browser2.executeAsyncScript((answer, cb) => {
const pc = window.__pc;
pc.setRemoteDescription(answer.answer)
.then(() => cb("OK"))
.catch(err => cb(err.message));
}, answer2), 5000);
console.log("*** Result:", finished);
await browser1.quit();
await browser2.quit();
}
test();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment