Skip to content

fix(optimizer): unblock server.close() when deps were discovered before listen (fix #23143) - #23347

Open
santusht06 wants to merge 2 commits into
vitejs:mainfrom
santusht06:fix/server-close-hang-23143
Open

fix(optimizer): unblock server.close() when deps were discovered before listen (fix #23143)#23347
santusht06 wants to merge 2 commits into
vitejs:mainfrom
santusht06:fix/server-close-hang-23143

Conversation

@santusht06

Copy link
Copy Markdown

Description

Fixes #23143.

When server.transformRequest(...) encounters a bare specifier without server.listen() being called (e.g. in test suites using Vite's programmatic JavaScript API):

  1. A dependency record is created with info.processing set to depOptimizationProcessing.promise.
  2. The import is rewritten to /.vite/deps/..., and when loaded, vite:optimized-deps awaits info.processing.
  3. Because server.listen() was never called (deferred since fix(optimizer): avoid optimizer run for transform request before init #22852), depsOptimizer.init() never runs and the pre-bundling run never starts.
  4. EnvironmentPluginContainer registers this hook promise in this._processesing.
  5. On server.close(), pluginContainer.close() waits on Promise.allSettled(this._processesing) which blocks indefinitely on the unfulfilled info.processing promise.

Solution

  • Resolve depOptimizationProcessing and queued promises (resolveEnqueuedProcessingPromises()) inside depsOptimizer.close().
  • Clear pending debounce and logging timer handles (debounceProcessingHandle, newDepsToLogHandle) on close.
  • Add isClosed: () => boolean on DepsOptimizer and gracefully return null in optimizedDeps.load() when reading unbundled files during/after server shutdown.
  • Add regression test in discoverBeforeListen.spec.ts.

Validation

  • pnpm run build
  • pnpm vitest run packages/vite/src/node/__tests__/optimizer/discoverBeforeListen.spec.ts
  • pnpm run typecheck
  • pnpm run lint
  • Verified against reproduction repository (resolved 10s timeout failure to 1ms exit).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

server.close() in JavaScript API hangs forever

1 participant