@reckona/mreact-server 0.0.81 → 0.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Fragment,\n Suspense as ReactCompatSuspense,\n createElement,\n isValidElement,\n type ReactCompatElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\nimport {\n isDangerousHtmlAttribute,\n isDangerousHtmlOptIn,\n isUnsafeMetaRefreshContent,\n isUnsafeUrlAttribute,\n} from \"./url-safety.js\";\nimport { escapeHtmlText as escapeHtml } from \"@reckona/mreact-shared/html-escape\";\nimport { createStreamingBufferSink } from \"./buffer-sink.js\";\n\nexport { Fragment } from \"@reckona/mreact-compat\";\nexport type { ReactCompatNode } from \"@reckona/mreact-compat\";\n\nexport interface HtmlSink {\n append(chunk: string): void;\n backpressure?(): Promise<void>;\n defer?(task: PromiseLike<void>): void;\n signal?: AbortSignal;\n}\n\nexport {\n CLIENT_REFERENCE_TYPE,\n SERVER_REFERENCE_TYPE,\n createClientReference,\n createFlightClientManifest,\n createServerReference,\n createServerActionHandler,\n fromReactFlightRows,\n getReactFlightProtocolCoverage,\n isClientReference,\n isServerReference,\n mergeReactFlightRows,\n renderFlightPreloadLinks,\n renderFlightResponseScript,\n renderToFlightResponse,\n stringifyFlightResponse,\n toReactFlightRows,\n} from \"./flight.js\";\nexport type {\n ClientReference,\n FlightClientManifestEntry,\n FlightClientReference,\n FlightClientReferenceInput,\n FlightClientReferenceModel,\n FlightDataViewModel,\n FlightElementModel,\n FlightFormDataModel,\n FlightIterableModel,\n FlightModel,\n FlightResponse,\n FlightScriptOptions,\n FlightServerReference,\n FlightServerReferenceModel,\n FlightArrayBufferModel,\n FlightTypedArrayModel,\n FlightTypedArrayName,\n ServerAction,\n ServerActionDescriptor,\n ServerActionHandlerOptions,\n ServerActionRegistry,\n ServerActionReplayStore,\n ServerActionRequestReference,\n ServerActionValidationResult,\n ServerReference,\n} from \"./flight.js\";\n\nexport interface StringHtmlSink extends HtmlSink {\n bufferStrategy(): StringSinkBufferStrategy;\n drain(): Promise<void>;\n toString(): string;\n}\n\nexport type StringSinkBufferStrategy = \"concat\" | \"array-join\";\n\nexport interface StringSinkOptions {\n strategy?: StringSinkBufferStrategy | \"auto\";\n arrayJoinThreshold?: number;\n}\n\nexport type StreamRender = (sink: HtmlSink) => void | PromiseLike<void>;\n\nexport interface RenderToReadableStreamOptions {\n logAbortedDeferredErrors?: boolean;\n}\n\nexport interface AsyncBoundaryOptions {\n catch?: (sink: HtmlSink, error: unknown) => void | PromiseLike<void>;\n hydrationAwaitId?: string;\n}\n\nexport interface OutOfOrderBoundaryOptions extends AsyncBoundaryOptions {\n hydration?: boolean;\n placeholder?: (sink: HtmlSink) => void | PromiseLike<void>;\n placeholderTag?: string;\n}\n\nexport interface OutOfOrderReorderScriptOptions {\n nonce?: string;\n src?: string;\n}\n\nexport interface HydrationScriptOptions {\n nonce?: string;\n}\n\nexport interface ReactSuspenseScriptOptions {\n nonce?: string;\n src?: string;\n}\n\nexport interface ReactSuspenseBoundaryOptions extends AsyncBoundaryOptions {\n fallback?: (sink: HtmlSink) => void | PromiseLike<void>;\n nonce?: string;\n}\n\nexport interface ReactSuspenseClientRenderOptions {\n message?: string;\n stack?: string;\n}\n\nconst outOfOrderBoundaryInstances = new WeakMap<HtmlSink, Map<string, number>>();\nconst streamQueuedChunkSoftLimitBytes = 1024 * 1024;\n\nexport interface ScriptAssetOptions {\n src: string;\n nonce?: string;\n integrity?: string;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\nexport interface EventHydrationEntry {\n id: string;\n event: string;\n handler: string;\n}\n\nexport interface EventHydrationManifest {\n version: 1;\n events: EventHydrationEntry[];\n}\n\nexport interface HtmlResponseOptions {\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n}\n\nexport interface SuspenseProps extends Record<string, unknown> {\n fallback?: unknown;\n children?: unknown;\n}\n\nexport type AsyncBoundaryRender<T> = (\n sink: HtmlSink,\n value: Awaited<T>,\n) => void | PromiseLike<void>;\n\nexport function Suspense(props: SuspenseProps): never {\n const config: SuspenseProps = {};\n\n if (props.fallback !== undefined) {\n config.fallback = props.fallback as ReactCompatNode;\n }\n\n return createElement<SuspenseProps>(\n ReactCompatSuspense,\n config,\n props.children as ReactCompatNode,\n ) as never;\n}\n\nexport function createStringSink(options: StringSinkOptions = {}): StringHtmlSink {\n // Default to \"concat\" — V8 rope flattening yields 2-6x throughput over\n // `Array#join(\"\")` across all measured fixture sizes (see\n // docs/benchmarks/2026-05-12-server-sink-strategy.md). \"array-join\" stays\n // available as opt-in for scenarios that need lower peak memory.\n const requestedStrategy = options.strategy ?? \"concat\";\n const arrayJoinThreshold = options.arrayJoinThreshold ?? 256;\n const deferredTasks: PromiseLike<void>[] = [];\n let strategy: StringSinkBufferStrategy = requestedStrategy === \"auto\"\n ? \"concat\"\n : requestedStrategy;\n let writeCount = 0;\n let text = \"\";\n const chunks: string[] = [];\n\n const switchConcatToArrayJoin = () => {\n if (strategy !== \"concat\") {\n return;\n }\n\n if (text !== \"\") {\n chunks.push(text);\n text = \"\";\n }\n strategy = \"array-join\";\n };\n\n return {\n append(chunk) {\n writeCount += 1;\n\n if (requestedStrategy === \"auto\" && strategy === \"concat\" && writeCount > arrayJoinThreshold) {\n switchConcatToArrayJoin();\n }\n\n if (strategy === \"concat\") {\n text += chunk;\n return;\n }\n\n chunks.push(chunk);\n },\n bufferStrategy() {\n return strategy;\n },\n defer(task) {\n deferredTasks.push(task);\n },\n async drain() {\n await Promise.all(deferredTasks);\n },\n toString() {\n if (strategy === \"concat\") {\n return text;\n }\n\n return chunks.join(\"\");\n },\n };\n}\n\nexport async function renderAsyncBoundary<T>(\n sink: HtmlSink,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: AsyncBoundaryOptions = {},\n): Promise<void> {\n try {\n const resolved = await value;\n await sink.backpressure?.();\n await render(sink, resolved);\n if (options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolved);\n }\n } catch (error) {\n if (options.catch === undefined) {\n throw error;\n }\n\n await sink.backpressure?.();\n await options.catch(sink, error);\n }\n}\n\n// Threshold for `<Await>` payload size warnings (UTF-8 byte length of\n// JSON-serialized representation). 100KB warn / 1MB error follow the\n// \"you're sending a lot of data\" hint pattern used by other frameworks.\nconst AWAIT_PAYLOAD_WARN_BYTES = 100 * 1024;\nconst AWAIT_PAYLOAD_ERROR_BYTES = 1024 * 1024;\n\nfunction isProductionMode(): boolean {\n // `process` may not exist in cross-runtime environments (Cloudflare/Deno).\n // The server tsconfig does not include `@types/node`, so we look it up\n // through `globalThis` with a minimal local typing.\n const globalProcess = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n\n try {\n return globalProcess?.env?.[\"NODE_ENV\"] === \"production\";\n } catch {\n return false;\n }\n}\n\nfunction appendAwaitHydrationData(\n sink: HtmlSink,\n awaitId: string,\n resolved: unknown,\n): void {\n const serialized = serializeAwaitHydrationValue(resolved, awaitId);\n\n if (serialized === undefined) {\n return;\n }\n\n const idLiteral = JSON.stringify(awaitId).replaceAll(\"<\", \"\\\\u003c\");\n sink.append(\n `<script data-mreact-await=${idLiteral}>(self.__mreactAwaitData||(self.__mreactAwaitData={}))[${idLiteral}]={value:${serialized}}</script>`,\n );\n}\n\n// Emits a single console.warn in dev when `resolved` contains shapes the\n// wire format will silently drop or coerce (Date / Map / Set / RegExp /\n// class instance / function / Symbol / nested non-POJO).\nfunction warnIfNonSerializableAwaitValue(value: unknown, awaitId: string): void {\n if (isProductionMode()) {\n return;\n }\n\n if (!containsNonSerializableSurface(value)) {\n return;\n }\n\n console.warn(\n `[mreact] <Await value={...}> for \"${awaitId}\" includes non-serializable ` +\n `data (Date / Map / Set / RegExp / class instance / function / Symbol). ` +\n `The wire format uses JSON.stringify, so the client-side renderer may ` +\n `receive a different shape after the JSON round-trip. Convert to plain ` +\n `JSON-serializable data before it reaches <Await>. See ` +\n `https://github.com/t-k/mreact#streaming-loading-and-await.`,\n );\n}\n\nfunction containsNonSerializableSurface(value: unknown): boolean {\n if (value === null || value === undefined || typeof value !== \"object\") {\n return false;\n }\n\n if (value instanceof Date || value instanceof Map || value instanceof Set || value instanceof RegExp) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsNonSerializableSurface(entry));\n }\n\n const proto = Object.getPrototypeOf(value);\n\n if (proto !== Object.prototype && proto !== null) {\n return true;\n }\n\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (containsNonSerializableSurface(entry)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction reportAwaitPayloadSize(json: string, awaitId: string): void {\n const byteLength =\n typeof TextEncoder !== \"undefined\" ? new TextEncoder().encode(json).length : json.length;\n\n if (byteLength > AWAIT_PAYLOAD_ERROR_BYTES) {\n console.error(\n `[mreact] <Await> payload for \"${awaitId}\" is ${(byteLength / 1024 / 1024).toFixed(2)}MB, ` +\n `exceeding the 1MB error threshold. Large payloads inflate HTML response size and ` +\n `client memory pressure. Stream the data via loader or split into smaller boundaries.`,\n );\n return;\n }\n\n if (byteLength > AWAIT_PAYLOAD_WARN_BYTES) {\n console.warn(\n `[mreact] large await payload for \"${awaitId}\": ${(byteLength / 1024).toFixed(1)}KB ` +\n `(over the 100KB warning threshold). Consider streaming the data via loader or ` +\n `splitting into smaller boundaries.`,\n );\n }\n}\n\nfunction serializeAwaitHydrationValue(value: unknown, awaitId: string): string | undefined {\n try {\n const json = JSON.stringify(value);\n if (json === undefined) {\n return undefined;\n }\n\n warnIfNonSerializableAwaitValue(value, awaitId);\n reportAwaitPayloadSize(json, awaitId);\n\n // Defuse `</script>` and runaway control characters so the data can be\n // safely embedded inside a `<script>` element.\n return json\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"
\", \"\\\\u2028\")\n .replaceAll(\"
\", \"\\\\u2029\");\n } catch {\n return undefined;\n }\n}\n\nfunction inheritBackpressure(childSink: StringHtmlSink, parentSink: HtmlSink): StringHtmlSink {\n if (parentSink.backpressure === undefined) {\n return childSink;\n }\n\n return {\n ...childSink,\n backpressure: parentSink.backpressure,\n };\n}\n\nexport function renderOutOfOrderBoundary<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions = {},\n): void {\n const boundaryId = nextOutOfOrderBoundaryInstanceId(sink, id);\n const placeholderSink = createStringSink();\n void options.placeholder?.(placeholderSink);\n const placeholderTag = normalizeOutOfOrderPlaceholderTag(options.placeholderTag);\n const hydrationStart =\n options.hydration === true ? `<!--mreact-h:start:${encodeURIComponent(boundaryId)}-->` : \"\";\n const hydrationEnd =\n options.hydration === true ? `<!--mreact-h:end:${encodeURIComponent(boundaryId)}-->` : \"\";\n sink.append(\n `${hydrationStart}<${placeholderTag} data-mreact-oob-placeholder=\"${escapeAttribute(boundaryId)}\">${placeholderSink.toString()}</${placeholderTag}>${hydrationEnd}`,\n );\n\n const task = renderOutOfOrderFragment(sink, boundaryId, value, render, options);\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction normalizeOutOfOrderPlaceholderTag(tag: unknown): string {\n if (typeof tag !== \"string\") {\n return \"span\";\n }\n\n const normalized = tag.trim().toLowerCase();\n return /^[a-z][a-z0-9-]*$/.test(normalized) ? normalized : \"span\";\n}\n\nasync function renderOutOfOrderFragment<T>(\n sink: HtmlSink,\n id: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: OutOfOrderBoundaryOptions,\n): Promise<void> {\n const fragmentSink = inheritBackpressure(createStringSink(), sink);\n let resolvedValue: unknown;\n let hasResolvedValue = false;\n\n await renderAsyncBoundary(\n fragmentSink,\n value,\n async (childSink, resolved) => {\n resolvedValue = resolved;\n hasResolvedValue = true;\n await render(childSink, resolved);\n },\n options.catch === undefined ? {} : { catch: options.catch },\n );\n await fragmentSink.drain();\n\n sink.append(\n `<template data-mreact-oob-fragment=\"${escapeAttribute(id)}\">${fragmentSink.toString()}</template>`,\n );\n\n if (hasResolvedValue && options.hydrationAwaitId !== undefined) {\n appendAwaitHydrationData(sink, options.hydrationAwaitId, resolvedValue);\n }\n}\n\nexport function renderOutOfOrderReorderScript(\n sink: HtmlSink,\n options: OutOfOrderReorderScriptOptions = {},\n): void {\n const nonceAttribute =\n options.nonce === undefined ? \"\" : ` nonce=\"${escapeAttribute(options.nonce)}\"`;\n\n if (options.src !== undefined) {\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute} src=\"${escapeAttribute(options.src)}\"></script>`,\n );\n return;\n }\n\n sink.append(\n `<script data-mreact-oob-reorder${nonceAttribute}>${outOfOrderReorderScript}</script>`,\n );\n}\n\nexport function renderReactSuspenseBoundary(\n sink: HtmlSink,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n sink.append(\"<!--$-->\");\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\nexport function renderReactSuspenseOutOfOrderBoundary<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions = {},\n): void {\n const actualBoundaryId = nextOutOfOrderBoundaryInstanceId(sink, boundaryId);\n const suffix = actualBoundaryId.slice(boundaryId.length);\n const actualSegmentId = `${segmentId}${suffix}`;\n const fallbackSink = createStringSink();\n void options.fallback?.(fallbackSink);\n sink.append(\n `<!--$?--><template id=\"${escapeAttribute(actualBoundaryId)}\"></template>${fallbackSink.toString()}<!--/$-->`,\n );\n\n const task = renderReactSuspenseSegment(\n sink,\n actualBoundaryId,\n actualSegmentId,\n value,\n render,\n options,\n );\n\n if (sink.defer === undefined) {\n void task;\n return;\n }\n\n sink.defer(task);\n}\n\nfunction nextOutOfOrderBoundaryInstanceId(sink: HtmlSink, id: string): string {\n let instances = outOfOrderBoundaryInstances.get(sink);\n\n if (instances === undefined) {\n instances = new Map();\n outOfOrderBoundaryInstances.set(sink, instances);\n }\n\n const count = instances.get(id) ?? 0;\n instances.set(id, count + 1);\n\n return count === 0 ? id : `${id}-${count.toString(36)}`;\n}\n\nexport function renderReactSuspenseClientRenderBoundary(\n sink: HtmlSink,\n fallback: (sink: HtmlSink) => void | PromiseLike<void>,\n options: ReactSuspenseClientRenderOptions = {},\n): void | PromiseLike<void> {\n sink.append(`<!--$!--><template${renderReactSuspenseErrorAttributes(options)}></template>`);\n const result = fallback(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(\"<!--/$-->\");\n });\n }\n\n sink.append(\"<!--/$-->\");\n}\n\nasync function renderReactSuspenseSegment<T>(\n sink: HtmlSink,\n boundaryId: string,\n segmentId: string,\n value: T,\n render: AsyncBoundaryRender<T>,\n options: ReactSuspenseBoundaryOptions,\n): Promise<void> {\n const segmentSink = inheritBackpressure(createStringSink(), sink);\n\n await renderAsyncBoundary(\n segmentSink,\n value,\n render,\n options.catch === undefined ? {} : { catch: options.catch },\n );\n\n sink.append(\n `<div hidden id=\"${escapeAttribute(segmentId)}\">${segmentSink.toString()}</div>${renderReactSuspenseRevealScript(boundaryId, segmentId, options)}`,\n );\n}\n\nfunction renderReactSuspenseErrorAttributes(options: ReactSuspenseClientRenderOptions): string {\n const message =\n options.message === undefined ? \"\" : ` data-msg=\"${escapeAttribute(options.message)}\"`;\n const stack = options.stack === undefined ? \"\" : ` data-stck=\"${escapeAttribute(options.stack)}\"`;\n\n return `${message}${stack}`;\n}\n\nfunction renderReactSuspenseRevealScript(\n boundaryId: string,\n segmentId: string,\n options: ReactSuspenseScriptOptions = {},\n): string {\n if (options.src !== undefined) {\n return `<script data-mreact-react-suspense-reveal${renderNonceAttribute(options.nonce)} src=\"${escapeAttribute(options.src)}\" data-boundary-id=\"${escapeAttribute(boundaryId)}\" data-segment-id=\"${escapeAttribute(segmentId)}\"></script>`;\n }\n\n return `<script${renderNonceAttribute(options.nonce)}>${reactSuspenseRevealScriptBody};$RC(${serializeScriptJson(boundaryId)},${serializeScriptJson(segmentId)})</script>`;\n}\n\nexport function renderHydrationBoundary(\n sink: HtmlSink,\n id: string,\n render: (sink: HtmlSink) => void | PromiseLike<void>,\n): void | PromiseLike<void> {\n const markerId = encodeURIComponent(id);\n sink.append(`<!--mreact-h:start:${markerId}-->`);\n const result = render(sink);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n });\n }\n\n sink.append(`<!--mreact-h:end:${markerId}-->`);\n}\n\nexport function serializeSsrState(value: unknown): string {\n return serializeScriptJson(value);\n}\n\nfunction serializeScriptJson(value: unknown): string {\n return JSON.stringify(value)\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"\\u2028\", \"\\\\u2028\")\n .replaceAll(\"\\u2029\", \"\\\\u2029\");\n}\n\nexport function renderSsrState(\n sink: HtmlSink,\n value: unknown,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-ssr-state${renderNonceAttribute(options.nonce)}>${serializeSsrState(value)}</script>`,\n );\n}\n\nexport function createEventHydrationManifest(\n events: readonly EventHydrationEntry[],\n): EventHydrationManifest {\n return {\n version: 1,\n events: events.map((event) => ({ ...event })),\n };\n}\n\nexport function renderEventHydrationManifest(\n sink: HtmlSink,\n manifest: EventHydrationManifest,\n options: HydrationScriptOptions = {},\n): void {\n sink.append(\n `<script type=\"application/json\" data-mreact-event-manifest${renderNonceAttribute(options.nonce)}>${serializeSsrState(manifest)}</script>`,\n );\n}\n\nexport function renderScriptAsset(sink: HtmlSink, options: ScriptAssetOptions): void {\n const integrityAttribute =\n options.integrity === undefined ? \"\" : ` integrity=\"${escapeAttribute(options.integrity)}\"`;\n const crossOrigin =\n options.integrity === undefined ? options.crossOrigin : (options.crossOrigin ?? \"anonymous\");\n const crossOriginAttribute =\n crossOrigin === undefined ? \"\" : ` crossorigin=\"${escapeAttribute(crossOrigin)}\"`;\n\n sink.append(\n `<script src=\"${escapeAttribute(options.src)}\"${renderNonceAttribute(options.nonce)}${integrityAttribute}${crossOriginAttribute}></script>`,\n );\n}\n\nexport function html(node: unknown, options: HtmlResponseOptions = {}): Response {\n const headers = new Headers(options.headers);\n const responseOptions: ResponseInit = { headers };\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/html; charset=utf-8\");\n }\n\n if (options.status !== undefined) {\n responseOptions.status = options.status;\n }\n\n if (options.statusText !== undefined) {\n responseOptions.statusText = options.statusText;\n }\n\n return new Response(\n renderToReadableStream((sink) => {\n const state: HtmlRenderState = { suspenseId: 0 };\n return appendReactNode(sink, node, state);\n }),\n responseOptions,\n );\n}\n\nexport async function renderToString(render: StreamRender): Promise<string> {\n const sink = createStringSink();\n\n await render(sink);\n await sink.drain();\n\n return sink.toString();\n}\n\ninterface HtmlRenderState {\n suspenseId: number;\n}\n\nfunction appendReactNode(\n sink: HtmlSink,\n node: unknown,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (isPromiseLikeNode(node)) {\n return node.then((resolved) => appendReactNode(sink, resolved, state));\n }\n\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n\n if (typeof node === \"string\" || typeof node === \"number\") {\n sink.append(escapeHtml(node));\n return;\n }\n\n if (Array.isArray(node)) {\n return appendReactNodeList(sink, node, state);\n }\n\n if (!isValidElement(node)) {\n return;\n }\n\n return appendReactElement(sink, node, state);\n}\n\nfunction appendReactNodeList(\n sink: HtmlSink,\n nodes: readonly unknown[],\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n let chain: PromiseLike<void> | undefined;\n\n for (const node of nodes) {\n if (chain !== undefined) {\n chain = chain.then(() => appendReactNode(sink, node, state));\n continue;\n }\n\n const result = appendReactNode(sink, node, state);\n\n if (isPromiseLike(result)) {\n chain = result;\n }\n }\n\n return chain;\n}\n\nfunction appendReactElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n if (typeof element.type === \"string\") {\n return appendHostElement(sink, element, state);\n }\n\n if (element.type === Fragment) {\n return appendReactNode(sink, element.props.children, state);\n }\n\n if (element.type === ReactCompatSuspense) {\n return appendSuspenseElement(sink, element, state);\n }\n\n if (isClassComponentType(element.type)) {\n const instance = new element.type(element.props);\n return appendReactNode(sink, instance.render(), state);\n }\n\n if (typeof element.type === \"function\") {\n return appendReactNode(sink, element.type(element.props), state);\n }\n}\n\nfunction isClassComponentType(\n value: unknown,\n): value is new (props: Record<string, unknown>) => { render(): ReactCompatNode } {\n return typeof value === \"function\" && value.prototype?.render !== undefined;\n}\n\nfunction appendHostElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void | PromiseLike<void> {\n const tagName = element.type as string;\n const innerHtml = (element.props as { dangerouslySetInnerHTML?: { __html?: unknown } })\n .dangerouslySetInnerHTML;\n sink.append(`<${tagName}${renderHtmlAttributes(element.props)}>`);\n\n if (innerHtml !== undefined) {\n sink.append(String(innerHtml.__html ?? \"\"));\n sink.append(`</${tagName}>`);\n return;\n }\n\n const result = appendReactNode(sink, element.props.children, state);\n\n if (isPromiseLike(result)) {\n return result.then(() => {\n sink.append(`</${tagName}>`);\n });\n }\n\n sink.append(`</${tagName}>`);\n}\n\nfunction appendSuspenseElement(\n sink: HtmlSink,\n element: ReactCompatElement,\n state: HtmlRenderState,\n): void {\n const rendered = renderReactNodeToString(element.props.children, state);\n\n if (!isPromiseLikeString(rendered)) {\n renderReactSuspenseBoundary(sink, (boundarySink) => {\n boundarySink.append(rendered);\n });\n return;\n }\n\n const id = state.suspenseId;\n state.suspenseId += 1;\n renderReactSuspenseOutOfOrderBoundary(\n sink,\n `B:${id}`,\n `S:${id}`,\n rendered,\n (boundarySink, renderedHtml) => {\n boundarySink.append(renderedHtml);\n },\n {\n fallback(boundarySink) {\n const fallback = renderReactNodeToString(\n (element.props as { fallback?: ReactCompatNode }).fallback,\n state,\n );\n\n if (isPromiseLikeString(fallback)) {\n return fallback.then((html) => {\n boundarySink.append(html);\n });\n }\n\n boundarySink.append(fallback);\n },\n },\n );\n}\n\nfunction renderReactNodeToString(\n node: unknown,\n state: HtmlRenderState,\n): string | PromiseLike<string> {\n const sink = createStringSink();\n const result = appendReactNode(sink, node, state);\n\n if (isPromiseLike(result)) {\n return result.then(() => sink.toString());\n }\n\n return sink.toString();\n}\n\nfunction renderHtmlAttributes(props: Record<string, unknown>): string {\n // Issue 078: <meta http-equiv=\"refresh\" content=\"0;url=javascript:...\">\n // is URL-bearing only when http-equiv is \"refresh\", so we need both\n // attributes in scope to make the call. Strip the unsafe content\n // before per-attribute rendering.\n const sanitizedProps = sanitizeMetaRefreshProps(props);\n return Object.entries(sanitizedProps)\n .map(([name, value]) => renderHtmlAttribute(name, value))\n .filter((attribute) => attribute !== \"\")\n .join(\"\");\n}\n\nfunction sanitizeMetaRefreshProps(\n props: Record<string, unknown>,\n): Record<string, unknown> {\n const httpEquiv = props[\"http-equiv\"] ?? props.httpEquiv;\n const content = props[\"content\"];\n if (typeof httpEquiv !== \"string\" || typeof content !== \"string\") return props;\n if (!isUnsafeMetaRefreshContent(httpEquiv, content)) return props;\n // Drop only `content`; keep http-equiv so the developer's intent is\n // still visible in the rendered HTML (debugging hint).\n const sanitized = { ...props };\n delete sanitized[\"content\"];\n return sanitized;\n}\n\n// Mirrors `isAttributeNameSafe` in react-dom: an attribute name must start with\n// an ASCII letter (or underscore) and contain only word chars, dot, hyphen, or\n// colon. Anything else is dropped to prevent SSR XSS via spread props\n// (`<div {...userControlled} />`). See docs/issues/resolved Issue 060.\nconst VALID_ATTRIBUTE_NAME = /^[A-Za-z_][\\w.\\-:]*$/;\n\n// URL scheme allow/block list is shared with the compiler emit paths\n// (Issues 062 / 073). See packages/server/src/url-safety.ts.\n\nfunction renderHtmlAttribute(name: string, value: unknown): string {\n if (\n name === \"children\" ||\n name === \"dangerouslySetInnerHTML\" ||\n name === \"key\" ||\n name === \"ref\" ||\n value === false ||\n value === null ||\n value === undefined ||\n typeof value === \"function\"\n ) {\n return \"\";\n }\n\n const attributeName = toHtmlAttributeName(name);\n\n if (!VALID_ATTRIBUTE_NAME.test(attributeName)) {\n return \"\";\n }\n\n // Issue 077: HTML-bearing attributes (`srcdoc`) require the explicit\n // `{ __html: \"...\" }` opt-in. A plain string value -- even if escaped\n // for the attribute syntax -- decodes back to executable HTML inside\n // the iframe document with the parent's origin.\n if (isDangerousHtmlAttribute(attributeName)) {\n if (!isDangerousHtmlOptIn(value)) {\n return \"\";\n }\n return ` ${attributeName}=\"${escapeAttribute(value.__html)}\"`;\n }\n\n if (value === true) {\n return ` ${attributeName}`;\n }\n\n const stringValue = String(value);\n\n if (isUnsafeUrlAttribute(attributeName, stringValue)) {\n return \"\";\n }\n\n return ` ${attributeName}=\"${escapeAttribute(stringValue)}\"`;\n}\n\nfunction toHtmlAttributeName(name: string): string {\n return HTML_ATTRIBUTE_ALIASES[name] ?? name;\n}\n\nconst HTML_ATTRIBUTE_ALIASES: Record<string, string> = {\n acceptCharset: \"accept-charset\",\n autoFocus: \"autofocus\",\n autoPlay: \"autoplay\",\n charSet: \"charset\",\n className: \"class\",\n colSpan: \"colspan\",\n contentEditable: \"contenteditable\",\n crossOrigin: \"crossorigin\",\n encType: \"enctype\",\n formAction: \"formaction\",\n frameBorder: \"frameborder\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n maxLength: \"maxlength\",\n minLength: \"minlength\",\n noValidate: \"novalidate\",\n playsInline: \"playsinline\",\n readOnly: \"readonly\",\n rowSpan: \"rowspan\",\n spellCheck: \"spellcheck\",\n srcDoc: \"srcdoc\",\n srcSet: \"srcset\",\n tabIndex: \"tabindex\",\n useMap: \"usemap\",\n};\n\nfunction isPromiseLikeNode(value: unknown): value is PromiseLike<unknown> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLikeString(value: unknown): value is PromiseLike<string> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return isPromiseLikeUnknown(value);\n}\n\nfunction isPromiseLikeUnknown(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction renderNonceAttribute(nonce: string | undefined): string {\n return nonce === undefined ? \"\" : ` nonce=\"${escapeAttribute(nonce)}\"`;\n}\n\nexport function renderToReadableStream(\n render: StreamRender,\n options: RenderToReadableStreamOptions = {},\n): ReadableStream<Uint8Array> {\n // Issue 084: append calls go into a coalescing Node Buffer sink. The\n // previous implementation called `controller.enqueue(encoder.encode(chunk))`\n // per `sink.append` — one TextEncoder allocation + one WHATWG queue trip\n // per call. Now we emit one chunk per flush boundary:\n // 1. After the sync portion of `render` returns — the \"shell\"\n // pre-flush. Done synchronously so it lands before any deferred\n // task body fires in a microtask.\n // 2. Whenever the accumulated buffer crosses the flushThreshold\n // mid-render (e.g. a single very large list rendering).\n // 3. Each `sink.append` made during the deferred phase flushes\n // immediately — gives each OOB fragment its own HTTP chunk so\n // the browser can swap it in as soon as it arrives.\n // 4. End of stream — any tail bytes.\n const abortController = new AbortController();\n const queuedChunks: Uint8Array[] = [];\n let controllerRef: ReadableStreamDefaultController<Uint8Array> | undefined;\n let cancelled = false;\n let complete = false;\n let queuedBytes = 0;\n let warnedQueuedBytes = false;\n let backpressurePromise: Promise<void> | undefined;\n let resolveBackpressure: (() => void) | undefined;\n\n const enqueueOrQueue = (buffer: Uint8Array) => {\n if (cancelled || abortController.signal.aborted) {\n return;\n }\n\n const controller = controllerRef;\n if (controller === undefined) {\n queueChunk(buffer);\n return;\n }\n\n if (queuedChunks.length === 0 && (controller.desiredSize ?? 0) > 0) {\n controller.enqueue(buffer);\n resolveBackpressureIfReady();\n return;\n }\n\n queueChunk(buffer);\n };\n const drainQueuedChunks = (controller: ReadableStreamDefaultController<Uint8Array>) => {\n while (!cancelled && queuedChunks.length > 0 && (controller.desiredSize ?? 0) > 0) {\n const chunk = queuedChunks.shift();\n if (chunk !== undefined) {\n queuedBytes -= chunk.byteLength;\n controller.enqueue(chunk);\n }\n }\n\n if (!cancelled && complete && queuedChunks.length === 0) {\n controller.close();\n }\n\n resolveBackpressureIfReady();\n };\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controllerRef = controller;\n const sink = createStreamingBufferSink({\n onFlush(buffer) {\n enqueueOrQueue(buffer);\n },\n });\n const deferredTasks: PromiseLike<void>[] = [];\n let inDeferredPhase = false;\n let renderResult: void | PromiseLike<void>;\n\n try {\n renderResult = render({\n append(chunk) {\n if (abortController.signal.aborted) {\n return;\n }\n sink.append(chunk);\n if (inDeferredPhase) {\n // OOB pattern: each deferred task ends with exactly one\n // `sink.append(\"<template ...>...\")`. Flushing here\n // promotes that single append to its own chunk so the\n // browser's MutationObserver can apply it without\n // waiting for other deferred fragments.\n sink.flush();\n }\n },\n backpressure() {\n return waitForBackpressure();\n },\n defer(task) {\n deferredTasks.push(ignoreAfterAbort(task, abortController.signal, options));\n },\n signal: abortController.signal,\n });\n } catch (error) {\n if (abortController.signal.aborted) {\n return;\n }\n controller.error(error);\n return;\n }\n\n // Shell pre-flush — synchronous, BEFORE we yield to microtasks.\n // If we awaited render first the deferred tasks' bodies would\n // already have appended their bytes to the same buffer and we\n // would emit one merged chunk.\n sink.flush();\n\n void continueAfterShell();\n\n async function continueAfterShell(): Promise<void> {\n try {\n if (renderResult !== undefined && renderResult !== null) {\n await raceAbort(renderResult, abortController.signal);\n // Async render may have written more before its tail returned.\n // That tail is also \"shell\" — flush it before entering the\n // deferred phase.\n sink.flush();\n }\n\n inDeferredPhase = true;\n await raceAbort(Promise.all(deferredTasks), abortController.signal);\n // Tail flush in case the render closure (or a deferred task)\n // somehow left bytes in the buffer past the per-append flushes.\n sink.flush();\n complete = true;\n drainQueuedChunks(controller);\n } catch (error) {\n if (abortController.signal.aborted) {\n return;\n }\n controller.error(error);\n }\n }\n },\n pull(controller) {\n drainQueuedChunks(controller);\n resolveBackpressureAfterPull();\n },\n cancel(reason) {\n cancelled = true;\n queuedChunks.length = 0;\n queuedBytes = 0;\n abortController.abort(reason);\n resolveBackpressureIfReady();\n },\n });\n\n function hasBackpressure(): boolean {\n if (cancelled || abortController.signal.aborted) {\n return false;\n }\n\n if (queuedChunks.length > 0) {\n return true;\n }\n\n const controller = controllerRef;\n return controller !== undefined && (controller.desiredSize ?? 0) <= 0;\n }\n\n function waitForBackpressure(): Promise<void> {\n if (!hasBackpressure()) {\n return Promise.resolve();\n }\n\n if (backpressurePromise === undefined) {\n backpressurePromise = new Promise<void>((resolve) => {\n resolveBackpressure = resolve;\n });\n }\n\n return backpressurePromise;\n }\n\n function resolveBackpressureIfReady(): void {\n if (resolveBackpressure === undefined || hasBackpressure()) {\n return;\n }\n\n resolveBackpressureWaiter();\n }\n\n function resolveBackpressureAfterPull(): void {\n if (\n resolveBackpressure === undefined ||\n queuedChunks.length > 0 ||\n cancelled ||\n abortController.signal.aborted\n ) {\n return;\n }\n\n resolveBackpressureWaiter();\n }\n\n function resolveBackpressureWaiter(): void {\n const resolve = resolveBackpressure;\n if (resolve === undefined) {\n return;\n }\n\n backpressurePromise = undefined;\n resolveBackpressure = undefined;\n resolve();\n }\n\n function queueChunk(buffer: Uint8Array): void {\n queuedChunks.push(buffer);\n queuedBytes += buffer.byteLength;\n\n if (\n !warnedQueuedBytes &&\n queuedBytes > streamQueuedChunkSoftLimitBytes &&\n shouldWarnAboutQueuedStreamBytes()\n ) {\n warnedQueuedBytes = true;\n console.warn(\n `[mreact] renderToReadableStream queued ${queuedBytes} bytes because the downstream reader is slower than the renderer.`,\n );\n }\n }\n}\n\nfunction shouldWarnAboutQueuedStreamBytes(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.env !== undefined &&\n process.env.NODE_ENV !== \"production\"\n );\n}\n\nasync function raceAbort<T>(task: PromiseLike<T>, signal: AbortSignal): Promise<T | undefined> {\n if (signal.aborted) {\n return undefined;\n }\n\n return Promise.race([\n task,\n new Promise<undefined>((resolve) => {\n signal.addEventListener(\"abort\", () => resolve(undefined), { once: true });\n }),\n ]);\n}\n\nfunction ignoreAfterAbort(\n task: PromiseLike<void>,\n signal: AbortSignal,\n options: RenderToReadableStreamOptions,\n): Promise<void> {\n return Promise.resolve(task).catch((error) => {\n if (!signal.aborted) {\n throw error;\n }\n\n if (options.logAbortedDeferredErrors === true && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[mreact] ignored deferred task error after abort:\", error);\n }\n });\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nconst outOfOrderReorderScript = `(()=>{function apply(root){const fragments=Array.from(root.querySelectorAll(\"template[data-mreact-oob-fragment]\"));for(const fragment of fragments){const id=fragment.getAttribute(\"data-mreact-oob-fragment\");if(id===null)continue;const placeholders=Array.from(root.querySelectorAll(\"[data-mreact-oob-placeholder]\"));const placeholder=placeholders.find((candidate)=>candidate.getAttribute(\"data-mreact-oob-placeholder\")===id);if(placeholder===undefined)continue;placeholder.replaceWith(fragment.content.cloneNode(true));fragment.remove();}}apply(document);new MutationObserver(()=>apply(document)).observe(document.documentElement,{childList:true,subtree:true});})();`;\n\nconst reactSuspenseRevealScriptBody = `(self.$RC=self.$RC||function(bid,sid){var b=document.getElementById(bid);var s=document.getElementById(sid);if(!b||!s)return;var p=b.parentNode;var e=b.nextSibling;var d=0;var r=[];for(var n=e;n;n=n.nextSibling){if(n.nodeType===8){if(n.data===\"$\"||n.data===\"$?\"||n.data===\"$!\")d++;else if(n.data===\"/$\"){if(d===0){e=n;break;}d--;}}r.push(n);}for(var i=0;r[i];i++)p.removeChild(r[i]);while(s.firstChild)p.insertBefore(s.firstChild,e);s.remove();b.data=\"$\";})`;\n\nexport const reactSuspenseRevealExternalScript = `(()=>{${reactSuspenseRevealScriptBody};var s=document.currentScript;if(!s)return;var b=s.getAttribute(\"data-boundary-id\");var seg=s.getAttribute(\"data-segment-id\");if(b!==null&&seg!==null)self.$RC(b,seg);})();`;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,IAAI,mBAAmB,EAC/B,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIlD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AA6BrB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAQnB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAKrB,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,EAC3B,uCAAuC,EACvC,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAYvB,OAAO,EACL,4BAA4B,EAC5B,IAAI,EACJ,4BAA4B,EAC5B,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAa3B,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAA2B,CAAC;IACtD,CAAC;IAED,OAAO,aAAa,CAClB,mBAAmB,EACnB,MAAM,EACN,KAAK,CAAC,QAA2B,CACzB,CAAC;AACb,CAAC","sourcesContent":["import {\n Suspense as ReactCompatSuspense,\n createElement,\n type ReactCompatNode,\n} from \"@reckona/mreact-compat\";\n\nexport { Fragment } from \"@reckona/mreact-compat\";\nexport type { ReactCompatNode } from \"@reckona/mreact-compat\";\nexport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\n\nexport {\n CLIENT_REFERENCE_TYPE,\n SERVER_REFERENCE_TYPE,\n createClientReference,\n createFlightClientManifest,\n createServerReference,\n createServerActionHandler,\n fromReactFlightRows,\n getReactFlightProtocolCoverage,\n isClientReference,\n isServerReference,\n mergeReactFlightRows,\n renderFlightPreloadLinks,\n renderFlightResponseScript,\n renderToFlightResponse,\n stringifyFlightResponse,\n toReactFlightRows,\n} from \"./flight.js\";\nexport type {\n ClientReference,\n FlightClientManifestEntry,\n FlightClientReference,\n FlightClientReferenceInput,\n FlightClientReferenceModel,\n FlightDataViewModel,\n FlightElementModel,\n FlightFormDataModel,\n FlightIterableModel,\n FlightModel,\n FlightResponse,\n FlightScriptOptions,\n FlightServerReference,\n FlightServerReferenceModel,\n FlightArrayBufferModel,\n FlightTypedArrayModel,\n FlightTypedArrayName,\n ServerAction,\n ServerActionDescriptor,\n ServerActionHandlerOptions,\n ServerActionRegistry,\n ServerActionReplayStore,\n ServerActionRequestReference,\n ServerActionValidationResult,\n ServerReference,\n} from \"./flight.js\";\n\nexport {\n createStringSink,\n} from \"./sink.js\";\nexport type {\n StreamRender,\n StringHtmlSink,\n StringSinkBufferStrategy,\n StringSinkOptions,\n} from \"./sink.js\";\n\nexport {\n renderToReadableStream,\n} from \"./stream.js\";\nexport type {\n RenderToReadableStreamOptions,\n} from \"./stream.js\";\n\nexport {\n reactSuspenseRevealExternalScript,\n renderAsyncBoundary,\n renderHydrationBoundary,\n renderOutOfOrderBoundary,\n renderOutOfOrderReorderScript,\n renderReactSuspenseBoundary,\n renderReactSuspenseClientRenderBoundary,\n renderReactSuspenseOutOfOrderBoundary,\n} from \"./boundary.js\";\nexport type {\n AsyncBoundaryOptions,\n AsyncBoundaryRender,\n HydrationScriptOptions,\n OutOfOrderBoundaryOptions,\n OutOfOrderReorderScriptOptions,\n ReactSuspenseBoundaryOptions,\n ReactSuspenseClientRenderOptions,\n ReactSuspenseScriptOptions,\n} from \"./boundary.js\";\n\nexport {\n createEventHydrationManifest,\n html,\n renderEventHydrationManifest,\n renderScriptAsset,\n renderSsrState,\n renderToString,\n serializeSsrState,\n} from \"./html-helpers.js\";\nexport type {\n EventHydrationEntry,\n EventHydrationManifest,\n HtmlResponseOptions,\n ScriptAssetOptions,\n} from \"./html-helpers.js\";\n\nexport interface SuspenseProps extends Record<string, unknown> {\n fallback?: unknown;\n children?: unknown;\n}\n\nexport function Suspense(props: SuspenseProps): never {\n const config: SuspenseProps = {};\n\n if (props.fallback !== undefined) {\n config.fallback = props.fallback as ReactCompatNode;\n }\n\n return createElement<SuspenseProps>(\n ReactCompatSuspense,\n config,\n props.children as ReactCompatNode,\n ) as never;\n}\n"]}
package/dist/sink.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { HtmlSink } from "@reckona/mreact-shared/compiler-contract";
2
+ export interface StringHtmlSink extends HtmlSink {
3
+ bufferStrategy(): StringSinkBufferStrategy;
4
+ drain(): Promise<void>;
5
+ toString(): string;
6
+ }
7
+ export type StringSinkBufferStrategy = "concat" | "array-join";
8
+ export interface StringSinkOptions {
9
+ strategy?: StringSinkBufferStrategy | "auto";
10
+ arrayJoinThreshold?: number;
11
+ }
12
+ export type StreamRender = (sink: HtmlSink) => void | PromiseLike<void>;
13
+ export declare function createStringSink(options?: StringSinkOptions): StringHtmlSink;
14
+ //# sourceMappingURL=sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../src/sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,cAAc,IAAI,wBAAwB,CAAC;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CA2DhF"}
package/dist/sink.js ADDED
@@ -0,0 +1,54 @@
1
+ export function createStringSink(options = {}) {
2
+ // Default to "concat" - V8 rope flattening yields 2-6x throughput over
3
+ // `Array#join("")` across all measured fixture sizes (see
4
+ // docs/benchmarks/2026-05-12-server-sink-strategy.md). "array-join" stays
5
+ // available as opt-in for scenarios that need lower peak memory.
6
+ const requestedStrategy = options.strategy ?? "concat";
7
+ const arrayJoinThreshold = options.arrayJoinThreshold ?? 256;
8
+ const deferredTasks = [];
9
+ let strategy = requestedStrategy === "auto"
10
+ ? "concat"
11
+ : requestedStrategy;
12
+ let writeCount = 0;
13
+ let text = "";
14
+ const chunks = [];
15
+ const switchConcatToArrayJoin = () => {
16
+ if (strategy !== "concat") {
17
+ return;
18
+ }
19
+ if (text !== "") {
20
+ chunks.push(text);
21
+ text = "";
22
+ }
23
+ strategy = "array-join";
24
+ };
25
+ return {
26
+ append(chunk) {
27
+ writeCount += 1;
28
+ if (requestedStrategy === "auto" && strategy === "concat" && writeCount > arrayJoinThreshold) {
29
+ switchConcatToArrayJoin();
30
+ }
31
+ if (strategy === "concat") {
32
+ text += chunk;
33
+ return;
34
+ }
35
+ chunks.push(chunk);
36
+ },
37
+ bufferStrategy() {
38
+ return strategy;
39
+ },
40
+ defer(task) {
41
+ deferredTasks.push(task);
42
+ },
43
+ async drain() {
44
+ await Promise.all(deferredTasks);
45
+ },
46
+ toString() {
47
+ if (strategy === "concat") {
48
+ return text;
49
+ }
50
+ return chunks.join("");
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sink.js","sourceRoot":"","sources":["../src/sink.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,uEAAuE;IACvE,0DAA0D;IAC1D,0EAA0E;IAC1E,iEAAiE;IACjE,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;IAC7D,MAAM,aAAa,GAAwB,EAAE,CAAC;IAC9C,IAAI,QAAQ,GAA6B,iBAAiB,KAAK,MAAM;QACnE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,iBAAiB,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,uBAAuB,GAAG,GAAG,EAAE;QACnC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,QAAQ,GAAG,YAAY,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,KAAK;YACV,UAAU,IAAI,CAAC,CAAC;YAEhB,IAAI,iBAAiB,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,UAAU,GAAG,kBAAkB,EAAE,CAAC;gBAC7F,uBAAuB,EAAE,CAAC;YAC5B,CAAC;YAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,IAAI,KAAK,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,cAAc;YACZ,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,IAAI;YACR,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ;YACN,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\n\nexport interface StringHtmlSink extends HtmlSink {\n bufferStrategy(): StringSinkBufferStrategy;\n drain(): Promise<void>;\n toString(): string;\n}\n\nexport type StringSinkBufferStrategy = \"concat\" | \"array-join\";\n\nexport interface StringSinkOptions {\n strategy?: StringSinkBufferStrategy | \"auto\";\n arrayJoinThreshold?: number;\n}\n\nexport type StreamRender = (sink: HtmlSink) => void | PromiseLike<void>;\n\nexport function createStringSink(options: StringSinkOptions = {}): StringHtmlSink {\n // Default to \"concat\" - V8 rope flattening yields 2-6x throughput over\n // `Array#join(\"\")` across all measured fixture sizes (see\n // docs/benchmarks/2026-05-12-server-sink-strategy.md). \"array-join\" stays\n // available as opt-in for scenarios that need lower peak memory.\n const requestedStrategy = options.strategy ?? \"concat\";\n const arrayJoinThreshold = options.arrayJoinThreshold ?? 256;\n const deferredTasks: PromiseLike<void>[] = [];\n let strategy: StringSinkBufferStrategy = requestedStrategy === \"auto\"\n ? \"concat\"\n : requestedStrategy;\n let writeCount = 0;\n let text = \"\";\n const chunks: string[] = [];\n\n const switchConcatToArrayJoin = () => {\n if (strategy !== \"concat\") {\n return;\n }\n\n if (text !== \"\") {\n chunks.push(text);\n text = \"\";\n }\n strategy = \"array-join\";\n };\n\n return {\n append(chunk) {\n writeCount += 1;\n\n if (requestedStrategy === \"auto\" && strategy === \"concat\" && writeCount > arrayJoinThreshold) {\n switchConcatToArrayJoin();\n }\n\n if (strategy === \"concat\") {\n text += chunk;\n return;\n }\n\n chunks.push(chunk);\n },\n bufferStrategy() {\n return strategy;\n },\n defer(task) {\n deferredTasks.push(task);\n },\n async drain() {\n await Promise.all(deferredTasks);\n },\n toString() {\n if (strategy === \"concat\") {\n return text;\n }\n\n return chunks.join(\"\");\n },\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { StreamRender } from "./sink.js";
2
+ export interface RenderToReadableStreamOptions {
3
+ logAbortedDeferredErrors?: boolean;
4
+ }
5
+ export declare function renderToReadableStream(render: StreamRender, options?: RenderToReadableStreamOptions): ReadableStream<Uint8Array>;
6
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,6BAA6B;IAC5C,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAID,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,6BAAkC,GAC1C,cAAc,CAAC,UAAU,CAAC,CA+N5B"}
package/dist/stream.js ADDED
@@ -0,0 +1,223 @@
1
+ import { createStreamingBufferSink } from "./buffer-sink.js";
2
+ const streamQueuedChunkSoftLimitBytes = 1024 * 1024;
3
+ export function renderToReadableStream(render, options = {}) {
4
+ // Issue 084: append calls go into a coalescing Node Buffer sink. The
5
+ // previous implementation called `controller.enqueue(encoder.encode(chunk))`
6
+ // per `sink.append` - one TextEncoder allocation + one WHATWG queue trip
7
+ // per call. Now we emit one chunk per flush boundary:
8
+ // 1. After the sync portion of `render` returns - the "shell"
9
+ // pre-flush. Done synchronously so it lands before any deferred
10
+ // task body fires in a microtask.
11
+ // 2. Whenever the accumulated buffer crosses the flushThreshold
12
+ // mid-render (e.g. a single very large list rendering).
13
+ // 3. Each `sink.append` made during the deferred phase flushes
14
+ // immediately - gives each OOB fragment its own HTTP chunk so
15
+ // the browser can swap it in as soon as it arrives.
16
+ // 4. End of stream - any tail bytes.
17
+ const abortController = new AbortController();
18
+ const queuedChunks = [];
19
+ let controllerRef;
20
+ let cancelled = false;
21
+ let complete = false;
22
+ let queuedBytes = 0;
23
+ let warnedQueuedBytes = false;
24
+ let backpressurePromise;
25
+ let resolveBackpressure;
26
+ const enqueueOrQueue = (buffer) => {
27
+ if (cancelled || abortController.signal.aborted) {
28
+ return;
29
+ }
30
+ const controller = controllerRef;
31
+ if (controller === undefined) {
32
+ queueChunk(buffer);
33
+ return;
34
+ }
35
+ if (queuedChunks.length === 0 && (controller.desiredSize ?? 0) > 0) {
36
+ controller.enqueue(buffer);
37
+ resolveBackpressureIfReady();
38
+ return;
39
+ }
40
+ queueChunk(buffer);
41
+ };
42
+ const drainQueuedChunks = (controller) => {
43
+ while (!cancelled && queuedChunks.length > 0 && (controller.desiredSize ?? 0) > 0) {
44
+ const chunk = queuedChunks.shift();
45
+ if (chunk !== undefined) {
46
+ queuedBytes -= chunk.byteLength;
47
+ controller.enqueue(chunk);
48
+ }
49
+ }
50
+ if (!cancelled && complete && queuedChunks.length === 0) {
51
+ controller.close();
52
+ }
53
+ resolveBackpressureIfReady();
54
+ };
55
+ return new ReadableStream({
56
+ start(controller) {
57
+ controllerRef = controller;
58
+ const sink = createStreamingBufferSink({
59
+ onFlush(buffer) {
60
+ enqueueOrQueue(buffer);
61
+ },
62
+ });
63
+ const deferredTasks = [];
64
+ let inDeferredPhase = false;
65
+ let renderResult;
66
+ try {
67
+ renderResult = render({
68
+ append(chunk) {
69
+ if (abortController.signal.aborted) {
70
+ return;
71
+ }
72
+ sink.append(chunk);
73
+ if (inDeferredPhase) {
74
+ // OOB pattern: each deferred task ends with exactly one
75
+ // `sink.append("<template ...>...")`. Flushing here
76
+ // promotes that single append to its own chunk so the
77
+ // browser's MutationObserver can apply it without
78
+ // waiting for other deferred fragments.
79
+ sink.flush();
80
+ }
81
+ },
82
+ backpressure() {
83
+ return waitForBackpressure();
84
+ },
85
+ defer(task) {
86
+ deferredTasks.push(ignoreAfterAbort(task, abortController.signal, options));
87
+ },
88
+ signal: abortController.signal,
89
+ });
90
+ }
91
+ catch (error) {
92
+ if (abortController.signal.aborted) {
93
+ return;
94
+ }
95
+ controller.error(error);
96
+ return;
97
+ }
98
+ // Shell pre-flush - synchronous, BEFORE we yield to microtasks.
99
+ // If we awaited render first the deferred tasks' bodies would
100
+ // already have appended their bytes to the same buffer and we
101
+ // would emit one merged chunk.
102
+ sink.flush();
103
+ void continueAfterShell();
104
+ async function continueAfterShell() {
105
+ try {
106
+ if (renderResult !== undefined && renderResult !== null) {
107
+ await raceAbort(renderResult, abortController.signal);
108
+ // Async render may have written more before its tail returned.
109
+ // That tail is also "shell" - flush it before entering the
110
+ // deferred phase.
111
+ sink.flush();
112
+ }
113
+ inDeferredPhase = true;
114
+ await raceAbort(Promise.all(deferredTasks), abortController.signal);
115
+ // Tail flush in case the render closure (or a deferred task)
116
+ // somehow left bytes in the buffer past the per-append flushes.
117
+ sink.flush();
118
+ complete = true;
119
+ drainQueuedChunks(controller);
120
+ }
121
+ catch (error) {
122
+ if (abortController.signal.aborted) {
123
+ return;
124
+ }
125
+ controller.error(error);
126
+ }
127
+ }
128
+ },
129
+ pull(controller) {
130
+ drainQueuedChunks(controller);
131
+ resolveBackpressureAfterPull();
132
+ },
133
+ cancel(reason) {
134
+ cancelled = true;
135
+ queuedChunks.length = 0;
136
+ queuedBytes = 0;
137
+ abortController.abort(reason);
138
+ resolveBackpressureIfReady();
139
+ },
140
+ });
141
+ function hasBackpressure() {
142
+ if (cancelled || abortController.signal.aborted) {
143
+ return false;
144
+ }
145
+ if (queuedChunks.length > 0) {
146
+ return true;
147
+ }
148
+ const controller = controllerRef;
149
+ return controller !== undefined && (controller.desiredSize ?? 0) <= 0;
150
+ }
151
+ function waitForBackpressure() {
152
+ if (!hasBackpressure()) {
153
+ return Promise.resolve();
154
+ }
155
+ if (backpressurePromise === undefined) {
156
+ backpressurePromise = new Promise((resolve) => {
157
+ resolveBackpressure = resolve;
158
+ });
159
+ }
160
+ return backpressurePromise;
161
+ }
162
+ function resolveBackpressureIfReady() {
163
+ if (resolveBackpressure === undefined || hasBackpressure()) {
164
+ return;
165
+ }
166
+ resolveBackpressureWaiter();
167
+ }
168
+ function resolveBackpressureAfterPull() {
169
+ if (resolveBackpressure === undefined ||
170
+ queuedChunks.length > 0 ||
171
+ cancelled ||
172
+ abortController.signal.aborted) {
173
+ return;
174
+ }
175
+ resolveBackpressureWaiter();
176
+ }
177
+ function resolveBackpressureWaiter() {
178
+ const resolve = resolveBackpressure;
179
+ if (resolve === undefined) {
180
+ return;
181
+ }
182
+ backpressurePromise = undefined;
183
+ resolveBackpressure = undefined;
184
+ resolve();
185
+ }
186
+ function queueChunk(buffer) {
187
+ queuedChunks.push(buffer);
188
+ queuedBytes += buffer.byteLength;
189
+ if (!warnedQueuedBytes &&
190
+ queuedBytes > streamQueuedChunkSoftLimitBytes &&
191
+ shouldWarnAboutQueuedStreamBytes()) {
192
+ warnedQueuedBytes = true;
193
+ console.warn(`[mreact] renderToReadableStream queued ${queuedBytes} bytes because the downstream reader is slower than the renderer.`);
194
+ }
195
+ }
196
+ }
197
+ function shouldWarnAboutQueuedStreamBytes() {
198
+ return (typeof process !== "undefined" &&
199
+ process.env !== undefined &&
200
+ process.env.NODE_ENV !== "production");
201
+ }
202
+ async function raceAbort(task, signal) {
203
+ if (signal.aborted) {
204
+ return undefined;
205
+ }
206
+ return Promise.race([
207
+ task,
208
+ new Promise((resolve) => {
209
+ signal.addEventListener("abort", () => resolve(undefined), { once: true });
210
+ }),
211
+ ]);
212
+ }
213
+ function ignoreAfterAbort(task, signal, options) {
214
+ return Promise.resolve(task).catch((error) => {
215
+ if (!signal.aborted) {
216
+ throw error;
217
+ }
218
+ if (options.logAbortedDeferredErrors === true && process.env.NODE_ENV !== "production") {
219
+ console.warn("[mreact] ignored deferred task error after abort:", error);
220
+ }
221
+ });
222
+ }
223
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import { createStreamingBufferSink } from \"./buffer-sink.js\";\nimport type { StreamRender } from \"./sink.js\";\n\nexport interface RenderToReadableStreamOptions {\n logAbortedDeferredErrors?: boolean;\n}\n\nconst streamQueuedChunkSoftLimitBytes = 1024 * 1024;\n\nexport function renderToReadableStream(\n render: StreamRender,\n options: RenderToReadableStreamOptions = {},\n): ReadableStream<Uint8Array> {\n // Issue 084: append calls go into a coalescing Node Buffer sink. The\n // previous implementation called `controller.enqueue(encoder.encode(chunk))`\n // per `sink.append` - one TextEncoder allocation + one WHATWG queue trip\n // per call. Now we emit one chunk per flush boundary:\n // 1. After the sync portion of `render` returns - the \"shell\"\n // pre-flush. Done synchronously so it lands before any deferred\n // task body fires in a microtask.\n // 2. Whenever the accumulated buffer crosses the flushThreshold\n // mid-render (e.g. a single very large list rendering).\n // 3. Each `sink.append` made during the deferred phase flushes\n // immediately - gives each OOB fragment its own HTTP chunk so\n // the browser can swap it in as soon as it arrives.\n // 4. End of stream - any tail bytes.\n const abortController = new AbortController();\n const queuedChunks: Uint8Array[] = [];\n let controllerRef: ReadableStreamDefaultController<Uint8Array> | undefined;\n let cancelled = false;\n let complete = false;\n let queuedBytes = 0;\n let warnedQueuedBytes = false;\n let backpressurePromise: Promise<void> | undefined;\n let resolveBackpressure: (() => void) | undefined;\n\n const enqueueOrQueue = (buffer: Uint8Array) => {\n if (cancelled || abortController.signal.aborted) {\n return;\n }\n\n const controller = controllerRef;\n if (controller === undefined) {\n queueChunk(buffer);\n return;\n }\n\n if (queuedChunks.length === 0 && (controller.desiredSize ?? 0) > 0) {\n controller.enqueue(buffer);\n resolveBackpressureIfReady();\n return;\n }\n\n queueChunk(buffer);\n };\n const drainQueuedChunks = (controller: ReadableStreamDefaultController<Uint8Array>) => {\n while (!cancelled && queuedChunks.length > 0 && (controller.desiredSize ?? 0) > 0) {\n const chunk = queuedChunks.shift();\n if (chunk !== undefined) {\n queuedBytes -= chunk.byteLength;\n controller.enqueue(chunk);\n }\n }\n\n if (!cancelled && complete && queuedChunks.length === 0) {\n controller.close();\n }\n\n resolveBackpressureIfReady();\n };\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controllerRef = controller;\n const sink = createStreamingBufferSink({\n onFlush(buffer) {\n enqueueOrQueue(buffer);\n },\n });\n const deferredTasks: PromiseLike<void>[] = [];\n let inDeferredPhase = false;\n let renderResult: void | PromiseLike<void>;\n\n try {\n renderResult = render({\n append(chunk) {\n if (abortController.signal.aborted) {\n return;\n }\n sink.append(chunk);\n if (inDeferredPhase) {\n // OOB pattern: each deferred task ends with exactly one\n // `sink.append(\"<template ...>...\")`. Flushing here\n // promotes that single append to its own chunk so the\n // browser's MutationObserver can apply it without\n // waiting for other deferred fragments.\n sink.flush();\n }\n },\n backpressure() {\n return waitForBackpressure();\n },\n defer(task) {\n deferredTasks.push(ignoreAfterAbort(task, abortController.signal, options));\n },\n signal: abortController.signal,\n });\n } catch (error) {\n if (abortController.signal.aborted) {\n return;\n }\n controller.error(error);\n return;\n }\n\n // Shell pre-flush - synchronous, BEFORE we yield to microtasks.\n // If we awaited render first the deferred tasks' bodies would\n // already have appended their bytes to the same buffer and we\n // would emit one merged chunk.\n sink.flush();\n\n void continueAfterShell();\n\n async function continueAfterShell(): Promise<void> {\n try {\n if (renderResult !== undefined && renderResult !== null) {\n await raceAbort(renderResult, abortController.signal);\n // Async render may have written more before its tail returned.\n // That tail is also \"shell\" - flush it before entering the\n // deferred phase.\n sink.flush();\n }\n\n inDeferredPhase = true;\n await raceAbort(Promise.all(deferredTasks), abortController.signal);\n // Tail flush in case the render closure (or a deferred task)\n // somehow left bytes in the buffer past the per-append flushes.\n sink.flush();\n complete = true;\n drainQueuedChunks(controller);\n } catch (error) {\n if (abortController.signal.aborted) {\n return;\n }\n controller.error(error);\n }\n }\n },\n pull(controller) {\n drainQueuedChunks(controller);\n resolveBackpressureAfterPull();\n },\n cancel(reason) {\n cancelled = true;\n queuedChunks.length = 0;\n queuedBytes = 0;\n abortController.abort(reason);\n resolveBackpressureIfReady();\n },\n });\n\n function hasBackpressure(): boolean {\n if (cancelled || abortController.signal.aborted) {\n return false;\n }\n\n if (queuedChunks.length > 0) {\n return true;\n }\n\n const controller = controllerRef;\n return controller !== undefined && (controller.desiredSize ?? 0) <= 0;\n }\n\n function waitForBackpressure(): Promise<void> {\n if (!hasBackpressure()) {\n return Promise.resolve();\n }\n\n if (backpressurePromise === undefined) {\n backpressurePromise = new Promise<void>((resolve) => {\n resolveBackpressure = resolve;\n });\n }\n\n return backpressurePromise;\n }\n\n function resolveBackpressureIfReady(): void {\n if (resolveBackpressure === undefined || hasBackpressure()) {\n return;\n }\n\n resolveBackpressureWaiter();\n }\n\n function resolveBackpressureAfterPull(): void {\n if (\n resolveBackpressure === undefined ||\n queuedChunks.length > 0 ||\n cancelled ||\n abortController.signal.aborted\n ) {\n return;\n }\n\n resolveBackpressureWaiter();\n }\n\n function resolveBackpressureWaiter(): void {\n const resolve = resolveBackpressure;\n if (resolve === undefined) {\n return;\n }\n\n backpressurePromise = undefined;\n resolveBackpressure = undefined;\n resolve();\n }\n\n function queueChunk(buffer: Uint8Array): void {\n queuedChunks.push(buffer);\n queuedBytes += buffer.byteLength;\n\n if (\n !warnedQueuedBytes &&\n queuedBytes > streamQueuedChunkSoftLimitBytes &&\n shouldWarnAboutQueuedStreamBytes()\n ) {\n warnedQueuedBytes = true;\n console.warn(\n `[mreact] renderToReadableStream queued ${queuedBytes} bytes because the downstream reader is slower than the renderer.`,\n );\n }\n }\n}\n\nfunction shouldWarnAboutQueuedStreamBytes(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.env !== undefined &&\n process.env.NODE_ENV !== \"production\"\n );\n}\n\nasync function raceAbort<T>(task: PromiseLike<T>, signal: AbortSignal): Promise<T | undefined> {\n if (signal.aborted) {\n return undefined;\n }\n\n return Promise.race([\n task,\n new Promise<undefined>((resolve) => {\n signal.addEventListener(\"abort\", () => resolve(undefined), { once: true });\n }),\n ]);\n}\n\nfunction ignoreAfterAbort(\n task: PromiseLike<void>,\n signal: AbortSignal,\n options: RenderToReadableStreamOptions,\n): Promise<void> {\n return Promise.resolve(task).catch((error) => {\n if (!signal.aborted) {\n throw error;\n }\n\n if (options.logAbortedDeferredErrors === true && process.env.NODE_ENV !== \"production\") {\n console.warn(\"[mreact] ignored deferred task error after abort:\", error);\n }\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-server",
3
- "version": "0.0.81",
3
+ "version": "0.0.83",
4
4
  "description": "Server rendering, streaming, hydration, and Flight primitives for mreact.",
5
5
  "keywords": [
6
6
  "flight",
@@ -47,13 +47,21 @@
47
47
  "./buffer-sink": {
48
48
  "types": "./dist/buffer-sink.d.ts",
49
49
  "default": "./dist/buffer-sink.js"
50
+ },
51
+ "./boundary": {
52
+ "types": "./dist/boundary.d.ts",
53
+ "default": "./dist/boundary.js"
54
+ },
55
+ "./html-helpers": {
56
+ "types": "./dist/html-helpers.d.ts",
57
+ "default": "./dist/html-helpers.js"
50
58
  }
51
59
  },
52
60
  "publishConfig": {
53
61
  "access": "public"
54
62
  },
55
63
  "dependencies": {
56
- "@reckona/mreact-compat": "0.0.81",
57
- "@reckona/mreact-shared": "0.0.81"
64
+ "@reckona/mreact-shared": "0.0.83",
65
+ "@reckona/mreact-compat": "0.0.83"
58
66
  }
59
67
  }