@@ -15,28 +15,43 @@ import { _deserializeData, _serializeData, _verifySerializable } from '@builder.
1515export async function workerThread ( sys : System ) {
1616 const ssgOpts = sys . getOptions ( ) ;
1717 const pendingPromises = new Set < Promise < any > > ( ) ;
18+ const log = await sys . createLogger ( ) ;
1819
1920 const opts : StaticGenerateHandlerOptions = {
2021 ...ssgOpts ,
22+ // TODO export this from server
2123 render : ( await import ( pathToFileURL ( ssgOpts . renderModulePath ) . href ) ) . default ,
22- qwikCityPlan : ( await import ( pathToFileURL ( ssgOpts . qwikCityPlanModulePath ) . href ) ) . default ,
24+ // TODO this should be built-in
25+ qwikRouterConfig : ( await import ( pathToFileURL ( ssgOpts . qwikRouterConfigModulePath ) . href ) )
26+ . default ,
2327 } ;
2428
25- sys . createWorkerProcess ( async ( msg ) => {
26- switch ( msg . type ) {
27- case 'render' : {
28- return new Promise < StaticWorkerRenderResult > ( ( resolve ) => {
29- workerRender ( sys , opts , msg , pendingPromises , resolve ) ;
30- } ) ;
31- }
32- case 'close' : {
33- const promises = Array . from ( pendingPromises ) ;
34- pendingPromises . clear ( ) ;
35- await Promise . all ( promises ) ;
36- return { type : 'close' } ;
29+ sys
30+ . createWorkerProcess ( async ( msg ) => {
31+ switch ( msg . type ) {
32+ case 'render' : {
33+ log . debug ( `Worker thread rendering: ${ msg . pathname } ` ) ;
34+ return new Promise < StaticWorkerRenderResult > ( ( resolve ) => {
35+ workerRender ( sys , opts , msg , pendingPromises , resolve ) . catch ( ( e ) => {
36+ console . error ( 'Error during render' , msg . pathname , e ) ;
37+ } ) ;
38+ } ) ;
39+ }
40+ case 'close' : {
41+ if ( pendingPromises . size ) {
42+ log . debug ( `Worker thread closing, waiting for ${ pendingPromises . size } pending renders` ) ;
43+ const promises = Array . from ( pendingPromises ) ;
44+ pendingPromises . clear ( ) ;
45+ await Promise . all ( promises ) ;
46+ }
47+ log . debug ( `Worker thread closed` ) ;
48+ return { type : 'close' } ;
49+ }
3750 }
38- }
39- } ) ;
51+ } )
52+ ?. catch ( ( e ) => {
53+ console . error ( 'Worker process creation failed' , e ) ;
54+ } ) ;
4055}
4156
4257export async function createSingleThreadWorker ( sys : System ) {
@@ -51,7 +66,9 @@ export async function createSingleThreadWorker(sys: System) {
5166
5267 return ( staticRoute : StaticRoute ) => {
5368 return new Promise < StaticWorkerRenderResult > ( ( resolve ) => {
54- workerRender ( sys , opts , staticRoute , pendingPromises , resolve ) ;
69+ workerRender ( sys , opts , staticRoute , pendingPromises , resolve ) . catch ( ( e ) => {
70+ console . error ( 'Error during render' , staticRoute . pathname , e ) ;
71+ } ) ;
5572 } ) ;
5673 } ;
5774}
@@ -254,6 +271,13 @@ async function workerRender(
254271 }
255272 }
256273 } )
274+ . catch ( ( e ) => {
275+ console . error ( 'Unhandled error during request handling' , staticRoute . pathname , e ) ;
276+ result . error = {
277+ message : String ( e ) ,
278+ stack : e . stack || '' ,
279+ } ;
280+ } )
257281 . finally ( ( ) => {
258282 pendingPromises . delete ( promise ) ;
259283 callback ( result ) ;
0 commit comments