@flight-framework/core 0.0.3 → 0.2.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.
- package/LICENSE +21 -0
- package/dist/{chunk-5KF3QQWZ.js → chunk-3AY23FZP.js} +5 -19
- package/dist/chunk-3AY23FZP.js.map +1 -0
- package/dist/chunk-4F77J5TY.js +324 -0
- package/dist/chunk-4F77J5TY.js.map +1 -0
- package/dist/{chunk-CLMFEKYM.js → chunk-54HPVE7N.js} +67 -2
- package/dist/chunk-54HPVE7N.js.map +1 -0
- package/dist/chunk-5GUCB2CG.js +300 -0
- package/dist/chunk-5GUCB2CG.js.map +1 -0
- package/dist/chunk-62C7LX2E.js +205 -0
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/chunk-63SCEXD7.js +3 -0
- package/dist/chunk-63SCEXD7.js.map +1 -0
- package/dist/chunk-6BDCTUQY.js +282 -0
- package/dist/chunk-6BDCTUQY.js.map +1 -0
- package/dist/chunk-6CD5FIYI.js +252 -0
- package/dist/chunk-6CD5FIYI.js.map +1 -0
- package/dist/chunk-6XZQPPYC.js +285 -0
- package/dist/chunk-6XZQPPYC.js.map +1 -0
- package/dist/chunk-BJIMTO2I.js +213 -0
- package/dist/chunk-BJIMTO2I.js.map +1 -0
- package/dist/chunk-CLZSB5QD.js +258 -0
- package/dist/chunk-CLZSB5QD.js.map +1 -0
- package/dist/chunk-K2CQZPCG.js +257 -0
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-MQQLYWZZ.js +288 -0
- package/dist/chunk-MQQLYWZZ.js.map +1 -0
- package/dist/chunk-MRLCNFSD.js +341 -0
- package/dist/chunk-MRLCNFSD.js.map +1 -0
- package/dist/chunk-PSJPMEQK.js +212 -0
- package/dist/chunk-PSJPMEQK.js.map +1 -0
- package/dist/chunk-Q62ZQ6FM.js +218 -0
- package/dist/chunk-Q62ZQ6FM.js.map +1 -0
- package/dist/{chunk-ABNCAPQB.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/chunk-T3S5YC7L.js +256 -0
- package/dist/chunk-T3S5YC7L.js.map +1 -0
- package/dist/chunk-WFAWAHJH.js +267 -0
- package/dist/chunk-WFAWAHJH.js.map +1 -0
- package/dist/chunk-WOEIJWGJ.js +351 -0
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/chunk-XOIYNY4I.js +164 -0
- package/dist/chunk-XOIYNY4I.js.map +1 -0
- package/dist/chunk-XSY5AAXT.js +125 -0
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/chunk-Y22AMGTM.js +3 -0
- package/dist/chunk-Y22AMGTM.js.map +1 -0
- package/dist/file-router/index.d.ts +9 -0
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.d.ts +129 -0
- package/dist/file-router/streaming-hints.js +3 -0
- package/dist/file-router/streaming-hints.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +23 -5
- package/dist/index.js.map +1 -1
- package/dist/islands/index.d.ts +234 -0
- package/dist/islands/index.js +3 -0
- package/dist/islands/index.js.map +1 -0
- package/dist/rsc/adapters/index.d.ts +8 -0
- package/dist/rsc/adapters/index.js +7 -0
- package/dist/rsc/adapters/index.js.map +1 -0
- package/dist/rsc/adapters/preact.d.ts +97 -0
- package/dist/rsc/adapters/preact.js +3 -0
- package/dist/rsc/adapters/preact.js.map +1 -0
- package/dist/rsc/adapters/react.d.ts +82 -0
- package/dist/rsc/adapters/react.js +3 -0
- package/dist/rsc/adapters/react.js.map +1 -0
- package/dist/rsc/adapters/solid.d.ts +84 -0
- package/dist/rsc/adapters/solid.js +3 -0
- package/dist/rsc/adapters/solid.js.map +1 -0
- package/dist/rsc/adapters/vue.d.ts +80 -0
- package/dist/rsc/adapters/vue.js +3 -0
- package/dist/rsc/adapters/vue.js.map +1 -0
- package/dist/rsc/boundaries.d.ts +182 -0
- package/dist/rsc/boundaries.js +3 -0
- package/dist/rsc/boundaries.js.map +1 -0
- package/dist/rsc/context.d.ts +201 -0
- package/dist/rsc/context.js +3 -0
- package/dist/rsc/context.js.map +1 -0
- package/dist/rsc/index.d.ts +20 -124
- package/dist/rsc/index.js +13 -1
- package/dist/rsc/legacy.d.ts +131 -0
- package/dist/rsc/legacy.js +3 -0
- package/dist/rsc/legacy.js.map +1 -0
- package/dist/rsc/payload.d.ts +262 -0
- package/dist/rsc/payload.js +3 -0
- package/dist/rsc/payload.js.map +1 -0
- package/dist/rsc/plugins/esbuild.d.ts +124 -0
- package/dist/rsc/plugins/esbuild.js +4 -0
- package/dist/rsc/plugins/esbuild.js.map +1 -0
- package/dist/rsc/plugins/index.d.ts +4 -0
- package/dist/rsc/plugins/index.js +6 -0
- package/dist/rsc/plugins/index.js.map +1 -0
- package/dist/rsc/plugins/rollup.d.ts +103 -0
- package/dist/rsc/plugins/rollup.js +4 -0
- package/dist/rsc/plugins/rollup.js.map +1 -0
- package/dist/rsc/renderer.d.ts +160 -0
- package/dist/rsc/renderer.js +5 -0
- package/dist/rsc/renderer.js.map +1 -0
- package/dist/rsc/stream.d.ts +129 -0
- package/dist/rsc/stream.js +3 -0
- package/dist/rsc/stream.js.map +1 -0
- package/dist/rsc/vite-plugin.d.ts +78 -0
- package/dist/rsc/vite-plugin.js +4 -0
- package/dist/rsc/vite-plugin.js.map +1 -0
- package/dist/streaming/adapters/index.d.ts +223 -0
- package/dist/streaming/adapters/index.js +3 -0
- package/dist/streaming/adapters/index.js.map +1 -0
- package/dist/streaming/conditional.d.ts +130 -0
- package/dist/streaming/conditional.js +3 -0
- package/dist/streaming/conditional.js.map +1 -0
- package/dist/streaming/index.d.ts +8 -0
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.d.ts +201 -0
- package/dist/streaming/observability.js +4 -0
- package/dist/streaming/observability.js.map +1 -0
- package/dist/streaming/priority.d.ts +103 -0
- package/dist/streaming/priority.js +3 -0
- package/dist/streaming/priority.js.map +1 -0
- package/package.json +180 -100
- package/dist/chunk-5KF3QQWZ.js.map +0 -1
- package/dist/chunk-ABNCAPQB.js.map +0 -1
- package/dist/chunk-CLMFEKYM.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/payload.ts"],"names":[],"mappings":"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","file":"chunk-K2CQZPCG.js","sourcesContent":["/**\r\n * @flight-framework/core - Flight Payload System\r\n * \r\n * Formato de serialización agnóstico para Server Components.\r\n * Diseñado para máxima debuggabilidad y compatibilidad multi-framework.\r\n * \r\n * Filosofía Flight:\r\n * - Formato documentado y abierto (NDJSON)\r\n * - No depende de internals de React\r\n * - Extensible para cualquier UI framework\r\n * - Zero vendor lock-in\r\n * \r\n * @module @flight-framework/core/rsc/payload\r\n */\r\n\r\n// ============================================================================\r\n// Chunk Types - El corazón del streaming protocol\r\n// ============================================================================\r\n\r\n/**\r\n * Union type de todos los chunks que pueden enviarse en un FlightStream\r\n */\r\nexport type FlightChunk =\r\n | ServerComponentChunk\r\n | ClientReferenceChunk\r\n | ServerReferenceChunk\r\n | ErrorBoundaryChunk\r\n | HintChunk\r\n | MetaChunk;\r\n\r\n/**\r\n * Chunk de Server Component renderizado\r\n * Contiene el árbol virtual de elementos\r\n */\r\nexport interface ServerComponentChunk {\r\n /** Discriminator */\r\n readonly type: 'S';\r\n /** Unique chunk ID */\r\n readonly id: string;\r\n /** Virtual element tree */\r\n readonly tree: FlightElement;\r\n /** IDs de chunks que este depende (para streaming ordenado) */\r\n readonly awaiting?: readonly string[];\r\n /** Timestamp para debugging/observability */\r\n readonly ts?: number;\r\n}\r\n\r\n/**\r\n * Referencia a un Client Component\r\n * El cliente cargará el módulo y lo hidratará\r\n */\r\nexport interface ClientReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'C';\r\n /** Reference ID */\r\n readonly id: string;\r\n /** Module specifier (relativo al manifest) */\r\n readonly module: string;\r\n /** Export name */\r\n readonly export: string;\r\n /** Serialized props */\r\n readonly props: SerializedValue;\r\n /** Fallback HTML para SSR (opcional) */\r\n readonly fallback?: string;\r\n}\r\n\r\n/**\r\n * Referencia a una Server Function (Action)\r\n * El cliente la invocará via RPC\r\n */\r\nexport interface ServerReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'A';\r\n /** Action ID */\r\n readonly id: string;\r\n /** Bound arguments (pre-bound via .bind()) */\r\n readonly bound?: readonly SerializedValue[];\r\n}\r\n\r\n/**\r\n * Error en un boundary específico\r\n */\r\nexport interface ErrorBoundaryChunk {\r\n /** Discriminator */\r\n readonly type: 'E';\r\n /** Boundary ID where error occurred */\r\n readonly boundary: string;\r\n /** Safe error message for client */\r\n readonly message: string;\r\n /** Error digest for server-side correlation */\r\n readonly digest: string;\r\n /** Component stack for development */\r\n readonly stack?: string;\r\n}\r\n\r\n/**\r\n * Hints para el cliente (preload, prefetch, etc.)\r\n */\r\nexport interface HintChunk {\r\n /** Discriminator */\r\n readonly type: 'H';\r\n /** Hint type */\r\n readonly hint: 'preload' | 'prefetch' | 'dns-prefetch' | 'preconnect' | 'modulepreload';\r\n /** Resource URL */\r\n readonly href: string;\r\n /** Resource type (for preload) */\r\n readonly as?: 'script' | 'style' | 'image' | 'font' | 'fetch';\r\n /** Crossorigin attribute */\r\n readonly crossorigin?: 'anonymous' | 'use-credentials';\r\n}\r\n\r\n/**\r\n * Metadata chunk (para SSR head injection)\r\n */\r\nexport interface MetaChunk {\r\n /** Discriminator */\r\n readonly type: 'M';\r\n /** Meta type */\r\n readonly meta: 'title' | 'description' | 'og' | 'twitter' | 'link' | 'script';\r\n /** Content */\r\n readonly content: string | Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element - Virtual DOM agnóstico\r\n// ============================================================================\r\n\r\n/**\r\n * Virtual element que puede representar cualquier UI framework\r\n */\r\nexport type FlightElement =\r\n | FlightHostElement\r\n | FlightTextElement\r\n | FlightFragmentElement\r\n | FlightSuspenseElement\r\n | FlightClientElement\r\n | FlightLazyElement\r\n | FlightNullElement;\r\n\r\n/**\r\n * Host element (div, span, etc.)\r\n */\r\nexport interface FlightHostElement {\r\n readonly $$type: 'host';\r\n readonly tag: string;\r\n readonly key?: string | number;\r\n readonly props: Readonly<Record<string, SerializedValue>>;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Text node\r\n */\r\nexport interface FlightTextElement {\r\n readonly $$type: 'text';\r\n readonly value: string;\r\n}\r\n\r\n/**\r\n * Fragment (multiple children, no wrapper)\r\n */\r\nexport interface FlightFragmentElement {\r\n readonly $$type: 'fragment';\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Suspense boundary\r\n */\r\nexport interface FlightSuspenseElement {\r\n readonly $$type: 'suspense';\r\n readonly id: string;\r\n readonly fallback: FlightElement;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Client component reference\r\n */\r\nexport interface FlightClientElement {\r\n readonly $$type: 'client';\r\n /** Reference to ClientReferenceChunk ID */\r\n readonly ref: string;\r\n /** Pre-rendered fallback HTML */\r\n readonly ssr?: string;\r\n}\r\n\r\n/**\r\n * Lazy/async element (pending resolution)\r\n */\r\nexport interface FlightLazyElement {\r\n readonly $$type: 'lazy';\r\n readonly id: string;\r\n readonly fallback?: FlightElement;\r\n}\r\n\r\n/**\r\n * Null/empty element\r\n */\r\nexport interface FlightNullElement {\r\n readonly $$type: 'null';\r\n}\r\n\r\n// ============================================================================\r\n// Serializable Values\r\n// ============================================================================\r\n\r\n/**\r\n * Valores que pueden cruzar el boundary server/client\r\n */\r\nexport type SerializedValue =\r\n | string\r\n | number\r\n | boolean\r\n | null\r\n | undefined\r\n | readonly SerializedValue[]\r\n | { readonly [key: string]: SerializedValue }\r\n | SerializedSpecialValue;\r\n\r\n/**\r\n * Tipos especiales que requieren serialización custom\r\n */\r\nexport interface SerializedSpecialValue {\r\n readonly $$flight: SpecialValueType;\r\n readonly value: string | readonly unknown[];\r\n}\r\n\r\nexport type SpecialValueType =\r\n | 'date'\r\n | 'bigint'\r\n | 'map'\r\n | 'set'\r\n | 'undefined'\r\n | 'symbol'\r\n | 'regexp'\r\n | 'url'\r\n | 'error'\r\n | 'formdata'\r\n | 'blob'\r\n | 'arraybuffer';\r\n\r\n// ============================================================================\r\n// Serialization Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Serializa un valor para transmisión a través de FlightStream\r\n */\r\nexport function serialize(value: unknown): SerializedValue {\r\n return serializeValue(value, new WeakSet());\r\n}\r\n\r\nfunction serializeValue(value: unknown, seen: WeakSet<object>): SerializedValue {\r\n // Primitives\r\n if (value === null) return null;\r\n if (value === undefined) return { $$flight: 'undefined', value: '' };\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number') {\r\n if (Number.isNaN(value)) return { $$flight: 'undefined', value: 'NaN' };\r\n if (!Number.isFinite(value)) return { $$flight: 'undefined', value: value > 0 ? 'Infinity' : '-Infinity' };\r\n return value;\r\n }\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'bigint') return { $$flight: 'bigint', value: value.toString() };\r\n if (typeof value === 'symbol') return { $$flight: 'symbol', value: value.description ?? '' };\r\n\r\n // Functions cannot be serialized\r\n if (typeof value === 'function') {\r\n throw new FlightSerializationError(\r\n 'Functions cannot be passed from Server to Client Components. ' +\r\n 'If you need to pass a function, use a Server Action instead.'\r\n );\r\n }\r\n\r\n // Circular reference detection\r\n if (typeof value === 'object') {\r\n if (seen.has(value)) {\r\n throw new FlightSerializationError('Circular references are not supported in Flight payloads.');\r\n }\r\n seen.add(value);\r\n }\r\n\r\n // Special objects\r\n if (value instanceof Date) {\r\n return { $$flight: 'date', value: value.toISOString() };\r\n }\r\n if (value instanceof RegExp) {\r\n return { $$flight: 'regexp', value: value.toString() };\r\n }\r\n if (value instanceof URL) {\r\n return { $$flight: 'url', value: value.href };\r\n }\r\n if (value instanceof Map) {\r\n const entries: [SerializedValue, SerializedValue][] = [];\r\n for (const [k, v] of value) {\r\n entries.push([serializeValue(k, seen), serializeValue(v, seen)]);\r\n }\r\n return { $$flight: 'map', value: entries as unknown as string };\r\n }\r\n if (value instanceof Set) {\r\n const items: SerializedValue[] = [];\r\n for (const v of value) {\r\n items.push(serializeValue(v, seen));\r\n }\r\n return { $$flight: 'set', value: items as unknown as string };\r\n }\r\n if (value instanceof Error) {\r\n return {\r\n $$flight: 'error',\r\n value: JSON.stringify({ name: value.name, message: value.message })\r\n };\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(v => serializeValue(v, seen));\r\n }\r\n\r\n // Plain objects\r\n if (isPlainObject(value)) {\r\n const result: Record<string, SerializedValue> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = serializeValue(v, seen);\r\n }\r\n return result;\r\n }\r\n\r\n // Unknown object type - try JSON serialization\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as SerializedValue;\r\n } catch {\r\n throw new FlightSerializationError(\r\n `Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. ` +\r\n 'Only serializable values can be passed to Client Components.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Deserializa un valor recibido de FlightStream\r\n */\r\nexport function deserialize<T = unknown>(value: SerializedValue): T {\r\n return deserializeValue(value) as T;\r\n}\r\n\r\nfunction deserializeValue(value: SerializedValue): unknown {\r\n if (value === null || value === undefined) return value;\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n // Special values\r\n if (isSpecialValue(value)) {\r\n switch (value.$$flight) {\r\n case 'undefined':\r\n if (value.value === 'NaN') return NaN;\r\n if (value.value === 'Infinity') return Infinity;\r\n if (value.value === '-Infinity') return -Infinity;\r\n return undefined;\r\n case 'date':\r\n return new Date(value.value as string);\r\n case 'bigint':\r\n return BigInt(value.value as string);\r\n case 'symbol':\r\n return Symbol(value.value as string);\r\n case 'regexp': {\r\n const match = (value.value as string).match(/^\\/(.*)\\/([gimsuy]*)$/);\r\n if (match) return new RegExp(match[1]!, match[2]);\r\n return new RegExp(value.value as string);\r\n }\r\n case 'url':\r\n return new URL(value.value as string);\r\n case 'map':\r\n return new Map((value.value as unknown as [SerializedValue, SerializedValue][])\r\n .map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));\r\n case 'set':\r\n return new Set((value.value as unknown as SerializedValue[])\r\n .map(v => deserializeValue(v)));\r\n case 'error': {\r\n const { name, message } = JSON.parse(value.value as string);\r\n const error = new Error(message);\r\n error.name = name;\r\n return error;\r\n }\r\n }\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(deserializeValue);\r\n }\r\n\r\n // Objects\r\n if (typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = deserializeValue(v);\r\n }\r\n return result;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== 'object' || value === null) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\nfunction isSpecialValue(value: unknown): value is SerializedSpecialValue {\r\n return typeof value === 'object' && value !== null && '$$flight' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element Builders\r\n// ============================================================================\r\n\r\n/**\r\n * Create a host element\r\n */\r\nexport function h(\r\n tag: string,\r\n props: Record<string, unknown> | null,\r\n ...children: unknown[]\r\n): FlightHostElement {\r\n const serializedProps: Record<string, SerializedValue> = {};\r\n\r\n if (props) {\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key !== 'children') {\r\n serializedProps[key] = serialize(value);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n props: serializedProps,\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a text element\r\n */\r\nexport function text(value: string): FlightTextElement {\r\n return { $$type: 'text', value };\r\n}\r\n\r\n/**\r\n * Create a fragment\r\n */\r\nexport function fragment(...children: unknown[]): FlightFragmentElement {\r\n return {\r\n $$type: 'fragment',\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a suspense boundary\r\n */\r\nexport function suspense(\r\n id: string,\r\n fallback: FlightElement,\r\n children: FlightElement[]\r\n): FlightSuspenseElement {\r\n return { $$type: 'suspense', id, fallback, children };\r\n}\r\n\r\n/**\r\n * Create a client component reference\r\n */\r\nexport function clientRef(refId: string, ssrHtml?: string): FlightClientElement {\r\n return { $$type: 'client', ref: refId, ssr: ssrHtml };\r\n}\r\n\r\n/**\r\n * Convert any value to a FlightElement\r\n */\r\nexport function toFlightElement(value: unknown): FlightElement {\r\n if (value === null || value === undefined || typeof value === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return { $$type: 'text', value: String(value) };\r\n }\r\n if (isFlightElement(value)) {\r\n return value;\r\n }\r\n // Unknown - render as null\r\n return { $$type: 'null' };\r\n}\r\n\r\n/**\r\n * Type guard for FlightElement\r\n */\r\nexport function isFlightElement(value: unknown): value is FlightElement {\r\n return typeof value === 'object' && value !== null && '$$type' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Chunk Builders\r\n// ============================================================================\r\n\r\nlet chunkIdCounter = 0;\r\n\r\n/**\r\n * Generate unique chunk ID\r\n */\r\nexport function generateChunkId(prefix = 'c'): string {\r\n return `${prefix}${chunkIdCounter++}`;\r\n}\r\n\r\n/**\r\n * Reset chunk ID counter (for testing)\r\n */\r\nexport function resetChunkIdCounter(): void {\r\n chunkIdCounter = 0;\r\n}\r\n\r\n/**\r\n * Create a server component chunk\r\n */\r\nexport function createServerChunk(\r\n id: string,\r\n tree: FlightElement,\r\n awaiting?: string[]\r\n): ServerComponentChunk {\r\n return {\r\n type: 'S',\r\n id,\r\n tree,\r\n awaiting,\r\n ts: Date.now(),\r\n };\r\n}\r\n\r\n/**\r\n * Create a client reference chunk\r\n */\r\nexport function createClientChunk(\r\n id: string,\r\n module: string,\r\n exportName: string,\r\n props: unknown,\r\n fallback?: string\r\n): ClientReferenceChunk {\r\n return {\r\n type: 'C',\r\n id,\r\n module,\r\n export: exportName,\r\n props: serialize(props),\r\n fallback,\r\n };\r\n}\r\n\r\n/**\r\n * Create a server reference (action) chunk\r\n */\r\nexport function createActionChunk(\r\n id: string,\r\n boundArgs?: unknown[]\r\n): ServerReferenceChunk {\r\n return {\r\n type: 'A',\r\n id,\r\n bound: boundArgs?.map(serialize),\r\n };\r\n}\r\n\r\n/**\r\n * Create an error chunk\r\n */\r\nexport function createErrorChunk(\r\n boundary: string,\r\n error: Error,\r\n includeStack = false\r\n): ErrorBoundaryChunk {\r\n return {\r\n type: 'E',\r\n boundary,\r\n message: error.message,\r\n digest: generateErrorDigest(error),\r\n stack: includeStack ? error.stack : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Create a hint chunk\r\n */\r\nexport function createHintChunk(\r\n hint: HintChunk['hint'],\r\n href: string,\r\n options?: { as?: HintChunk['as']; crossorigin?: HintChunk['crossorigin'] }\r\n): HintChunk {\r\n return {\r\n type: 'H',\r\n hint,\r\n href,\r\n ...options,\r\n };\r\n}\r\n\r\n/**\r\n * Generate error digest for correlation\r\n */\r\nfunction generateErrorDigest(error: Error): string {\r\n const str = `${error.name}:${error.message}:${Date.now()}`;\r\n // Simple hash for digest\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n}\r\n\r\n// ============================================================================\r\n// Custom Errors\r\n// ============================================================================\r\n\r\n/**\r\n * Error thrown during serialization\r\n */\r\nexport class FlightSerializationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'FlightSerializationError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown during payload processing\r\n */\r\nexport class FlightPayloadError extends Error {\r\n constructor(message: string, public readonly chunk?: FlightChunk) {\r\n super(message);\r\n this.name = 'FlightPayloadError';\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// src/streaming/adapters/index.ts
|
|
2
|
+
function createReactStreamAdapter(options) {
|
|
3
|
+
if (!options.renderToReadableStream) {
|
|
4
|
+
throw new Error(
|
|
5
|
+
"[Flight] createReactStreamAdapter requires renderToReadableStream. Import it from react-dom/server and pass it in options."
|
|
6
|
+
);
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
name: "react",
|
|
10
|
+
framework: "react@18+",
|
|
11
|
+
runtime: "edge",
|
|
12
|
+
async stream(component, streamOptions = {}) {
|
|
13
|
+
const mergedOptions = { ...options, ...streamOptions };
|
|
14
|
+
let resolveShell;
|
|
15
|
+
let resolveAll;
|
|
16
|
+
const shellReady = new Promise((r) => {
|
|
17
|
+
resolveShell = r;
|
|
18
|
+
});
|
|
19
|
+
const allReady = new Promise((r) => {
|
|
20
|
+
resolveAll = r;
|
|
21
|
+
});
|
|
22
|
+
const stream = await options.renderToReadableStream(component, {
|
|
23
|
+
bootstrapScripts: mergedOptions.bootstrapScripts,
|
|
24
|
+
bootstrapModules: mergedOptions.bootstrapModules,
|
|
25
|
+
identifierPrefix: mergedOptions.identifierPrefix,
|
|
26
|
+
signal: mergedOptions.signal,
|
|
27
|
+
onError: (error) => {
|
|
28
|
+
mergedOptions.onError?.(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
resolveShell();
|
|
32
|
+
mergedOptions.onShellReady?.();
|
|
33
|
+
stream.allReady.then(() => {
|
|
34
|
+
resolveAll();
|
|
35
|
+
mergedOptions.onAllReady?.();
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
stream,
|
|
39
|
+
abort: () => {
|
|
40
|
+
},
|
|
41
|
+
shellReady,
|
|
42
|
+
allReady
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
async renderToString(component) {
|
|
46
|
+
if (!options.renderToString) {
|
|
47
|
+
throw new Error("[Flight] renderToString not provided to adapter");
|
|
48
|
+
}
|
|
49
|
+
return options.renderToString(component);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function createVueStreamAdapter(options) {
|
|
54
|
+
if (!options.renderToWebStream) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
"[Flight] createVueStreamAdapter requires renderToWebStream. Import it from vue/server-renderer and pass it in options."
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
name: "vue",
|
|
61
|
+
framework: "vue@3+",
|
|
62
|
+
runtime: "universal",
|
|
63
|
+
async stream(app, streamOptions = {}) {
|
|
64
|
+
const mergedOptions = { ...options, ...streamOptions };
|
|
65
|
+
let resolveShell;
|
|
66
|
+
let resolveAll;
|
|
67
|
+
const shellReady = new Promise((r) => {
|
|
68
|
+
resolveShell = r;
|
|
69
|
+
});
|
|
70
|
+
const allReady = new Promise((r) => {
|
|
71
|
+
resolveAll = r;
|
|
72
|
+
});
|
|
73
|
+
try {
|
|
74
|
+
const stream = options.renderToWebStream(app, mergedOptions.context);
|
|
75
|
+
resolveShell();
|
|
76
|
+
mergedOptions.onShellReady?.();
|
|
77
|
+
const reader = stream.getReader();
|
|
78
|
+
const wrappedStream = new ReadableStream({
|
|
79
|
+
async pull(controller) {
|
|
80
|
+
const { done, value } = await reader.read();
|
|
81
|
+
if (done) {
|
|
82
|
+
resolveAll();
|
|
83
|
+
mergedOptions.onAllReady?.();
|
|
84
|
+
controller.close();
|
|
85
|
+
} else {
|
|
86
|
+
controller.enqueue(value);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
stream: wrappedStream,
|
|
92
|
+
abort: () => reader.cancel(),
|
|
93
|
+
shellReady,
|
|
94
|
+
allReady
|
|
95
|
+
};
|
|
96
|
+
} catch (error) {
|
|
97
|
+
mergedOptions.onError?.(error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
async renderToString(app) {
|
|
102
|
+
if (!options.renderToString) {
|
|
103
|
+
throw new Error("[Flight] renderToString not provided to adapter");
|
|
104
|
+
}
|
|
105
|
+
return options.renderToString(app);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function createSolidStreamAdapter(options) {
|
|
110
|
+
if (!options.renderToStream) {
|
|
111
|
+
throw new Error(
|
|
112
|
+
"[Flight] createSolidStreamAdapter requires renderToStream. Import it from solid-js/web and pass it in options."
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
name: "solid",
|
|
117
|
+
framework: "solid-js@1+",
|
|
118
|
+
runtime: "universal",
|
|
119
|
+
async stream(component, streamOptions = {}) {
|
|
120
|
+
const mergedOptions = { ...options, ...streamOptions };
|
|
121
|
+
let resolveShell;
|
|
122
|
+
let resolveAll;
|
|
123
|
+
const shellReady = new Promise((r) => {
|
|
124
|
+
resolveShell = r;
|
|
125
|
+
});
|
|
126
|
+
const allReady = new Promise((r) => {
|
|
127
|
+
resolveAll = r;
|
|
128
|
+
});
|
|
129
|
+
try {
|
|
130
|
+
const { readable, writable } = new TransformStream();
|
|
131
|
+
const result = options.renderToStream(component, {
|
|
132
|
+
nonce: mergedOptions.nonce,
|
|
133
|
+
onCompleteShell: () => {
|
|
134
|
+
resolveShell();
|
|
135
|
+
mergedOptions.onShellReady?.();
|
|
136
|
+
},
|
|
137
|
+
onCompleteAll: () => {
|
|
138
|
+
resolveAll();
|
|
139
|
+
mergedOptions.onAllReady?.();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
result.pipeTo(writable);
|
|
143
|
+
return {
|
|
144
|
+
stream: readable,
|
|
145
|
+
abort: () => writable.abort(),
|
|
146
|
+
shellReady,
|
|
147
|
+
allReady
|
|
148
|
+
};
|
|
149
|
+
} catch (error) {
|
|
150
|
+
mergedOptions.onError?.(error);
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
async renderToString(component) {
|
|
155
|
+
if (!options.renderToString) {
|
|
156
|
+
throw new Error("[Flight] renderToString not provided to adapter");
|
|
157
|
+
}
|
|
158
|
+
return options.renderToString(component);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function createSvelteStreamAdapter(options) {
|
|
163
|
+
if (!options.render) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
"[Flight] createSvelteStreamAdapter requires render. Import it from svelte/server and pass it in options."
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
name: "svelte",
|
|
170
|
+
framework: "svelte@5+",
|
|
171
|
+
runtime: "universal",
|
|
172
|
+
async stream(component, streamOptions = {}) {
|
|
173
|
+
const mergedOptions = { ...options, ...streamOptions };
|
|
174
|
+
let resolveShell;
|
|
175
|
+
let resolveAll;
|
|
176
|
+
const shellReady = new Promise((r) => {
|
|
177
|
+
resolveShell = r;
|
|
178
|
+
});
|
|
179
|
+
const allReady = new Promise((r) => {
|
|
180
|
+
resolveAll = r;
|
|
181
|
+
});
|
|
182
|
+
try {
|
|
183
|
+
const result = options.render(component, { props: mergedOptions.props || {} });
|
|
184
|
+
const html = result.body;
|
|
185
|
+
const encoder = new TextEncoder();
|
|
186
|
+
const stream = new ReadableStream({
|
|
187
|
+
start(controller) {
|
|
188
|
+
if (result.head) {
|
|
189
|
+
controller.enqueue(encoder.encode(result.head));
|
|
190
|
+
}
|
|
191
|
+
resolveShell();
|
|
192
|
+
mergedOptions.onShellReady?.();
|
|
193
|
+
controller.enqueue(encoder.encode(html));
|
|
194
|
+
resolveAll();
|
|
195
|
+
mergedOptions.onAllReady?.();
|
|
196
|
+
controller.close();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
stream,
|
|
201
|
+
abort: () => {
|
|
202
|
+
},
|
|
203
|
+
shellReady,
|
|
204
|
+
allReady
|
|
205
|
+
};
|
|
206
|
+
} catch (error) {
|
|
207
|
+
mergedOptions.onError?.(error);
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
async renderToString(component) {
|
|
212
|
+
const result = options.render(component, { props: options?.props || {} });
|
|
213
|
+
return result.body;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function createHTMXStreamAdapter(options) {
|
|
218
|
+
return {
|
|
219
|
+
name: "htmx",
|
|
220
|
+
framework: "htmx@2+",
|
|
221
|
+
runtime: "universal",
|
|
222
|
+
async stream(htmlChunks, streamOptions = {}) {
|
|
223
|
+
const mergedOptions = { ...options, ...streamOptions };
|
|
224
|
+
const eventName = mergedOptions.eventName || "message";
|
|
225
|
+
const retryMs = mergedOptions.retryMs || 3e3;
|
|
226
|
+
let resolveShell;
|
|
227
|
+
let resolveAll;
|
|
228
|
+
const shellReady = new Promise((r) => {
|
|
229
|
+
resolveShell = r;
|
|
230
|
+
});
|
|
231
|
+
const allReady = new Promise((r) => {
|
|
232
|
+
resolveAll = r;
|
|
233
|
+
});
|
|
234
|
+
const encoder = new TextEncoder();
|
|
235
|
+
let chunkIndex = 0;
|
|
236
|
+
const stream = new ReadableStream({
|
|
237
|
+
start(controller) {
|
|
238
|
+
controller.enqueue(encoder.encode(`retry: ${retryMs}
|
|
239
|
+
|
|
240
|
+
`));
|
|
241
|
+
resolveShell();
|
|
242
|
+
mergedOptions.onShellReady?.();
|
|
243
|
+
},
|
|
244
|
+
async pull(controller) {
|
|
245
|
+
if (chunkIndex >= htmlChunks.length) {
|
|
246
|
+
resolveAll();
|
|
247
|
+
mergedOptions.onAllReady?.();
|
|
248
|
+
controller.close();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const chunk = htmlChunks[chunkIndex++];
|
|
252
|
+
const sseData = `event: ${eventName}
|
|
253
|
+
data: ${JSON.stringify(chunk)}
|
|
254
|
+
|
|
255
|
+
`;
|
|
256
|
+
controller.enqueue(encoder.encode(sseData));
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
return {
|
|
260
|
+
stream,
|
|
261
|
+
abort: () => {
|
|
262
|
+
},
|
|
263
|
+
shellReady,
|
|
264
|
+
allReady
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function createStreamAdapter(framework, options) {
|
|
270
|
+
switch (framework) {
|
|
271
|
+
case "react":
|
|
272
|
+
return createReactStreamAdapter(options);
|
|
273
|
+
case "vue":
|
|
274
|
+
return createVueStreamAdapter(options);
|
|
275
|
+
case "solid":
|
|
276
|
+
return createSolidStreamAdapter(options);
|
|
277
|
+
case "svelte":
|
|
278
|
+
return createSvelteStreamAdapter(options);
|
|
279
|
+
case "htmx":
|
|
280
|
+
return createHTMXStreamAdapter(options);
|
|
281
|
+
default:
|
|
282
|
+
throw new Error(`[Flight] Unknown framework: ${framework}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter };
|
|
287
|
+
//# sourceMappingURL=chunk-MQQLYWZZ.js.map
|
|
288
|
+
//# sourceMappingURL=chunk-MQQLYWZZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/streaming/adapters/index.ts"],"names":[],"mappings":"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","file":"chunk-MQQLYWZZ.js","sourcesContent":["/**\r\n * @flight-framework/core - Multi-Framework Streaming Adapters\r\n * \r\n * Streaming SSR adapters for React, Vue, Svelte, Solid, and HTMX.\r\n * Uses dependency injection pattern for optional framework dependencies.\r\n * \r\n * Best Practices 2026:\r\n * - Dependency injection for optional peer dependencies\r\n * - Support both Node.js and Edge runtimes \r\n * - Progressive hydration support\r\n * - Error boundary integration\r\n * \r\n * @example\r\n * ```typescript\r\n * // React adapter with your imports\r\n * import { renderToReadableStream } from 'react-dom/server';\r\n * \r\n * const adapter = createReactStreamAdapter({\r\n * renderToReadableStream,\r\n * bootstrapModules: ['/client.js'],\r\n * });\r\n * ```\r\n */\r\n\r\nimport type { StreamingRenderOptions, StreamingRenderResult } from '../index.js';\r\n\r\n// ============================================================================\r\n// Common Types\r\n// ============================================================================\r\n\r\n/**\r\n * Framework-specific streaming adapter\r\n */\r\nexport interface StreamingAdapter<TComponent = unknown> {\r\n /** Adapter name */\r\n readonly name: string;\r\n /** Framework version support */\r\n readonly framework: string;\r\n /** Runtime support */\r\n readonly runtime: 'universal' | 'node' | 'edge';\r\n\r\n /**\r\n * Create a streaming response from a component\r\n */\r\n stream(\r\n component: TComponent,\r\n options?: StreamingRenderOptions\r\n ): Promise<StreamingRenderResult>;\r\n\r\n /**\r\n * Render to static string (for comparison/fallback)\r\n */\r\n renderToString?(component: TComponent): Promise<string>;\r\n}\r\n\r\n/**\r\n * Common adapter options\r\n */\r\nexport interface AdapterOptions {\r\n /** Enable streaming (default: true) */\r\n streaming?: boolean;\r\n /** Scripts to bootstrap on client */\r\n bootstrapScripts?: string[];\r\n /** Modules to bootstrap on client */\r\n bootstrapModules?: string[];\r\n /** Error handling strategy */\r\n onError?: (error: Error) => void;\r\n /** Shell ready callback */\r\n onShellReady?: () => void;\r\n /** All content ready callback */\r\n onAllReady?: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// React Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * React streaming adapter options with required dependencies\r\n */\r\nexport interface ReactAdapterOptions extends AdapterOptions {\r\n /** React's renderToReadableStream (for Edge) */\r\n renderToReadableStream?: (\r\n element: unknown,\r\n options?: {\r\n bootstrapScripts?: string[];\r\n bootstrapModules?: string[];\r\n identifierPrefix?: string;\r\n signal?: AbortSignal;\r\n onError?: (error: unknown) => void;\r\n }\r\n ) => Promise<ReadableStream<Uint8Array> & { allReady: Promise<void> }>;\r\n\r\n /** React's renderToString (for static fallback) */\r\n renderToString?: (element: unknown) => string;\r\n\r\n /** Custom identifier prefix */\r\n identifierPrefix?: string;\r\n /** Abort signal */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/**\r\n * Create a React streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToReadableStream, renderToString } from 'react-dom/server';\r\n * \r\n * const adapter = createReactStreamAdapter({\r\n * renderToReadableStream,\r\n * renderToString,\r\n * bootstrapModules: ['/client.js'],\r\n * });\r\n * \r\n * const result = await adapter.stream(<App />);\r\n * ```\r\n */\r\nexport function createReactStreamAdapter(options: ReactAdapterOptions): StreamingAdapter {\r\n if (!options.renderToReadableStream) {\r\n throw new Error(\r\n '[Flight] createReactStreamAdapter requires renderToReadableStream. ' +\r\n 'Import it from react-dom/server and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'react',\r\n framework: 'react@18+',\r\n runtime: 'edge',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n const stream = await options.renderToReadableStream!(component, {\r\n bootstrapScripts: mergedOptions.bootstrapScripts,\r\n bootstrapModules: mergedOptions.bootstrapModules,\r\n identifierPrefix: mergedOptions.identifierPrefix,\r\n signal: mergedOptions.signal,\r\n onError: (error: unknown) => {\r\n mergedOptions.onError?.(error as Error);\r\n },\r\n });\r\n\r\n // Shell is ready when stream is created\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Track all ready via stream completion\r\n stream.allReady.then(() => {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { /* stream handles abort via signal */ },\r\n shellReady,\r\n allReady,\r\n };\r\n },\r\n\r\n async renderToString(component) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(component);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Vue Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Vue streaming adapter options\r\n */\r\nexport interface VueAdapterOptions extends AdapterOptions {\r\n /** Vue's renderToWebStream */\r\n renderToWebStream?: (app: unknown, context?: Record<string, unknown>) => ReadableStream;\r\n /** Vue's renderToString */\r\n renderToString?: (app: unknown) => Promise<string>;\r\n /** Vue app context */\r\n context?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Create a Vue 3 streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToWebStream, renderToString } from 'vue/server-renderer';\r\n * \r\n * const adapter = createVueStreamAdapter({\r\n * renderToWebStream,\r\n * renderToString,\r\n * });\r\n * \r\n * const result = await adapter.stream(createSSRApp(App));\r\n * ```\r\n */\r\nexport function createVueStreamAdapter(options: VueAdapterOptions): StreamingAdapter {\r\n if (!options.renderToWebStream) {\r\n throw new Error(\r\n '[Flight] createVueStreamAdapter requires renderToWebStream. ' +\r\n 'Import it from vue/server-renderer and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'vue',\r\n framework: 'vue@3+',\r\n runtime: 'universal',\r\n\r\n async stream(app, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n const stream = options.renderToWebStream!(app, mergedOptions.context);\r\n\r\n // Vue streams shell immediately\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Wrap to detect completion\r\n const reader = stream.getReader();\r\n\r\n const wrappedStream = new ReadableStream<Uint8Array>({\r\n async pull(controller) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n } else {\r\n controller.enqueue(value);\r\n }\r\n },\r\n });\r\n\r\n return {\r\n stream: wrappedStream,\r\n abort: () => reader.cancel(),\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(app) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(app);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Solid Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Solid streaming adapter options\r\n */\r\nexport interface SolidAdapterOptions extends AdapterOptions {\r\n /** Solid's renderToStream */\r\n renderToStream?: (\r\n fn: () => unknown,\r\n options?: {\r\n nonce?: string;\r\n onCompleteShell?: () => void;\r\n onCompleteAll?: () => void;\r\n }\r\n ) => { pipeTo: (writable: WritableStream) => void };\r\n /** Solid's renderToString */\r\n renderToString?: (fn: () => unknown) => string;\r\n /** Nonce for CSP */\r\n nonce?: string;\r\n}\r\n\r\n/**\r\n * Create a Solid.js streaming adapter\r\n * \r\n * @example\r\n * ```typescript\r\n * import { renderToStream, renderToString } from 'solid-js/web';\r\n * \r\n * const adapter = createSolidStreamAdapter({\r\n * renderToStream,\r\n * renderToString,\r\n * });\r\n * \r\n * const result = await adapter.stream(() => <App />);\r\n * ```\r\n */\r\nexport function createSolidStreamAdapter(options: SolidAdapterOptions): StreamingAdapter {\r\n if (!options.renderToStream) {\r\n throw new Error(\r\n '[Flight] createSolidStreamAdapter requires renderToStream. ' +\r\n 'Import it from solid-js/web and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'solid',\r\n framework: 'solid-js@1+',\r\n runtime: 'universal',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>();\r\n\r\n // Solid's renderToStream with async options\r\n const result = options.renderToStream!(component as () => unknown, {\r\n nonce: mergedOptions.nonce,\r\n onCompleteShell: () => {\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n },\r\n onCompleteAll: () => {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n },\r\n });\r\n\r\n // Pipe to transform stream\r\n result.pipeTo(writable);\r\n\r\n return {\r\n stream: readable,\r\n abort: () => writable.abort(),\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(component) {\r\n if (!options.renderToString) {\r\n throw new Error('[Flight] renderToString not provided to adapter');\r\n }\r\n return options.renderToString(component as () => unknown);\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Svelte Adapter (Dependency Injection Pattern)\r\n// ============================================================================\r\n\r\n/**\r\n * Svelte streaming adapter options\r\n */\r\nexport interface SvelteAdapterOptions extends AdapterOptions {\r\n /** Svelte's render function */\r\n render?: (\r\n component: unknown,\r\n options?: { props?: Record<string, unknown> }\r\n ) => { body: string; head?: string };\r\n /** Props for the component */\r\n props?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Create a Svelte 5 streaming adapter\r\n * Note: Svelte's SSR is primarily string-based, streaming is simulated\r\n * \r\n * @example\r\n * ```typescript\r\n * import { render } from 'svelte/server';\r\n * \r\n * const adapter = createSvelteStreamAdapter({\r\n * render,\r\n * props: { name: 'World' },\r\n * });\r\n * \r\n * const result = await adapter.stream(App);\r\n * ```\r\n */\r\nexport function createSvelteStreamAdapter(options: SvelteAdapterOptions): StreamingAdapter {\r\n if (!options.render) {\r\n throw new Error(\r\n '[Flight] createSvelteStreamAdapter requires render. ' +\r\n 'Import it from svelte/server and pass it in options.'\r\n );\r\n }\r\n\r\n return {\r\n name: 'svelte',\r\n framework: 'svelte@5+',\r\n runtime: 'universal',\r\n\r\n async stream(component, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n try {\r\n // Render to string first\r\n const result = options.render!(component, { props: mergedOptions.props || {} });\r\n const html = result.body;\r\n\r\n // Convert to stream\r\n const encoder = new TextEncoder();\r\n const stream = new ReadableStream<Uint8Array>({\r\n start(controller) {\r\n // Send head/css first\r\n if (result.head) {\r\n controller.enqueue(encoder.encode(result.head));\r\n }\r\n\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n\r\n // Send body\r\n controller.enqueue(encoder.encode(html));\r\n\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { },\r\n shellReady,\r\n allReady,\r\n };\r\n } catch (error) {\r\n mergedOptions.onError?.(error as Error);\r\n throw error;\r\n }\r\n },\r\n\r\n async renderToString(component) {\r\n const result = options.render!(component, { props: options?.props || {} });\r\n return result.body;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HTMX Streaming Adapter (SSE-based)\r\n// ============================================================================\r\n\r\n/**\r\n * HTMX streaming adapter options\r\n */\r\nexport interface HTMXAdapterOptions extends AdapterOptions {\r\n /** Event name for SSE */\r\n eventName?: string;\r\n /** Retry interval for SSE */\r\n retryMs?: number;\r\n}\r\n\r\n/**\r\n * Create an HTMX SSE streaming adapter\r\n * Uses Server-Sent Events for progressive updates\r\n * \r\n * @example\r\n * ```typescript\r\n * const adapter = createHTMXStreamAdapter({\r\n * eventName: 'update',\r\n * retryMs: 3000,\r\n * });\r\n * \r\n * const result = await adapter.stream(['<div>Part 1</div>', '<div>Part 2</div>']);\r\n * ```\r\n */\r\nexport function createHTMXStreamAdapter(options?: HTMXAdapterOptions): StreamingAdapter<string[]> {\r\n return {\r\n name: 'htmx',\r\n framework: 'htmx@2+',\r\n runtime: 'universal',\r\n\r\n async stream(htmlChunks, streamOptions = {}) {\r\n const mergedOptions = { ...options, ...streamOptions };\r\n const eventName = mergedOptions.eventName || 'message';\r\n const retryMs = mergedOptions.retryMs || 3000;\r\n\r\n let resolveShell: () => void;\r\n let resolveAll: () => void;\r\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\r\n const allReady = new Promise<void>((r) => { resolveAll = r; });\r\n\r\n const encoder = new TextEncoder();\r\n let chunkIndex = 0;\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n start(controller) {\r\n // Send retry configuration\r\n controller.enqueue(encoder.encode(`retry: ${retryMs}\\n\\n`));\r\n resolveShell!();\r\n mergedOptions.onShellReady?.();\r\n },\r\n\r\n async pull(controller) {\r\n if (chunkIndex >= htmlChunks.length) {\r\n resolveAll!();\r\n mergedOptions.onAllReady?.();\r\n controller.close();\r\n return;\r\n }\r\n\r\n const chunk = htmlChunks[chunkIndex++];\r\n const sseData = `event: ${eventName}\\ndata: ${JSON.stringify(chunk)}\\n\\n`;\r\n controller.enqueue(encoder.encode(sseData));\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n abort: () => { },\r\n shellReady,\r\n allReady,\r\n };\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Factory\r\n// ============================================================================\r\n\r\nexport type FrameworkType = 'react' | 'vue' | 'solid' | 'svelte' | 'htmx';\r\n\r\n/**\r\n * Create a streaming adapter for any supported framework\r\n * Note: For react, vue, solid, svelte you need to pass the required dependencies\r\n */\r\nexport function createStreamAdapter(\r\n framework: FrameworkType,\r\n options?: AdapterOptions & Record<string, unknown>\r\n): StreamingAdapter {\r\n switch (framework) {\r\n case 'react':\r\n return createReactStreamAdapter(options as ReactAdapterOptions);\r\n case 'vue':\r\n return createVueStreamAdapter(options as VueAdapterOptions);\r\n case 'solid':\r\n return createSolidStreamAdapter(options as SolidAdapterOptions);\r\n case 'svelte':\r\n return createSvelteStreamAdapter(options as SvelteAdapterOptions);\r\n case 'htmx':\r\n return createHTMXStreamAdapter(options as HTMXAdapterOptions);\r\n default:\r\n throw new Error(`[Flight] Unknown framework: ${framework}`);\r\n }\r\n}\r\n"]}
|