const { Types } = require('mongoose'); const puppeteer = require('puppeteer'); const Bluebird = require('bluebird'); const UserModel = require('../services/users/user.model.js'); const launchUserSession = require('./launchUserSession.js'); const attendConference = require('./attendConference.js'); const { clickElementBySelector } = require('./utils.js'); const { EDUFPMI_URL, NODE_ENV, HEADFUL } = process.env; // Always run headless in production, but allow configuring for development const headless = NODE_ENV === 'production' || !HEADFUL; const handleJobAsUser = async (job, browser, user) => { console.log(`Running job as ${user.username}`); const browserContext = await browser.createIncognitoBrowserContext(); const { conferenceId } = job.attrs.data; const conferenceUrl = `${EDUFPMI_URL}/mod/bigbluebuttonbn/view.php?id=${conferenceId}`; const page = await launchUserSession(user, browserContext); await page.goto(conferenceUrl); // Launch the conference in a new tab const conferencePagePromise = new Promise(resolve => browserContext.on( 'targetcreated', target => resolve(target.page()) )); await clickElementBySelector(page, 'input#join_button_input'); const conferencePage = await conferencePagePromise; await page.close(); await attendConference(conferencePage, () => console.log(`Joined the conference at ${conferenceUrl}`)); await browserContext.close(); }; const handleJob = async job => { const { data } = job.attrs; const participants = await UserModel.find({ username: { $in: data.participants } }); console.log('Participants: ', participants.map(participant => participant.username)); const browser = await puppeteer.launch({ headless, args: ['--no-sandbox', '--incognito'] }); try { await Bluebird.map(participants, participant => handleJobAsUser(job, browser, participant)); } catch (err) { console.error(err); } finally { await browser.close(); } }; module.exports = handleJob;