fix(server-renderer): pipeToWebWritable CF worker compat

fix #4287
This commit is contained in:
Evan You 2021-08-10 11:46:44 -04:00
parent e04680b0aa
commit 2224610b0b
2 changed files with 23 additions and 19 deletions

View File

@ -92,8 +92,7 @@ Renders input as a [Web ReadableStream](https://developer.mozilla.org/en-US/docs
```ts ```ts
function renderToWebStream( function renderToWebStream(
input: App | VNode, input: App | VNode,
context?: SSRContext, context?: SSRContext
Ctor?: { new (): ReadableStream }
): ReadableStream ): ReadableStream
``` ```

View File

@ -74,9 +74,7 @@ export function renderToSimpleStream<T extends SimpleReadable>(
Promise.resolve(renderComponentVNode(vnode)) Promise.resolve(renderComponentVNode(vnode))
.then(buffer => unrollBuffer(buffer, stream)) .then(buffer => unrollBuffer(buffer, stream))
.then(() => { .then(() => stream.push(null))
stream.push(null)
})
.catch(error => { .catch(error => {
stream.destroy(error) stream.destroy(error)
}) })
@ -180,20 +178,27 @@ export function pipeToWebWritable(
const writer = writable.getWriter() const writer = writable.getWriter()
const encoder = new TextEncoder() const encoder = new TextEncoder()
writer.ready.then(() => { // #4287 CloudFlare workers do not implement `ready` property
renderToSimpleStream(input, context, { let hasReady = false
push(content) { try {
if (content != null) { hasReady = isPromise(writer.ready)
writer.write(encoder.encode(content)) } catch (e) {}
} else {
writer.close() renderToSimpleStream(input, context, {
} async push(content) {
}, if (hasReady) {
destroy(err) { await writer.ready
// TODO better error handling?
console.log(err)
writer.close()
} }
}) if (content != null) {
return writer.write(encoder.encode(content))
} else {
return writer.close()
}
},
destroy(err) {
// TODO better error handling?
console.log(err)
writer.close()
}
}) })
} }