Skip to content
Draft
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/fresh-workers-retire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-cloudflare': patch
---

fix: dispose Cloudflare platform proxies when Vite servers close
32 changes: 30 additions & 2 deletions packages/adapter-cloudflare/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,18 +219,46 @@ export default function (options = {}) {
* @returns {Plugin}
*/
function virtual_workers_module(options, stub_import) {
/** @type {import('wrangler').PlatformProxy | undefined} */
let proxy;

const setup = async () => {
if (globalThis.__sveltekit_cloudflare_platform) return;
const proxy = await getPlatformProxy(options);
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 dispose = async () => {
if (!proxy) return;

const current = proxy;
proxy = undefined;
if (globalThis.__sveltekit_cloudflare_platform === current) {
// @ts-expect-error allow another dev or preview server to create a new proxy
globalThis.__sveltekit_cloudflare_platform = undefined;
}
await current.dispose();
};

return {
name: 'vite-plugin-sveltekit-adapter-cloudflare-virtual-workers-module',
configureServer: setup,
configurePreviewServer: setup,
async configurePreviewServer(server) {
await setup();

const close = server.close;
server.close = async () => {
try {
await close.call(server);
} finally {
await dispose();
}
};
},
closeBundle: dispose,
resolveId: {
filter: { id: exactRegex('cloudflare:workers') },
handler() {
Expand Down
59 changes: 59 additions & 0 deletions packages/adapter-cloudflare/index.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
import { getPlatformProxy } from 'wrangler';
import adapter from './index.js';

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

/** @type {Awaited<ReturnType<typeof getPlatformProxy>> | undefined} */
let proxy;

beforeEach(() => {
const value = /** @type {Awaited<ReturnType<typeof getPlatformProxy>>} */ (
/** @type {unknown} */ ({
env: {},
ctx: {},
caches: {},
cf: {},
dispose: vi.fn()
})
);
proxy = value;
vi.mocked(getPlatformProxy).mockResolvedValue(value);
});

afterEach(() => {
// @ts-expect-error reset the global populated by the plugin
globalThis.__sveltekit_cloudflare_platform = undefined;
});

describe('virtual workers module', () => {
test('disposes the platform proxy when the dev server closes', async () => {
const plugin = adapter().vite?.plugins?.pre?.[0];
const configure_server = /** @type {Function} */ (plugin?.configureServer);
const close_bundle = /** @type {Function} */ (plugin?.closeBundle);

await configure_server({});
await close_bundle();
await close_bundle();

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

test('disposes the platform proxy when the preview server closes', async () => {
const plugin = adapter().vite?.plugins?.pre?.[0];
const configure_preview_server = /** @type {Function} */ (plugin?.configurePreviewServer);
const close = vi.fn();
const server = { close };

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

expect(close).toHaveBeenCalledOnce();
expect(proxy?.dispose).toHaveBeenCalledOnce();
expect(globalThis.__sveltekit_cloudflare_platform).toBeUndefined();
});
});
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