@@ -14,6 +14,8 @@ async function getBrowser(): Promise<Browser> {
14
14
protocolTimeout : 240000 ,
15
15
args : [ '--no-sandbox' , '--disable-setuid-sandbox' ] ,
16
16
} ) ;
17
+ } else {
18
+ logger . info ( 'Reusing existing browser instance...' ) ;
17
19
}
18
20
return browserInstance ;
19
21
}
@@ -24,45 +26,51 @@ export async function GET(req: Request) {
24
26
let page = null ;
25
27
26
28
if ( ! url ) {
29
+ logger . warn ( 'No URL provided in query parameters' ) ;
27
30
return NextResponse . json (
28
31
{ error : 'URL parameter is required' } ,
29
32
{ status : 400 }
30
33
) ;
31
34
}
32
35
36
+ logger . info ( `Starting screenshot for URL: ${ url } ` ) ;
37
+
33
38
try {
34
39
// Get browser instance
35
40
const browser = await getBrowser ( ) ;
41
+ logger . info ( 'Browser instance acquired' ) ;
36
42
37
43
// Create a new page
38
44
page = await browser . newPage ( ) ;
45
+ logger . info ( 'New page created' ) ;
39
46
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' ) ;
45
50
46
- // Navigate to URL with increased timeout and more reliable wait condition
51
+ // Navigate to the URL
52
+ logger . info ( `Navigating to URL: ${ url } ` ) ;
47
53
await page . goto ( url , {
48
- waitUntil : 'domcontentloaded' , // Less strict than networkidle0
49
- timeout : 60000 , // Increased timeout to 60 seconds
54
+ waitUntil : 'domcontentloaded' ,
55
+ timeout : 60000 ,
50
56
} ) ;
57
+ logger . info ( 'Page loaded (DOMContentLoaded)' ) ;
51
58
52
- await new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) ) ; // Waits for 2 seconds
59
+ // Extra wait for rendering
60
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) ) ;
61
+ logger . info ( 'Waited 2 seconds for rendering' ) ;
53
62
54
63
// Take screenshot
55
64
const screenshot = await page . screenshot ( {
56
65
type : 'png' ,
57
66
fullPage : true ,
58
67
} ) ;
68
+ logger . info ( 'Screenshot captured' ) ;
59
69
60
- // Always close the page when done
61
- if ( page ) {
62
- await page . close ( ) ;
63
- }
70
+ // Clean up
71
+ if ( page ) await page . close ( ) ;
72
+ logger . info ( 'Page closed' ) ;
64
73
65
- // Return the screenshot as a PNG image
66
74
return new Response ( screenshot , {
67
75
headers : {
68
76
'Content-Type' : 'image/png' ,
@@ -72,24 +80,24 @@ export async function GET(req: Request) {
72
80
} catch ( error : any ) {
73
81
logger . error ( 'Screenshot error:' , error ) ;
74
82
75
- // Ensure page is closed even if an error occurs
76
83
if ( page ) {
77
84
try {
78
85
await page . close ( ) ;
86
+ logger . info ( 'Closed page after error' ) ;
79
87
} catch ( closeError ) {
80
88
logger . error ( 'Error closing page:' , closeError ) ;
81
89
}
82
90
}
83
91
84
- // If browser seems to be in a bad state, recreate it
85
92
if (
86
- error . message . includes ( 'Target closed' ) ||
87
- error . message . includes ( 'Protocol error' ) ||
88
- error . message . includes ( 'Target.createTarget' )
93
+ error . message ? .includes ( 'Target closed' ) ||
94
+ error . message ? .includes ( 'Protocol error' ) ||
95
+ error . message ? .includes ( 'Target.createTarget' )
89
96
) {
90
97
try {
91
98
if ( browserInstance ) {
92
99
await browserInstance . close ( ) ;
100
+ logger . warn ( 'Browser instance was closed due to protocol error' ) ;
93
101
browserInstance = null ;
94
102
}
95
103
} catch ( closeBrowserError ) {
@@ -104,12 +112,12 @@ export async function GET(req: Request) {
104
112
}
105
113
}
106
114
107
- // Handle process termination to close browser
115
+ // Gracefully close the browser when the process exits
108
116
process . on ( 'SIGINT' , async ( ) => {
109
117
if ( browserInstance ) {
110
- logger . info ( 'Closing browser instance...' ) ;
118
+ logger . info ( 'SIGINT received. Closing browser instance...' ) ;
111
119
await browserInstance . close ( ) ;
112
120
browserInstance = null ;
113
121
}
114
122
process . exit ( 0 ) ;
115
- } ) ;
123
+ } ) ;
0 commit comments