From bfae4eab78e309d555ca1738a0b5df5fd5c3e168 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 18 Feb 2025 02:51:30 -0500 Subject: [PATCH] Fix response streaming with wrangler dev server (#1242) Fixes #1237. --- examples/07_cloudflare/src/pages/index.tsx | 5 +++- .../waku.cloudflare-middleware.ts | 30 +++++++++++++++++++ examples/07_cloudflare/waku.config.ts | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 examples/07_cloudflare/waku.cloudflare-middleware.ts diff --git a/examples/07_cloudflare/src/pages/index.tsx b/examples/07_cloudflare/src/pages/index.tsx index d6daf051a..76062f9bb 100644 --- a/examples/07_cloudflare/src/pages/index.tsx +++ b/examples/07_cloudflare/src/pages/index.tsx @@ -2,7 +2,7 @@ import { Link } from 'waku'; import { Suspense } from 'react'; import { Counter } from '../components/counter'; import { getHonoContext } from '../lib/hono'; -import { getEnv } from '../lib/waku'; +import { getEnv, isBuild } from '../lib/waku'; export default async function HomePage() { const data = await getData(); @@ -44,6 +44,9 @@ export default async function HomePage() { // Example async server component const ServerMessage = async () => { + if (isBuild()) { + console.warn('Note: server components are awaited during build.'); + } await new Promise((resolve) => setTimeout(resolve, 2000)); return

Hello from server!

; }; diff --git a/examples/07_cloudflare/waku.cloudflare-middleware.ts b/examples/07_cloudflare/waku.cloudflare-middleware.ts new file mode 100644 index 000000000..fbe29a9a1 --- /dev/null +++ b/examples/07_cloudflare/waku.cloudflare-middleware.ts @@ -0,0 +1,30 @@ +// Workaround https://github.com/cloudflare/workers-sdk/issues/6577 +import type { Middleware } from 'waku/config'; + +function isWranglerDev(headers?: Record): boolean { + // This header seems to only be set for production cloudflare workers + return !headers?.['cf-visitor']; +} + +const cloudflareMiddleware: Middleware = () => { + return async (ctx, next) => { + await next(); + if (!import.meta.env?.PROD) { + return; + } + if (!isWranglerDev(ctx.req.headers)) { + return; + } + const contentType = ctx.res.headers?.['content-type']; + if ( + !contentType || + contentType.includes('text/html') || + contentType.includes('text/plain') + ) { + ctx.res.headers ||= {}; + ctx.res.headers['content-encoding'] = 'Identity'; + } + }; +}; + +export default cloudflareMiddleware; diff --git a/examples/07_cloudflare/waku.config.ts b/examples/07_cloudflare/waku.config.ts index ee32f7894..e07506e06 100644 --- a/examples/07_cloudflare/waku.config.ts +++ b/examples/07_cloudflare/waku.config.ts @@ -31,6 +31,7 @@ export default defineConfig({ return [ import('waku/middleware/context'), import('waku/middleware/dev-server'), + import('./waku.cloudflare-middleware'), import('waku/middleware/handler'), ]; },