Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions export/src/handler.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as Sentry from '@sentry/node';
import type { VercelApiHandler, VercelRequest, VercelResponse } from '@vercel/node';
import type { Page } from 'puppeteer-core';
import type { Browser, Page } from 'puppeteer-core';

import * as render from './render-serverless';
import config from './config';
Expand Down Expand Up @@ -56,9 +56,10 @@ export function makeExportHandler<T>(

// Prepare browser for export
const url = config.page;
let browser: Browser;
let page: Page;
try {
page = await render.open(url);
({ browser, page } = await render.open(url));
} catch (error) {
if (error.message.includes('ERR_CONNECTION_REFUSED')) {
throw new HttpError(
Expand All @@ -70,11 +71,12 @@ export function makeExportHandler<T>(
throw new HttpError(500, 'Cannot start browser', error);
}

// Export
await performExport(response, page, data);

// Cleanup
await page.close();
try {
// Export
await performExport(response, page, data);
} finally {
await browser.close();
}
} catch (error) {
const eventId = Sentry.captureException(error.original || error);

Expand Down
17 changes: 11 additions & 6 deletions export/src/render-serverless.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import chromium from '@sparticuz/chromium';
import puppeteer, { Page } from 'puppeteer-core';
import puppeteer, { Browser, Page } from 'puppeteer-core';

import { resolveChromeExecutable } from './chrome-executable';
import { getModules } from './data';
Expand All @@ -23,7 +23,7 @@ async function setViewport(page: Page, options: ViewportOptions = {}) {
});
}

export async function open(url: string) {
export async function open(url: string): Promise<{ browser: Browser; page: Page }> {
const executablePath = await resolveChromeExecutable(() => chromium.executablePath());

chromium.setGraphicsMode = false;
Expand All @@ -35,11 +35,16 @@ export async function open(url: string) {
headless: 'shell',
});

const page = await browser.newPage();
await page.goto(url, { waitUntil: 'load' });
await setViewport(page);
try {
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'load' });
await setViewport(page);

return page;
return { browser, page };
} catch (error) {
await browser.close();
throw error;
}
}

async function injectData(page: Page, data: ExportData) {
Expand Down