@@ -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
124128process . 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