Skip to content

fix: dispose Cloudflare platform proxy when Vite servers close - #17216

Closed
svelte-triage-bot[bot] wants to merge 1 commit into
version-3from
triage/kit-17215-dispose-platform-proxy
Closed

svelte-triage-bot[bot] wants to merge 1 commit into
version-3from
triage/kit-17215-dispose-platform-proxy

Conversation

@svelte-triage-bot

Copy link
Copy Markdown
Contributor
  • The Vite dev and preview setup introduced in breaking: Move cloudflare bindings from platform to cloudflare:workers #16754 eagerly created a Wrangler platform proxy but never released its Miniflare handles; the global is required so cloudflare:workers, Request.cf, and caches share one proxy.
  • Earlier anti-hang fixes fix: prevent vitest from hanging #12830 and fix: prevent Vitest from hanging #13373 deferred the old platform emulation, but the new virtual-module architecture must initialize the proxy during server setup.
  • Wrap the owning server's existing close() to close Vite concurrently with one memoized disposal and only clear the still-owned global; reject closeBundle because Vite 8.2 preview does not invoke it and reject Vite 8.3 close hooks because the adapter supports Vite 8.0+.
  • Cover actual middleware-mode Vite dev shutdown, preview shutdown, repeated closes, concurrent disposal, original-close preservation, and replacement-global ownership.

Fixes #17215

@pkg-svelte-dev

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from d5d1cdb:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/d5d1cdb530ca0c5f28184eaf096c1f721fd54d89

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/17216

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Sep 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: d5d1cdb

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/adapter-cloudflare Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@Nic-Polumeyv Nic-Polumeyv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The server.close wrapper is lost on restart: restartServer closes via _closeServer('restart') and Object.assign(server, newServer) replaces close, so after a vite.config edit the final close never disposes the proxy (reproduced locally).

Use Vite 8.3's closeServer / closePreviewServer instead (vitejs/vite#23110). Below 8.3 they never fire, which is acceptable. Skipping reason === 'restart' is required because the new server's configureServer already ran against the existing global and inherits the proxy.

const dispose = async () => {
	const proxy = globalThis.__sveltekit_cloudflare_platform;
	if (!proxy) return;
	Reflect.deleteProperty(globalThis, '__sveltekit_cloudflare_platform');
	await proxy.dispose();
};
// ...
closeServer: ({ reason }) => (reason === 'close' ? dispose() : undefined),
closePreviewServer: dispose,

This drops the memoised disposal and the ownership guard, so one real-server close test is enough.

@Nic-Polumeyv

Copy link
Copy Markdown
Member

@svelte-triage-bot Hello? are we working on my review?

@Nic-Polumeyv

Copy link
Copy Markdown
Member

Closed in favour of #17238

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.

adapter-cloudflare: getPlatformProxy() is never disposed, so Vitest hangs ~10s after the run

1 participant