@@ -21,10 +21,12 @@ export interface RevalidateEvent {
21
21
records : {
22
22
host : string ;
23
23
url : string ;
24
+ id : string ;
24
25
} [ ] ;
25
26
}
26
27
27
28
const defaultHandler = async ( event : RevalidateEvent ) => {
29
+ const failedRecords : RevalidateEvent [ "records" ] = [ ] ;
28
30
for ( const record of event . records ) {
29
31
const { host, url } = record ;
30
32
debug ( `Revalidating stale page` , { host, url } ) ;
@@ -37,27 +39,53 @@ const defaultHandler = async (event: RevalidateEvent) => {
37
39
// - "previewModeId" is used to ensure the page is revalidated in a
38
40
// blocking way in lambda
39
41
// https://github.com/vercel/next.js/blob/1088b3f682cbe411be2d1edc502f8a090e36dee4/packages/next/src/server/api-utils/node.ts#L353
40
- await new Promise < IncomingMessage > ( ( resolve , reject ) => {
41
- const req = https . request (
42
- `https://${ host } ${ url } ` ,
43
- {
44
- method : "HEAD" ,
45
- headers : {
46
- "x-prerender-revalidate" : prerenderManifest . preview . previewModeId ,
47
- "x-isr" : "1" ,
42
+ try {
43
+ await new Promise < IncomingMessage > ( ( resolve , reject ) => {
44
+ const req = https . request (
45
+ `https://${ host } ${ url } ` ,
46
+ {
47
+ method : "HEAD" ,
48
+ headers : {
49
+ "x-prerender-revalidate" : prerenderManifest . preview . previewModeId ,
50
+ "x-isr" : "1" ,
51
+ } ,
48
52
} ,
49
- } ,
50
- ( res ) => resolve ( res ) ,
51
- ) ;
52
- req . on ( "error" , ( err ) => {
53
- error ( `Error revalidating page` , { host, url } ) ;
54
- reject ( err ) ;
53
+ ( res ) => {
54
+ debug ( "revalidating" , {
55
+ url,
56
+ host,
57
+ headers : res . headers ,
58
+ statusCode : res . statusCode ,
59
+ } ) ;
60
+ if (
61
+ res . statusCode !== 200 ||
62
+ res . headers [ "x-nextjs-cache" ] !== "REVALIDATED"
63
+ ) {
64
+ failedRecords . push ( record ) ;
65
+ }
66
+ resolve ( res ) ;
67
+ } ,
68
+ ) ;
69
+ req . on ( "error" , ( err ) => {
70
+ error ( `Error revalidating page` , { host, url } ) ;
71
+ reject ( err ) ;
72
+ } ) ;
73
+ req . end ( ) ;
55
74
} ) ;
56
- req . end ( ) ;
75
+ } catch ( err ) {
76
+ failedRecords . push ( record ) ;
77
+ }
78
+ }
79
+ if ( failedRecords . length > 0 ) {
80
+ error ( `Failed to revalidate ${ failedRecords . length } pages` , {
81
+ failedRecords,
57
82
} ) ;
58
83
}
84
+
59
85
return {
60
86
type : "revalidate" ,
87
+ // Records returned here are the ones that failed to revalidate
88
+ records : failedRecords ,
61
89
} ;
62
90
} ;
63
91
0 commit comments