UNPKG

hono

Version:

Web framework built on Web Standards

63 lines (62 loc) 1.86 kB
// src/helper/streaming/sse.ts import { HtmlEscapedCallbackPhase, resolveCallback } from "../../utils/html.js"; import { StreamingApi } from "../../utils/stream.js"; import { isOldBunVersion } from "./utils.js"; var SSEStreamingApi = class extends StreamingApi { constructor(writable, readable) { super(writable, readable); } async writeSSE(message) { const data = await resolveCallback(message.data, HtmlEscapedCallbackPhase.Stringify, false, {}); const dataLines = data.split("\n").map((line) => { return `data: ${line}`; }).join("\n"); const sseData = [ message.event && `event: ${message.event}`, dataLines, message.id && `id: ${message.id}`, message.retry && `retry: ${message.retry}` ].filter(Boolean).join("\n") + "\n\n"; await this.write(sseData); } }; var run = async (stream, cb, onError) => { try { await cb(stream); } catch (e) { if (e instanceof Error && onError) { await onError(e, stream); await stream.writeSSE({ event: "error", data: e.message }); } else { console.error(e); } } finally { stream.close(); } }; var contextStash = /* @__PURE__ */ new WeakMap(); var streamSSE = (c, cb, onError) => { const { readable, writable } = new TransformStream(); const stream = new SSEStreamingApi(writable, readable); if (isOldBunVersion()) { c.req.raw.signal.addEventListener("abort", () => { if (!stream.closed) { stream.abort(); } }); } contextStash.set(stream.responseReadable, c); c.header("Transfer-Encoding", "chunked"); c.header("Content-Type", "text/event-stream"); c.header("Cache-Control", "no-cache"); c.header("Connection", "keep-alive"); run(stream, cb, onError); return c.newResponse(stream.responseReadable); }; export { SSEStreamingApi, streamSSE };