@@ -10,6 +10,12 @@ import { baseMiddleware } from './base.js';
10
10
import { createController } from './controller.js' ;
11
11
import DevPipeline from './devPipeline.js' ;
12
12
import { handleRequest } from './request.js' ;
13
+ import { AstroError , AstroErrorData } from '../core/errors/index.js' ;
14
+ import { getViteErrorPayload } from '../core/errors/dev/index.js' ;
15
+ import { AsyncLocalStorage } from 'node:async_hooks' ;
16
+ import { IncomingMessage } from 'node:http' ;
17
+ import { setRouteError } from './server-state.js' ;
18
+ import { recordServerError } from './error.js' ;
13
19
14
20
export interface AstroPluginOptions {
15
21
settings : AstroSettings ;
@@ -30,6 +36,7 @@ export default function createVitePluginAstroServer({
30
36
const pipeline = new DevPipeline ( { logger, manifest, settings, loader } ) ;
31
37
let manifestData : ManifestData = createRouteManifest ( { settings, fsMod } , logger ) ;
32
38
const controller = createController ( { loader } ) ;
39
+ const localStorage = new AsyncLocalStorage ( ) ;
33
40
34
41
/** rebuild the route cache + manifest, as needed. */
35
42
function rebuildManifest ( needsManifestRebuild : boolean ) {
@@ -43,6 +50,22 @@ export default function createVitePluginAstroServer({
43
50
viteServer . watcher . on ( 'unlink' , rebuildManifest . bind ( null , true ) ) ;
44
51
viteServer . watcher . on ( 'change' , rebuildManifest . bind ( null , false ) ) ;
45
52
53
+ function handleUnhandledRejection ( rejection : any ) {
54
+ const error = new AstroError ( {
55
+ ...AstroErrorData . UnhandledRejection ,
56
+ message : AstroErrorData . UnhandledRejection . message ( rejection ?. stack || rejection )
57
+ } ) ;
58
+ const store = localStorage . getStore ( ) ;
59
+ if ( store instanceof IncomingMessage ) {
60
+ const request = store ;
61
+ setRouteError ( controller . state , request . url ! , error ) ;
62
+ }
63
+ const { errorWithMetadata } = recordServerError ( loader , settings . config , pipeline , error ) ;
64
+ setTimeout ( async ( ) => loader . webSocketSend ( await getViteErrorPayload ( errorWithMetadata ) ) , 200 )
65
+ }
66
+
67
+ process . on ( 'unhandledRejection' , handleUnhandledRejection ) ;
68
+
46
69
return ( ) => {
47
70
// Push this middleware to the front of the stack so that it can intercept responses.
48
71
// fix(#6067): always inject this to ensure zombie base handling is killed after restarts
@@ -57,13 +80,15 @@ export default function createVitePluginAstroServer({
57
80
response . end ( ) ;
58
81
return ;
59
82
}
60
- handleRequest ( {
61
- pipeline,
62
- manifestData,
63
- controller,
64
- incomingRequest : request ,
65
- incomingResponse : response ,
66
- manifest,
83
+ localStorage . run ( request , ( ) => {
84
+ handleRequest ( {
85
+ pipeline,
86
+ manifestData,
87
+ controller,
88
+ incomingRequest : request ,
89
+ incomingResponse : response ,
90
+ manifest,
91
+ } ) ;
67
92
} ) ;
68
93
} ) ;
69
94
} ;
0 commit comments