如何从服务器流式传输异步字符串

How to stream asynchronous string from server

我正在尝试在 Deno 中流式传输 html 响应,但不太明白。

从前端的 Service Worker 执行它看起来像这样:

async function streamResponse(html: {start: (s: string) => Promise<void>}) {
    const encoder = new TextEncoder()
    const stream = new ReadableStream({
        async start(controller : ReadableStreamDefaultController<any>) {
            const send = (item: string) => controller.enqueue(encoder.encode(item))
            await html.start(send)
            controller.close()
        }
    })

    return new Response(stream, { headers: { "content-type": "text/html; charset=utf-8" }})
}

当我在 Deno (req.respond({body: stream, headers})) 中做类似的事情时,它说正文不能是 ReadableStream 类型。我知道有一些方法可以做到这一点。我只是想不通。我错过了什么?我查看了多个地方试图了解它是如何完成的,但我还没有找到任何好的例子。

想通了。我需要使用Deno.Buffer作为编写器,然后引入BufReader来包装编写器。

import { BufReader } from "https://deno.land/std@0.79.0/io/bufio.ts"
import { ServerRequest } from "https://deno.land/std@0.79.0/http/server.ts"
import { HTML } from "./html.ts"

var headers = new Headers({
    "Content-Type": "text/html"
})

const encoder = new TextEncoder()

export async function toHTML(req: ServerRequest, html: Promise<HTML>) {
    var buffer = new Deno.Buffer()
    var body = new BufReader(buffer)

    var h = await html
    req.respond({body, headers})
    await h.start((item: string) => buffer.write(encoder.encode(item)))
}