Streaming ヘルパー
Streaming ヘルパーは、ストリーミングレスポンス用のメソッドを提供します。
インポート
ts
import { Hono } from 'hono'
import { stream, streamText, streamSSE } from 'hono/streaming'stream()
単純なストリーミングレスポンスを Response オブジェクトとして返します。
ts
app.get('/stream', (c) => {
return stream(c, async (stream) => {
// Write a process to be executed when aborted.
stream.onAbort(() => {
console.log('Aborted!')
})
// Write a Uint8Array.
await stream.write(new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]))
// Pipe a readable stream.
await stream.pipe(anotherReadableStream)
})
})streamText()
Content-Type: text/plain、Transfer-Encoding: chunked、X-Content-Type-Options: nosniff ヘッダーを持つストリーミングレスポンスを返します。
ts
app.get('/streamText', (c) => {
return streamText(c, async (stream) => {
// Write a text with a new line ('\n').
await stream.writeln('Hello')
// Wait 1 second.
await stream.sleep(1000)
// Write a text without a new line.
await stream.write(`Hono!`)
})
})注意
Cloudflare Workers 向けの開発では、Wrangler 上でストリーミングが正しく動かない場合があります。その場合は、Content-Encoding ヘッダーに Identity を設定してください。
ts
app.get('/streamText', (c) => {
c.header('Content-Encoding', 'Identity')
return streamText(c, async (stream) => {
// ...
})
})streamSSE()
Server-Sent Events(SSE)を簡単にストリーミングできます。
ts
const app = new Hono()
let id = 0
app.get('/sse', async (c) => {
return streamSSE(c, async (stream) => {
while (!stream.aborted) {
const message = `It is ${new Date().toISOString()}`
await stream.writeSSE({
data: message,
event: 'time-update',
id: String(id++),
})
await stream.sleep(1000)
}
})
})エラー処理
ストリーミングヘルパーの第 3 引数はエラーハンドラーです。 この引数は省略可能で、指定しなければコンソールにエラーを出力します。
ts
app.get('/stream', (c) => {
return stream(
c,
async (stream) => {
// Write a process to be executed when aborted.
stream.onAbort(() => {
console.log('Aborted!')
})
// Write a Uint8Array.
await stream.write(
new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])
)
// Pipe a readable stream.
await stream.pipe(anotherReadableStream)
},
(err, stream) => {
stream.writeln('An error occurred!')
console.error(err)
}
)
})コールバックの実行後、ストリームは自動的に閉じられます。
注意
ストリーミングヘルパーのコールバック関数がエラーをスローしても、Hono の onError イベントは発生しません。
onError は、レスポンスの送信前にエラーを処理し、レスポンスを上書きするフックです。ただし、コールバックの実行時にはストリームがすでに開始しているため、レスポンスを上書きできません。