From 361523048ff186d8b797e5ace7e31cf8a2c2ebab Mon Sep 17 00:00:00 2001 From: PatrickJS Date: Thu, 23 May 2024 01:07:12 -0700 Subject: [PATCH 1/3] chore: use old cf TextEncoderStream --- packages/qwik-city/middleware/bun/index.ts | 2 +- .../middleware/cloudflare-pages/index.ts | 4 +- .../middleware/request-handler/api.md | 11 ++++++ .../middleware/request-handler/index.ts | 2 +- .../middleware/request-handler/polyfill.ts | 37 +++++++++++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/packages/qwik-city/middleware/bun/index.ts b/packages/qwik-city/middleware/bun/index.ts index 3cc057523b4..195f88f09f1 100644 --- a/packages/qwik-city/middleware/bun/index.ts +++ b/packages/qwik-city/middleware/bun/index.ts @@ -20,7 +20,7 @@ import { join, extname } from 'node:path'; export function createQwikCity(opts: QwikCityBunOptions) { // @builder.io/qwik-city/middleware/bun // still missing from bun: last check was bun version 1.1.8 - globalThis.TextEncoderStream ||= class TextEncoderStream extends _TextEncoderStream_polyfill {}; + globalThis.TextEncoderStream ||= _TextEncoderStream_polyfill; const qwikSerializer = { _deserializeData, diff --git a/packages/qwik-city/middleware/cloudflare-pages/index.ts b/packages/qwik-city/middleware/cloudflare-pages/index.ts index 22e3d04047a..6471b5ae0c7 100644 --- a/packages/qwik-city/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-city/middleware/cloudflare-pages/index.ts @@ -5,7 +5,7 @@ import type { import { mergeHeadersCookies, requestHandler, - _TextEncoderStream_polyfill, + _TextEncoderStream_polyfill2, } from '@builder.io/qwik-city/middleware/request-handler'; import { getNotFound } from '@qwik-city-not-found-paths'; import { isStaticPath } from '@qwik-city-static-paths'; @@ -22,7 +22,7 @@ export function createQwikCity(opts: QwikCityCloudflarePagesOptions) { new globalThis.TextEncoderStream(); } catch (e) { // @ts-ignore - globalThis.TextEncoderStream = class TextEncoderStream extends _TextEncoderStream_polyfill {}; + globalThis.TextEncoderStream = _TextEncoderStream_polyfill; } const qwikSerializer = { _deserializeData, diff --git a/packages/qwik-city/middleware/request-handler/api.md b/packages/qwik-city/middleware/request-handler/api.md index 91fb8b63b50..e130f662b74 100644 --- a/packages/qwik-city/middleware/request-handler/api.md +++ b/packages/qwik-city/middleware/request-handler/api.md @@ -233,6 +233,17 @@ export class _TextEncoderStream_polyfill { get writable(): WritableStream; } +// @internal (undocumented) +export class _TextEncoderStream_polyfill2 { + constructor(); + // (undocumented) + readable: any; + // (undocumented) + writable: any; + // (undocumented) + _writer: any; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/qwik-city/middleware/request-handler/index.ts b/packages/qwik-city/middleware/request-handler/index.ts index a5d10b3195a..34790151783 100644 --- a/packages/qwik-city/middleware/request-handler/index.ts +++ b/packages/qwik-city/middleware/request-handler/index.ts @@ -2,7 +2,7 @@ export { getErrorHtml, ServerError } from './error-handler'; export { mergeHeadersCookies } from './cookie'; export { AbortMessage, RedirectMessage } from './redirect-handler'; export { requestHandler } from './request-handler'; -export { _TextEncoderStream_polyfill } from './polyfill'; +export { _TextEncoderStream_polyfill, _TextEncoderStream_polyfill2 } from './polyfill'; export type { CacheControl, Cookie, diff --git a/packages/qwik-city/middleware/request-handler/polyfill.ts b/packages/qwik-city/middleware/request-handler/polyfill.ts index c51e6185b17..d440af95e15 100644 --- a/packages/qwik-city/middleware/request-handler/polyfill.ts +++ b/packages/qwik-city/middleware/request-handler/polyfill.ts @@ -73,3 +73,40 @@ export class _TextEncoderStream_polyfill { return 'TextEncoderStream'; } } + + +const resolved = Promise.resolve(); +/** @internal */ +export class _TextEncoderStream_polyfill2 { + // 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, + }; + }, + }; + } +} \ No newline at end of file From bafd99c5f1e696aa745b1957ff9a2b409dfcf140 Mon Sep 17 00:00:00 2001 From: PatrickJS Date: Thu, 23 May 2024 01:10:34 -0700 Subject: [PATCH 2/3] chore: lint --- packages/qwik-city/middleware/request-handler/polyfill.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/qwik-city/middleware/request-handler/polyfill.ts b/packages/qwik-city/middleware/request-handler/polyfill.ts index d440af95e15..485bae077f7 100644 --- a/packages/qwik-city/middleware/request-handler/polyfill.ts +++ b/packages/qwik-city/middleware/request-handler/polyfill.ts @@ -74,7 +74,6 @@ export class _TextEncoderStream_polyfill { } } - const resolved = Promise.resolve(); /** @internal */ export class _TextEncoderStream_polyfill2 { @@ -109,4 +108,4 @@ export class _TextEncoderStream_polyfill2 { }, }; } -} \ No newline at end of file +} From 79f88f63e2c1aec88e8b60fc7c21eb8bf2b0191a Mon Sep 17 00:00:00 2001 From: PatrickJS Date: Thu, 23 May 2024 01:25:31 -0700 Subject: [PATCH 3/3] Update index.ts --- packages/qwik-city/middleware/cloudflare-pages/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/qwik-city/middleware/cloudflare-pages/index.ts b/packages/qwik-city/middleware/cloudflare-pages/index.ts index 6471b5ae0c7..eee224c1e9b 100644 --- a/packages/qwik-city/middleware/cloudflare-pages/index.ts +++ b/packages/qwik-city/middleware/cloudflare-pages/index.ts @@ -22,7 +22,7 @@ export function createQwikCity(opts: QwikCityCloudflarePagesOptions) { new globalThis.TextEncoderStream(); } catch (e) { // @ts-ignore - globalThis.TextEncoderStream = _TextEncoderStream_polyfill; + globalThis.TextEncoderStream = _TextEncoderStream_polyfill2; } const qwikSerializer = { _deserializeData,