Skip to content

Commit

Permalink
feat: keep browser alive and properly await commands
Browse files Browse the repository at this point in the history
  • Loading branch information
matthieu-foucault committed Oct 29, 2020
1 parent c4d45e5 commit 606d839
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 52 deletions.
2 changes: 1 addition & 1 deletion app/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ LABEL summary="$SUMMARY" \
maintainer="Matthieu Foucault <matthieu@button.is>"

RUN apt-get update && \
apt-get install -y git gnupg curl && \
apt-get install -y git gnupg curl chromium-browser && \
apt-get clean

ENV USER_ID=1001
Expand Down
4 changes: 2 additions & 2 deletions app/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ const getRedirectURL = (req) => {
return getUserGroupLandingRoute(groups);
};

app.prepare().then(() => {
app.prepare().then(async () => {
const server = express();

server.use(morgan('combined'));
Expand Down Expand Up @@ -445,7 +445,7 @@ app.prepare().then(() => {

server.get('/register', ({res}) => res.redirect(302, kcRegistrationUrl));

server.use('/print-pdf', printPdf);
server.use('/print-pdf', await printPdf());

server.get('*', async (req, res) => {
return handle(req, res);
Expand Down
110 changes: 61 additions & 49 deletions app/server/routes/print-pdf.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,65 @@ const express = require('express');
const cookieParser = require('cookie-parser');
const puppeteer = require('puppeteer');
const router = express.Router();
const PORT = Number.parseInt(process.env.PORT, 10) || 3004;

router.use(cookieParser());
router.get('/', async (req, res) => {
let browser;
try {
browser = await puppeteer.launch({
headless: true,
args: ['--disable-dev-shm-usage']
});

const page = await browser.newPage();
await page.setCookie({
name: 'connect.sid',
value: req.cookies['connect.sid'],
domain: 'localhost',
httpOnly: true
});

page.setViewport({
width: 1920,
height: 1080
});

console.log(`http://localhost:3004${req.query.url}`);
page.goto(`http://localhost:3004${req.query.url}`, {
waitUntil: 'networkidle2'
});

await page.waitForSelector('#page-content');

const pdfFile = await page.pdf({
format: 'letter',
printBackground: true
});

res.set({
'Content-Type': 'application/pdf',
'Content-Length': pdfFile.length
});

res.send(pdfFile);
} catch (e) {
console.error(e);
res.sendStatus(500);
} finally {
await browser.close();
}
});

module.exports = router;
const launchBrowser = async () => {
browser = await puppeteer.launch({
headless: true,
args: ['--disable-dev-shm-usage', '--incognito']
});

browser.on('disconnected', launchBrowser);
return browser;
};

module.exports = async () => {
const browser = await launchBrowser();
router.use(cookieParser());
router.get('/', async (req, res) => {
let page;
try {
page = await browser.newPage();
await page.setCookie({
name: 'connect.sid',
value: req.cookies['connect.sid'],
domain: 'localhost',
httpOnly: true
});

page.setViewport({
width: 1920,
height: 1080
});

await page.goto(`${process.env.HOST}:${PORT}${req.query.url}`, {
waitUntil: 'networkidle2'
});

await page.waitForSelector('#page-content');

const pdfFile = await page.pdf({
format: 'letter',
printBackground: true
});

res.set({
'Content-Type': 'application/pdf',
'Content-Length': pdfFile.length,
'Content-Disposition': 'attachment; filename=CIIP_Application.pdf'
});

res.send(pdfFile);
} catch (e) {
console.error(e);
res.sendStatus(500);
} finally {
try {
if (page) await page.close();
} catch (ee) {
console.error(ee);
}
}
});
return router;
};

0 comments on commit 606d839

Please sign in to comment.