Skip to content

Commit 2e8e2e6

Browse files
committedDec 7, 2023
fix: avoid chrome process hanging while prerendering
1 parent 4b894b7 commit 2e8e2e6

File tree

3 files changed

+4
-24
lines changed

3 files changed

+4
-24
lines changed
 

Diff for: ‎src/runtime/core/cache/prerender.ts

-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import { createStorage } from 'unstorage'
22
import lruCacheDriver from 'unstorage/drivers/lru-cache'
3-
import type { Browser } from 'playwright-core'
43
import type { OgImageOptions } from '../../types'
54

65
export const prerenderOptionsCache = import.meta.prerender
76
? createStorage<OgImageOptions>({
87
driver: lruCacheDriver({ max: 1000 }),
98
})
109
: undefined
11-
12-
export const prerenderChromiumContext: { browser?: Browser } = { browser: undefined }

Diff for: ‎src/runtime/core/renderers/chromium/index.ts

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { Browser } from 'playwright-core'
22
import type { Renderer } from '../../../types'
3-
import { prerenderChromiumContext } from '../../cache/prerender'
43
import { createScreenshot } from './screenshot'
54
import { createBrowser } from '#nuxt-og-image/bindings/chromium'
65

@@ -11,16 +10,8 @@ const ChromiumRenderer: Renderer = {
1110
return {} // TODO
1211
},
1312
async createImage(ctx) {
14-
let browser: Browser = (import.meta.prerender ? prerenderChromiumContext.browser : null) || await createBrowser()
13+
const browser: Browser = await createBrowser()
1514
// check if browser is open
16-
// lets us re-use the browser
17-
if (import.meta.prerender) {
18-
prerenderChromiumContext.browser = browser
19-
// if not, open it
20-
if (!browser.isConnected())
21-
browser = await createBrowser()
22-
}
23-
2415
if (!browser.isConnected()) {
2516
return createError({
2617
statusCode: 400,
@@ -29,9 +20,8 @@ const ChromiumRenderer: Renderer = {
2920
}
3021

3122
// @todo return placeholder image on failure
32-
return createScreenshot(ctx, browser!).finally(async () => {
33-
if (!import.meta.prerender) // closed by
34-
await browser!.close()
23+
return await createScreenshot(ctx, browser!).finally(async () => {
24+
await browser!.close()
3525
})
3626
},
3727
}

Diff for: ‎src/runtime/nitro/plugins/prerender.ts

+1-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { createRouter as createRadixRouter, toRouteMatcher } from 'radix3'
44
import { defu } from 'defu'
55
import type { NitroRouteRules } from 'nitropack'
66
import { extractAndNormaliseOgImageOptions } from '../../core/options/extract'
7-
import { prerenderChromiumContext, prerenderOptionsCache } from '../../core/cache/prerender'
7+
import { prerenderOptionsCache } from '../../core/cache/prerender'
88
import { isInternalRoute } from '../../utils.pure'
99
import { resolvePathCacheKey } from '../utils'
1010
import { useRuntimeConfig } from '#imports'
@@ -38,11 +38,4 @@ export default defineNitroPlugin(async (nitro) => {
3838
const key = resolvePathCacheKey(ctx.event)
3939
await prerenderOptionsCache!.setItem(key, options)
4040
})
41-
nitro.hooks.hook('close', async () => {
42-
// clean up the browser
43-
if (prerenderChromiumContext.browser) {
44-
await prerenderChromiumContext.browser.close()
45-
prerenderChromiumContext.browser = undefined
46-
}
47-
})
4841
})

0 commit comments

Comments
 (0)
Please sign in to comment.