UNPKG

@jsreport/jsreport-chrome-pdf

Version:

jsreport recipe which is rendering pdf from html using headless chrome

93 lines (82 loc) 2.27 kB
const conversion = require('./conversion') module.exports = ({ reporter, puppeteer, options }) => { let openedBrowsers = [] let openedPages = [] const execute = async ({ strategy, connectOptions, conversionOptions, req, imageExecution, allowLocalFilesAccess, onOutput, res }) => { let browser let page let htmlUrl let content if (conversionOptions.url) { htmlUrl = conversionOptions.url } else { content = (await res.output.getBuffer()).toString() } try { const result = await conversion({ reporter, getBrowser: async () => { try { browser = await puppeteer.connect(connectOptions) openedBrowsers.push(browser) return browser } catch (e) { throw reporter.createError('Unable to connect to the browser ' + e.message, { statusCode: 500, originalError: e }) } }, htmlUrl, content, strategy, req, timeout: reporter.getReportTimeout(req), allowLocalFilesAccess, imageExecution, options: conversionOptions, useEvaluateInsteadOfEvaluateOnNewDocument: true }) page = result.page openedPages.push(page) const output = { type: result.type, content: result.content } if (onOutput) { await onOutput(output) delete output.content } return output } finally { if (browser) { try { if (page && !page.isClosed()) { await page.close() } await browser.disconnect() } finally { openedPages = openedPages.filter(p => p !== page) openedBrowsers = openedBrowsers.filter(b => b !== browser) } } } } execute.kill = async () => { for (const page of openedPages) { try { await page.close() } catch (e) { // ignore error } } for (const browser of openedBrowsers) { try { await browser.disconnect() } catch (e) { // ignore error } } } return execute }