From 2224610b0b390d82d7b5436df1f78b0569a199a9 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 Aug 2021 11:46:44 -0400 Subject: [PATCH] fix(server-renderer): pipeToWebWritable CF worker compat fix #4287 --- packages/server-renderer/README.md | 3 +- .../server-renderer/src/renderToStream.ts | 39 +++++++++++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/server-renderer/README.md b/packages/server-renderer/README.md index d56b75be269..7cec9a6f25f 100644 --- a/packages/server-renderer/README.md +++ b/packages/server-renderer/README.md @@ -92,8 +92,7 @@ Renders input as a [Web ReadableStream](https://developer.mozilla.org/en-US/docs ```ts function renderToWebStream( input: App | VNode, - context?: SSRContext, - Ctor?: { new (): ReadableStream } + context?: SSRContext ): ReadableStream ``` diff --git a/packages/server-renderer/src/renderToStream.ts b/packages/server-renderer/src/renderToStream.ts index 437e0b6cdac..2c51da77ecd 100644 --- a/packages/server-renderer/src/renderToStream.ts +++ b/packages/server-renderer/src/renderToStream.ts @@ -74,9 +74,7 @@ export function renderToSimpleStream( Promise.resolve(renderComponentVNode(vnode)) .then(buffer => unrollBuffer(buffer, stream)) - .then(() => { - stream.push(null) - }) + .then(() => stream.push(null)) .catch(error => { stream.destroy(error) }) @@ -180,20 +178,27 @@ export function pipeToWebWritable( const writer = writable.getWriter() const encoder = new TextEncoder() - writer.ready.then(() => { - renderToSimpleStream(input, context, { - push(content) { - if (content != null) { - writer.write(encoder.encode(content)) - } else { - writer.close() - } - }, - destroy(err) { - // TODO better error handling? - console.log(err) - writer.close() + // #4287 CloudFlare workers do not implement `ready` property + let hasReady = false + try { + hasReady = isPromise(writer.ready) + } catch (e) {} + + renderToSimpleStream(input, context, { + async push(content) { + if (hasReady) { + await writer.ready } - }) + if (content != null) { + return writer.write(encoder.encode(content)) + } else { + return writer.close() + } + }, + destroy(err) { + // TODO better error handling? + console.log(err) + writer.close() + } }) }