JSFiddle - React, Tailwind, and code Playground
HTML
<div id="log"></div>
JavaScript 1.7
function log() {
document.querySelector('#log').innerText += (arguments.map(a => a.toString()).join(' | '));
}
let locked = false;
class Workout {
constructor() {
this.instructorPeer = new Map();
this.lock = Promise.resolve();
}
async getAllPartners() {
if (locked) {
throw new Error('THIS SHOULD NEVER HAPPEN');
}
locked = true;
return new Promise((resolve) => {
setTimeout(() => {
locked = false;
resolve(/* partners */[
{value: {type: 'chrome', isAvailable: true}, id: 'abc'},
{value: {type: 'chrome', isAvailable: true}, id: 'xyz'},
])
}, 3000)
});
}
async createSession(partnerInfo) {
this.lock = this.lock.then(async () => {
const partners = { chrome: [], firefox: [], safari: [], ie: [] }
console.info('retrieving partners for', partnerInfo);
const appropriatePartners = await this.retrievePartners(partnerInfo)
console.info('retrieved partners')
Object.keys(appropriatePartners).forEach(key => {
appropriatePartners[key].forEach(partner => {
const newPartner = console.info(
'Creating partner', this.instructorPeer, partner.id);
partners[key].push(newPartner)
})
})
return console.info('Creating session with', partners)
});
}
async retrievePartners(capabilities) {
const appropriatePartners = { chrome: [], firefox: [], safari: [], ie: [] }
const partners = await this.getAllPartners()
// first check if there is available appropriate Partners
Object.keys(capabilities.type).forEach(key => {
let typeNumber = parseInt(capabilities.type[key])
for (let i = 0; i < typeNumber; i++) {
partners.forEach((partner, i) => {
if (
key === partner.value.type &&
partner.value.isAvailable &&
appropriatePartners[key].length < typeNumber
) {
appropriatePartners[key].push(partner)
...