@fictjs/ssr 0.22.0 → 0.24.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-core-BLLUhkYy.js","names":["g","getNodeRequire","g"],"sources":["../src/globals.ts","../src/stream-bridge.ts","../src/render-core.ts"],"sourcesContent":["import { __fictGetCurrentSSRSession } from '@fictjs/runtime/internal'\n\ninterface GlobalSnapshot {\n key: string\n exists: boolean\n value: unknown\n}\n\nexport function installGlobals(window: Window, document: Document): () => void {\n const win = window as Window & {\n Node?: typeof Node\n Element?: typeof Element\n HTMLElement?: typeof HTMLElement\n SVGElement?: typeof SVGElement\n Document?: typeof Document\n DocumentFragment?: typeof DocumentFragment\n Text?: typeof Text\n Comment?: typeof Comment\n Range?: typeof Range\n Event?: typeof Event\n CustomEvent?: typeof CustomEvent\n MutationObserver?: typeof MutationObserver\n DOMParser?: typeof DOMParser\n getComputedStyle?: Window['getComputedStyle']\n }\n\n const required: Record<string, unknown> = {\n window: win,\n document,\n self: win,\n Node: win.Node,\n Element: win.Element,\n HTMLElement: win.HTMLElement,\n SVGElement: win.SVGElement,\n Document: win.Document,\n DocumentFragment: win.DocumentFragment,\n Text: win.Text,\n Comment: win.Comment,\n }\n\n const optional: Record<string, unknown> = {\n Range: win.Range,\n Event: win.Event,\n CustomEvent: win.CustomEvent,\n MutationObserver: win.MutationObserver,\n DOMParser: win.DOMParser,\n getComputedStyle: win.getComputedStyle?.bind(win),\n }\n\n const missing = Object.entries(required)\n .filter(([, value]) => value === undefined)\n .map(([key]) => key)\n\n if (missing.length) {\n throw new Error(`[fict/ssr] Missing DOM globals: ${missing.join(', ')}`)\n }\n\n const globals = { ...required, ...optional }\n const keys = Object.keys(globals)\n\n const snapshot = captureGlobals(keys)\n for (const key of keys) {\n const value = globals[key]\n if (value !== undefined) {\n ;(globalThis as Record<string, unknown>)[key] = value\n }\n }\n\n return () => restoreGlobals(snapshot)\n}\n\nexport function installManifest(manifest?: Record<string, string> | string): () => void {\n if (!manifest) return () => {}\n\n let resolved: Record<string, string>\n if (typeof manifest === 'string') {\n const raw = readTextFileFromPath(manifest)\n resolved = JSON.parse(raw) as Record<string, string>\n } else {\n resolved = manifest\n }\n\n const session = __fictGetCurrentSSRSession()\n if (session) {\n const previous = session.manifest\n session.manifest = resolved\n\n return () => {\n session.manifest = previous\n }\n }\n\n const key = '__FICT_MANIFEST__'\n const snapshot = {\n exists: Object.prototype.hasOwnProperty.call(globalThis, key),\n value: (globalThis as Record<string, unknown>)[key],\n }\n ;(globalThis as Record<string, unknown>)[key] = resolved\n\n return () => {\n if (snapshot.exists) {\n ;(globalThis as Record<string, unknown>)[key] = snapshot.value\n } else {\n delete (globalThis as Record<string, unknown>)[key]\n }\n }\n}\n\nfunction captureGlobals(keys: string[]): GlobalSnapshot[] {\n const snapshot: GlobalSnapshot[] = []\n for (const key of keys) {\n const exists = Object.prototype.hasOwnProperty.call(globalThis, key)\n const value = (globalThis as Record<string, unknown>)[key]\n snapshot.push({ key, exists, value })\n }\n return snapshot\n}\n\nfunction restoreGlobals(snapshot: GlobalSnapshot[]): void {\n for (const entry of snapshot) {\n if (entry.exists) {\n ;(globalThis as Record<string, unknown>)[entry.key] = entry.value\n } else {\n delete (globalThis as Record<string, unknown>)[entry.key]\n }\n }\n}\n\nfunction readTextFileFromPath(path: string): string {\n const g = globalThis as Record<string, unknown>\n\n const deno = g.Deno as { readTextFileSync?: (path: string) => string } | undefined\n if (deno && typeof deno.readTextFileSync === 'function') {\n return deno.readTextFileSync(path)\n }\n\n const nodeRequire = getNodeRequire()\n if (nodeRequire) {\n const fs = nodeRequire('node:fs') as {\n readFileSync: (path: string, encoding: string) => string\n }\n return fs.readFileSync(path, 'utf8')\n }\n\n throw new Error(\n '[fict/ssr] `manifest` as file path is only supported when Deno.readTextFileSync or CommonJS require is available. ' +\n 'Pass a manifest object in Node ESM or edge runtimes.',\n )\n}\n\nfunction getNodeRequire(): ((specifier: string) => unknown) | null {\n const g = globalThis as Record<string, unknown>\n const direct = g.require\n if (typeof direct === 'function') {\n return direct as (specifier: string) => unknown\n }\n try {\n return Function('return typeof require === \"function\" ? require : null')() as\n | ((specifier: string) => unknown)\n | null\n } catch {\n return null\n }\n}\n","interface NodePassThroughLike {\n pipe: (destination: NodeJS.WritableStream) => unknown\n write: (chunk: string | Uint8Array) => boolean\n end: (...args: unknown[]) => unknown\n destroy?: (error?: Error) => void\n}\n\nexport interface StreamWriter {\n write: (chunk: string) => void | Promise<void>\n close: () => void\n abort: (reason?: unknown) => void\n}\n\nexport interface QueuedTextStream {\n stream: ReadableStream<Uint8Array>\n writer: StreamWriter\n}\n\nexport interface QueuedTextStreamOptions {\n onCancel?: (reason?: unknown) => void\n}\n\nexport function createQueuedTextStream(options: QueuedTextStreamOptions = {}): QueuedTextStream {\n const encoder = new TextEncoder()\n const queue: Uint8Array[] = []\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null\n let closed = false\n let aborted: unknown\n const readyResolvers: (() => void)[] = []\n\n const resolveReady = () => {\n if (!controller || (controller.desiredSize ?? 1) <= 0) return\n while (readyResolvers.length > 0) {\n readyResolvers.shift()?.()\n }\n }\n\n const drainReady = () => {\n while (readyResolvers.length > 0) {\n readyResolvers.shift()?.()\n }\n }\n\n const abortQueue = (reason?: unknown, notifyController = true) => {\n if (closed || aborted !== undefined) return\n aborted = reason ?? new Error('Stream aborted')\n queue.length = 0\n drainReady()\n if (notifyController) {\n controller?.error(aborted)\n }\n }\n\n const stream = new ReadableStream<Uint8Array>({\n start(ctrl) {\n controller = ctrl\n for (const chunk of queue) {\n ctrl.enqueue(chunk)\n }\n queue.length = 0\n if (aborted !== undefined) {\n ctrl.error(aborted)\n return\n }\n if (closed) {\n ctrl.close()\n }\n },\n pull() {\n resolveReady()\n },\n cancel(reason?: unknown) {\n abortQueue(reason, false)\n options.onCancel?.(reason)\n },\n })\n\n const writer: StreamWriter = {\n write(chunk) {\n if (closed || aborted !== undefined) return\n const data = encoder.encode(chunk)\n if (controller) {\n controller.enqueue(data)\n if ((controller.desiredSize ?? 1) <= 0) {\n return new Promise<void>(resolve => {\n readyResolvers.push(resolve)\n })\n }\n } else {\n queue.push(data)\n }\n return undefined\n },\n close() {\n if (closed || aborted !== undefined) return\n closed = true\n drainReady()\n controller?.close()\n },\n abort(reason?: unknown) {\n abortQueue(reason)\n },\n }\n\n return { stream, writer }\n}\n\nexport interface PipeBridge {\n pipe: (\n writable: NodeJS.WritableStream,\n options?: { onError?: (reason?: unknown) => void },\n ) => void\n write: (chunk: string) => void | Promise<void>\n close: () => void\n abort: (reason?: unknown) => void\n}\n\nexport function createPipeBridge(): PipeBridge {\n const nodeBridge = createNodePipeBridge()\n if (nodeBridge) return nodeBridge\n\n const targets = new Set<NodeJS.WritableStream>()\n const buffer: string[] = []\n let state: 'open' | 'closed' | 'aborted' = 'open'\n let abortReason: Error | null = null\n // Propagates downstream-sink failures to the render so it can abort instead of\n // hanging on a backed-up source (see docs/preview-degradation-audit.md G1).\n let sinkErrorHandler: ((reason?: unknown) => void) | undefined\n\n const safeWrite = (target: NodeJS.WritableStream, chunk: string): void | Promise<void> => {\n try {\n const ready = target.write(chunk)\n if (ready === false) {\n return new Promise(resolve => {\n const withOnce = target as NodeJS.WritableStream & {\n once?: (event: 'drain', listener: () => void) => unknown\n }\n if (typeof withOnce.once === 'function') {\n withOnce.once('drain', resolve)\n } else {\n resolve()\n }\n })\n }\n } catch (error) {\n // Surface the sink failure to the render (abort), then keep lifecycle deterministic.\n sinkErrorHandler?.(error)\n }\n return undefined\n }\n\n const safeEnd = (target: NodeJS.WritableStream) => {\n try {\n target.end()\n } catch {\n // Ignore end errors from downstream writable.\n }\n }\n\n const safeDestroy = (target: NodeJS.WritableStream, reason: Error) => {\n const withDestroy = target as NodeJS.WritableStream & { destroy?: (error?: Error) => void }\n if (typeof withDestroy.destroy === 'function') {\n try {\n withDestroy.destroy(reason)\n } catch {\n // Ignore destroy errors from downstream writable.\n }\n return\n }\n safeEnd(target)\n }\n\n return {\n pipe(writable, options) {\n targets.add(writable)\n if (options?.onError) {\n sinkErrorHandler = options.onError\n if (typeof (writable as { on?: unknown }).on === 'function') {\n writable.on('error', options.onError)\n }\n }\n if (buffer.length > 0) {\n for (const chunk of buffer) {\n safeWrite(writable, chunk)\n }\n buffer.length = 0\n }\n if (state === 'closed') {\n safeEnd(writable)\n } else if (state === 'aborted') {\n safeDestroy(writable, abortReason ?? new Error('Stream aborted'))\n }\n },\n write(chunk) {\n if (state !== 'open') return\n if (targets.size === 0) {\n buffer.push(chunk)\n return\n }\n const pending: Promise<void>[] = []\n for (const target of targets) {\n const result = safeWrite(target, chunk)\n if (result) pending.push(result)\n }\n return pending.length > 0 ? Promise.all(pending).then(() => undefined) : undefined\n },\n close() {\n if (state !== 'open') return\n state = 'closed'\n for (const target of targets) {\n safeEnd(target)\n }\n if (targets.size > 0) {\n buffer.length = 0\n }\n },\n abort(reason?: unknown) {\n if (state !== 'open') return\n state = 'aborted'\n abortReason = reason instanceof Error ? reason : new Error('Stream aborted')\n for (const target of targets) {\n safeDestroy(target, abortReason)\n }\n buffer.length = 0\n },\n }\n}\n\nfunction createNodePipeBridge(): PipeBridge | null {\n const nodeRequire = getNodeRequire()\n if (!nodeRequire) return null\n try {\n const streamModule = nodeRequire('node:stream') as {\n PassThrough?: new (...args: unknown[]) => NodePassThroughLike\n }\n if (!streamModule.PassThrough) return null\n const passThrough = new streamModule.PassThrough()\n const buffer: string[] = []\n let piped = false\n let state: 'open' | 'closed' | 'aborted' = 'open'\n let abortReason: Error | null = null\n // Pending backpressure 'drain' resolvers. If the sink dies the PassThrough\n // never drains, so these must be flushed on sink-error/abort to release the\n // render's write chain (otherwise allReady hangs — audit G1).\n const pendingDrains = new Set<() => void>()\n const flushDrains = () => {\n for (const resolve of pendingDrains) resolve()\n pendingDrains.clear()\n }\n\n const writeToPassThrough = (chunk: string): void | Promise<void> => {\n if (passThrough.write(chunk) === false) {\n return new Promise<void>(resolve => {\n const settle = () => {\n pendingDrains.delete(settle)\n resolve()\n }\n pendingDrains.add(settle)\n const withOnce = passThrough as NodePassThroughLike & {\n once?: (event: 'drain', listener: () => void) => unknown\n }\n if (typeof withOnce.once === 'function') {\n withOnce.once('drain', settle)\n } else {\n settle()\n }\n })\n }\n return undefined\n }\n\n const flushBuffer = (): void | Promise<void> => {\n if (buffer.length === 0) return undefined\n const pending: Promise<void>[] = []\n for (const chunk of buffer) {\n const result = writeToPassThrough(chunk)\n if (result) pending.push(result)\n }\n buffer.length = 0\n return pending.length > 0 ? Promise.all(pending).then(() => undefined) : undefined\n }\n\n const destroyPassThrough = (error: Error) => {\n if (typeof passThrough.destroy === 'function') {\n passThrough.destroy(error)\n } else {\n passThrough.end()\n }\n }\n\n return {\n pipe(writable, options) {\n piped = true\n passThrough.pipe(writable)\n // A downstream sink that errors mid-stream would otherwise back up the\n // source PassThrough and hang the render; route it to the render's abort.\n const onError = options?.onError\n if (onError && typeof (writable as { on?: unknown }).on === 'function') {\n writable.on('error', (err: unknown) => {\n flushDrains()\n onError(err)\n })\n }\n\n if (state === 'aborted') {\n destroyPassThrough(abortReason ?? new Error('Stream aborted'))\n return\n }\n\n const flushed = flushBuffer()\n if (state === 'closed') {\n if (flushed) {\n void flushed.then(() => passThrough.end())\n } else {\n passThrough.end()\n }\n }\n },\n write(chunk) {\n if (state !== 'open') return\n if (!piped) {\n buffer.push(chunk)\n return undefined\n }\n return writeToPassThrough(chunk)\n },\n close() {\n if (state !== 'open') return\n state = 'closed'\n if (!piped) return\n passThrough.end()\n },\n abort(reason?: unknown) {\n if (state !== 'open') return\n state = 'aborted'\n abortReason = reason instanceof Error ? reason : new Error('Stream aborted')\n buffer.length = 0\n flushDrains()\n if (piped) {\n destroyPassThrough(abortReason)\n }\n },\n }\n } catch {\n return null\n }\n}\n\nfunction getNodeRequire(): ((specifier: string) => unknown) | null {\n const g = globalThis as Record<string, unknown>\n const direct = g.require\n if (typeof direct === 'function') {\n return direct as (specifier: string) => unknown\n }\n try {\n return Function('return typeof require === \"function\" ? require : null')() as\n | ((specifier: string) => unknown)\n | null\n } catch {\n return null\n }\n}\n","import { render } from '@fictjs/runtime'\nimport type { FictNode } from '@fictjs/runtime'\nimport {\n __fictDisableSSR,\n __fictEnableSSR,\n __fictCreateSSRSession,\n __fictGetScopeRegistry,\n __fictGetScopesForBoundary,\n __fictRunWithSSRSession,\n __fictSerializeSSRState,\n __fictSerializeSSRStateForScopes,\n __fictSetSSRStreamHooks,\n} from '@fictjs/runtime/internal'\nimport { parseHTML } from 'linkedom'\n\nimport { installGlobals, installManifest } from './globals'\nimport { createPipeBridge, createQueuedTextStream, type StreamWriter } from './stream-bridge'\nimport { createStreamRuntimeCode } from './stream-runtime'\n\nconst DEFAULT_HTML = '<!doctype html><html><head></head><body></body></html>'\n\nexport interface SSRDom {\n window: Window\n document: Document\n}\n\nexport interface RenderToStringOptions {\n /**\n * Provide a pre-created DOM (document + window). If omitted, a new DOM is\n * created per render using `html`.\n */\n dom?: SSRDom\n /**\n * Provide a document directly. If `window` is omitted, `document.defaultView`\n * will be used when available.\n */\n document?: Document\n /**\n * Provide a window directly. If `document` is omitted, `window.document` is used.\n */\n window?: Window\n /**\n * HTML template used when creating a new DOM.\n */\n html?: string\n /**\n * Provide a container element to render into.\n */\n container?: HTMLElement\n /**\n * Tag name for the auto-created container.\n */\n containerTag?: string\n /**\n * id applied to the auto-created container.\n */\n containerId?: string\n /**\n * Additional attributes applied to the auto-created container.\n */\n containerAttributes?: Record<string, string | number | boolean | null | undefined>\n /**\n * Return the container element including its outer tag.\n */\n includeContainer?: boolean\n /**\n * Return a full HTML document string (doctype + documentElement.outerHTML).\n */\n fullDocument?: boolean\n /**\n * Override doctype when `fullDocument` is true. Use `null` to omit.\n */\n doctype?: string | null\n /**\n * Expose DOM globals (window/document/Node/Element/etc) during render.\n * Defaults to false. Set to true only for compatibility with components\n * that still read process-global DOM objects during server rendering.\n */\n exposeGlobals?: boolean\n /**\n * Manifest mapping module URLs to built client chunk URLs.\n * Can be an object or a path to a JSON file.\n * File path mode requires Deno sync filesystem access or a CommonJS\n * environment where `require('node:fs')` is available. Pass an object when\n * rendering from Node ESM or edge runtimes.\n */\n manifest?: Record<string, string> | string\n /**\n * Include the SSR snapshot script for resumability.\n * Defaults to true.\n */\n includeSnapshot?: boolean\n /**\n * Script element id for the snapshot.\n */\n snapshotScriptId?: string\n /**\n * Where to append the snapshot script when not returning full document.\n * Defaults to 'container'.\n */\n snapshotTarget?: 'container' | 'body' | 'head'\n /**\n * Nonce applied to generated <script> tags for CSP compatibility.\n */\n scriptNonce?: string\n}\n\nexport interface RenderToStreamOptions extends RenderToStringOptions {\n /**\n * Streaming mode:\n * - 'shell': send fallback shell first, then patch resolved boundaries\n * - 'all': wait for all suspense boundaries, then send full HTML\n */\n mode?: 'shell' | 'all'\n /**\n * Called once the initial shell has been written.\n */\n onShellReady?: () => void\n /**\n * Called once all pending boundaries resolve and the stream completes.\n */\n onAllReady?: () => void\n /**\n * Called when an error occurs during streaming.\n */\n onError?: (err: unknown) => void\n /**\n * Abort signal to cancel the stream.\n */\n signal?: AbortSignal\n /**\n * How to load the streaming patch runtime.\n * Defaults to 'inline'. Use 'external' with streamRuntimeSrc for strict CSP.\n */\n streamRuntime?: 'inline' | 'external'\n /**\n * External streaming patch runtime URL when streamRuntime is 'external'.\n */\n streamRuntimeSrc?: string\n /**\n * How resolved Suspense patch chunks are applied.\n * Defaults to 'inline' for inline runtimes and 'observer' for external runtimes.\n */\n streamPatchMode?: 'inline' | 'observer'\n}\n\nexport interface PipeableStream {\n pipe: (writable: NodeJS.WritableStream) => void\n abort: (reason?: unknown) => void\n shellReady: Promise<void>\n allReady: Promise<void>\n}\n\nexport interface PartialPrerenderResult {\n /**\n * Complete shell HTML (fallbacks + markers + initial snapshot scripts).\n *\n * @experimental Preview API for v1.0; the access pattern may change before\n * this becomes stable.\n */\n shell: string\n /**\n * Stream of deferred patch chunks and incremental snapshots.\n */\n stream: ReadableStream<Uint8Array>\n shellReady: Promise<void>\n allReady: Promise<void>\n abort: (reason?: unknown) => void\n}\n\nexport interface RenderToDocumentResult extends SSRDom {\n html: string\n container: HTMLElement\n dispose: () => void\n}\n\ninterface StreamingControlOptions {\n includeTailInShell?: boolean\n onShellFlushed?: () => void\n}\n\nexport function createSSRDocument(html: string = DEFAULT_HTML): SSRDom {\n const window = parseHTML(html) as Window & typeof globalThis\n const document = window.document as Document | undefined\n if (!window || !document) {\n throw new Error('[fict/ssr] Failed to create DOM. Missing window or document.')\n }\n return { window, document }\n}\n\nexport function renderToDocument(\n view: () => FictNode,\n options: RenderToStringOptions = {},\n): RenderToDocumentResult {\n const session = __fictCreateSSRSession()\n return __fictRunWithSSRSession(session, () => renderToDocumentInSession(view, options))\n}\n\nfunction renderToDocumentInSession(\n view: () => FictNode,\n options: RenderToStringOptions,\n): RenderToDocumentResult {\n const includeSnapshot = options.includeSnapshot !== false\n\n // Always enable SSR mode during server rendering.\n // This ensures SSR-specific code paths (list rendering, etc.) work correctly\n // regardless of whether state snapshots are included.\n __fictEnableSSR()\n\n let dom: SSRDom\n let restoreGlobals = () => {}\n let restoreManifest = () => {}\n let container: HTMLElement\n let teardown = () => {}\n\n try {\n dom = resolveDom(options)\n const { document, window } = dom\n\n const shouldExpose = options.exposeGlobals === true\n restoreGlobals = shouldExpose ? installGlobals(window, document) : () => {}\n restoreManifest = installManifest(options.manifest)\n\n container = resolveContainer(document, options)\n teardown = render(view, container)\n\n if (includeSnapshot) {\n const state = __fictSerializeSSRState()\n injectSnapshot(document, container, state, options)\n }\n } catch (error) {\n // Clean up SSR state and globals on any error\n __fictDisableSSR()\n restoreGlobals()\n restoreManifest()\n throw error\n }\n\n // SSR rendering complete - disable SSR mode\n __fictDisableSSR()\n\n const html = serializeOutput(dom.document, container!, options)\n\n const dispose = () => {\n try {\n teardown()\n } finally {\n restoreGlobals()\n restoreManifest()\n }\n }\n\n return { html, document: dom.document, window: dom.window, container: container!, dispose }\n}\n\nexport function renderToString(view: () => FictNode, options: RenderToStringOptions = {}): string {\n const result = renderToDocument(view, options)\n const html = result.html\n result.dispose()\n return html\n}\n\nexport async function renderToStringAsync(\n view: () => FictNode,\n options: RenderToStringOptions = {},\n): Promise<string> {\n return renderToString(view, options)\n}\n\nexport function renderToStream(\n view: () => FictNode,\n options: RenderToStreamOptions = {},\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null\n let abortRender: ((reason?: unknown) => void) | null = null\n const readyResolvers: (() => void)[] = []\n\n const drainBackpressure = () => {\n while (readyResolvers.length > 0) {\n readyResolvers.shift()?.()\n }\n }\n\n const resolveBackpressure = () => {\n if (!controller || (controller.desiredSize ?? 1) <= 0) return\n drainBackpressure()\n }\n\n const closeController = () => {\n abortRender = null\n drainBackpressure()\n if (!controller) return\n try {\n controller.close()\n } finally {\n controller = null\n }\n }\n\n const errorController = (reason?: unknown) => {\n abortRender = null\n drainBackpressure()\n if (!controller) return\n try {\n controller.error(reason)\n } finally {\n controller = null\n }\n }\n\n const stream = new ReadableStream<Uint8Array>({\n start(ctrl) {\n controller = ctrl\n const started = startStreamingRender(view, options, {\n write(chunk) {\n if (!controller) return\n controller.enqueue(encoder.encode(chunk))\n if ((controller.desiredSize ?? 1) <= 0) {\n return new Promise<void>(resolve => {\n readyResolvers.push(resolve)\n })\n }\n return undefined\n },\n close() {\n closeController()\n },\n abort(reason?: unknown) {\n errorController(reason)\n },\n })\n abortRender = started.abort\n // renderToStream doesn't expose readiness promises, so consume rejections\n // to avoid unhandled promise noise when streaming aborts.\n started.shellReady.catch(() => undefined)\n started.allReady.catch(() => undefined)\n },\n pull() {\n resolveBackpressure()\n },\n cancel(reason?: unknown) {\n const abort = abortRender\n controller = null\n drainBackpressure()\n abort?.(reason ?? new Error('Stream canceled'))\n },\n })\n\n return stream\n}\n\nexport function renderToPipeableStream(\n view: () => FictNode,\n options: RenderToStreamOptions = {},\n): PipeableStream {\n const bridge = createPipeBridge()\n const { shellReady, allReady, abort } = startStreamingRender(view, options, {\n write(chunk) {\n return bridge.write(chunk)\n },\n close() {\n bridge.close()\n },\n abort(reason?: unknown) {\n bridge.abort(reason)\n },\n })\n\n return {\n pipe(writable) {\n // Route downstream-sink errors to abort so a failing sink rejects\n // shellReady/allReady and runs cleanup instead of hanging the render.\n bridge.pipe(writable, { onError: abort })\n },\n abort,\n shellReady,\n allReady,\n }\n}\n\n/**\n * @experimental Preview API for v1.0; the return shape may change before this\n * becomes stable.\n */\nexport function renderToPartial(\n view: () => FictNode,\n options: RenderToStreamOptions = {},\n): PartialPrerenderResult {\n const partialOptions: RenderToStreamOptions = {\n ...options,\n mode: 'shell',\n fullDocument: options.fullDocument ?? true,\n }\n\n let shell = ''\n let shellPhase = true\n let abortPartial: ((reason?: unknown) => void) | null = null\n const queued = createQueuedTextStream({\n onCancel(reason) {\n abortPartial?.(reason ?? new Error('Stream canceled'))\n },\n })\n\n const { shellReady, allReady, abort } = startStreamingRender(\n view,\n partialOptions,\n {\n write(chunk) {\n if (shellPhase) {\n shell += chunk\n return\n }\n return queued.writer.write(chunk)\n },\n close() {\n queued.writer.close()\n },\n abort(reason?: unknown) {\n queued.writer.abort(reason)\n },\n },\n {\n includeTailInShell: true,\n onShellFlushed() {\n shellPhase = false\n },\n },\n )\n abortPartial = abort\n\n return {\n shell,\n stream: queued.stream,\n shellReady,\n allReady,\n abort,\n }\n}\n\nfunction resolveDom(options: RenderToStringOptions): SSRDom {\n if (options.dom) {\n return options.dom\n }\n\n if (options.document && options.window) {\n return { document: options.document, window: options.window }\n }\n\n if (options.document) {\n const window =\n options.window ??\n (options.document.defaultView as Window | null) ??\n (options.document as Document & { defaultView?: Window | null }).defaultView ??\n undefined\n if (!window) {\n throw new Error(\n '[fict/ssr] A window is required when providing a document without defaultView.',\n )\n }\n return { document: options.document, window }\n }\n\n if (options.window) {\n return { document: options.window.document, window: options.window }\n }\n\n return createSSRDocument(options.html)\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<unknown>).then === 'function'\n )\n}\n\nfunction startStreamingRender(\n view: () => FictNode,\n options: RenderToStreamOptions,\n writer: StreamWriter,\n control: StreamingControlOptions = {},\n): { shellReady: Promise<void>; allReady: Promise<void>; abort: (reason?: unknown) => void } {\n const session = __fictCreateSSRSession()\n return __fictRunWithSSRSession(session, () =>\n startStreamingRenderInSession(session, view, options, writer, control),\n )\n}\n\ntype SSRSession = ReturnType<typeof __fictCreateSSRSession>\n\nfunction startStreamingRenderInSession(\n session: SSRSession,\n view: () => FictNode,\n options: RenderToStreamOptions,\n writer: StreamWriter,\n control: StreamingControlOptions = {},\n): { shellReady: Promise<void>; allReady: Promise<void>; abort: (reason?: unknown) => void } {\n const runInSession = <T>(fn: () => T): T => __fictRunWithSSRSession(session, fn)\n const resolvedOptions: RenderToStreamOptions = {\n ...options,\n // Streaming requires a real document; default to fullDocument when unspecified.\n fullDocument: options.fullDocument ?? true,\n }\n\n let resolveShell!: () => void\n let rejectShell!: (err: unknown) => void\n let resolveAll!: () => void\n let rejectAll!: (err: unknown) => void\n let shellSettled = false\n\n const shellReady = new Promise<void>((res, rej) => {\n resolveShell = () => {\n if (shellSettled) return\n shellSettled = true\n res()\n }\n rejectShell = err => {\n if (shellSettled) return\n shellSettled = true\n rej(err)\n }\n })\n const allReady = new Promise<void>((res, rej) => {\n resolveAll = res\n rejectAll = rej\n })\n\n let dom: SSRDom | null = null\n let restoreGlobals = () => {}\n let restoreManifest = () => {}\n let teardown = () => {}\n let container: HTMLElement | null = null\n let closed = false\n let tailHtml = ''\n let wroteShell = false\n let shellCarriesTail = false\n let writeChain: Promise<void> | null = null\n let writeFailed = false\n let removeAbortListener = () => {}\n\n const mode = options.mode ?? 'shell'\n const includeSnapshot = options.includeSnapshot !== false\n const sentScopes = new Set<string>()\n\n const boundaryMap = new Map<string, { start: Comment; end: Comment; pending: boolean }>()\n let boundaryId = 0\n let pendingCount = 0\n\n const handleWriteError = (error: unknown) => {\n if (writeFailed) return\n writeFailed = true\n options.onError?.(error)\n writer.abort(error)\n cleanup()\n rejectShell(error)\n rejectAll(error)\n }\n\n const enqueueWrite = (chunk: string): void => {\n if (writeFailed) return\n const trackWrite = (promise: Promise<void>) => {\n const tracked = promise.then(\n () => {\n if (writeChain === tracked) {\n writeChain = null\n }\n },\n error => {\n if (writeChain === tracked) {\n writeChain = null\n }\n handleWriteError(error)\n },\n )\n writeChain = tracked\n }\n const writeAsync = () => Promise.resolve(writer.write(chunk)).then(() => undefined)\n\n if (writeChain) {\n trackWrite(writeChain.then(writeAsync))\n return\n }\n\n try {\n const result = writer.write(chunk)\n if (isPromiseLike(result)) {\n trackWrite(\n result.then(\n () => undefined,\n error => {\n throw error\n },\n ),\n )\n }\n } catch (error) {\n handleWriteError(error)\n }\n }\n\n const afterWrites = (fn: () => void): void => {\n const pending = writeChain\n if (!pending) {\n if (!writeFailed) {\n fn()\n }\n return\n }\n void pending.then(() => {\n if (!writeFailed) {\n fn()\n }\n })\n }\n\n const markShellReady = (): void => {\n afterWrites(() => {\n control.onShellFlushed?.()\n resolveShell()\n options.onShellReady?.()\n })\n }\n\n const writeSnapshotForScopes = (scopeIds: string[]): void => {\n runInSession(() => {\n if (!includeSnapshot || scopeIds.length === 0) return\n const registry = __fictGetScopeRegistry()\n const pending = scopeIds.filter(id => registry.has(id) && !sentScopes.has(id))\n if (pending.length === 0) return\n const snapshot = __fictSerializeSSRStateForScopes(pending)\n const ids = Object.keys(snapshot.scopes)\n if (ids.length === 0) return\n const chunk = buildIncrementalSnapshotChunk(snapshot, resolvedOptions)\n if (chunk) {\n enqueueWrite(chunk)\n }\n for (const id of ids) {\n sentScopes.add(id)\n }\n })\n }\n\n const writeSnapshotForBoundary = (boundary: string): void => {\n runInSession(() => {\n const scopes = __fictGetScopesForBoundary(boundary)\n writeSnapshotForScopes(scopes)\n })\n }\n\n const writeRemainingSnapshots = (): void => {\n runInSession(() => {\n const scopes = Array.from(__fictGetScopeRegistry().keys())\n writeSnapshotForScopes(scopes)\n })\n }\n\n const cleanup = () => {\n removeAbortListener()\n removeAbortListener = () => {}\n runInSession(() => {\n __fictSetSSRStreamHooks(null)\n __fictDisableSSR()\n })\n try {\n teardown()\n } catch {\n // ignore cleanup errors\n } finally {\n restoreGlobals()\n restoreManifest()\n }\n }\n\n const finalize = () => {\n if (closed) return\n closed = true\n\n if (mode === 'all' && dom && container && !wroteShell) {\n if (includeSnapshot) {\n const snapshot = __fictSerializeSSRState()\n injectSnapshot(dom.document, container, snapshot, resolvedOptions)\n }\n const fullHtml = serializeOutput(dom.document, container, resolvedOptions)\n enqueueWrite(fullHtml)\n afterWrites(() => {\n writer.close()\n cleanup()\n resolveShell()\n resolveAll()\n options.onShellReady?.()\n options.onAllReady?.()\n })\n return\n }\n\n writeRemainingSnapshots()\n\n if (tailHtml) {\n enqueueWrite(tailHtml)\n }\n\n afterWrites(() => {\n writer.close()\n cleanup()\n resolveAll()\n options.onAllReady?.()\n })\n }\n\n const maybeFinalize = () => {\n if (pendingCount === 0) {\n finalize()\n }\n }\n\n const hooks = {\n registerBoundary(start: Comment, end: Comment) {\n const id = `s${++boundaryId}`\n boundaryMap.set(id, { start, end, pending: false })\n return id\n },\n boundaryPending(id: string) {\n const entry = boundaryMap.get(id)\n if (!entry || entry.pending) return\n entry.pending = true\n pendingCount++\n },\n boundaryResolved(id: string) {\n const entry = boundaryMap.get(id)\n if (!entry) return\n if (entry.pending) {\n entry.pending = false\n pendingCount = Math.max(0, pendingCount - 1)\n }\n if (mode === 'shell') {\n writeSnapshotForBoundary(id)\n if (dom) {\n const html = serializeBetween(dom.document, entry.start, entry.end)\n enqueueWrite(buildPatchChunk(id, html, resolvedOptions))\n }\n }\n maybeFinalize()\n },\n onError(err: unknown) {\n options.onError?.(err)\n abort(err)\n },\n }\n\n const abort = (reason?: unknown) => {\n const abortReason = reason ?? new Error('Stream aborted')\n if (!closed) {\n closed = true\n writeFailed = true\n writer.abort(reason)\n cleanup()\n }\n // Always settle. A late sink error can arrive after finalize() set `closed`\n // but before its (stalled) write chain resolves; rejecting an already-settled\n // promise is a no-op, so this is safe and prevents allReady from hanging.\n rejectShell(abortReason)\n rejectAll(abortReason)\n }\n\n if (options.signal) {\n if (options.signal.aborted) {\n abort(options.signal.reason)\n return { shellReady, allReady, abort }\n } else {\n const onAbort = () => abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => options.signal?.removeEventListener('abort', onAbort)\n }\n }\n\n try {\n __fictEnableSSR()\n __fictSetSSRStreamHooks(hooks)\n\n dom = resolveDom(resolvedOptions)\n restoreGlobals =\n resolvedOptions.exposeGlobals === true ? installGlobals(dom.window, dom.document) : () => {}\n restoreManifest = installManifest(resolvedOptions.manifest)\n\n container = resolveContainer(dom.document, resolvedOptions)\n teardown = render(view, container)\n\n if (mode === 'all') {\n if (pendingCount === 0) {\n finalize()\n }\n return { shellReady, allReady, abort }\n }\n\n // shell-first mode\n const shellHtml = serializeOutput(dom.document, container, resolvedOptions)\n const streamRuntime = boundaryMap.size > 0 ? buildStreamRuntimeScript(resolvedOptions) : ''\n if (resolvedOptions.fullDocument) {\n const split = splitDocumentHtml(shellHtml)\n if (!split) {\n throw new Error('[fict/ssr] Failed to locate </body> for streaming output.')\n }\n if (control.includeTailInShell) {\n enqueueWrite(split.head + streamRuntime)\n tailHtml = split.tail\n shellCarriesTail = true\n } else {\n enqueueWrite(split.head + streamRuntime)\n tailHtml = split.tail\n }\n } else {\n enqueueWrite(shellHtml + streamRuntime)\n }\n wroteShell = true\n writeSnapshotForScopes(Array.from(__fictGetScopeRegistry().keys()))\n if (shellCarriesTail && tailHtml) {\n enqueueWrite(tailHtml)\n tailHtml = ''\n shellCarriesTail = false\n }\n markShellReady()\n\n // If no pending boundaries, finalize immediately.\n maybeFinalize()\n } catch (err) {\n options.onError?.(err)\n abort(err)\n }\n\n return { shellReady, allReady, abort }\n}\n\nfunction resolveContainer(document: Document, options: RenderToStringOptions): HTMLElement {\n if (options.container) {\n if (options.container.ownerDocument && options.container.ownerDocument !== document) {\n throw new Error('[fict/ssr] Provided container belongs to a different document.')\n }\n return options.container\n }\n\n const tag = options.containerTag ?? 'div'\n const container = document.createElement(tag)\n if (options.containerId) {\n container.setAttribute('id', options.containerId)\n }\n if (options.containerAttributes) {\n for (const [name, value] of Object.entries(options.containerAttributes)) {\n if (value === null || value === undefined || value === false) continue\n container.setAttribute(name, value === true ? '' : String(value))\n }\n }\n\n if (document.body) {\n document.body.appendChild(container)\n }\n\n return container\n}\n\nfunction buildStreamRuntimeScript(options: RenderToStreamOptions): string {\n const nonce = renderNonceAttribute(options)\n if (options.streamRuntime === 'external') {\n if (!options.streamRuntimeSrc) {\n throw new Error('[fict/ssr] streamRuntimeSrc is required when streamRuntime is \"external\".')\n }\n return `<script${nonce} src=\"${escapeAttribute(options.streamRuntimeSrc)}\" data-fict-stream-runtime data-fict-stream-observer></script>`\n }\n\n return `<script${nonce}>${createStreamRuntimeCode({\n observerMode: resolveStreamPatchMode(options) === 'observer',\n })}</script>`\n}\n\nfunction buildPatchChunk(id: string, html: string, options: RenderToStreamOptions): string {\n const template = `<template data-fict-suspense=\"${escapeAttribute(id)}\">${html}</template>`\n if (resolveStreamPatchMode(options) === 'observer') {\n return template\n }\n return `${template}<script${renderNonceAttribute(options)}>__FICT_STREAM.apply(\"${escapeScriptString(id)}\")</script>`\n}\n\nfunction resolveStreamPatchMode(options: RenderToStreamOptions): 'inline' | 'observer' {\n if (options.streamPatchMode) return options.streamPatchMode\n return options.streamRuntime === 'external' ? 'observer' : 'inline'\n}\n\nfunction serializeBetween(document: Document, start: Comment, end: Comment): string {\n const wrapper = document.createElement('div')\n let node = start.nextSibling\n while (node && node !== end) {\n wrapper.appendChild(node.cloneNode(true) as Node)\n node = node.nextSibling\n }\n return wrapper.innerHTML\n}\n\nfunction splitDocumentHtml(html: string): { head: string; tail: string } | null {\n const lower = html.toLowerCase()\n const idx = lower.lastIndexOf('</body>')\n if (idx === -1) return null\n return { head: html.slice(0, idx), tail: html.slice(idx) }\n}\n\nfunction buildIncrementalSnapshotChunk(\n state: ReturnType<typeof __fictSerializeSSRState>,\n options: RenderToStringOptions,\n): string {\n const json = serializeSnapshotForScript(state)\n const nonce = renderNonceAttribute(options)\n if (options.snapshotTarget === 'head') {\n const jsonLiteral = JSON.stringify(json)\n const setNonce =\n options.scriptNonce !== undefined\n ? `s.setAttribute('nonce',${serializeScriptStringLiteral(options.scriptNonce)});`\n : ''\n return `<script${nonce}>(function(){var s=document.createElement('script');s.type='application/json';s.setAttribute('data-fict-snapshot','');${setNonce}s.textContent=${jsonLiteral};(document.head||document.documentElement).appendChild(s);}())</script>`\n }\n return `<script${nonce} type=\"application/json\" data-fict-snapshot>${json}</script>`\n}\n\nfunction serializeOutput(\n document: Document,\n container: HTMLElement,\n options: RenderToStringOptions,\n): string {\n if (options.fullDocument) {\n const doctype = serializeDoctype(document, options.doctype)\n const html = document.documentElement ? document.documentElement.outerHTML : container.outerHTML\n return doctype ? `${doctype}${html}` : html\n }\n\n if (options.includeContainer) {\n return container.outerHTML\n }\n\n return container.innerHTML\n}\n\nfunction injectSnapshot(\n document: Document,\n container: HTMLElement,\n state: ReturnType<typeof __fictSerializeSSRState>,\n options: RenderToStringOptions,\n): void {\n const script = document.createElement('script')\n script.type = 'application/json'\n script.id = options.snapshotScriptId ?? '__FICT_SNAPSHOT__'\n if (options.scriptNonce !== undefined) {\n script.setAttribute('nonce', options.scriptNonce)\n }\n script.textContent = serializeSnapshotForScript(state)\n\n if (options.fullDocument) {\n if (options.snapshotTarget === 'head' && document.head) {\n document.head.appendChild(script)\n return\n }\n if (document.body) {\n document.body.appendChild(script)\n return\n }\n }\n\n const target = options.snapshotTarget ?? 'container'\n if (target === 'body' && document.body) {\n document.body.appendChild(script)\n return\n }\n if (target === 'head' && document.head) {\n document.head.appendChild(script)\n return\n }\n\n container.appendChild(script)\n}\n\nfunction serializeSnapshotForScript(state: ReturnType<typeof __fictSerializeSSRState>): string {\n return JSON.stringify(state)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nfunction serializeScriptStringLiteral(value: string): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nfunction renderNonceAttribute(options: RenderToStringOptions): string {\n return options.scriptNonce === undefined ? '' : ` nonce=\"${escapeAttribute(options.scriptNonce)}\"`\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n}\n\nfunction escapeScriptString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/</g, '\\\\u003c')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nfunction serializeDoctype(document: Document, override?: string | null): string {\n if (override === null) return ''\n if (override !== undefined) return override\n\n const doctype = document.doctype\n if (!doctype) return ''\n\n const name = doctype.name || 'html'\n const publicId = doctype.publicId\n const systemId = doctype.systemId\n\n let id = ''\n if (publicId) {\n id = ` PUBLIC \"${publicId}\"`\n if (systemId) {\n id += ` \"${systemId}\"`\n }\n } else if (systemId) {\n id = ` SYSTEM \"${systemId}\"`\n }\n\n return `<!DOCTYPE ${name}${id}>`\n}\n"],"mappings":"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"}