diff --git a/packages/qwik-city/middleware/cloudflare-pages/index.ts b/packages/qwik-city/middleware/cloudflare-pages/index.ts index a602af48c52..e7fa7cbfb82 100644 --- a/packages/qwik-city/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-city/middleware/cloudflare-pages/index.ts @@ -15,6 +15,7 @@ import { setServerPlatform } from '@builder.io/qwik/server'; /** @public */ export function createQwikCity(opts: QwikCityCloudflarePagesOptions) { + (globalThis as any).TextEncoderStream = TextEncoderStream; const qwikSerializer = { _deserializeData, _serializeData, @@ -131,3 +132,39 @@ export interface PlatformCloudflarePages { env?: Record; ctx: { waitUntil: (promise: Promise) => void }; } + +const resolved = Promise.resolve(); + +class TextEncoderStream { + // minimal polyfill implementation of TextEncoderStream + // since Cloudflare Pages doesn't support readable.pipeTo() + _writer: any; + readable: any; + writable: any; + + constructor() { + this._writer = null; + this.readable = { + pipeTo: (writableStream: any) => { + this._writer = writableStream.getWriter(); + }, + }; + this.writable = { + getWriter: () => { + if (!this._writer) { + throw new Error('No writable stream'); + } + const encoder = new TextEncoder(); + return { + write: async (chunk: any) => { + if (chunk != null) { + await this._writer.write(encoder.encode(chunk)); + } + }, + close: () => this._writer.close(), + ready: resolved, + }; + }, + }; + } +}