]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(server-renderer): pipeToWebWritable CF worker compat
authorEvan You <yyx990803@gmail.com>
Tue, 10 Aug 2021 15:46:44 +0000 (11:46 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 10 Aug 2021 18:03:51 +0000 (14:03 -0400)
fix #4287

packages/server-renderer/README.md
packages/server-renderer/src/renderToStream.ts

index d56b75be2694050d07974e7163e75d54ecf9dceb..7cec9a6f25fcbdc1c8c7cce8b45e3c23efac8d0d 100644 (file)
@@ -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
 ```
 
index 437e0b6cdac267fc0a1ddbaf810b01c667286f49..2c51da77ecdb2759eb5b7b098e7dd831331b6c2e 100644 (file)
@@ -74,9 +74,7 @@ export function renderToSimpleStream<T extends SimpleReadable>(
 
   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()
+    }
   })
 }