@@ -88,6 +88,15 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
88
88
// This is set when the client environment is built to determine if the entry Worker should include assets
89
89
let hasClientBuild = false ;
90
90
91
+ // This is needed so that we can tell the difference between the Vite http server closing and restarting.
92
+ let previousServer : unknown ;
93
+ let restartingServer = false ;
94
+ function updateRestartingServerFlag ( viteDevServer : unknown ) {
95
+ restartingServer =
96
+ previousServer !== undefined && viteDevServer !== previousServer ;
97
+ previousServer = viteDevServer ;
98
+ }
99
+
91
100
return [
92
101
{
93
102
name : "vite-plugin-cloudflare" ,
@@ -332,7 +341,20 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
332
341
return [ ] ;
333
342
}
334
343
} ,
344
+ buildEnd ( ) {
345
+ if ( ! restartingServer ) {
346
+ miniflare ?. dispose ( ) . catch ( ( error ) => {
347
+ console . error ( "Error disposing Miniflare instance:" , error ) ;
348
+ } ) ;
349
+ miniflare = undefined ;
350
+ }
351
+ // Reset the flag so that if a `buildEnd` hook is called again before the next
352
+ // configureServer hook then we do dispose of miniflare correctly.
353
+ restartingServer = false ;
354
+ } ,
335
355
async configureServer ( viteDevServer ) {
356
+ updateRestartingServerFlag ( viteDevServer ) ;
357
+
336
358
const inputInspectorPort = await getInputInspectorPortOption (
337
359
pluginConfig ,
338
360
viteDevServer
@@ -399,6 +421,8 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
399
421
} ;
400
422
} ,
401
423
async configurePreviewServer ( vitePreviewServer ) {
424
+ updateRestartingServerFlag ( vitePreviewServer ) ;
425
+
402
426
const workerConfigs = getWorkerConfigs (
403
427
vitePreviewServer . config . root ,
404
428
pluginConfig . experimental ?. mixedMode ?? false
@@ -409,7 +433,7 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
409
433
vitePreviewServer
410
434
) ;
411
435
412
- const miniflare = new Miniflare (
436
+ miniflare = new Miniflare (
413
437
await getPreviewMiniflareOptions (
414
438
vitePreviewServer ,
415
439
workerConfigs ,
@@ -419,19 +443,17 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
419
443
)
420
444
) ;
421
445
422
- handleWebSocket (
423
- vitePreviewServer . httpServer ,
424
- ( ) => miniflare . dispatchFetch
425
- ) ;
446
+ const dispatchFetch = miniflare . dispatchFetch ;
447
+
448
+ handleWebSocket ( vitePreviewServer . httpServer , ( ) => dispatchFetch ) ;
426
449
427
450
// In preview mode we put our middleware at the front of the chain so that all assets are handled in Miniflare
428
451
vitePreviewServer . middlewares . use ( async ( req , res , next ) => {
429
452
try {
430
453
const request = createRequest ( req , res ) ;
431
- const response = await miniflare . dispatchFetch (
432
- toMiniflareRequest ( request ) ,
433
- { redirect : "manual" }
434
- ) ;
454
+ const response = await dispatchFetch ( toMiniflareRequest ( request ) , {
455
+ redirect : "manual" ,
456
+ } ) ;
435
457
436
458
// Vite uses HTTP/2 when `preview.https` is enabled
437
459
if ( req . httpVersionMajor === 2 ) {
0 commit comments