Fix exports in prod (#521)

* Fix exports in prod

* downgrade libs to fit under next.js serverless function size limit
This commit is contained in:
Steve Ruiz 2022-01-18 10:00:58 +00:00 committed by GitHub
parent 8977d296a9
commit 30d1d7721c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 123 additions and 102 deletions

View file

@ -1,7 +1,8 @@
import { NextApiRequest, NextApiResponse } from 'next'
import puppeteer from 'puppeteer'
import chromium from 'chrome-aws-lambda'
import Cors from 'cors'
import { TDExport, TDExportTypes, TldrawApp } from '@tldraw/tldraw'
import { AnyLengthString } from 'aws-sdk/clients/comprehend'
const cors = Cors({
methods: ['POST'],
@ -35,13 +36,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
type,
} = body
if (type === TDExportTypes.PDF) res.status(500).send('Not implemented yet.')
let browser: puppeteer.Browser = null
try {
browser = await puppeteer.launch({
const browser = await chromium.puppeteer.launch({
slowMo: 50,
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
ignoreHTTPSErrors: true,
headless: true,
})
const page = await browser.newPage()
await page.setUserAgent(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
@ -49,25 +52,32 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
await page.setViewport({ width: Math.floor(width), height: Math.floor(height) })
await page.goto(FRONTEND_URL, { timeout: 15 * 1000, waitUntil: 'networkidle0' })
await page.evaluateHandle('document.fonts.ready')
let err: AnyLengthString
await page.evaluate(async (body: TDExport) => {
let app = window.app
if (!app) app = await new Promise((resolve) => setTimeout(() => resolve(window.app), 250))
await app.ready
const { assets, shapes } = body
app.patchAssets(assets)
app.createShapes(...shapes)
app.selectAll()
app.zoomToSelection()
app.selectNone()
try {
let app = window.app
if (!app) app = await new Promise((resolve) => setTimeout(() => resolve(window.app), 250))
await app.ready
const { assets, shapes } = body
app.patchAssets(assets)
app.createShapes(...shapes)
app.selectAll()
app.zoomToSelection()
app.selectNone()
} catch (e) {
err = e.message
}
}, body)
if (err) {
throw err
}
const imageBuffer = await page.screenshot({
type,
})
await browser.close()
res.status(200).send(imageBuffer)
} catch (err) {
console.error(err.message)
res.status(500).send(err)
} finally {
await browser.close()
}
}