Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/calm-proxies-close.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-cloudflare': patch
---

fix: dispose the development platform proxy when Vite servers close
15 changes: 14 additions & 1 deletion packages/adapter-cloudflare/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -222,13 +222,26 @@ export default function (options = {}) {
* @returns {Plugin}
*/
function virtual_workers_module(options, stub_import) {
const setup = async () => {
/** @param {import('vite').ViteDevServer | import('vite').PreviewServer} server */
const setup = async (server) => {
if (globalThis.__sveltekit_cloudflare_platform) return;
const proxy = await getPlatformProxy(options);
// We store the platform proxy on globalThis so that our virtual workers module
// can access the same instance that we use here to populate `caches` and `cf` (above).
globalThis.__sveltekit_cloudflare_platform = proxy;
/** @type {any} */ (globalThis).caches = proxy.caches;

const close = server.close.bind(server);
/** @type {Promise<void> | undefined} */
let disposing;
server.close = async () => {
disposing ??= proxy.dispose().finally(() => {
if (globalThis.__sveltekit_cloudflare_platform === proxy) {
Reflect.deleteProperty(globalThis, '__sveltekit_cloudflare_platform');
}
});
await Promise.all([close(), disposing]);
};
};
return {
name: 'vite-plugin-sveltekit-adapter-cloudflare-virtual-workers-module',
Expand Down
76 changes: 76 additions & 0 deletions packages/adapter-cloudflare/index.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { afterEach, expect, test, vi } from 'vitest';
import { createServer } from 'vite';

const dispose = vi.fn(async () => {});

vi.mock('wrangler', () => ({
getPlatformProxy: vi.fn(() =>
Promise.resolve({
caches: {},
dispose
})
),
unstable_readConfig: vi.fn()
}));

const { default: adapter } = await import('./index.js');

const get_plugin = () =>
/** @type {import('vite').Plugin} */ (/** @type {any} */ (adapter().vite).plugins[0]);

afterEach(() => {
Reflect.deleteProperty(globalThis, '__sveltekit_cloudflare_platform');
dispose.mockClear();
});

test('disposes the platform proxy when the Vite dev server closes', async () => {
const server = await createServer({
configFile: false,
logLevel: 'silent',
plugins: [get_plugin()],
server: { middlewareMode: true }
});

expect(globalThis.__sveltekit_cloudflare_platform).toBeDefined();

await server.close();
await server.close();

expect(dispose).toHaveBeenCalledOnce();
expect(globalThis.__sveltekit_cloudflare_platform).toBeUndefined();
});

test('disposes the platform proxy when the Vite preview server closes', async () => {
const plugin = get_plugin();
const close = vi.fn();
const server = { close };

await /** @type {Function} */ (plugin.configurePreviewServer)(server);
await server.close();

expect(close).toHaveBeenCalledOnce();
expect(dispose).toHaveBeenCalledOnce();
expect(globalThis.__sveltekit_cloudflare_platform).toBeUndefined();
});

test('closes concurrently and does not clear a replacement platform proxy', async () => {
const plugin = get_plugin();
const close = vi.fn();
const server = { close };
/** @type {PromiseWithResolvers<void>} */
const disposal = Promise.withResolvers();
dispose.mockImplementationOnce(() => disposal.promise);

await /** @type {Function} */ (plugin.configurePreviewServer)(server);
const closing = server.close();

expect(close).toHaveBeenCalledOnce();
expect(dispose).toHaveBeenCalledOnce();

const replacement = /** @type {import('wrangler').PlatformProxy} */ ({});
globalThis.__sveltekit_cloudflare_platform = replacement;
disposal.resolve();
await closing;

expect(globalThis.__sveltekit_cloudflare_platform).toBe(replacement);
});
1 change: 1 addition & 0 deletions packages/adapter-cloudflare/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
},
"include": [
"index.js",
"index.spec.js",
"src",
"utils.js",
"utils.spec.js",
Expand Down
Loading