Skip to content

Commit 1e27c8d

Browse files
author
pengyu
committed
fix the problem doesn't allow for screenshot
1 parent b0dec4a commit 1e27c8d

File tree

2 files changed

+29
-23
lines changed

2 files changed

+29
-23
lines changed

docker/project-base-image/Dockerfile

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ WORKDIR /app
55
# Pre-install common frontend dependencies to speed up project startup
66
RUN npm install -g npm@latest vite@latest
77

8-
# Create a non-root user to run the app
9-
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
10-
RUN chown -R appuser:appuser /app
8+
#TODO: Uncomment this when we have a non-root usr (Allen)
9+
# #Create a non-root user to run the app
10+
# RUN groupadd -r appuser && useradd -r -g appuser -m appuser
11+
# RUN chown -R appuser:appuser /app
12+
# RUN chmod -R u+w /app
1113

12-
# Switch to non-root user for security
13-
USER appuser
14+
# # Switch to non-root user for security
15+
# USER appuser
1416

1517
EXPOSE 5173
1618

frontend/src/app/api/screenshot/route.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ async function getBrowser(): Promise<Browser> {
1414
protocolTimeout: 240000,
1515
args: ['--no-sandbox', '--disable-setuid-sandbox'],
1616
});
17+
} else {
18+
logger.info('Reusing existing browser instance...');
1719
}
1820
return browserInstance;
1921
}
@@ -24,24 +26,27 @@ export async function GET(req: Request) {
2426
let page = null;
2527

2628
if (!url) {
29+
logger.warn('No URL provided in query parameters');
2730
return NextResponse.json(
2831
{ error: 'URL parameter is required' },
2932
{ status: 400 }
3033
);
3134
}
3235

36+
logger.info(`Starting screenshot for URL: ${url}`);
37+
3338
try {
3439
// Get browser instance
3540
const browser = await getBrowser();
41+
logger.info('Browser instance acquired');
3642

3743
// Create a new page
3844
page = await browser.newPage();
45+
logger.info('New page created');
3946

40-
// Set viewport to a reasonable size
41-
await page.setViewport({
42-
width: 1600,
43-
height: 900,
44-
});
47+
// Set viewport
48+
await page.setViewport({ width: 1600, height: 900 });
49+
logger.info('Viewport set to 1600x900');
4550

4651
// Navigate to URL with increased timeout and more reliable wait condition
4752
await page.goto(url, {
@@ -72,13 +77,12 @@ export async function GET(req: Request) {
7277
type: 'png',
7378
fullPage: true,
7479
});
80+
logger.info('Screenshot captured');
7581

76-
// Always close the page when done
77-
if (page) {
78-
await page.close();
79-
}
82+
// Clean up
83+
if (page) await page.close();
84+
logger.info('Page closed');
8085

81-
// Return the screenshot as a PNG image
8286
return new Response(screenshot, {
8387
headers: {
8488
'Content-Type': 'image/png',
@@ -88,24 +92,24 @@ export async function GET(req: Request) {
8892
} catch (error: any) {
8993
logger.error('Screenshot error:', error);
9094

91-
// Ensure page is closed even if an error occurs
9295
if (page) {
9396
try {
9497
await page.close();
98+
logger.info('Closed page after error');
9599
} catch (closeError) {
96100
logger.error('Error closing page:', closeError);
97101
}
98102
}
99103

100-
// If browser seems to be in a bad state, recreate it
101104
if (
102-
error.message.includes('Target closed') ||
103-
error.message.includes('Protocol error') ||
104-
error.message.includes('Target.createTarget')
105+
error.message?.includes('Target closed') ||
106+
error.message?.includes('Protocol error') ||
107+
error.message?.includes('Target.createTarget')
105108
) {
106109
try {
107110
if (browserInstance) {
108111
await browserInstance.close();
112+
logger.warn('Browser instance was closed due to protocol error');
109113
browserInstance = null;
110114
}
111115
} catch (closeBrowserError) {
@@ -120,12 +124,12 @@ export async function GET(req: Request) {
120124
}
121125
}
122126

123-
// Handle process termination to close browser
127+
// Gracefully close the browser when the process exits
124128
process.on('SIGINT', async () => {
125129
if (browserInstance) {
126-
logger.info('Closing browser instance...');
130+
logger.info('SIGINT received. Closing browser instance...');
127131
await browserInstance.close();
128132
browserInstance = null;
129133
}
130134
process.exit(0);
131-
});
135+
});

0 commit comments

Comments
 (0)