@@ -677,7 +677,7 @@ const binaryMediaTypes = BINARY_MEDIA_TYPES;
677
677
const serveStatic = SERVE_STATIC ;
678
678
679
679
// Get the directory of this handler file
680
- const dir = dirname ( fileURLToPath ( import . meta. url ) ) ;
680
+ const __dirname = dirname ( fileURLToPath ( import . meta. url ) ) ;
681
681
682
682
// Initialize server with timeout protection
683
683
const SERVER_INIT_TIMEOUT = 10000 ; // 10 seconds
@@ -734,29 +734,14 @@ function isALBEvent(event) {
734
734
return event . requestContext && 'elb' in event . requestContext ;
735
735
}
736
736
737
- /**
738
- * Create file server only if directory exists (like SvelteKit node adapter)
739
- * @param {string } path - Directory path
740
- * @param {any } options - File server options
741
- * @returns {Function|null } - File server function or null if directory doesn't exist
742
- */
743
- function serve ( path , options = { } ) {
744
- try {
745
- statSync ( path ) ;
746
- return createFileServer ( { root : path , ...options } ) ;
747
- } catch {
748
- return null ;
749
- }
750
- }
751
-
752
737
// Create file server instances for different asset types
753
738
let clientFileServer = null ;
754
739
let prerenderedFileServer = null ;
755
- let staticFileServer = null ;
756
740
757
741
if ( serveStatic ) {
758
742
// Client assets - SvelteKit's built JS/CSS with aggressive caching for immutable files
759
- clientFileServer = serve ( join ( dir , 'client' ) , {
743
+ clientFileServer = createFileServer ( {
744
+ root : join ( __dirname , 'client' ) ,
760
745
compression : true ,
761
746
cacheControl : {
762
747
'/_app/immutable/.*' : 'public,max-age=31536000,immutable' ,
@@ -765,22 +750,18 @@ if (serveStatic) {
765
750
etag : true ,
766
751
} ) ;
767
752
768
- // Static assets
769
- staticFileServer = serve ( join ( dir , 'static' ) , {
770
- compression : true ,
771
- cacheControl : 'public,max-age=3600' ,
772
- etag : true ,
773
- } ) ;
774
-
775
- // Prerendered pages - different caching strategy for HTML vs other assets
776
- prerenderedFileServer = serve ( join ( dir , 'prerendered' ) , {
777
- compression : true ,
778
- cacheControl : {
779
- '\\.html$' : 'no-cache' ,
780
- '.*' : 'public,max-age=3600' ,
781
- } ,
782
- etag : true ,
783
- } ) ;
753
+ // Only create prerendered file server if there are prerendered pages
754
+ if ( prerendered . size > 0 ) {
755
+ prerenderedFileServer = createFileServer ( {
756
+ root : join ( __dirname , 'prerendered' ) ,
757
+ compression : true ,
758
+ cacheControl : {
759
+ '\\.html$' : 'no-cache' ,
760
+ '.*' : 'public,max-age=3600' ,
761
+ } ,
762
+ etag : true ,
763
+ } ) ;
764
+ }
784
765
}
785
766
786
767
/**
@@ -789,6 +770,27 @@ if (serveStatic) {
789
770
* @param {any } context
790
771
* @returns {Promise<any> }
791
772
*/
773
+ /**
774
+ * Convert a prerendered route path to the corresponding file path
775
+ * SvelteKit saves prerendered routes as .html files
776
+ * @param {string } pathname - The request pathname
777
+ * @returns {string } The file path to look for
778
+ */
779
+ function getPrerenderedFilePath ( pathname ) {
780
+ // Handle root path
781
+ if ( pathname === '/' ) {
782
+ return '/index.html' ;
783
+ }
784
+
785
+ // Remove trailing slash if present (except for root)
786
+ const normalizedPath = pathname . endsWith ( '/' ) && pathname !== '/'
787
+ ? pathname . slice ( 0 , - 1 )
788
+ : pathname ;
789
+
790
+ // Add .html extension
791
+ return `${ normalizedPath } .html` ;
792
+ }
793
+
792
794
/**
793
795
* Check if response size exceeds Lambda limits
794
796
* @param {Response } response - Web Response object
@@ -863,54 +865,49 @@ const handler = async (event, context) => {
863
865
const webRequest = u ( event ) ;
864
866
const pathname = new URL ( webRequest . url ) . pathname ;
865
867
866
- // Handle client assets first (JS, CSS, images, etc.)
867
- if ( serveStatic && clientFileServer ) {
868
- const clientResponse = await clientFileServer ( webRequest ) ;
869
- if ( clientResponse . status !== 404 ) {
870
- // Check response size before returning
871
- if ( await isResponseTooLarge ( clientResponse ) ) {
872
- return await l ( createOversizedResponse ( ) , {
873
- binaryMediaTypes,
874
- multiValueHeaders : isALBEvent ( event ) ,
875
- } ) ;
876
- }
877
- return await l ( clientResponse , {
878
- binaryMediaTypes,
879
- multiValueHeaders : isALBEvent ( event ) ,
880
- } ) ;
881
- }
882
- }
883
-
884
- // Handle static assets
885
- if ( serveStatic && staticFileServer ) {
886
- const staticResponse = await staticFileServer ( webRequest ) ;
887
- if ( staticResponse . status !== 404 ) {
868
+ // Handle prerendered pages first
869
+ if ( serveStatic && prerendered . has ( pathname ) && prerenderedFileServer ) {
870
+ // Convert route path to file path (e.g., /third -> /third.html)
871
+ const filePath = getPrerenderedFilePath ( pathname ) ;
872
+
873
+ // Create request with the correct file path
874
+ const fileUrl = new URL ( webRequest . url ) ;
875
+ fileUrl . pathname = filePath ;
876
+
877
+ const fileRequest = new Request ( fileUrl . toString ( ) , {
878
+ method : webRequest . method ,
879
+ headers : webRequest . headers ,
880
+ body : webRequest . body ,
881
+ } ) ;
882
+
883
+ const prerenderedResponse = await prerenderedFileServer ( fileRequest ) ;
884
+ if ( prerenderedResponse . status !== 404 ) {
888
885
// Check response size before returning
889
- if ( await isResponseTooLarge ( staticResponse ) ) {
886
+ if ( await isResponseTooLarge ( prerenderedResponse ) ) {
890
887
return await l ( createOversizedResponse ( ) , {
891
888
binaryMediaTypes,
892
889
multiValueHeaders : isALBEvent ( event ) ,
893
890
} ) ;
894
891
}
895
- return await l ( staticResponse , {
892
+ return await l ( prerenderedResponse , {
896
893
binaryMediaTypes,
897
894
multiValueHeaders : isALBEvent ( event ) ,
898
895
} ) ;
899
896
}
900
897
}
901
898
902
- // Handle prerendered pages
903
- if ( serveStatic && prerendered . has ( pathname ) && prerenderedFileServer ) {
904
- const prerenderedResponse = await prerenderedFileServer ( webRequest ) ;
905
- if ( prerenderedResponse . status !== 404 ) {
899
+ // Handle client assets (JS, CSS, images, etc.)
900
+ if ( serveStatic && clientFileServer ) {
901
+ const clientResponse = await clientFileServer ( webRequest ) ;
902
+ if ( clientResponse . status !== 404 ) {
906
903
// Check response size before returning
907
- if ( await isResponseTooLarge ( prerenderedResponse ) ) {
904
+ if ( await isResponseTooLarge ( clientResponse ) ) {
908
905
return await l ( createOversizedResponse ( ) , {
909
906
binaryMediaTypes,
910
907
multiValueHeaders : isALBEvent ( event ) ,
911
908
} ) ;
912
909
}
913
- return await l ( prerenderedResponse , {
910
+ return await l ( clientResponse , {
914
911
binaryMediaTypes,
915
912
multiValueHeaders : isALBEvent ( event ) ,
916
913
} ) ;
0 commit comments