Commit 225bf82
committed
refactor(sse): consolidate client SSE readers behind a single typed primitive
Replace four hand-rolled client SSE decode loops with two layered
primitives in lib/core/utils/sse.ts:
- readSSELines: the single byte-stream decode engine. Splits on \n,
strips trailing \r, tolerates data: with/without a leading space,
skips the [DONE] sentinel, honors an AbortSignal before each chunk and
between events, and releases the reader lock only when it acquired it.
- readSSEEvents<T>: a thin JSON layer that parses each payload and routes
unparseable lines to onParseError (default: skip).
An SSESource union accepts a Response, a ReadableStream, or an
already-acquired reader so callers that must stash the reader for
external cancellation keep ownership of the lock.
Migrates use-execution-stream, chat use-chat-streaming, home use-chat
(via readSSELines for schema-validated decode), and the workflow chat
panel. Legacy server/wand exports (encodeSSE, SSE_HEADERS,
readSSEStream) are untouched. Behavior is preserved across abort, RAF
batching, TTS, [DONE], delimiter tolerance, and reader-lock ownership.
Tests in sse.test.ts pin the prior behavior: \n and \n\n framing,
mid-chunk splits, [DONE], data: with/without leading space, \r\n
stripping, sync/async early-stop, pre-aborted and mid-stream abort,
lock release/non-release per source, lock release on a throwing
handler, and Response/stream/reader sources.1 parent b212a5d commit 225bf82
6 files changed
Lines changed: 823 additions & 428 deletions
File tree
- apps/sim
- app
- chat/hooks
- workspace/[workspaceId]
- home/hooks
- w/[workflowId]/components/chat
- hooks
- lib/core/utils
0 commit comments