UNPKG

@tanstack/router-core

Version:

Modern and scalable routing for React applications

59 lines (51 loc) 1.78 kB
import type { PluginInfo, SerovalNode } from 'seroval' export type RawStreamHint = 'binary' | 'text' export interface RawStreamOptions { /** * Encoding hint for JSON and SSR serialization. * - 'binary' (default): Always use base64 encoding * - 'text': Try UTF-8 first, fallback to base64 for invalid UTF-8 chunks */ hint?: RawStreamHint } /** * Marker class for ReadableStream<Uint8Array> that should be serialized * with base64/text encoding (JSON and SSR) or binary framing * (server-function responses). * * Wrap your binary streams with this to get efficient serialization: * ```ts * // For binary data (files, images, etc.) * return { data: new RawStream(file.stream()) } * * // For text-heavy data (RSC payloads, etc.) * return { data: new RawStream(rscStream, { hint: 'text' }) } * ``` * * RawStreams returned from one server function share one ordered response. * Arbitrary or sequential consumption can require potentially unbounded client * buffering for unread data. Cancelling one RawStream discards it locally; * abort the whole server-function call to cancel the response and server work. * Consume streams concurrently, cancel unused streams promptly, or use separate * calls when independent backpressure is required. */ export class RawStream { public readonly hint: RawStreamHint constructor( public readonly stream: ReadableStream<Uint8Array>, options?: RawStreamOptions, ) { this.hint = options?.hint ?? 'binary' } } export type OnRawStreamCallback = ( streamId: number, stream: ReadableStream<Uint8Array>, ) => void export interface RawStreamJSONNode extends PluginInfo { text: SerovalNode stream: SerovalNode } export interface RawStreamRPCNode extends PluginInfo { streamId: SerovalNode }