Last active
March 21, 2019 15:12
-
-
Save argggh/677154f5001f1407c1f08e3d95e10de5 to your computer and use it in GitHub Desktop.
Test offerer/answerer role reversal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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