@flight-framework/core 0.3.2 → 0.4.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.
Files changed (141) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +541 -541
  3. package/dist/actions/index.js +1 -1
  4. package/dist/adapters/index.d.ts +138 -1
  5. package/dist/adapters/index.js +1 -1
  6. package/dist/cache/index.js +1 -1
  7. package/dist/{chunk-3UQJE3XZ.js → chunk-2F2QU6RC.js} +2 -2
  8. package/dist/chunk-2F2QU6RC.js.map +1 -0
  9. package/dist/{chunk-4U7CJVNQ.js → chunk-3KRBRSRJ.js} +2 -2
  10. package/dist/chunk-3KRBRSRJ.js.map +1 -0
  11. package/dist/{chunk-OZ3EXPLE.js → chunk-3QP3E7HS.js} +2 -2
  12. package/dist/chunk-3QP3E7HS.js.map +1 -0
  13. package/dist/{chunk-CKJHJPKQ.js → chunk-62C7LX2E.js} +2 -2
  14. package/dist/chunk-62C7LX2E.js.map +1 -0
  15. package/dist/{chunk-YNTMYL36.js → chunk-6BDCTUQY.js} +3 -3
  16. package/dist/chunk-6BDCTUQY.js.map +1 -0
  17. package/dist/{chunk-KDEA64UX.js → chunk-EGB7C73X.js} +5 -5
  18. package/dist/chunk-EGB7C73X.js.map +1 -0
  19. package/dist/{chunk-2JVEH76V.js → chunk-FSJNOPYE.js} +3 -3
  20. package/dist/chunk-FSJNOPYE.js.map +1 -0
  21. package/dist/{chunk-ARBKF6VI.js → chunk-GCQZ4FHI.js} +2 -2
  22. package/dist/{chunk-ARBKF6VI.js.map → chunk-GCQZ4FHI.js.map} +1 -1
  23. package/dist/{chunk-EHVUAFNH.js → chunk-IXMD5QH2.js} +2 -2
  24. package/dist/chunk-IXMD5QH2.js.map +1 -0
  25. package/dist/{chunk-6GI6HFSQ.js → chunk-K2CQZPCG.js} +2 -2
  26. package/dist/chunk-K2CQZPCG.js.map +1 -0
  27. package/dist/chunk-K5NYYNFS.js +311 -0
  28. package/dist/chunk-K5NYYNFS.js.map +1 -0
  29. package/dist/{chunk-6IG6XIXU.js → chunk-LNV47HGV.js} +2 -2
  30. package/dist/chunk-LNV47HGV.js.map +1 -0
  31. package/dist/{chunk-65JYF3DJ.js → chunk-MDQNNIHH.js} +2 -2
  32. package/dist/chunk-MDQNNIHH.js.map +1 -0
  33. package/dist/{chunk-GNS2FGPC.js → chunk-MQQLYWZZ.js} +2 -2
  34. package/dist/chunk-MQQLYWZZ.js.map +1 -0
  35. package/dist/{chunk-LAKHYTHL.js → chunk-NWMJYTMB.js} +3 -3
  36. package/dist/chunk-NWMJYTMB.js.map +1 -0
  37. package/dist/{chunk-R7MEVVA4.js → chunk-OYF2OAKS.js} +2 -2
  38. package/dist/chunk-OYF2OAKS.js.map +1 -0
  39. package/dist/{chunk-FRAH5QNY.js → chunk-P6WSBVDT.js} +4 -4
  40. package/dist/chunk-P6WSBVDT.js.map +1 -0
  41. package/dist/{chunk-5XHOLZBJ.js → chunk-PDW5WCMW.js} +2 -2
  42. package/dist/chunk-PDW5WCMW.js.map +1 -0
  43. package/dist/{chunk-A2QRUBVE.js → chunk-PVUMB632.js} +2 -2
  44. package/dist/chunk-PVUMB632.js.map +1 -0
  45. package/dist/{chunk-LKOPJ3GS.js → chunk-R7SQAREQ.js} +2 -2
  46. package/dist/chunk-R7SQAREQ.js.map +1 -0
  47. package/dist/{chunk-CNY3ZUVG.js → chunk-RSVA2EYO.js} +2 -2
  48. package/dist/chunk-RSVA2EYO.js.map +1 -0
  49. package/dist/{chunk-PAVI5W6M.js → chunk-T4Z4HM4W.js} +3 -3
  50. package/dist/chunk-T4Z4HM4W.js.map +1 -0
  51. package/dist/{chunk-HNPO6LFW.js → chunk-TASAT7KB.js} +2 -2
  52. package/dist/chunk-TASAT7KB.js.map +1 -0
  53. package/dist/{chunk-3N5ZBVZJ.js → chunk-VPFMHGEV.js} +2 -2
  54. package/dist/chunk-VPFMHGEV.js.map +1 -0
  55. package/dist/{chunk-A4TKWQBU.js → chunk-W6D62JCI.js} +2 -2
  56. package/dist/chunk-W6D62JCI.js.map +1 -0
  57. package/dist/{chunk-UFWGOJL7.js → chunk-WFAWAHJH.js} +2 -2
  58. package/dist/chunk-WFAWAHJH.js.map +1 -0
  59. package/dist/{chunk-NZS2YJ43.js → chunk-WOEIJWGJ.js} +2 -2
  60. package/dist/chunk-WOEIJWGJ.js.map +1 -0
  61. package/dist/{chunk-VNO2YUVD.js → chunk-XOIYNY4I.js} +2 -2
  62. package/dist/chunk-XOIYNY4I.js.map +1 -0
  63. package/dist/{chunk-PO7IHPFF.js → chunk-XSY5AAXT.js} +2 -2
  64. package/dist/chunk-XSY5AAXT.js.map +1 -0
  65. package/dist/{chunk-OZBPR27I.js → chunk-YHEVHRLH.js} +2 -2
  66. package/dist/chunk-YHEVHRLH.js.map +1 -0
  67. package/dist/{chunk-XU6MRYG2.js → chunk-ZIE56LCA.js} +3 -3
  68. package/dist/chunk-ZIE56LCA.js.map +1 -0
  69. package/dist/{chunk-B2LPSCES.js → chunk-ZVC3ZWLM.js} +2 -2
  70. package/dist/chunk-ZVC3ZWLM.js.map +1 -0
  71. package/dist/client.js +8 -8
  72. package/dist/client.js.map +1 -1
  73. package/dist/config/index.js +1 -1
  74. package/dist/errors/index.js +2 -2
  75. package/dist/file-router/index.js +1 -1
  76. package/dist/file-router/streaming-hints.js +1 -1
  77. package/dist/handlers/index.js +1 -1
  78. package/dist/index.js +30 -30
  79. package/dist/index.js.map +1 -1
  80. package/dist/islands/index.js +1 -1
  81. package/dist/middleware/index.js +1 -1
  82. package/dist/react/index.js +2 -2
  83. package/dist/react/index.js.map +1 -1
  84. package/dist/render/index.js +1 -1
  85. package/dist/router/index.js +1 -1
  86. package/dist/rsc/adapters/index.js +4 -4
  87. package/dist/rsc/adapters/preact.js +1 -1
  88. package/dist/rsc/adapters/react.js +1 -1
  89. package/dist/rsc/adapters/solid.js +1 -1
  90. package/dist/rsc/adapters/vue.js +1 -1
  91. package/dist/rsc/boundaries.js +1 -1
  92. package/dist/rsc/context.js +1 -1
  93. package/dist/rsc/index.js +11 -11
  94. package/dist/rsc/legacy.js +1 -1
  95. package/dist/rsc/payload.js +1 -1
  96. package/dist/rsc/plugins/esbuild.js +2 -2
  97. package/dist/rsc/plugins/index.js +4 -4
  98. package/dist/rsc/plugins/rollup.js +2 -2
  99. package/dist/rsc/renderer.js +3 -3
  100. package/dist/rsc/stream.js +1 -1
  101. package/dist/rsc/vite-plugin.js +2 -2
  102. package/dist/server/index.js +4 -4
  103. package/dist/streaming/adapters/index.js +1 -1
  104. package/dist/streaming/conditional.js +1 -1
  105. package/dist/streaming/index.js +1 -1
  106. package/dist/streaming/observability.js +2 -2
  107. package/dist/streaming/priority.js +1 -1
  108. package/dist/utils/index.js +1 -1
  109. package/package.json +1 -1
  110. package/dist/chunk-2JVEH76V.js.map +0 -1
  111. package/dist/chunk-3N5ZBVZJ.js.map +0 -1
  112. package/dist/chunk-3UQJE3XZ.js.map +0 -1
  113. package/dist/chunk-4U7CJVNQ.js.map +0 -1
  114. package/dist/chunk-5XHOLZBJ.js.map +0 -1
  115. package/dist/chunk-65JYF3DJ.js.map +0 -1
  116. package/dist/chunk-6GI6HFSQ.js.map +0 -1
  117. package/dist/chunk-6IG6XIXU.js.map +0 -1
  118. package/dist/chunk-A2QRUBVE.js.map +0 -1
  119. package/dist/chunk-A4TKWQBU.js.map +0 -1
  120. package/dist/chunk-B2LPSCES.js.map +0 -1
  121. package/dist/chunk-CKJHJPKQ.js.map +0 -1
  122. package/dist/chunk-CNY3ZUVG.js.map +0 -1
  123. package/dist/chunk-EHVUAFNH.js.map +0 -1
  124. package/dist/chunk-FRAH5QNY.js.map +0 -1
  125. package/dist/chunk-GNS2FGPC.js.map +0 -1
  126. package/dist/chunk-HNPO6LFW.js.map +0 -1
  127. package/dist/chunk-KDEA64UX.js.map +0 -1
  128. package/dist/chunk-LAKHYTHL.js.map +0 -1
  129. package/dist/chunk-LKOPJ3GS.js.map +0 -1
  130. package/dist/chunk-NZS2YJ43.js.map +0 -1
  131. package/dist/chunk-OZ3EXPLE.js.map +0 -1
  132. package/dist/chunk-OZBPR27I.js.map +0 -1
  133. package/dist/chunk-PAVI5W6M.js.map +0 -1
  134. package/dist/chunk-PO7IHPFF.js.map +0 -1
  135. package/dist/chunk-QK6UEQ75.js +0 -13
  136. package/dist/chunk-QK6UEQ75.js.map +0 -1
  137. package/dist/chunk-R7MEVVA4.js.map +0 -1
  138. package/dist/chunk-UFWGOJL7.js.map +0 -1
  139. package/dist/chunk-VNO2YUVD.js.map +0 -1
  140. package/dist/chunk-XU6MRYG2.js.map +0 -1
  141. package/dist/chunk-YNTMYL36.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/plugins/rollup.ts"],"names":["exports"],"mappings":"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","file":"chunk-NWMJYTMB.js","sourcesContent":["/**\r\n * @flight-framework/core - Rollup Plugin for RSC\r\n * \r\n * Rollup plugin for Flight Server Components.\r\n * Transforms 'use client' and 'use server' directives at build time.\r\n * \r\n * Philosophy: Zero lock-in - Rollup is optional, user decides bundler.\r\n * \r\n * @module @flight-framework/core/rsc/plugins/rollup\r\n */\r\n\r\nimport {\r\n analyzeModule,\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectInlineServerActions,\r\n} from '../boundaries.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Rollup Plugin interface (minimal)\r\n * We define our own to avoid requiring rollup as dependency\r\n */\r\nexport interface RollupPlugin {\r\n name: string;\r\n buildStart?: (options: unknown) => void | Promise<void>;\r\n resolveId?: (\r\n source: string,\r\n importer: string | undefined,\r\n options: { isEntry: boolean }\r\n ) => string | null | undefined | { id: string; external?: boolean } | Promise<string | null | undefined | { id: string; external?: boolean }>;\r\n load?: (id: string) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n transform?: (\r\n code: string,\r\n id: string\r\n ) => string | null | undefined | { code: string; map?: unknown } | Promise<string | null | undefined | { code: string; map?: unknown }>;\r\n generateBundle?: (\r\n options: unknown,\r\n bundle: Record<string, unknown>\r\n ) => void | Promise<void>;\r\n buildEnd?: (error?: Error) => void | Promise<void>;\r\n}\r\n\r\nexport interface RollupPluginContext {\r\n emitFile: (file: { type: 'asset' | 'chunk'; fileName?: string; source?: string; id?: string }) => string;\r\n warn: (message: string) => void;\r\n error: (message: string) => never;\r\n}\r\n\r\n/**\r\n * Plugin configuration\r\n */\r\nexport interface FlightRollupPluginOptions {\r\n /** Include patterns (regex or function) */\r\n include?: RegExp | ((id: string) => boolean);\r\n\r\n /** Exclude patterns (regex or function) */\r\n exclude?: RegExp | ((id: string) => boolean);\r\n\r\n /** Server actions endpoint */\r\n actionsEndpoint?: string;\r\n\r\n /** Client manifest filename */\r\n clientManifest?: string;\r\n\r\n /** Server manifest filename */\r\n serverManifest?: string;\r\n\r\n /** Is this for SSR build? */\r\n ssr?: boolean;\r\n\r\n /** Dev mode */\r\n dev?: boolean;\r\n}\r\n\r\n/**\r\n * Manifest entry\r\n */\r\nexport interface ManifestEntry {\r\n id: string;\r\n file: string;\r\n exports: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Plugin State\r\n// ============================================================================\r\n\r\ninterface PluginState {\r\n clientModules: Map<string, ManifestEntry>;\r\n serverActions: Map<string, ManifestEntry>;\r\n}\r\n\r\n// ============================================================================\r\n// Plugin Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight RSC Rollup Plugin\r\n * \r\n * @example\r\n * ```typescript\r\n * // rollup.config.js\r\n * import { flightRSCRollup } from '@flight-framework/core/rsc/plugins/rollup';\r\n * \r\n * export default {\r\n * input: 'src/index.tsx',\r\n * output: { dir: 'dist', format: 'esm' },\r\n * plugins: [\r\n * flightRSCRollup({\r\n * ssr: true,\r\n * actionsEndpoint: '/_flight/action',\r\n * }),\r\n * ],\r\n * };\r\n * ```\r\n */\r\nexport function flightRSCRollup(options: FlightRollupPluginOptions = {}): RollupPlugin {\r\n const {\r\n include = /\\.(tsx?|jsx?)$/,\r\n exclude = /node_modules/,\r\n actionsEndpoint = '/_flight/action',\r\n clientManifest = '.flight/client-manifest.json',\r\n serverManifest = '.flight/server-manifest.json',\r\n ssr = false,\r\n dev = false,\r\n } = options;\r\n\r\n const state: PluginState = {\r\n clientModules: new Map(),\r\n serverActions: new Map(),\r\n };\r\n\r\n const shouldInclude = (id: string): boolean => {\r\n if (typeof include === 'function') return include(id);\r\n return include.test(id);\r\n };\r\n\r\n const shouldExclude = (id: string): boolean => {\r\n if (typeof exclude === 'function') return exclude(id);\r\n return exclude.test(id);\r\n };\r\n\r\n return {\r\n name: 'flight-rsc',\r\n\r\n // ================================================================\r\n // buildStart: Reset state\r\n // ================================================================\r\n buildStart() {\r\n state.clientModules.clear();\r\n state.serverActions.clear();\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Build started (SSR: ${ssr})`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // transform: Analyze and transform modules\r\n // ================================================================\r\n transform(code: string, id: string) {\r\n // Skip non-matching files\r\n if (!shouldInclude(id) || shouldExclude(id)) {\r\n return null;\r\n }\r\n\r\n // Analyze module\r\n const analysis = analyzeModule(code, id);\r\n const moduleId = createModuleId(id);\r\n\r\n // Track client modules\r\n if (analysis.fileDirective === 'client') {\r\n state.clientModules.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.clientComponents,\r\n });\r\n }\r\n\r\n // Track server actions\r\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\r\n state.serverActions.set(id, {\r\n id: moduleId,\r\n file: id,\r\n exports: analysis.serverActions.length > 0\r\n ? analysis.serverActions\r\n : extractExportNames(code),\r\n });\r\n }\r\n\r\n // Transform based on build type\r\n if (ssr) {\r\n // SSR build: Transform 'use client' to references\r\n if (hasUseClientDirective(code)) {\r\n return {\r\n code: transformClientForSSR(code, moduleId),\r\n map: null,\r\n };\r\n }\r\n } else {\r\n // Client build: Transform 'use server' to RPC calls\r\n if (hasUseServerDirective(code)) {\r\n return {\r\n code: transformServerForClient(code, moduleId, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n\r\n // Transform inline server actions\r\n const inlineActions = detectInlineServerActions(code);\r\n if (inlineActions.length > 0) {\r\n return {\r\n code: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\r\n map: null,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // ================================================================\r\n // generateBundle: Emit manifests\r\n // ================================================================\r\n generateBundle(this: RollupPluginContext) {\r\n // Emit client manifest\r\n if (state.clientModules.size > 0) {\r\n const manifest = Object.fromEntries(state.clientModules);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: clientManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n // Emit server manifest\r\n if (state.serverActions.size > 0) {\r\n const manifest = Object.fromEntries(state.serverActions);\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: serverManifest,\r\n source: JSON.stringify(manifest, null, 2),\r\n });\r\n }\r\n\r\n if (dev) {\r\n console.log(`[Flight RSC Rollup] Client modules: ${state.clientModules.size}`);\r\n console.log(`[Flight RSC Rollup] Server actions: ${state.serverActions.size}`);\r\n }\r\n },\r\n\r\n // ================================================================\r\n // buildEnd: Cleanup\r\n // ================================================================\r\n buildEnd(error?: Error) {\r\n if (error && dev) {\r\n console.error('[Flight RSC Rollup] Build failed:', error.message);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Transform Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Transform 'use client' module for SSR build\r\n */\r\nfunction transformClientForSSR(code: string, moduleId: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Client Component Reference (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n if (exportName === 'default') {\r\n transformed += `\r\nconst __flight_default = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#default',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: 'default',\r\n }\r\n);\r\nexport default __flight_default;\r\n`;\r\n } else {\r\n transformed += `\r\nexport const ${exportName} = Object.assign(\r\n function() {\r\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\r\n },\r\n {\r\n $$typeof: Symbol.for('flight.client.reference'),\r\n $$id: __flight_module_id + '#${exportName}',\r\n $$async: false,\r\n __flight_client: true,\r\n __flight_module: __flight_module_id,\r\n __flight_export: '${exportName}',\r\n }\r\n);\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform 'use server' module for client build\r\n */\r\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\r\n const exports = extractExportNames(code);\r\n\r\n let transformed = `\r\n// Flight RSC: Server Actions RPC Proxies (Rollup)\r\n// Original module: ${moduleId}\r\n\r\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\r\nconst __flight_module_id = ${JSON.stringify(moduleId)};\r\n\r\nasync function __flight_rpc(actionId, args) {\r\n const response = await fetch(__flight_endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Flight-Action': actionId,\r\n },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n \r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\r\n throw new Error(error.message || 'Server action failed');\r\n }\r\n \r\n return response.json();\r\n}\r\n\r\n`;\r\n\r\n for (const exportName of exports) {\r\n const actionId = `${moduleId}#${exportName}`;\r\n if (exportName === 'default') {\r\n transformed += `\r\nexport default async function(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n } else {\r\n transformed += `\r\nexport async function ${exportName}(...args) {\r\n return __flight_rpc(${JSON.stringify(actionId)}, args);\r\n}\r\n`;\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n/**\r\n * Transform inline server actions\r\n */\r\nfunction transformInlineActions(\r\n code: string,\r\n moduleId: string,\r\n actions: string[],\r\n endpoint: string\r\n): string {\r\n let transformed = code;\r\n\r\n // Add RPC helper\r\n const rpcHelper = `\r\n// Flight RSC: Inline Server Action Helpers (Rollup)\r\nconst __flight_inline_endpoint = ${JSON.stringify(endpoint)};\r\nasync function __flight_inline_rpc(actionId, args) {\r\n const response = await fetch(__flight_inline_endpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\r\n body: JSON.stringify({ actionId, args }),\r\n });\r\n if (!response.ok) throw new Error('Server action failed');\r\n return response.json();\r\n}\r\n`;\r\n\r\n // Insert after imports\r\n const lastImportMatch = code.match(/^import\\s.+$/gm);\r\n if (lastImportMatch) {\r\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\r\n const insertPos = code.indexOf(lastImport) + lastImport.length;\r\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\r\n } else {\r\n transformed = rpcHelper + code;\r\n }\r\n\r\n // Transform action functions\r\n for (const actionName of actions) {\r\n const actionId = `${moduleId}#${actionName}`;\r\n\r\n const patterns = [\r\n new RegExp(\r\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n new RegExp(\r\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\r\n 'g'\r\n ),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n transformed = transformed.replace(\r\n pattern,\r\n `async function ${actionName}(...args) { return __flight_inline_rpc(${JSON.stringify(actionId)}, args); }`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create module ID from file path\r\n */\r\nfunction createModuleId(filePath: string): string {\r\n let id = filePath.replace(/\\\\/g, '/');\r\n\r\n const prefixes = ['/src/', 'src/', 'packages/', '/packages/'];\r\n for (const prefix of prefixes) {\r\n const idx = id.indexOf(prefix);\r\n if (idx !== -1) {\r\n id = id.slice(idx);\r\n break;\r\n }\r\n }\r\n\r\n if (!id.startsWith('/')) {\r\n id = '/' + id;\r\n }\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * Extract export names from source code\r\n */\r\nfunction extractExportNames(code: string): string[] {\r\n const exports: string[] = [];\r\n\r\n if (/export\\s+default\\s+/.test(code)) {\r\n exports.push('default');\r\n }\r\n\r\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\r\n let match;\r\n while ((match = namedPattern.exec(code)) !== null) {\r\n if (match[1] && match[1] !== 'default') {\r\n exports.push(match[1]);\r\n }\r\n }\r\n\r\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\r\n while ((match = bracketPattern.exec(code)) !== null) {\r\n if (match[1]) {\r\n const names = match[1].split(',').map(n => {\r\n const parts = n.trim().split(/\\s+as\\s+/);\r\n return parts[parts.length - 1]?.trim() || '';\r\n });\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\nexport default flightRSCRollup;\r\n"]}
@@ -390,5 +390,5 @@ function compose(...middlewares) {
390
390
  }
391
391
 
392
392
  export { compose, compress, cors, createContextFromRequest, createMiddlewareChain, createResponseFromContext, errorHandler, logger, securityHeaders };
393
- //# sourceMappingURL=chunk-R7MEVVA4.js.map
394
- //# sourceMappingURL=chunk-R7MEVVA4.js.map
393
+ //# sourceMappingURL=chunk-OYF2OAKS.js.map
394
+ //# sourceMappingURL=chunk-OYF2OAKS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/index.ts"],"names":[],"mappings":"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","file":"chunk-OYF2OAKS.js","sourcesContent":["/**\r\n * Flight Middleware - Composable request/response handlers\r\n * \r\n * Framework-agnostic middleware system inspired by Koa/Hono.\r\n * Provides primitives for building your own middleware solutions.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Type-safe middleware with custom variables (Hono pattern)\r\n * interface MyLocals {\r\n * user: { id: string; role: string };\r\n * requestId: string;\r\n * }\r\n * \r\n * const authMiddleware: Middleware<MyLocals> = async (ctx, next) => {\r\n * ctx.locals.user = { id: '123', role: 'admin' };\r\n * await next();\r\n * };\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Request context passed through middleware chain.\r\n * \r\n * Supports generic type parameter for type-safe locals (like Hono Variables).\r\n * \r\n * @typeParam TLocals - Type of the locals object for type-safe middleware data sharing\r\n * \r\n * @example\r\n * ```typescript\r\n * interface AppLocals {\r\n * user: User;\r\n * db: DatabaseClient;\r\n * }\r\n * \r\n * const ctx: MiddlewareContext<AppLocals> = createContextFromRequest(request);\r\n * ctx.locals.user = currentUser; // Type-safe!\r\n * ```\r\n */\r\nexport interface MiddlewareContext<TLocals extends Record<string, unknown> = Record<string, unknown>> {\r\n /** Request URL */\r\n url: URL;\r\n /** Request method */\r\n method: string;\r\n /** Request headers */\r\n headers: Headers;\r\n /** URL parameters from routing */\r\n params: Record<string, string | string[]>;\r\n /** Query parameters */\r\n query: URLSearchParams;\r\n /** Parsed request body (if any) */\r\n body?: unknown;\r\n /** Local data shared between middleware - type-safe with generics */\r\n locals: TLocals;\r\n /** Original request (platform-specific) */\r\n request?: Request;\r\n\r\n // Response building\r\n /** Response status code */\r\n status: number;\r\n /** Response headers */\r\n responseHeaders: Headers;\r\n /** Response body */\r\n responseBody?: BodyInit | null;\r\n}\r\n\r\n/** Next function to call the next middleware */\r\nexport type MiddlewareNext = () => Promise<void>;\r\n\r\n/**\r\n * Middleware function signature with optional typed locals.\r\n * \r\n * @typeParam TLocals - Type of the locals object for type-safe data sharing\r\n */\r\nexport type Middleware<TLocals extends Record<string, unknown> = Record<string, unknown>> = (\r\n ctx: MiddlewareContext<TLocals>,\r\n next: MiddlewareNext\r\n) => Promise<void> | void;\r\n\r\n/** Middleware with optional path matching */\r\nexport interface MiddlewareDefinition {\r\n /** Path pattern to match (undefined = match all) */\r\n path?: string | RegExp;\r\n /** HTTP methods to match (undefined = match all) */\r\n methods?: string[];\r\n /** The middleware function */\r\n handler: Middleware;\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Chain\r\n// ============================================================================\r\n\r\nexport interface MiddlewareChain {\r\n /** Add middleware to the chain */\r\n use(middleware: Middleware): MiddlewareChain;\r\n use(path: string, middleware: Middleware): MiddlewareChain;\r\n use(definition: MiddlewareDefinition): MiddlewareChain;\r\n\r\n /** Execute the middleware chain */\r\n execute(ctx: MiddlewareContext): Promise<void>;\r\n\r\n /** Get all middleware definitions */\r\n middlewares(): MiddlewareDefinition[];\r\n}\r\n\r\n/**\r\n * Create a new middleware chain\r\n */\r\nexport function createMiddlewareChain(): MiddlewareChain {\r\n const stack: MiddlewareDefinition[] = [];\r\n\r\n function use(\r\n pathOrMiddleware: string | Middleware | MiddlewareDefinition,\r\n maybeMiddleware?: Middleware\r\n ): MiddlewareChain {\r\n if (typeof pathOrMiddleware === 'function') {\r\n // use(middleware)\r\n stack.push({ handler: pathOrMiddleware });\r\n } else if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\r\n // use(path, middleware)\r\n stack.push({ path: pathOrMiddleware, handler: maybeMiddleware });\r\n } else if (typeof pathOrMiddleware === 'object') {\r\n // use(definition)\r\n stack.push(pathOrMiddleware);\r\n }\r\n return chain;\r\n }\r\n\r\n async function execute(ctx: MiddlewareContext): Promise<void> {\r\n let index = -1;\r\n\r\n async function dispatch(i: number): Promise<void> {\r\n if (i <= index) {\r\n throw new Error('next() called multiple times');\r\n }\r\n index = i;\r\n\r\n if (i >= stack.length) {\r\n return;\r\n }\r\n\r\n const definition = stack[i];\r\n if (!definition) {\r\n return dispatch(i + 1);\r\n }\r\n\r\n // Check if middleware should run\r\n if (!shouldRun(definition, ctx)) {\r\n return dispatch(i + 1);\r\n }\r\n\r\n await definition.handler(ctx, () => dispatch(i + 1));\r\n }\r\n\r\n await dispatch(0);\r\n }\r\n\r\n const chain: MiddlewareChain = {\r\n use: use as MiddlewareChain['use'],\r\n execute,\r\n middlewares: () => [...stack],\r\n };\r\n\r\n return chain;\r\n}\r\n\r\n/**\r\n * Check if a middleware should run for the given context\r\n */\r\nfunction shouldRun(def: MiddlewareDefinition, ctx: MiddlewareContext): boolean {\r\n // Check method\r\n if (def.methods && !def.methods.includes(ctx.method.toUpperCase())) {\r\n return false;\r\n }\r\n\r\n // Check path\r\n if (def.path) {\r\n const path = ctx.url.pathname;\r\n\r\n if (typeof def.path === 'string') {\r\n // Simple path matching (supports wildcards)\r\n if (def.path.endsWith('*')) {\r\n const prefix = def.path.slice(0, -1);\r\n if (!path.startsWith(prefix)) {\r\n return false;\r\n }\r\n } else if (def.path !== path) {\r\n return false;\r\n }\r\n } else if (def.path instanceof RegExp) {\r\n if (!def.path.test(path)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================================\r\n// Built-in Middleware Factories\r\n// ============================================================================\r\n\r\n/**\r\n * CORS middleware factory\r\n */\r\n/**\r\n * CORS options for configuring cross-origin requests.\r\n */\r\nexport interface CorsOptions {\r\n /** \r\n * Allowed origins. Can be:\r\n * - '*' for any origin\r\n * - A specific origin string\r\n * - An array of allowed origins\r\n * - A function that returns true if origin is allowed\r\n * - An async function for dynamic origin validation\r\n */\r\n origin?: string | string[] | ((origin: string) => boolean | Promise<boolean>);\r\n /** Allowed HTTP methods */\r\n methods?: string[];\r\n /** Allowed headers */\r\n headers?: string[];\r\n /** Whether to include credentials */\r\n credentials?: boolean;\r\n /** Preflight cache duration in seconds */\r\n maxAge?: number;\r\n /** Exposed headers that can be accessed from the response */\r\n exposeHeaders?: string[];\r\n}\r\n\r\n/**\r\n * CORS middleware factory.\r\n * \r\n * Handles cross-origin resource sharing with best practices:\r\n * - Adds Vary: Origin for dynamic origins (CDN compatibility)\r\n * - Supports async origin validation\r\n * - Proper preflight handling\r\n * \r\n * @example\r\n * ```typescript\r\n * // Allow specific origins\r\n * chain.use(cors({ origin: ['https://app.example.com'] }));\r\n * \r\n * // Dynamic validation\r\n * chain.use(cors({\r\n * origin: async (origin) => {\r\n * return await db.allowedOrigins.exists(origin);\r\n * }\r\n * }));\r\n * ```\r\n */\r\nexport function cors(options: CorsOptions = {}): Middleware {\r\n const {\r\n origin = '*',\r\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\r\n headers = ['Content-Type', 'Authorization'],\r\n credentials = false,\r\n maxAge = 86400,\r\n exposeHeaders = [],\r\n } = options;\r\n\r\n // Track if origin is dynamic (requires Vary header)\r\n const isDynamicOrigin = typeof origin === 'function' || Array.isArray(origin);\r\n\r\n return async (ctx, next) => {\r\n const requestOrigin = ctx.headers.get('Origin') || '';\r\n\r\n // Add Vary: Origin for dynamic origins (CDN/cache compatibility)\r\n if (isDynamicOrigin) {\r\n const existingVary = ctx.responseHeaders.get('Vary');\r\n if (existingVary) {\r\n if (!existingVary.includes('Origin')) {\r\n ctx.responseHeaders.set('Vary', `${existingVary}, Origin`);\r\n }\r\n } else {\r\n ctx.responseHeaders.set('Vary', 'Origin');\r\n }\r\n }\r\n\r\n // Determine allowed origin\r\n let allowedOrigin: string | null = null;\r\n if (origin === '*') {\r\n allowedOrigin = '*';\r\n } else if (typeof origin === 'string') {\r\n allowedOrigin = origin;\r\n } else if (Array.isArray(origin)) {\r\n if (origin.includes(requestOrigin)) {\r\n allowedOrigin = requestOrigin;\r\n }\r\n } else if (typeof origin === 'function') {\r\n const isAllowed = await origin(requestOrigin);\r\n if (isAllowed) {\r\n allowedOrigin = requestOrigin;\r\n }\r\n }\r\n\r\n if (allowedOrigin) {\r\n ctx.responseHeaders.set('Access-Control-Allow-Origin', allowedOrigin);\r\n ctx.responseHeaders.set('Access-Control-Allow-Methods', methods.join(', '));\r\n ctx.responseHeaders.set('Access-Control-Allow-Headers', headers.join(', '));\r\n\r\n if (credentials) {\r\n ctx.responseHeaders.set('Access-Control-Allow-Credentials', 'true');\r\n }\r\n\r\n if (maxAge) {\r\n ctx.responseHeaders.set('Access-Control-Max-Age', String(maxAge));\r\n }\r\n\r\n if (exposeHeaders.length > 0) {\r\n ctx.responseHeaders.set('Access-Control-Expose-Headers', exposeHeaders.join(', '));\r\n }\r\n }\r\n\r\n // Handle preflight\r\n if (ctx.method === 'OPTIONS') {\r\n ctx.status = 204;\r\n ctx.responseBody = null;\r\n return;\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n// ============================================================================\r\n// Logger Types and Constants\r\n// ============================================================================\r\n\r\n/** Log levels in order of verbosity */\r\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\r\n\r\n/** Log format types */\r\nexport type LogFormat = 'pretty' | 'json' | 'combined' | 'common' | 'short' | 'tiny';\r\n\r\n/** Log entry structure for JSON format */\r\nexport interface LogEntry {\r\n timestamp: string;\r\n level: LogLevel;\r\n method: string;\r\n path: string;\r\n status: number;\r\n duration: number;\r\n userAgent?: string;\r\n ip?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/** Custom log writer function */\r\nexport type LogWriter = (entry: LogEntry, formatted: string) => void;\r\n\r\n/** Logger options */\r\nexport interface LoggerOptions {\r\n /** Minimum log level (default: 'info') */\r\n level?: LogLevel;\r\n /** Output format (default: 'pretty') */\r\n format?: LogFormat;\r\n /** Skip logging for certain requests */\r\n skip?: (ctx: MiddlewareContext) => boolean;\r\n /** Custom log writer (replaces console output) */\r\n writer?: LogWriter;\r\n /** Include request headers in logs */\r\n includeHeaders?: boolean;\r\n /** Colorize output (only for 'pretty' format, default: true) */\r\n colorize?: boolean;\r\n}\r\n\r\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst LOG_LEVEL_COLORS: Record<LogLevel, string> = {\r\n debug: '\\x1b[36m', // Cyan\r\n info: '\\x1b[32m', // Green\r\n warn: '\\x1b[33m', // Yellow\r\n error: '\\x1b[31m', // Red\r\n silent: '',\r\n};\r\n\r\nconst STATUS_COLORS: Record<string, string> = {\r\n '2': '\\x1b[32m', // Green for 2xx\r\n '3': '\\x1b[36m', // Cyan for 3xx\r\n '4': '\\x1b[33m', // Yellow for 4xx\r\n '5': '\\x1b[31m', // Red for 5xx\r\n};\r\n\r\nconst RESET = '\\x1b[0m';\r\nconst DIM = '\\x1b[2m';\r\n\r\n/**\r\n * Professional logger middleware with configurable levels\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage\r\n * server.use(logger());\r\n * \r\n * // With level control\r\n * server.use(logger({ level: 'warn' })); // Only warn and error\r\n * \r\n * // JSON format for production/observability\r\n * server.use(logger({ format: 'json', level: 'info' }));\r\n * \r\n * // Custom writer (e.g., for external logging service)\r\n * server.use(logger({\r\n * writer: (entry) => myLoggingService.log(entry)\r\n * }));\r\n * \r\n * // Silent in production\r\n * server.use(logger({ level: process.env.NODE_ENV === 'production' ? 'error' : 'debug' }));\r\n * ```\r\n */\r\nexport function logger(options: LoggerOptions = {}): Middleware {\r\n const {\r\n level = 'info',\r\n format = 'pretty',\r\n skip,\r\n writer,\r\n includeHeaders = false,\r\n colorize = true,\r\n } = options;\r\n\r\n // Helper to format and output log\r\n const outputLog = (\r\n ctx: MiddlewareContext,\r\n logLevel: LogLevel,\r\n startTime: string,\r\n duration: number,\r\n error?: Error\r\n ): void => {\r\n const status = error ? 500 : ctx.status;\r\n const userAgent = ctx.headers.get('user-agent');\r\n const forwardedFor = ctx.headers.get('x-forwarded-for');\r\n const ip = forwardedFor || 'unknown';\r\n\r\n // Build log entry\r\n const entry: LogEntry = {\r\n timestamp: startTime,\r\n level: logLevel,\r\n method: ctx.method,\r\n path: ctx.url.pathname,\r\n status,\r\n duration,\r\n };\r\n\r\n if (userAgent) entry.userAgent = userAgent;\r\n entry.ip = ip;\r\n\r\n if (error) {\r\n entry.error = error.message;\r\n entry.stack = error.stack;\r\n }\r\n\r\n if (includeHeaders) {\r\n const headers: Record<string, string> = {};\r\n ctx.headers.forEach((value, key) => {\r\n if (!key.toLowerCase().includes('authorization')) {\r\n headers[key] = value;\r\n }\r\n });\r\n entry.headers = headers;\r\n }\r\n\r\n // Format the log line\r\n let formatted: string;\r\n\r\n switch (format) {\r\n case 'json':\r\n formatted = JSON.stringify(entry);\r\n break;\r\n\r\n case 'combined':\r\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status} - \"${userAgent || '-'}\"`;\r\n break;\r\n\r\n case 'common':\r\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status}`;\r\n break;\r\n\r\n case 'short':\r\n formatted = `${ctx.method} ${ctx.url.pathname} ${status} ${duration}ms`;\r\n break;\r\n\r\n case 'tiny':\r\n formatted = `${ctx.method} ${ctx.url.pathname} ${status}`;\r\n break;\r\n\r\n case 'pretty':\r\n default:\r\n if (colorize) {\r\n const statusFirstChar = String(status).charAt(0) || '2';\r\n const statusColor = STATUS_COLORS[statusFirstChar] ?? '';\r\n const levelColor = LOG_LEVEL_COLORS[logLevel];\r\n const errorSuffix = error ? ` ${LOG_LEVEL_COLORS.error}[${error.message}]${RESET}` : '';\r\n formatted = `${DIM}${startTime}${RESET} ${levelColor}${logLevel.toUpperCase().padEnd(5)}${RESET} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${statusColor}${status}${RESET} ${DIM}${duration}ms${RESET}${errorSuffix}`;\r\n } else {\r\n const errorSuffix = error ? ` [${error.message}]` : '';\r\n formatted = `${startTime} ${logLevel.toUpperCase().padEnd(5)} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${status} ${duration}ms${errorSuffix}`;\r\n }\r\n break;\r\n }\r\n\r\n // Output\r\n if (writer) {\r\n writer(entry, formatted);\r\n } else {\r\n switch (logLevel) {\r\n case 'error':\r\n console.error(formatted);\r\n break;\r\n case 'warn':\r\n console.warn(formatted);\r\n break;\r\n case 'debug':\r\n console.debug(formatted);\r\n break;\r\n default:\r\n console.log(formatted);\r\n }\r\n }\r\n };\r\n\r\n return async (ctx, next) => {\r\n // Skip if configured\r\n if (skip?.(ctx)) {\r\n return next();\r\n }\r\n\r\n const start = Date.now();\r\n const startTime = new Date().toISOString();\r\n\r\n try {\r\n await next();\r\n\r\n const duration = Date.now() - start;\r\n const status = ctx.status;\r\n\r\n // Determine log level based on status\r\n let logLevel: LogLevel = 'info';\r\n if (status >= 500) {\r\n logLevel = 'error';\r\n } else if (status >= 400) {\r\n logLevel = 'warn';\r\n } else if (status >= 300) {\r\n logLevel = 'info';\r\n } else {\r\n logLevel = 'debug';\r\n }\r\n\r\n // Check if we should log based on level\r\n if (LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[level]) {\r\n outputLog(ctx, logLevel, startTime, duration);\r\n }\r\n } catch (error) {\r\n // Always log errors, then re-throw\r\n const duration = Date.now() - start;\r\n if (LOG_LEVEL_PRIORITY.error >= LOG_LEVEL_PRIORITY[level]) {\r\n outputLog(ctx, 'error', startTime, duration, error as Error);\r\n }\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Security headers middleware\r\n */\r\nexport function securityHeaders(options: {\r\n contentSecurityPolicy?: string | false;\r\n xFrameOptions?: 'DENY' | 'SAMEORIGIN' | false;\r\n xContentTypeOptions?: boolean;\r\n referrerPolicy?: string;\r\n permissionsPolicy?: string;\r\n} = {}): Middleware {\r\n const {\r\n contentSecurityPolicy = \"default-src 'self'\",\r\n xFrameOptions = 'DENY',\r\n xContentTypeOptions = true,\r\n referrerPolicy = 'strict-origin-when-cross-origin',\r\n permissionsPolicy,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n if (contentSecurityPolicy) {\r\n ctx.responseHeaders.set('Content-Security-Policy', contentSecurityPolicy);\r\n }\r\n if (xFrameOptions) {\r\n ctx.responseHeaders.set('X-Frame-Options', xFrameOptions);\r\n }\r\n if (xContentTypeOptions) {\r\n ctx.responseHeaders.set('X-Content-Type-Options', 'nosniff');\r\n }\r\n if (referrerPolicy) {\r\n ctx.responseHeaders.set('Referrer-Policy', referrerPolicy);\r\n }\r\n if (permissionsPolicy) {\r\n ctx.responseHeaders.set('Permissions-Policy', permissionsPolicy);\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Compression middleware (requires implementation in adapter)\r\n */\r\nexport function compress(): Middleware {\r\n return async (ctx, next) => {\r\n // Mark that compression is desired\r\n ctx.locals['flight:compress'] = true;\r\n await next();\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Error Handler Middleware\r\n// ============================================================================\r\n\r\n/**\r\n * Error information passed to error handlers.\r\n */\r\nexport interface ErrorInfo {\r\n /** The original error */\r\n error: Error;\r\n /** HTTP status code (derived from error or default 500) */\r\n status: number;\r\n /** Error code for categorization */\r\n code?: string;\r\n /** Request context */\r\n ctx: MiddlewareContext;\r\n /** Request timestamp */\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * Error handler options.\r\n */\r\nexport interface ErrorHandlerOptions {\r\n /**\r\n * Custom error handler function.\r\n * Called when an error is caught. Can modify ctx to set response.\r\n * If not provided, a default JSON response is sent.\r\n */\r\n onError?: (info: ErrorInfo) => void | Promise<void>;\r\n\r\n /**\r\n * Whether to expose error details in response.\r\n * Set to false in production to hide internal error messages.\r\n * @default false\r\n */\r\n expose?: boolean;\r\n\r\n /**\r\n * Default status code for errors without a status property.\r\n * @default 500\r\n */\r\n defaultStatus?: number;\r\n\r\n /**\r\n * Emit error events for centralized logging (Koa pattern).\r\n * Provide a function to receive error events.\r\n */\r\n emit?: (error: Error, ctx: MiddlewareContext) => void;\r\n}\r\n\r\n/**\r\n * Error handler middleware factory.\r\n * \r\n * Provides centralized error handling following Koa best practices:\r\n * - Catches all downstream errors\r\n * - Sets appropriate status codes\r\n * - Supports custom error handlers\r\n * - Supports error event emission for logging\r\n * \r\n * Place this as one of the FIRST middleware in your chain.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage - default JSON error response\r\n * chain.use(errorHandler());\r\n * \r\n * // With custom handler\r\n * chain.use(errorHandler({\r\n * onError: ({ error, status, ctx }) => {\r\n * ctx.status = status;\r\n * ctx.responseBody = JSON.stringify({\r\n * error: error.message,\r\n * code: 'SERVER_ERROR'\r\n * });\r\n * },\r\n * emit: (error, ctx) => {\r\n * logger.error('Request error:', error);\r\n * errorTracker.capture(error);\r\n * }\r\n * }));\r\n * \r\n * // Production-safe (hide error details)\r\n * chain.use(errorHandler({ expose: false }));\r\n * ```\r\n */\r\nexport function errorHandler(options: ErrorHandlerOptions = {}): Middleware {\r\n const {\r\n onError,\r\n expose = false,\r\n defaultStatus = 500,\r\n emit,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n try {\r\n await next();\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n\r\n // Extract status from error if available\r\n const status = (error as Error & { status?: number; statusCode?: number }).status\r\n ?? (error as Error & { status?: number; statusCode?: number }).statusCode\r\n ?? defaultStatus;\r\n\r\n // Extract error code if available\r\n const code = (error as Error & { code?: string }).code;\r\n\r\n const timestamp = new Date().toISOString();\r\n\r\n const errorInfo: ErrorInfo = {\r\n error,\r\n status,\r\n code,\r\n ctx,\r\n timestamp,\r\n };\r\n\r\n // Emit error event for centralized logging (Koa pattern)\r\n if (emit) {\r\n try {\r\n emit(error, ctx);\r\n } catch {\r\n // Ignore emission errors to prevent infinite loops\r\n }\r\n }\r\n\r\n // Call custom error handler if provided\r\n if (onError) {\r\n await onError(errorInfo);\r\n } else {\r\n // Default error response\r\n ctx.status = status;\r\n ctx.responseHeaders.set('Content-Type', 'application/json');\r\n\r\n const body = expose\r\n ? {\r\n error: error.message,\r\n code,\r\n status,\r\n timestamp,\r\n stack: error.stack,\r\n }\r\n : {\r\n error: status >= 500 ? 'Internal Server Error' : error.message,\r\n code,\r\n status,\r\n timestamp,\r\n };\r\n\r\n ctx.responseBody = JSON.stringify(body);\r\n }\r\n }\r\n };\r\n}\r\n\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a middleware context from a Web Request\r\n */\r\nexport function createContextFromRequest(\r\n request: Request,\r\n params: Record<string, string | string[]> = {}\r\n): MiddlewareContext {\r\n const url = new URL(request.url);\r\n\r\n return {\r\n url,\r\n method: request.method,\r\n headers: request.headers,\r\n params,\r\n query: url.searchParams,\r\n locals: {},\r\n request,\r\n status: 200,\r\n responseHeaders: new Headers(),\r\n };\r\n}\r\n\r\n/**\r\n * Create a Web Response from middleware context\r\n */\r\nexport function createResponseFromContext(ctx: MiddlewareContext): Response {\r\n return new Response(ctx.responseBody, {\r\n status: ctx.status,\r\n headers: ctx.responseHeaders,\r\n });\r\n}\r\n\r\n/**\r\n * Compose multiple middleware into one\r\n */\r\nexport function compose(...middlewares: Middleware[]): Middleware {\r\n return async (ctx, next) => {\r\n let index = -1;\r\n\r\n async function dispatch(i: number): Promise<void> {\r\n if (i <= index) {\r\n throw new Error('next() called multiple times');\r\n }\r\n index = i;\r\n\r\n const fn = i === middlewares.length ? next : middlewares[i];\r\n\r\n if (fn) {\r\n await fn(ctx, () => dispatch(i + 1));\r\n }\r\n }\r\n\r\n await dispatch(0);\r\n };\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
- import { createServerChunk, createErrorChunk, toFlightElement, serialize, generateChunkId, createClientChunk } from './chunk-6GI6HFSQ.js';
2
- import { isClientReference } from './chunk-5XHOLZBJ.js';
1
+ import { createServerChunk, createErrorChunk, toFlightElement, serialize, generateChunkId, createClientChunk } from './chunk-K2CQZPCG.js';
2
+ import { isClientReference } from './chunk-PDW5WCMW.js';
3
3
 
4
4
  // src/rsc/renderer.ts
5
5
  var FlightRenderer = class {
@@ -312,5 +312,5 @@ async function* renderServerComponentStreaming(component, props, ctx, adapter, o
312
312
  }
313
313
 
314
314
  export { FlightRenderer, createRenderer, renderServerComponent, renderServerComponentStreaming };
315
- //# sourceMappingURL=chunk-FRAH5QNY.js.map
316
- //# sourceMappingURL=chunk-FRAH5QNY.js.map
315
+ //# sourceMappingURL=chunk-P6WSBVDT.js.map
316
+ //# sourceMappingURL=chunk-P6WSBVDT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/renderer.ts"],"names":["children"],"mappings":";;;;AAsIO,IAAM,iBAAN,MAAqB;AAAA,EAMxB,WAAA,CACY,OAAA,EACA,OAAA,GAAyB,EAAC,EACpC;AAFU,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACR;AAAA,EARI,SAAwB,EAAC;AAAA,EACzB,aAAqC,EAAC;AAAA,EACtC,eAAA,uBAAsB,GAAA,EAAoC;AAAA,EAC1D,KAAA,GAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAUhB,MAAM,MAAA,CACF,OAAA,EACA,GAAA,EACqB;AACrB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AAEb,IAAA,IAAI;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAI,CAAA;AAGxB,MAAA,MAAM,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAEnC,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AAEzB,MAAA,OAAO;AAAA,QACH,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,IAAA;AAAA,QACA,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,UACJ,SAAA;AAAA,UACA,OAAA;AAAA,UACA,UAAU,OAAA,GAAU;AAAA;AACxB,OACJ;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,WAAW,gBAAA,CAAiB,MAAA,EAAQ,KAAA,EAAgB,IAAA,CAAK,QAAQ,GAAG,CAAA;AAC1E,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,QAAQ,CAAA;AAEzB,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAA,CACH,OAAA,EACA,GAAA,EAC2B;AAE3B,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AAEb,IAAA,IAAI;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,MAAM,IAAA;AAGN,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG;AAClC,QAAA,MAAM,UAAU,CAAC,GAAG,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAGlD,QAAA,MAAM,WAAW,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,EAAA,EAAI,OAAO,CAAA,KAAM;AAClD,UAAA,MAAM,OAAO,MAAM,OAAA;AACnB,UAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAC9B,UAAA,OAAO,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,QACrC,CAAC,CAAA;AAGD,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACzC,QAAA,MAAM,KAAA;AAAA,MACV;AAGA,MAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACrC,QAAA,MAAM,SAAA;AAAA,MACV;AAAA,IAEJ,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,gBAAA,CAAiB,MAAA,EAAQ,KAAA,EAAgB,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,IACnE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACV,OAAA,EACA,GAAA,EACsB;AAEtB,IAAA,IAAA,CAAK,KAAA,EAAA;AACL,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,YAAY,GAAA,CAAA,EAAM;AAC7C,MAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,IACxF;AAEA,IAAA,IAAI;AAEA,MAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,KAAA,CAAA,IAAa,OAAO,YAAY,SAAA,EAAW;AAC3E,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA,MAC5B;AAGA,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AAAA,MAC5C;AACA,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,MACpD;AAGA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxB,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC3B,QAAQ,GAAA,CAAI,CAAA,KAAA,KAAS,KAAK,aAAA,CAAc,KAAA,EAAO,GAAG,CAAC;AAAA,SACvD;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAS;AAAA,MAC1C;AAGA,MAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAC5B,QAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,GAAG,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AACjC,QAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,GAAG,CAAA;AAAA,MACnD;AAGA,MAAA,OAAO,gBAAgB,OAAO,CAAA;AAAA,IAElC,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,KAAA,EAAA;AAAA,IACT;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAA,CACV,OAAA,EACA,GAAA,EACsB;AACtB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,OAAO,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAEvC,IAAA,QAAQ,SAAS,IAAA;AAAM,MACnB,KAAK,MAAA;AACD,QAAA,OAAO,KAAK,iBAAA,CAAkB,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,MAE/D,KAAK,WAAA;AACD,QAAA,OAAO,KAAK,eAAA,CAAgB,QAAA,CAAS,IAAI,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AAAA,MAEtE,KAAK,UAAA,EAAY;AACb,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AACjD,QAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,GAAA;AAAA,UACnC,SAAS,GAAA,CAAI,CAAA,KAAA,KAAS,KAAK,aAAA,CAAc,KAAA,EAAO,GAAG,CAAC;AAAA,SACxD;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,gBAAA,EAAiB;AAAA,MAC5D;AAAA,MAEA,KAAK,UAAA,EAAY;AACb,QAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,UAAU,GAAG,CAAA;AAAA,MAC9D;AAAA,MAEA,KAAK,MAAA;AACD,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,MAEnD,KAAK,MAAA;AACD,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA,MAE5B;AACI,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA;AAChC,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACV,GAAA,EACA,KAAA,EACA,KACA,GAAA,EACsB;AAEtB,IAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,GAAG,WAAU,GAAI,KAAA;AAGjD,IAAA,MAAM,kBAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,MAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC7B,QAAA,eAAA,CAAgB,OAAO,CAAA,GAAI,SAAA,CAAU,KAAK,CAAA;AAAA,MAC9C;AAAA,IACJ;AAGA,IAAA,MAAM,WAAA,GAAc,YAAA,GACf,KAAA,CAAM,OAAA,CAAQ,YAAY,IAAI,YAAA,GAAe,CAAC,YAAY,CAAA,GAC3D,EAAC;AAEL,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC3B,YAAY,GAAA,CAAI,CAAA,KAAA,KAAS,KAAK,aAAA,CAAc,KAAA,EAAO,GAAG,CAAC;AAAA,KAC3D;AAEA,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA,EAAO,eAAA;AAAA,MACP;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACV,SAAA,EACA,IAAA,EACA,OACA,GAAA,EACsB;AAEtB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC1C,MAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,SAAA,EAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAAA,IAChE;AAGA,IAAA,IAAI;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA;AACzC,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AAEZ,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC1B,QAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,IAAA,EAAM,OAAO,GAAG,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,KAAA,EAAgB,IAAI,CAAA;AAC3C,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,CACV,SAAA,EACA,IAAA,EACA,OACA,IAAA,EACsB;AACtB,IAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AAGnC,IAAA,MAAM,QAAA,GAAY,UAAsD,eAAA,IAAmB,IAAA;AAC3F,IAAA,MAAM,UAAA,GAAc,UAAsD,eAAA,IAAmB,SAAA;AAG7F,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,mBAAA,IAAuB,IAAA,CAAK,QAAQ,cAAA,EAAgB;AACjE,MAAA,IAAI;AAEA,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACJ;AAGA,IAAA,MAAM,cAAc,iBAAA,CAAkB,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,OAAO,QAAQ,CAAA;AACpF,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,WAAW,CAAA;AAE5B,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAK,OAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACT;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,CACV,OAAA,EACA,eAAA,EACA,GAAA,EACsB;AACtB,IAAA,MAAM,UAAA,GAAa,gBAAgB,GAAG,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAGjD,IAAA,MAAM,QAAA,GAAW,eAAA,GACb,MAAM,IAAA,CAAK,aAAA,CAAc,iBAAiB,GAAG,CAAA,GAC7C,EAAE,MAAA,EAAQ,MAAA,EAAgB;AAG9B,IAAA,MAAM,mBAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC1B,MAAA,IAAI;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,GAAG,CAAA;AACpD,QAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACZ,QAAA,IAAI,iBAAiB,OAAA,EAAS;AAE1B,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAA,EAAY,KAAA,CAAM,KAAK,YAAY;AACxD,YAAA,MAAMA,SAAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AACjD,YAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,cAC3BA,UAAS,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,aAAA,CAAc,CAAA,EAAG,GAAG,CAAC;AAAA,aAChD;AACA,YAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAqB,QAAA,EAAU,QAAA,EAAS;AAAA,UAC7D,CAAC,CAAC,CAAA;AAGF,UAAA,OAAO;AAAA,YACH,MAAA,EAAQ,UAAA;AAAA,YACR,EAAA,EAAI,UAAA;AAAA,YACJ,QAAA;AAAA,YACA,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,QAAQ,EAAA,EAAI,UAAA,EAAY,UAAU;AAAA,WAC3D;AAAA,QACJ;AACA,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,UAAA;AAAA,MACR,EAAA,EAAI,UAAA;AAAA,MACJ,QAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACd;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CACJ,OAAA,EACA,IAAA,EACA,KAAA,EACA,GAAA,EACa;AACb,IAAA,MAAM,UAAA,GAAa,gBAAgB,GAAG,CAAA;AAGtC,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA;AAAA,MAAI,UAAA;AAAA,MACrB,OAAA,CAAQ,KAAK,YAAY;AAErB,QAAA,MAAM,YAAa,KAAA,CAAgD,SAAA;AACnE,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA;AACzC,UAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA;AAAA,QACzC;AACA,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAgB;AAAA,MACrC,CAAC;AAAA,KACL;AAEA,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,EAAA,EAAI,UAAA;AAAA,MACJ,UAAU,EAAE,MAAA,EAAQ,QAAQ,KAAA,EAAO,CAAA,QAAA,EAAW,IAAI,CAAA,GAAA,CAAA;AAAM,KAC5D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAA,CACV,GAAA,EACA,IAAA,EACsB;AACtB,IAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AAEnC,IAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,MAChB,OAAA;AAAA,MACA,GAAA,CAAI,eAAA;AAAA,MACJ,GAAA,CAAI,eAAA;AAAA,MACJ;AAAC;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,WAAW,CAAA;AAE5B,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAK;AAAA,KACT;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,IAAA,EAAoC;AACnE,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG;AAClC,MAAA,MAAM,UAAU,CAAC,GAAG,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAElD,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,OAAA,EAAS;AACjC,QAAA,IAAI;AACA,UAAA,MAAM,OAAO,MAAM,OAAA;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAChD,SAAS,KAAA,EAAO;AACZ,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gBAAA,CAAiB,EAAA,EAAI,OAAgB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,QAC3E;AACA,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AACJ;AASO,SAAS,cAAA,CACZ,SACA,OAAA,EACc;AACd,EAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAC9C;AAKA,eAAsB,qBAAA,CAClB,SAAA,EACA,KAAA,EACA,GAAA,EACA,SACA,OAAA,EACqB;AACrB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAGhD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,CAAc,SAAA,EAAW,KAAgC,CAAA;AAEjF,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,GAAG,CAAA;AACvC;AAEA,gBAAuB,8BAAA,CACnB,SAAA,EACA,KAAA,EACA,GAAA,EACA,SACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAGhD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,CAAc,SAAA,EAAW,KAAgC,CAAA;AAEjF,EAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,GAAG,CAAA;AAChD","file":"chunk-P6WSBVDT.js","sourcesContent":["/**\r\n * @flight-framework/core - Server Component Renderer\r\n * \r\n * Renders Server Components to FlightChunks.\r\n * Framework-agnostic rendering engine that works with adapters.\r\n * \r\n * @module @flight-framework/core/rsc/renderer\r\n */\r\n\r\nimport type {\r\n FlightChunk,\r\n FlightElement,\r\n ServerComponentChunk,\r\n ClientReferenceChunk,\r\n} from './payload.js';\r\nimport {\r\n generateChunkId,\r\n createServerChunk,\r\n createClientChunk,\r\n createErrorChunk,\r\n toFlightElement,\r\n serialize,\r\n} from './payload.js';\r\nimport {\r\n isClientReference,\r\n type ClientReference,\r\n} from './boundaries.js';\r\nimport type { ServerContext } from './context.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * UI Framework adapter for rendering\r\n */\r\nexport interface UIAdapter {\r\n /** Adapter name */\r\n name: string;\r\n\r\n /** Check if value is a framework element */\r\n isElement(value: unknown): boolean;\r\n\r\n /** Get element type info */\r\n getElementType(element: unknown): ElementTypeInfo;\r\n\r\n /** Get element props */\r\n getProps(element: unknown): Record<string, unknown>;\r\n\r\n /** Get element children */\r\n getChildren(element: unknown): unknown[];\r\n\r\n /** Get element key */\r\n getKey(element: unknown): string | number | undefined;\r\n\r\n /** Check if component is a client boundary */\r\n isClientBoundary(component: unknown): boolean;\r\n\r\n /** \r\n * Create a framework-specific element\r\n * This abstracts away React's Symbol.for('react.element'), Vue's VNode, etc.\r\n */\r\n createElement(\r\n component: ComponentFn,\r\n props: Record<string, unknown>\r\n ): unknown;\r\n\r\n /** Render element to HTML string (for SSR fallback) */\r\n renderToString?(element: unknown): Promise<string>;\r\n}\r\n\r\nexport type ElementTypeInfo =\r\n | { kind: 'host'; tag: string }\r\n | { kind: 'component'; fn: ComponentFn; name: string }\r\n | { kind: 'fragment' }\r\n | { kind: 'suspense'; fallback?: unknown }\r\n | { kind: 'provider'; value?: unknown }\r\n | { kind: 'context' }\r\n | { kind: 'text'; value: string }\r\n | { kind: 'null' };\r\n\r\n/**\r\n * Component function type\r\n */\r\nexport type ComponentFn = (\r\n props: Record<string, unknown>,\r\n ctx?: ServerContext\r\n) => unknown | Promise<unknown>;\r\n\r\n/**\r\n * Render options\r\n */\r\nexport interface RenderOptions {\r\n /** Include SSR fallbacks for client components */\r\n includeSSRFallbacks?: boolean;\r\n\r\n /** Error handler */\r\n onError?: (error: Error, componentName?: string) => void;\r\n\r\n /** Dev mode (include extra debug info) */\r\n dev?: boolean;\r\n\r\n /** Max render depth to prevent infinite loops */\r\n maxDepth?: number;\r\n}\r\n\r\n/**\r\n * Render result with metadata\r\n */\r\nexport interface RenderResult {\r\n /** All chunks generated */\r\n chunks: FlightChunk[];\r\n\r\n /** Root chunk */\r\n root: ServerComponentChunk;\r\n\r\n /** Client references found */\r\n clientRefs: ClientReferenceChunk[];\r\n\r\n /** Timing info */\r\n timing: {\r\n startTime: number;\r\n endTime: number;\r\n duration: number;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Renderer Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Flight Server Component Renderer\r\n */\r\nexport class FlightRenderer {\r\n private chunks: FlightChunk[] = [];\r\n private clientRefs: ClientReferenceChunk[] = [];\r\n private pendingPromises = new Map<string, Promise<FlightElement>>();\r\n private depth = 0;\r\n\r\n constructor(\r\n private adapter: UIAdapter,\r\n private options: RenderOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Render a component tree to Flight chunks\r\n */\r\n async render(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<RenderResult> {\r\n const startTime = Date.now();\r\n\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render the root element\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n this.chunks.unshift(root);\r\n\r\n // Wait for any pending async boundaries\r\n await this.resolvePendingChunks(ctx);\r\n\r\n const endTime = Date.now();\r\n\r\n return {\r\n chunks: this.chunks,\r\n root,\r\n clientRefs: this.clientRefs,\r\n timing: {\r\n startTime,\r\n endTime,\r\n duration: endTime - startTime,\r\n },\r\n };\r\n } catch (error) {\r\n const errChunk = createErrorChunk('root', error as Error, this.options.dev);\r\n this.chunks.push(errChunk);\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render as async generator (for streaming)\r\n */\r\n async *renderStreaming(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): AsyncGenerator<FlightChunk> {\r\n // Note: startTime available for future timing features\r\n this.chunks = [];\r\n this.clientRefs = [];\r\n this.pendingPromises.clear();\r\n this.depth = 0;\r\n\r\n try {\r\n // Render root synchronously\r\n const rootTree = await this.renderElement(element, ctx);\r\n const root = createServerChunk('root', rootTree);\r\n yield root;\r\n\r\n // Yield pending chunks as they resolve\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n // Race all pending promises\r\n const promises = entries.map(async ([id, promise]) => {\r\n const tree = await promise;\r\n this.pendingPromises.delete(id);\r\n return createServerChunk(id, tree);\r\n });\r\n\r\n // Yield first to complete\r\n const chunk = await Promise.race(promises);\r\n yield chunk;\r\n }\r\n\r\n // Yield all client refs\r\n for (const clientRef of this.clientRefs) {\r\n yield clientRef;\r\n }\r\n\r\n } catch (error) {\r\n yield createErrorChunk('root', error as Error, this.options.dev);\r\n }\r\n }\r\n\r\n /**\r\n * Render an element to FlightElement\r\n */\r\n private async renderElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check depth limit\r\n this.depth++;\r\n if (this.depth > (this.options.maxDepth ?? 100)) {\r\n throw new Error('Maximum render depth exceeded. Check for infinite component loops.');\r\n }\r\n\r\n try {\r\n // Handle null/undefined/boolean\r\n if (element === null || element === undefined || typeof element === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n\r\n // Handle primitives\r\n if (typeof element === 'string') {\r\n return { $$type: 'text', value: element };\r\n }\r\n if (typeof element === 'number') {\r\n return { $$type: 'text', value: String(element) };\r\n }\r\n\r\n // Handle arrays (fragments)\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(\r\n element.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children };\r\n }\r\n\r\n // Handle Client References\r\n if (isClientReference(element)) {\r\n return this.renderClientReference(element, ctx);\r\n }\r\n\r\n // Handle framework elements\r\n if (this.adapter.isElement(element)) {\r\n return this.renderFrameworkElement(element, ctx);\r\n }\r\n\r\n // Unknown - try to convert\r\n return toFlightElement(element);\r\n\r\n } finally {\r\n this.depth--;\r\n }\r\n }\r\n\r\n /**\r\n * Render a framework-specific element\r\n */\r\n private async renderFrameworkElement(\r\n element: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const typeInfo = this.adapter.getElementType(element);\r\n const props = this.adapter.getProps(element);\r\n const key = this.adapter.getKey(element);\r\n\r\n switch (typeInfo.kind) {\r\n case 'host':\r\n return this.renderHostElement(typeInfo.tag, props, key, ctx);\r\n\r\n case 'component':\r\n return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);\r\n\r\n case 'fragment': {\r\n const children = this.adapter.getChildren(element);\r\n const renderedChildren = await Promise.all(\r\n children.map(child => this.renderElement(child, ctx))\r\n );\r\n return { $$type: 'fragment', children: renderedChildren };\r\n }\r\n\r\n case 'suspense': {\r\n return this.renderSuspense(element, typeInfo.fallback, ctx);\r\n }\r\n\r\n case 'text':\r\n return { $$type: 'text', value: typeInfo.value };\r\n\r\n case 'null':\r\n return { $$type: 'null' };\r\n\r\n default:\r\n return { $$type: 'null' };\r\n }\r\n }\r\n\r\n /**\r\n * Render a host element (div, span, etc.)\r\n */\r\n private async renderHostElement(\r\n tag: string,\r\n props: Record<string, unknown>,\r\n key: string | number | undefined,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Extract children\r\n const { children: childrenProp, ...restProps } = props;\r\n\r\n // Serialize props (excluding functions and children)\r\n const serializedProps: Record<string, unknown> = {};\r\n for (const [propKey, value] of Object.entries(restProps)) {\r\n if (typeof value !== 'function') {\r\n serializedProps[propKey] = serialize(value);\r\n }\r\n }\r\n\r\n // Render children\r\n const rawChildren = childrenProp ?\r\n (Array.isArray(childrenProp) ? childrenProp : [childrenProp]) :\r\n [];\r\n\r\n const children = await Promise.all(\r\n rawChildren.map(child => this.renderElement(child, ctx))\r\n );\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n key,\r\n props: serializedProps as Record<string, import('./payload.js').SerializedValue>,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Render a component (server or client)\r\n */\r\n private async renderComponent(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n // Check if this is a client component\r\n if (this.adapter.isClientBoundary(component)) {\r\n return this.renderClientBoundary(component, name, props, ctx);\r\n }\r\n\r\n // Execute server component\r\n try {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n } catch (error) {\r\n // Check for Suspense promise\r\n if (error instanceof Promise) {\r\n return this.renderAsyncBoundary(error, name, props, ctx);\r\n }\r\n\r\n this.options.onError?.(error as Error, name);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Render a client boundary\r\n */\r\n private async renderClientBoundary(\r\n component: ComponentFn,\r\n name: string,\r\n props: Record<string, unknown>,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n // Get module info from component\r\n const moduleId = (component as unknown as { __flight_module?: string }).__flight_module ?? name;\r\n const exportName = (component as unknown as { __flight_export?: string }).__flight_export ?? 'default';\r\n\r\n // Generate SSR fallback if enabled\r\n let fallback: string | undefined;\r\n if (this.options.includeSSRFallbacks && this.adapter.renderToString) {\r\n try {\r\n // Create element with props for SSR\r\n fallback = await this.adapter.renderToString(props);\r\n } catch {\r\n // SSR failed, continue without fallback\r\n }\r\n }\r\n\r\n // Create client reference chunk\r\n const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n ssr: fallback,\r\n };\r\n }\r\n\r\n /**\r\n * Render a Suspense boundary\r\n */\r\n private async renderSuspense(\r\n element: unknown,\r\n fallbackElement: unknown,\r\n ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const boundaryId = generateChunkId('s');\r\n const children = this.adapter.getChildren(element);\r\n\r\n // Render fallback\r\n const fallback = fallbackElement ?\r\n await this.renderElement(fallbackElement, ctx) :\r\n { $$type: 'null' as const };\r\n\r\n // Render children\r\n const renderedChildren: FlightElement[] = [];\r\n for (const child of children) {\r\n try {\r\n const rendered = await this.renderElement(child, ctx);\r\n renderedChildren.push(rendered);\r\n } catch (error) {\r\n if (error instanceof Promise) {\r\n // This is a suspended promise\r\n this.pendingPromises.set(boundaryId, error.then(async () => {\r\n const children = this.adapter.getChildren(element);\r\n const rendered = await Promise.all(\r\n children.map(c => this.renderElement(c, ctx))\r\n );\r\n return { $$type: 'fragment' as const, children: rendered };\r\n }));\r\n\r\n // Return suspense with fallback for now\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: [{ $$type: 'lazy', id: boundaryId, fallback }],\r\n };\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'suspense',\r\n id: boundaryId,\r\n fallback,\r\n children: renderedChildren,\r\n };\r\n }\r\n\r\n /**\r\n * Render an async boundary (promise thrown from component)\r\n */\r\n private renderAsyncBoundary(\r\n promise: Promise<unknown>,\r\n name: string,\r\n props: Record<string, unknown>,\r\n ctx: ServerContext\r\n ): FlightElement {\r\n const boundaryId = generateChunkId('a');\r\n\r\n // Track this promise\r\n this.pendingPromises.set(boundaryId,\r\n promise.then(async () => {\r\n // Re-render the component after promise resolves\r\n const component = (props as unknown as { component: ComponentFn }).component;\r\n if (component) {\r\n const result = await component(props, ctx);\r\n return this.renderElement(result, ctx);\r\n }\r\n return { $$type: 'null' as const };\r\n })\r\n );\r\n\r\n return {\r\n $$type: 'lazy',\r\n id: boundaryId,\r\n fallback: { $$type: 'text', value: `Loading ${name}...` },\r\n };\r\n }\r\n\r\n /**\r\n * Render a Client Reference directly\r\n */\r\n private async renderClientReference(\r\n ref: ClientReference,\r\n _ctx: ServerContext\r\n ): Promise<FlightElement> {\r\n const chunkId = generateChunkId('c');\r\n\r\n const clientChunk = createClientChunk(\r\n chunkId,\r\n ref.__flight_module,\r\n ref.__flight_export,\r\n {} // Props are embedded in the reference\r\n );\r\n\r\n this.clientRefs.push(clientChunk);\r\n this.chunks.push(clientChunk);\r\n\r\n return {\r\n $$type: 'client',\r\n ref: chunkId,\r\n };\r\n }\r\n\r\n /**\r\n * Resolve all pending async chunks\r\n */\r\n private async resolvePendingChunks(_ctx: ServerContext): Promise<void> {\r\n while (this.pendingPromises.size > 0) {\r\n const entries = [...this.pendingPromises.entries()];\r\n\r\n for (const [id, promise] of entries) {\r\n try {\r\n const tree = await promise;\r\n this.chunks.push(createServerChunk(id, tree));\r\n } catch (error) {\r\n this.chunks.push(createErrorChunk(id, error as Error, this.options.dev));\r\n }\r\n this.pendingPromises.delete(id);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a renderer with adapter\r\n */\r\nexport function createRenderer(\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): FlightRenderer {\r\n return new FlightRenderer(adapter, options);\r\n}\r\n\r\n/**\r\n * Render a server component tree\r\n */\r\nexport async function renderServerComponent<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): Promise<RenderResult> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n return renderer.render(element, ctx);\r\n}\r\n\r\nexport async function* renderServerComponentStreaming<P>(\r\n component: ComponentFn,\r\n props: P,\r\n ctx: ServerContext,\r\n adapter: UIAdapter,\r\n options?: RenderOptions\r\n): AsyncGenerator<FlightChunk> {\r\n const renderer = createRenderer(adapter, options);\r\n\r\n // Create element using adapter (framework-agnostic)\r\n const element = adapter.createElement(component, props as Record<string, unknown>);\r\n\r\n yield* renderer.renderStreaming(element, ctx);\r\n}\r\n"]}
@@ -254,5 +254,5 @@ function registerServerAction(id, action) {
254
254
  }
255
255
 
256
256
  export { BoundaryRegistry, CLIENT_REFERENCE, SERVER_REFERENCE, analyzeModule, createClientReference, createServerReference, detectAsyncComponents, detectBoundaryType, detectInlineServerActions, getReferenceId, globalRegistry, hasUseClientDirective, hasUseServerDirective, isClientReference, isServerReference, registerClientComponent, registerServerAction };
257
- //# sourceMappingURL=chunk-5XHOLZBJ.js.map
258
- //# sourceMappingURL=chunk-5XHOLZBJ.js.map
257
+ //# sourceMappingURL=chunk-PDW5WCMW.js.map
258
+ //# sourceMappingURL=chunk-PDW5WCMW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/boundaries.ts"],"names":["exports"],"mappings":"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","file":"chunk-PDW5WCMW.js","sourcesContent":["/**\r\n * @flight-framework/core - Component Boundary Detection\r\n * \r\n * Sistema de detección de boundaries client/server para Server Components.\r\n * Soporta directivas 'use client' y 'use server' tanto a nivel de archivo\r\n * como inline en funciones.\r\n * \r\n * Filosofía Flight:\r\n * - Detección en build-time (no runtime overhead)\r\n * - Soporte para directivas estándar de React\r\n * - Extensible para otros frameworks\r\n * - Zero dependencies\r\n * \r\n * @module @flight-framework/core/rsc/boundaries\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Tipo de boundary de componente\r\n */\r\nexport type BoundaryType = 'server' | 'client' | 'shared';\r\n\r\n/**\r\n * Información de un boundary detectado\r\n */\r\nexport interface ComponentBoundary {\r\n /** Tipo de boundary */\r\n type: BoundaryType;\r\n /** ID del módulo (path relativo o absoluto) */\r\n moduleId: string;\r\n /** Nombre del export */\r\n exportName: string;\r\n /** Línea donde se detectó la directiva */\r\n line?: number;\r\n /** Es una directiva inline (dentro de función) */\r\n inline?: boolean;\r\n /** Metadata adicional */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Resultado del análisis de un módulo\r\n */\r\nexport interface ModuleAnalysis {\r\n /** Path del módulo */\r\n moduleId: string;\r\n /** Directiva a nivel de archivo ('use client' o 'use server') */\r\n fileDirective?: 'client' | 'server';\r\n /** Boundaries detectados */\r\n boundaries: ComponentBoundary[];\r\n /** Exports que son Server Actions */\r\n serverActions: string[];\r\n /** Exports que son Client Components */\r\n clientComponents: string[];\r\n /** El módulo tiene componentes async */\r\n hasAsyncComponents: boolean;\r\n}\r\n\r\n/**\r\n * Referencia a un Client Component\r\n */\r\nexport interface ClientReference<T = unknown> {\r\n $$typeof: symbol;\r\n $$id: string;\r\n $$async: boolean;\r\n __flight_client: true;\r\n __flight_module: string;\r\n __flight_export: string;\r\n // Type-safe component signature\r\n (props: T extends (props: infer P) => unknown ? P : unknown): unknown;\r\n}\r\n\r\n/**\r\n * Referencia a una Server Function (Action)\r\n */\r\nexport interface ServerReference<T extends (...args: unknown[]) => unknown = (...args: unknown[]) => unknown> {\r\n $$typeof: symbol;\r\n $$id: string;\r\n $$bound: unknown[] | null;\r\n __flight_server: true;\r\n __flight_action: string;\r\n // Type-safe function signature\r\n (...args: Parameters<T>): Promise<ReturnType<T>>;\r\n}\r\n\r\n// Symbols for reference detection\r\nexport const CLIENT_REFERENCE = Symbol.for('flight.client.reference');\r\nexport const SERVER_REFERENCE = Symbol.for('flight.server.reference');\r\n\r\n// ============================================================================\r\n// Directive Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Regex patterns para detección de directivas\r\n */\r\nconst PATTERNS = {\r\n // 'use client'; o \"use client\";\r\n USE_CLIENT: /^['\"]use client['\"];?\\s*$/,\r\n // 'use server'; o \"use server\";\r\n USE_SERVER: /^['\"]use server['\"];?\\s*$/,\r\n // Inline 'use server' dentro de función\r\n INLINE_USE_SERVER: /['\"]use server['\"];?/,\r\n // Detección de función async\r\n ASYNC_FUNCTION: /(?:^|\\s)async\\s+function\\s+(\\w+)/,\r\n // Detección de arrow function async\r\n ASYNC_ARROW: /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s*(?:\\([^)]*\\)|[^=])\\s*=>/,\r\n // Export statement\r\n EXPORT: /export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|const|let|class)\\s+(\\w+)/g,\r\n // Export default\r\n EXPORT_DEFAULT: /export\\s+default\\s+/,\r\n} as const;\r\n\r\n/**\r\n * Detecta si un archivo tiene la directiva 'use client'\r\n */\r\nexport function hasUseClientDirective(source: string): boolean {\r\n const lines = source.trim().split('\\n');\r\n // Check first non-empty, non-comment line\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('/*')) {\r\n continue;\r\n }\r\n return PATTERNS.USE_CLIENT.test(trimmed);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Detecta si un archivo tiene la directiva 'use server' a nivel de archivo\r\n */\r\nexport function hasUseServerDirective(source: string): boolean {\r\n const lines = source.trim().split('\\n');\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('/*')) {\r\n continue;\r\n }\r\n return PATTERNS.USE_SERVER.test(trimmed);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Detecta el tipo de componente basado en directivas\r\n */\r\nexport function detectBoundaryType(source: string): BoundaryType {\r\n if (hasUseClientDirective(source)) return 'client';\r\n if (hasUseServerDirective(source)) return 'server';\r\n return 'shared';\r\n}\r\n\r\n/**\r\n * Detecta Server Actions inline en el código\r\n * Busca funciones que contienen 'use server' dentro de su cuerpo\r\n */\r\nexport function detectInlineServerActions(source: string): string[] {\r\n const actions: string[] = [];\r\n\r\n // Regex para encontrar funciones con 'use server' inline\r\n // Soporta:\r\n // - async function name() { 'use server'; ... }\r\n // - const name = async () => { 'use server'; ... }\r\n // - const name = async function() { 'use server'; ... }\r\n\r\n const functionPatterns = [\r\n // async function name() { 'use server';\r\n /async\\s+function\\s+(\\w+)\\s*\\([^)]*\\)\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n // const name = async () => { 'use server';\r\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s*\\([^)]*\\)\\s*=>\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n // const name = async function() { 'use server';\r\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*async\\s+function\\s*\\([^)]*\\)\\s*\\{[\\s\\n]*['\"]use server['\"]/g,\r\n ];\r\n\r\n for (const pattern of functionPatterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1]) {\r\n actions.push(match[1]);\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(actions)]; // Deduplicar\r\n}\r\n\r\n/**\r\n * Detecta componentes async (Server Components potenciales)\r\n */\r\nexport function detectAsyncComponents(source: string): string[] {\r\n const components: string[] = [];\r\n\r\n // Buscar exports de funciones async\r\n const patterns = [\r\n // export async function ComponentName\r\n /export\\s+(?:default\\s+)?async\\s+function\\s+(\\w+)/g,\r\n // export const ComponentName = async\r\n /export\\s+(?:const|let)\\s+(\\w+)\\s*=\\s*async/g,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1] && /^[A-Z]/.test(match[1])) { // PascalCase = component\r\n components.push(match[1]);\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(components)];\r\n}\r\n\r\n/**\r\n * Análisis completo de un módulo\r\n */\r\nexport function analyzeModule(source: string, moduleId: string): ModuleAnalysis {\r\n const boundaries: ComponentBoundary[] = [];\r\n const serverActions: string[] = [];\r\n const clientComponents: string[] = [];\r\n\r\n // Detectar directiva a nivel de archivo\r\n let fileDirective: 'client' | 'server' | undefined;\r\n if (hasUseClientDirective(source)) {\r\n fileDirective = 'client';\r\n } else if (hasUseServerDirective(source)) {\r\n fileDirective = 'server';\r\n }\r\n\r\n // Si es 'use client', todo el módulo es client\r\n if (fileDirective === 'client') {\r\n boundaries.push({\r\n type: 'client',\r\n moduleId,\r\n exportName: '*',\r\n line: 1,\r\n });\r\n\r\n // Buscar todos los exports como client components\r\n const exports = extractExports(source);\r\n clientComponents.push(...exports);\r\n }\r\n\r\n // Si es 'use server' a nivel de archivo, todos los exports son server actions\r\n if (fileDirective === 'server') {\r\n boundaries.push({\r\n type: 'server',\r\n moduleId,\r\n exportName: '*',\r\n line: 1,\r\n });\r\n\r\n const exports = extractExports(source);\r\n serverActions.push(...exports);\r\n }\r\n\r\n // Detectar server actions inline (incluso en módulos sin directiva de archivo)\r\n if (fileDirective !== 'client') {\r\n const inlineActions = detectInlineServerActions(source);\r\n for (const action of inlineActions) {\r\n if (!serverActions.includes(action)) {\r\n serverActions.push(action);\r\n boundaries.push({\r\n type: 'server',\r\n moduleId,\r\n exportName: action,\r\n inline: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Detectar async components\r\n const asyncComponents = detectAsyncComponents(source);\r\n\r\n return {\r\n moduleId,\r\n fileDirective,\r\n boundaries,\r\n serverActions,\r\n clientComponents,\r\n hasAsyncComponents: asyncComponents.length > 0,\r\n };\r\n}\r\n\r\n/**\r\n * Extrae nombres de exports de un módulo\r\n */\r\nfunction extractExports(source: string): string[] {\r\n const exports: string[] = [];\r\n\r\n const patterns = [\r\n // export function/const/let/class Name\r\n /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g,\r\n // export default function Name\r\n /export\\s+default\\s+(?:async\\s+)?(?:function|class)\\s+(\\w+)/g,\r\n // export { name }\r\n /export\\s*\\{\\s*([^}]+)\\s*\\}/g,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(source)) !== null) {\r\n if (match[1]) {\r\n // Handle export { a, b, c }\r\n const names = match[1].split(',').map(n => n.trim().split(/\\s+as\\s+/).pop()!.trim());\r\n exports.push(...names.filter(n => n && n !== 'default'));\r\n }\r\n }\r\n }\r\n\r\n // Check for export default\r\n if (/export\\s+default\\s+/.test(source)) {\r\n exports.push('default');\r\n }\r\n\r\n return [...new Set(exports)];\r\n}\r\n\r\n// ============================================================================\r\n// Reference Creation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una referencia a un Client Component\r\n * Para uso en build-time (transformación de código)\r\n */\r\nexport function createClientReference<T>(\r\n moduleId: string,\r\n exportName: string,\r\n isAsync = false\r\n): ClientReference<T> {\r\n const id = `${moduleId}#${exportName}`;\r\n\r\n const reference = function (_props: unknown): never {\r\n throw new Error(\r\n `Attempted to call Client Component \"${exportName}\" from \"${moduleId}\" on the server. ` +\r\n 'Client Components can only be rendered on the client.'\r\n );\r\n } as unknown as ClientReference<T>;\r\n\r\n reference.$$typeof = CLIENT_REFERENCE;\r\n reference.$$id = id;\r\n reference.$$async = isAsync;\r\n reference.__flight_client = true;\r\n reference.__flight_module = moduleId;\r\n reference.__flight_export = exportName;\r\n\r\n return reference;\r\n}\r\n\r\n/**\r\n * Crea una referencia a una Server Function (Action)\r\n * Para uso en build-time (transformación de código)\r\n */\r\nexport function createServerReference<T extends (...args: unknown[]) => unknown>(\r\n actionId: string,\r\n boundArgs?: unknown[]\r\n): ServerReference<T> {\r\n const reference = async function (..._args: unknown[]) {\r\n // Esta función será reemplazada por el bundler plugin\r\n // para hacer una llamada RPC al servidor\r\n throw new Error(\r\n `Server Action \"${actionId}\" was called but no RPC handler is configured. ` +\r\n 'Make sure the Flight bundler plugin is properly configured.'\r\n );\r\n } as unknown as ServerReference<T>;\r\n\r\n reference.$$typeof = SERVER_REFERENCE;\r\n reference.$$id = actionId;\r\n reference.$$bound = boundArgs ?? null;\r\n reference.__flight_server = true;\r\n reference.__flight_action = actionId;\r\n\r\n return reference;\r\n}\r\n\r\n/**\r\n * Verifica si un valor es una Client Reference\r\n */\r\nexport function isClientReference(value: unknown): value is ClientReference {\r\n return (\r\n typeof value === 'function' &&\r\n '$$typeof' in value &&\r\n value.$$typeof === CLIENT_REFERENCE\r\n );\r\n}\r\n\r\n/**\r\n * Verifica si un valor es una Server Reference\r\n */\r\nexport function isServerReference(value: unknown): value is ServerReference {\r\n return (\r\n typeof value === 'function' &&\r\n '$$typeof' in value &&\r\n value.$$typeof === SERVER_REFERENCE\r\n );\r\n}\r\n\r\n/**\r\n * Obtiene el ID de una referencia\r\n */\r\nexport function getReferenceId(ref: ClientReference | ServerReference): string {\r\n return ref.$$id;\r\n}\r\n\r\n// ============================================================================\r\n// Boundary Registry\r\n// ============================================================================\r\n\r\n/**\r\n * Registry de boundaries para uso en runtime\r\n */\r\nexport class BoundaryRegistry {\r\n private clientModules = new Map<string, () => Promise<unknown>>();\r\n private serverActions = new Map<string, (...args: unknown[]) => Promise<unknown>>();\r\n\r\n /**\r\n * Registra un Client Component\r\n */\r\n registerClient(id: string, loader: () => Promise<unknown>): void {\r\n this.clientModules.set(id, loader);\r\n }\r\n\r\n /**\r\n * Registra una Server Action\r\n */\r\n registerServer(id: string, action: (...args: unknown[]) => Promise<unknown>): void {\r\n this.serverActions.set(id, action);\r\n }\r\n\r\n /**\r\n * Obtiene un Client Component loader\r\n */\r\n getClient(id: string): (() => Promise<unknown>) | undefined {\r\n return this.clientModules.get(id);\r\n }\r\n\r\n /**\r\n * Obtiene una Server Action\r\n */\r\n getServer(id: string): ((...args: unknown[]) => Promise<unknown>) | undefined {\r\n return this.serverActions.get(id);\r\n }\r\n\r\n /**\r\n * Verifica si un client module está registrado\r\n */\r\n hasClient(id: string): boolean {\r\n return this.clientModules.has(id);\r\n }\r\n\r\n /**\r\n * Verifica si una server action está registrada\r\n */\r\n hasServer(id: string): boolean {\r\n return this.serverActions.has(id);\r\n }\r\n\r\n /**\r\n * Obtiene todos los IDs de client modules\r\n */\r\n getClientIds(): string[] {\r\n return [...this.clientModules.keys()];\r\n }\r\n\r\n /**\r\n * Obtiene todos los IDs de server actions\r\n */\r\n getServerIds(): string[] {\r\n return [...this.serverActions.keys()];\r\n }\r\n\r\n /**\r\n * Limpia el registry\r\n */\r\n clear(): void {\r\n this.clientModules.clear();\r\n this.serverActions.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Registry global (singleton)\r\n */\r\nexport const globalRegistry = new BoundaryRegistry();\r\n\r\n/**\r\n * Registra un Client Component en el registry global\r\n */\r\nexport function registerClientComponent(id: string, loader: () => Promise<unknown>): void {\r\n globalRegistry.registerClient(id, loader);\r\n}\r\n\r\n/**\r\n * Registra una Server Action en el registry global\r\n */\r\nexport function registerServerAction(id: string, action: (...args: unknown[]) => Promise<unknown>): void {\r\n globalRegistry.registerServer(id, action);\r\n}\r\n"]}
@@ -252,5 +252,5 @@ var FlightStreamError = class extends Error {
252
252
  };
253
253
 
254
254
  export { FlightStreamError, consumeFlightStream, createFlightResponse, createFlightStream, createFlightStreamFromArray, createHybridResponse, createStreamController, mergeFlightStreams, parseFlightStream, parseFlightStreamSync, prettyPrintChunks, transformFlightStream };
255
- //# sourceMappingURL=chunk-A2QRUBVE.js.map
256
- //# sourceMappingURL=chunk-A2QRUBVE.js.map
255
+ //# sourceMappingURL=chunk-PVUMB632.js.map
256
+ //# sourceMappingURL=chunk-PVUMB632.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/stream.ts"],"names":["index","result"],"mappings":";AAyEO,SAAS,kBAAA,CACZ,MAAA,EACA,OAAA,GAA+B,EAAC,EACN;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,OAAA,EAAQ,GAAI,OAAA;AACzC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,EAAA,OAAO,IAAI,cAAA,CAAe;AAAA,IACtB,MAAM,MAAM,UAAA,EAAY;AACpB,MAAA,IAAI;AACA,QAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAE9B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA;AACrC,UAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAEvC,UAAA,OAAA,GAAU,KAAK,CAAA;AAAA,QACnB;AAEA,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA,UAAA,IAAa;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,QAAA,OAAA,GAAU,GAAG,CAAA;AACb,QAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,MACxB;AAAA,IACJ;AAAA,GACH,CAAA;AACL;AAKO,SAAS,2BAAA,CACZ,MAAA,EACA,OAAA,GAA+B,EAAC,EACN;AAC1B,EAAA,gBAAgB,SAAA,GAAY;AACxB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AACA,EAAA,OAAO,kBAAA,CAAmB,SAAA,EAAU,EAAG,OAAO,CAAA;AAClD;AAoBA,gBAAuB,kBACnB,MAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,EAAM;AACT,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AAEN,QAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACf,UAAA,MAAM,WAAW,MAAM,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACJ;AAEA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACb,UAAA,MAAM,WAAW,IAAI,CAAA;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAA,SAAE;AACE,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACvB;AACJ;AAKO,SAAS,sBAAsB,IAAA,EAA6B;AAC/D,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACjC,IAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAChC;AAAA,EACJ;AAEA,EAAA,OAAO,MAAA;AACX;AAKA,SAAS,WAAW,IAAA,EAA2B;AAC3C,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACJ,IAAA,MAAM,IAAI,iBAAA;AAAA,MACN,CAAA,8BAAA,EAAiC,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAE,CAAA,CAAA;AAAA,MACpF;AAAA,KACJ;AAAA,EACJ;AACJ;AAKA,eAAsB,oBAClB,MAAA,EAC2B;AAC3B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,IAAI,IAAA;AAEJ,EAAA,WAAA,MAAiB,KAAA,IAAS,iBAAA,CAAkB,MAAM,CAAA,EAAG;AACjD,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,GAAA,IAAO,KAAA,CAAM,OAAO,MAAA,EAAQ;AAC3C,MAAA,IAAA,GAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACpB,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACrB;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC3B;AACJ;AASO,SAAS,oBAAA,CACZ,MAAA,EACA,OAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,EAAE,MAAA,GAAS,GAAA,EAAK,OAAA,GAAU,IAAG,GAAI,OAAA;AAEvC,EAAA,OAAO,IAAI,QAAA,CAAS,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAAA,IAC5C,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB,eAAA;AAAA,MAChB,mBAAA,EAAqB,SAAA;AAAA,MACrB,eAAA,EAAiB,oBAAA;AAAA,MACjB,wBAAA,EAA0B,SAAA;AAAA,MAC1B,GAAG;AAAA;AACP,GACH,CAAA;AACL;AAUO,SAAS,oBAAA,CACZ,UAAA,EACA,YAAA,EACA,OAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,EAAE,MAAA,GAAS,GAAA,EAAK,OAAA,GAAU,IAAG,GAAI,OAAA;AAGvC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,CAAA,6BAAA,EAAgC,YAAA,CAAa,aAAa,CAAC,CAAA,SAAA,CAAA;AAGhF,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAwC;AAAA,IAC1D,SAAA,CAAU,OAAO,UAAA,EAAY;AACzB,MAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,MAAM,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IACnD;AAAA,GACH,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,WAAA,CAAY,SAAS,CAAA;AAEvD,EAAA,OAAO,IAAI,SAAS,cAAA,EAAgB;AAAA,IAChC,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB,0BAAA;AAAA,MAChB,mBAAA,EAAqB,SAAA;AAAA,MACrB,wBAAA,EAA0B,SAAA;AAAA,MAC1B,GAAG;AAAA;AACP,GACH,CAAA;AACL;AAKA,SAAS,aAAa,OAAA,EAAyB;AAC3C,EAAA,OAAO,OAAA,CACF,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA,CACvB,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA,CACvB,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA;AAChC;AASO,SAAS,sBAAA,GAKd;AACE,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,UAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAA2B;AAAA,IAC1C,MAAM,IAAA,EAAM;AACR,MAAA,UAAA,GAAa,IAAA;AAAA,IACjB;AAAA,GACH,CAAA;AAED,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,QAAQ,KAAA,EAAoB;AACxB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA;AACrC,MAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,MAAM,GAAA,EAAY;AACd,MAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,KAAA,GAAQ;AACJ,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACrB;AAAA,GACJ;AACJ;AAKO,SAAS,sBACT,OAAA,EACuB;AAC1B,EAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,CAAA;AAE9C,EAAA,OAAO,IAAI,cAAA,CAAe;AAAA,IACtB,MAAM,KAAK,UAAA,EAAY;AAEnB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,OAAO,QAAQA,MAAAA,KAAU;AAClD,QAAA,MAAMC,OAAAA,GAAS,MAAM,MAAA,CAAO,IAAA,EAAK;AACjC,QAAA,OAAO,EAAE,MAAA,EAAAA,OAAAA,EAAQ,KAAA,EAAAD,MAAAA,EAAM;AAAA,MAC3B,CAAC,CAAA;AAED,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,KAAU,MAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAErD,MAAA,IAAI,OAAO,IAAA,EAAM;AAEb,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AAEvB,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACrB;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,MACnC;AAAA,IACJ;AAAA,GACH,CAAA;AACL;AAKO,SAAS,qBAAA,CACZ,QACA,SAAA,EAC0B;AAC1B,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,EAAA,OAAO,IAAI,cAAA,CAAe;AAAA,IACtB,MAAM,MAAM,UAAA,EAAY;AACpB,MAAA,IAAI;AACA,QAAA,WAAA,MAAiB,KAAA,IAAS,iBAAA,CAAkB,MAAM,CAAA,EAAG;AACjD,UAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,KAAK,CAAA;AACzC,UAAA,IAAI,WAAA,EAAa;AACb,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,GAAI,IAAA;AAC3C,YAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,UAC3C;AAAA,QACJ;AACA,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MACrB,SAAS,KAAA,EAAO;AACZ,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC1B;AAAA,IACJ;AAAA,GACH,CAAA;AACL;AASO,SAAS,kBAAkB,MAAA,EAA+B;AAC7D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,QAAQ,KAAA,GAAQ,KAAA,CAAM,KAAK,UAAA,IAAc,KAAA,GAAQ,MAAM,QAAA,GAAW,GAAA;AAE7E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,EAAE,CAAA,CAAE,CAAA;AAE9B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,GAAA,IAAO,KAAA,CAAM,IAAA,EAAM;AAClC,MAAA,KAAA,CAAM,KAAK,CAAA,uBAAA,EAAgB,kBAAA,CAAmB,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACpB,MAAA,KAAA,CAAM,KAAK,CAAA,yBAAA,EAAkB,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAAiB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAC1B;AAEA,SAAS,kBAAkB,IAAA,EAAmC;AAC1D,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,QAAA;AAAA,IACjB;AAAS,MAAA,OAAO,QAAA;AAAA;AAExB;AAEA,SAAS,mBAAmB,OAAA,EAA0B;AAClD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,YAAY,QAAA,EAAU,OAAO,OAAO,OAAO,CAAA;AAElE,EAAA,MAAM,EAAA,GAAK,OAAA;AAEX,EAAA,IAAI,GAAG,MAAA,KAAW,MAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,GAAG,GAAG,CAAA,IAAA,CAAA;AAC3C,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAQ,OAAO,QAAA;AACjC,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,UAAA,EAAY,OAAO,UAAA;AACrC,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,UAAA,EAAY,OAAO,0BAAA;AACrC,EAAA,IAAI,GAAG,MAAA,KAAW,QAAA,EAAU,OAAO,CAAA,WAAA,EAAc,GAAG,GAAG,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAQ,OAAO,WAAA;AACjC,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA;AAEjC,EAAA,OAAO,KAAK,SAAA,CAAU,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC9C;AASO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EACzC,WAAA,CACI,SACgB,OAAA,EAClB;AACE,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EAChB;AACJ","file":"chunk-PVUMB632.js","sourcesContent":["/**\r\n * @flight-framework/core - Flight Stream\r\n * \r\n * Protocolo de streaming para Server Components.\r\n * Usa NDJSON (Newline Delimited JSON) para máxima debuggabilidad.\r\n * \r\n * Filosofía Flight:\r\n * - Formato abierto y documentado\r\n * - Works con cualquier runtime (Node, Deno, Bun, Edge)\r\n * - Fácil de debuggear (text-based)\r\n * - Sin dependencias\r\n * \r\n * @module @flight-framework/core/rsc/stream\r\n */\r\n\r\nimport type {\r\n FlightChunk,\r\n ServerComponentChunk,\r\n ErrorBoundaryChunk,\r\n} from './payload.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Opciones para crear un FlightStream\r\n */\r\nexport interface FlightStreamOptions {\r\n /** Incluir timestamps en chunks */\r\n timestamps?: boolean;\r\n /** Prefix para IDs generados */\r\n idPrefix?: string;\r\n /** Callback cuando un chunk es enviado */\r\n onChunk?: (chunk: FlightChunk) => void;\r\n /** Callback cuando el stream termina */\r\n onComplete?: () => void;\r\n /** Callback en caso de error */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * Resultado del parsing de un FlightStream\r\n */\r\nexport interface FlightStreamResult {\r\n /** Chunks recibidos */\r\n chunks: FlightChunk[];\r\n /** Componente raíz */\r\n root?: ServerComponentChunk;\r\n /** Errores encontrados */\r\n errors: ErrorBoundaryChunk[];\r\n /** Tiempo total de streaming en ms */\r\n duration: number;\r\n}\r\n\r\n// ============================================================================\r\n// Stream Creation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea un ReadableStream desde un AsyncIterable de chunks\r\n * \r\n * @example\r\n * ```typescript\r\n * async function* renderApp() {\r\n * yield createServerChunk('root', tree);\r\n * yield createClientChunk('counter', './Counter', 'default', { initial: 0 });\r\n * }\r\n * \r\n * const stream = createFlightStream(renderApp());\r\n * return new Response(stream, { headers: { 'Content-Type': 'text/x-flight' } });\r\n * ```\r\n */\r\nexport function createFlightStream(\r\n chunks: AsyncIterable<FlightChunk>,\r\n options: FlightStreamOptions = {}\r\n): ReadableStream<Uint8Array> {\r\n const { onChunk, onComplete, onError } = options;\r\n const encoder = new TextEncoder();\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n for await (const chunk of chunks) {\r\n // Serialize chunk to NDJSON line\r\n const line = JSON.stringify(chunk) + '\\n';\r\n controller.enqueue(encoder.encode(line));\r\n\r\n onChunk?.(chunk);\r\n }\r\n\r\n controller.close();\r\n onComplete?.();\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n onError?.(err);\r\n controller.error(err);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Crea un FlightStream desde un array de chunks\r\n */\r\nexport function createFlightStreamFromArray(\r\n chunks: FlightChunk[],\r\n options: FlightStreamOptions = {}\r\n): ReadableStream<Uint8Array> {\r\n async function* generator() {\r\n for (const chunk of chunks) {\r\n yield chunk;\r\n }\r\n }\r\n return createFlightStream(generator(), options);\r\n}\r\n\r\n// ============================================================================\r\n// Stream Parsing\r\n// ============================================================================\r\n\r\n/**\r\n * Parsea un FlightStream a chunks individuales\r\n * \r\n * @example\r\n * ```typescript\r\n * // En el cliente\r\n * const response = await fetch('/page');\r\n * const chunks = parseFlightStream(response.body!);\r\n * \r\n * for await (const chunk of chunks) {\r\n * handleChunk(chunk);\r\n * }\r\n * ```\r\n */\r\nexport async function* parseFlightStream(\r\n stream: ReadableStream<Uint8Array>\r\n): AsyncGenerator<FlightChunk> {\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n\r\n if (done) {\r\n // Process remaining buffer\r\n if (buffer.trim()) {\r\n yield parseChunk(buffer);\r\n }\r\n break;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // Split by newlines and process complete lines\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() ?? '';\r\n\r\n for (const line of lines) {\r\n if (line.trim()) {\r\n yield parseChunk(line);\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Parsea un string completo de FlightStream\r\n */\r\nexport function parseFlightStreamSync(data: string): FlightChunk[] {\r\n const chunks: FlightChunk[] = [];\r\n\r\n for (const line of data.split('\\n')) {\r\n if (line.trim()) {\r\n chunks.push(parseChunk(line));\r\n }\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Parsea una línea individual a un chunk\r\n */\r\nfunction parseChunk(line: string): FlightChunk {\r\n try {\r\n return JSON.parse(line) as FlightChunk;\r\n } catch {\r\n throw new FlightStreamError(\r\n `Failed to parse Flight chunk: ${line.slice(0, 100)}${line.length > 100 ? '...' : ''}`,\r\n line\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Consume un FlightStream y retorna todos los chunks\r\n */\r\nexport async function consumeFlightStream(\r\n stream: ReadableStream<Uint8Array>\r\n): Promise<FlightStreamResult> {\r\n const startTime = Date.now();\r\n const chunks: FlightChunk[] = [];\r\n const errors: ErrorBoundaryChunk[] = [];\r\n let root: ServerComponentChunk | undefined;\r\n\r\n for await (const chunk of parseFlightStream(stream)) {\r\n chunks.push(chunk);\r\n\r\n if (chunk.type === 'S' && chunk.id === 'root') {\r\n root = chunk;\r\n }\r\n\r\n if (chunk.type === 'E') {\r\n errors.push(chunk);\r\n }\r\n }\r\n\r\n return {\r\n chunks,\r\n root,\r\n errors,\r\n duration: Date.now() - startTime,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Crea una Response con Flight payload\r\n */\r\nexport function createFlightResponse(\r\n chunks: AsyncIterable<FlightChunk>,\r\n options: FlightResponseOptions = {}\r\n): Response {\r\n const { status = 200, headers = {} } = options;\r\n\r\n return new Response(createFlightStream(chunks), {\r\n status,\r\n headers: {\r\n 'Content-Type': 'text/x-flight',\r\n 'Transfer-Encoding': 'chunked',\r\n 'Cache-Control': 'no-cache, no-store',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...headers,\r\n },\r\n });\r\n}\r\n\r\nexport interface FlightResponseOptions {\r\n status?: number;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Crea una Response HTML con streaming SSR + Flight payload embebido\r\n */\r\nexport function createHybridResponse(\r\n htmlStream: ReadableStream<Uint8Array>,\r\n flightChunks: FlightChunk[],\r\n options: FlightResponseOptions = {}\r\n): Response {\r\n const { status = 200, headers = {} } = options;\r\n\r\n // Combine HTML stream with Flight payload as inline script\r\n const encoder = new TextEncoder();\r\n const flightPayload = JSON.stringify(flightChunks);\r\n const inlineScript = `<script type=\"text/x-flight\">${escapeScript(flightPayload)}</script>`;\r\n\r\n // Create a TransformStream to inject Flight payload before closing body\r\n const transform = new TransformStream<Uint8Array, Uint8Array>({\r\n transform(chunk, controller) {\r\n controller.enqueue(chunk);\r\n },\r\n flush(controller) {\r\n controller.enqueue(encoder.encode(inlineScript));\r\n },\r\n });\r\n\r\n const combinedStream = htmlStream.pipeThrough(transform);\r\n\r\n return new Response(combinedStream, {\r\n status,\r\n headers: {\r\n 'Content-Type': 'text/html; charset=utf-8',\r\n 'Transfer-Encoding': 'chunked',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Escapa contenido para uso seguro en script tags\r\n */\r\nfunction escapeScript(content: string): string {\r\n return content\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/&/g, '\\\\u0026');\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Crea un stream controller para enviar chunks progresivamente\r\n */\r\nexport function createStreamController(): {\r\n stream: ReadableStream<Uint8Array>;\r\n enqueue: (chunk: FlightChunk) => void;\r\n error: (error: Error) => void;\r\n close: () => void;\r\n} {\r\n const encoder = new TextEncoder();\r\n let controller: ReadableStreamDefaultController<Uint8Array>;\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n start(ctrl) {\r\n controller = ctrl;\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n enqueue(chunk: FlightChunk) {\r\n const line = JSON.stringify(chunk) + '\\n';\r\n controller.enqueue(encoder.encode(line));\r\n },\r\n error(err: Error) {\r\n controller.error(err);\r\n },\r\n close() {\r\n controller.close();\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Merge múltiples streams en uno solo (para rendering paralelo)\r\n */\r\nexport function mergeFlightStreams(\r\n ...streams: ReadableStream<Uint8Array>[]\r\n): ReadableStream<Uint8Array> {\r\n const readers = streams.map(s => s.getReader());\r\n\r\n return new ReadableStream({\r\n async pull(controller) {\r\n // Race all readers\r\n const promises = readers.map(async (reader, index) => {\r\n const result = await reader.read();\r\n return { result, index };\r\n });\r\n\r\n const { result, index } = await Promise.race(promises);\r\n\r\n if (result.done) {\r\n // Remove completed reader\r\n readers.splice(index, 1);\r\n\r\n if (readers.length === 0) {\r\n controller.close();\r\n }\r\n } else {\r\n controller.enqueue(result.value);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Pipe a flight stream through a transform\r\n */\r\nexport function transformFlightStream(\r\n stream: ReadableStream<Uint8Array>,\r\n transform: (chunk: FlightChunk) => FlightChunk | null | Promise<FlightChunk | null>\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n for await (const chunk of parseFlightStream(stream)) {\r\n const transformed = await transform(chunk);\r\n if (transformed) {\r\n const line = JSON.stringify(transformed) + '\\n';\r\n controller.enqueue(encoder.encode(line));\r\n }\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Debug Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Pretty print Flight chunks para debugging\r\n */\r\nexport function prettyPrintChunks(chunks: FlightChunk[]): string {\r\n const lines: string[] = [];\r\n\r\n for (const chunk of chunks) {\r\n const prefix = getChunkTypeLabel(chunk.type);\r\n const id = 'id' in chunk ? chunk.id : 'boundary' in chunk ? chunk.boundary : '?';\r\n\r\n lines.push(`[${prefix}] ${id}`);\r\n\r\n if (chunk.type === 'S' && chunk.tree) {\r\n lines.push(` └─ Tree: ${prettyPrintElement(chunk.tree)}`);\r\n }\r\n if (chunk.type === 'C') {\r\n lines.push(` └─ Module: ${chunk.module}#${chunk.export}`);\r\n }\r\n if (chunk.type === 'E') {\r\n lines.push(` └─ Error: ${chunk.message}`);\r\n }\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction getChunkTypeLabel(type: FlightChunk['type']): string {\r\n switch (type) {\r\n case 'S': return 'SERVER';\r\n case 'C': return 'CLIENT';\r\n case 'A': return 'ACTION';\r\n case 'E': return 'ERROR ';\r\n case 'H': return 'HINT ';\r\n case 'M': return 'META ';\r\n default: return 'UNKNWN';\r\n }\r\n}\r\n\r\nfunction prettyPrintElement(element: unknown): string {\r\n if (!element || typeof element !== 'object') return String(element);\r\n\r\n const el = element as { $$type?: string; tag?: string; ref?: string };\r\n\r\n if (el.$$type === 'host') return `<${el.tag}>...`;\r\n if (el.$$type === 'text') return '\"text\"';\r\n if (el.$$type === 'fragment') return '<>...</>';\r\n if (el.$$type === 'suspense') return '<Suspense>...</Suspense>';\r\n if (el.$$type === 'client') return `<ClientRef:${el.ref}>`;\r\n if (el.$$type === 'lazy') return '<Lazy...>';\r\n if (el.$$type === 'null') return 'null';\r\n\r\n return JSON.stringify(element).slice(0, 50);\r\n}\r\n\r\n// ============================================================================\r\n// Custom Errors\r\n// ============================================================================\r\n\r\n/**\r\n * Error durante parsing de FlightStream\r\n */\r\nexport class FlightStreamError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly rawData?: string\r\n ) {\r\n super(message);\r\n this.name = 'FlightStreamError';\r\n }\r\n}\r\n"]}
@@ -306,5 +306,5 @@ function dedupe(fn, keyFn = (...args) => JSON.stringify(args)) {
306
306
  }
307
307
 
308
308
  export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory };
309
- //# sourceMappingURL=chunk-LKOPJ3GS.js.map
310
- //# sourceMappingURL=chunk-LKOPJ3GS.js.map
309
+ //# sourceMappingURL=chunk-R7SQAREQ.js.map
310
+ //# sourceMappingURL=chunk-R7SQAREQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/index.ts"],"names":["cached"],"mappings":"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","file":"chunk-R7SQAREQ.js","sourcesContent":["/**\r\n * Flight Cache - Agnostic caching primitives\r\n * \r\n * Flight provides the interface, you choose the implementation.\r\n * Use in-memory, Redis, Cloudflare KV, Upstash, or anything else.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createCache } from '@flight-framework/core';\r\n * import { redis } from '@flight-framework/cache-redis';\r\n * \r\n * const cache = createCache({\r\n * adapter: redis({ url: process.env.REDIS_URL }),\r\n * defaultTTL: 3600,\r\n * });\r\n * \r\n * await cache.set('user:1', userData, { tags: ['users'] });\r\n * await cache.invalidateTag('users');\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface CacheOptions {\r\n /** Time-to-live in seconds */\r\n ttl?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** Stale-while-revalidate time in seconds */\r\n swr?: number;\r\n}\r\n\r\nexport interface CacheEntry<T> {\r\n /** Cached value */\r\n value: T;\r\n /** When this entry expires (timestamp) */\r\n expiresAt?: number;\r\n /** When this entry becomes stale (timestamp) */\r\n staleAt?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** When this entry was created */\r\n createdAt: number;\r\n}\r\n\r\nexport interface Cache {\r\n /** Get a value from cache */\r\n get<T>(key: string): Promise<T | undefined>;\r\n\r\n /** Set a value in cache */\r\n set<T>(key: string, value: T, options?: CacheOptions): Promise<void>;\r\n\r\n /** Delete a value from cache */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /** Check if a key exists */\r\n has(key: string): Promise<boolean>;\r\n\r\n /** Clear all cache entries */\r\n clear(): Promise<void>;\r\n\r\n /** Invalidate entries by tag */\r\n invalidateTag(tag: string): Promise<void>;\r\n\r\n /** Invalidate entries by multiple tags */\r\n invalidateTags(tags: string[]): Promise<void>;\r\n\r\n /** Get or set with a factory function */\r\n getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n options?: CacheOptions\r\n ): Promise<T>;\r\n\r\n /** Get multiple values at once */\r\n getMany<T>(keys: string[]): Promise<Map<string, T | undefined>>;\r\n\r\n /** Set multiple values at once */\r\n setMany<T>(entries: Map<string, T>, options?: CacheOptions): Promise<void>;\r\n\r\n /** Get cache statistics (if tracking enabled) */\r\n getStats?(): CacheStats | undefined;\r\n}\r\n\r\nexport interface CacheStats {\r\n hits: number;\r\n misses: number;\r\n sets: number;\r\n deletes: number;\r\n}\r\n\r\n/** Adapter interface for external cache providers */\r\nexport interface CacheAdapter {\r\n /** Adapter name for identification */\r\n readonly name: string;\r\n\r\n /** Get an entry from cache */\r\n get<T>(key: string): Promise<CacheEntry<T> | undefined>;\r\n\r\n /** Set an entry in cache */\r\n set<T>(key: string, entry: CacheEntry<T>): Promise<void>;\r\n\r\n /** Delete an entry from cache */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /** Check if key exists */\r\n has(key: string): Promise<boolean>;\r\n\r\n /** Clear all entries */\r\n clear(): Promise<void>;\r\n\r\n /** Get keys matching pattern (optional) */\r\n keys?(pattern?: string): Promise<string[]>;\r\n\r\n /** Get multiple entries at once (optional, for performance) */\r\n getMany?<T>(keys: string[]): Promise<Map<string, CacheEntry<T> | undefined>>;\r\n\r\n /** Set multiple entries at once (optional, for performance) */\r\n setMany?<T>(entries: Map<string, CacheEntry<T>>): Promise<void>;\r\n\r\n // ========================================================================\r\n // Tag operations - For distributed caches, tags MUST be handled by adapter\r\n // ========================================================================\r\n\r\n /** Whether this adapter supports distributed tags natively */\r\n readonly supportsDistributedTags?: boolean;\r\n\r\n /** Add a key to a tag set (for distributed tag management) */\r\n addToTag?(tag: string, key: string): Promise<void>;\r\n\r\n /** Get all keys associated with a tag */\r\n getTagMembers?(tag: string): Promise<string[]>;\r\n\r\n /** Delete a tag and return its members */\r\n deleteTag?(tag: string): Promise<string[]>;\r\n\r\n // ========================================================================\r\n // Lifecycle\r\n // ========================================================================\r\n\r\n /** Close connection (for cleanup) */\r\n close?(): Promise<void>;\r\n\r\n /** Check if adapter is healthy */\r\n ping?(): Promise<boolean>;\r\n}\r\n\r\n// ============================================================================\r\n// Serialization\r\n// ============================================================================\r\n\r\nexport interface Serializer {\r\n serialize(value: unknown): string;\r\n deserialize<T>(data: string): T;\r\n}\r\n\r\n/** Default JSON serializer */\r\nexport const jsonSerializer: Serializer = {\r\n serialize: (value) => JSON.stringify(value),\r\n deserialize: <T>(data: string) => JSON.parse(data) as T,\r\n};\r\n\r\n// ============================================================================\r\n// In-Memory Cache Implementation (Default)\r\n// ============================================================================\r\n\r\nexport interface MemoryCacheAdapterOptions {\r\n /** Maximum number of entries (0 = unlimited) */\r\n maxSize?: number;\r\n /** Cleanup interval in ms (default: 60000) */\r\n cleanupInterval?: number;\r\n}\r\n\r\nclass MemoryCacheAdapter implements CacheAdapter {\r\n readonly name = 'memory';\r\n readonly supportsDistributedTags = false;\r\n\r\n private store = new Map<string, CacheEntry<unknown>>();\r\n private tagIndex = new Map<string, Set<string>>();\r\n private maxSize: number;\r\n private cleanupTimer?: ReturnType<typeof setInterval>;\r\n\r\n constructor(options: MemoryCacheAdapterOptions = {}) {\r\n this.maxSize = options.maxSize ?? 0;\r\n\r\n // Periodic cleanup of expired entries\r\n const interval = options.cleanupInterval ?? 60000;\r\n if (interval > 0) {\r\n this.cleanupTimer = setInterval(() => this.cleanup(), interval);\r\n }\r\n }\r\n\r\n async get<T>(key: string): Promise<CacheEntry<T> | undefined> {\r\n const entry = this.store.get(key) as CacheEntry<T> | undefined;\r\n if (!entry) return undefined;\r\n\r\n // Check if expired\r\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\r\n this.store.delete(key);\r\n this.removeFromTagIndex(key, entry.tags);\r\n return undefined;\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\r\n // Evict if at max size (simple FIFO eviction)\r\n if (this.maxSize > 0 && this.store.size >= this.maxSize && !this.store.has(key)) {\r\n const firstKey = this.store.keys().next().value;\r\n if (firstKey) {\r\n const evicted = this.store.get(firstKey);\r\n this.store.delete(firstKey);\r\n if (evicted?.tags) {\r\n this.removeFromTagIndex(firstKey, evicted.tags);\r\n }\r\n }\r\n }\r\n\r\n this.store.set(key, entry as CacheEntry<unknown>);\r\n\r\n // Update tag index\r\n if (entry.tags) {\r\n for (const tag of entry.tags) {\r\n if (!this.tagIndex.has(tag)) {\r\n this.tagIndex.set(tag, new Set());\r\n }\r\n this.tagIndex.get(tag)!.add(key);\r\n }\r\n }\r\n }\r\n\r\n async delete(key: string): Promise<boolean> {\r\n const entry = this.store.get(key);\r\n if (entry?.tags) {\r\n this.removeFromTagIndex(key, entry.tags);\r\n }\r\n return this.store.delete(key);\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n const entry = await this.get(key);\r\n return entry !== undefined;\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.store.clear();\r\n this.tagIndex.clear();\r\n }\r\n\r\n async keys(pattern?: string): Promise<string[]> {\r\n const allKeys = Array.from(this.store.keys());\r\n if (!pattern) return allKeys;\r\n\r\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\r\n return allKeys.filter(key => regex.test(key));\r\n }\r\n\r\n async getMany<T>(keys: string[]): Promise<Map<string, CacheEntry<T> | undefined>> {\r\n const result = new Map<string, CacheEntry<T> | undefined>();\r\n for (const key of keys) {\r\n result.set(key, await this.get<T>(key));\r\n }\r\n return result;\r\n }\r\n\r\n async setMany<T>(entries: Map<string, CacheEntry<T>>): Promise<void> {\r\n for (const [key, entry] of entries) {\r\n await this.set(key, entry);\r\n }\r\n }\r\n\r\n // In-memory adapter handles tags locally (non-distributed)\r\n async addToTag(tag: string, key: string): Promise<void> {\r\n if (!this.tagIndex.has(tag)) {\r\n this.tagIndex.set(tag, new Set());\r\n }\r\n this.tagIndex.get(tag)!.add(key);\r\n }\r\n\r\n async getTagMembers(tag: string): Promise<string[]> {\r\n return Array.from(this.tagIndex.get(tag) ?? []);\r\n }\r\n\r\n async deleteTag(tag: string): Promise<string[]> {\r\n const members = await this.getTagMembers(tag);\r\n this.tagIndex.delete(tag);\r\n return members;\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n }\r\n this.store.clear();\r\n this.tagIndex.clear();\r\n }\r\n\r\n async ping(): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n private removeFromTagIndex(key: string, tags?: string[]): void {\r\n if (!tags) return;\r\n for (const tag of tags) {\r\n this.tagIndex.get(tag)?.delete(key);\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n const now = Date.now();\r\n for (const [key, entry] of this.store) {\r\n if (entry.expiresAt && now > entry.expiresAt) {\r\n this.store.delete(key);\r\n this.removeFromTagIndex(key, entry.tags);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create in-memory cache adapter\r\n */\r\nexport function memory(options: MemoryCacheAdapterOptions = {}): CacheAdapter {\r\n return new MemoryCacheAdapter(options);\r\n}\r\n\r\n// ============================================================================\r\n// Cache Factory\r\n// ============================================================================\r\n\r\nexport interface CreateCacheOptions {\r\n /** Custom cache adapter (defaults to in-memory) */\r\n adapter?: CacheAdapter;\r\n /** Default TTL for all entries (seconds) */\r\n defaultTTL?: number;\r\n /** Key prefix for namespacing */\r\n prefix?: string;\r\n /** Custom serializer (for external adapters) */\r\n serializer?: Serializer;\r\n /** Track cache statistics */\r\n trackStats?: boolean;\r\n}\r\n\r\n/**\r\n * Create a new cache instance\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple in-memory cache\r\n * const cache = createCache();\r\n * \r\n * // With Redis adapter\r\n * import { redis } from '@flight-framework/cache-redis';\r\n * const cache = createCache({\r\n * adapter: redis({ url: 'redis://localhost:6379' }),\r\n * defaultTTL: 3600,\r\n * prefix: 'myapp',\r\n * });\r\n * ```\r\n */\r\nexport function createCache(options: CreateCacheOptions = {}): Cache {\r\n const {\r\n adapter = new MemoryCacheAdapter(),\r\n defaultTTL,\r\n prefix = '',\r\n trackStats = false,\r\n } = options;\r\n\r\n // Local tag index for adapters that don't support distributed tags\r\n const localTagIndex = new Map<string, Set<string>>();\r\n\r\n // Stats tracking\r\n const stats: CacheStats = { hits: 0, misses: 0, sets: 0, deletes: 0 };\r\n\r\n function prefixKey(key: string): string {\r\n return prefix ? `${prefix}:${key}` : key;\r\n }\r\n\r\n function useDistributedTags(): boolean {\r\n return !!(adapter.supportsDistributedTags && adapter.addToTag && adapter.getTagMembers && adapter.deleteTag);\r\n }\r\n\r\n async function registerTags(fullKey: string, tags?: string[]): Promise<void> {\r\n if (!tags || tags.length === 0) return;\r\n\r\n if (useDistributedTags()) {\r\n // Distributed: adapter handles tag storage\r\n for (const tag of tags) {\r\n await adapter.addToTag!(tag, fullKey);\r\n }\r\n } else {\r\n // Local: use in-memory index (for memory adapter or simple adapters)\r\n for (const tag of tags) {\r\n if (!localTagIndex.has(tag)) {\r\n localTagIndex.set(tag, new Set());\r\n }\r\n localTagIndex.get(tag)!.add(fullKey);\r\n }\r\n }\r\n }\r\n\r\n async function getTagMembers(tag: string): Promise<string[]> {\r\n if (useDistributedTags()) {\r\n return adapter.getTagMembers!(tag);\r\n }\r\n return Array.from(localTagIndex.get(tag) ?? []);\r\n }\r\n\r\n async function removeTag(tag: string): Promise<void> {\r\n if (useDistributedTags()) {\r\n await adapter.deleteTag!(tag);\r\n } else {\r\n localTagIndex.delete(tag);\r\n }\r\n }\r\n\r\n return {\r\n async get<T>(key: string): Promise<T | undefined> {\r\n const entry = await adapter.get<T>(prefixKey(key));\r\n\r\n if (!entry) {\r\n if (trackStats) stats.misses++;\r\n return undefined;\r\n }\r\n\r\n if (trackStats) stats.hits++;\r\n\r\n // Check stale-while-revalidate (return stale value, caller should revalidate)\r\n // The value is still returned even if stale - that's the \"while revalidate\" part\r\n return entry.value;\r\n },\r\n\r\n async set<T>(key: string, value: T, opts?: CacheOptions): Promise<void> {\r\n const ttl = opts?.ttl ?? defaultTTL;\r\n const now = Date.now();\r\n\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: now,\r\n tags: opts?.tags,\r\n };\r\n\r\n if (ttl) {\r\n entry.expiresAt = now + (ttl * 1000);\r\n if (opts?.swr) {\r\n entry.staleAt = now + ((ttl - opts.swr) * 1000);\r\n }\r\n }\r\n\r\n const fullKey = prefixKey(key);\r\n await adapter.set(fullKey, entry);\r\n await registerTags(fullKey, opts?.tags);\r\n\r\n if (trackStats) stats.sets++;\r\n },\r\n\r\n async delete(key: string): Promise<boolean> {\r\n const fullKey = prefixKey(key);\r\n const result = await adapter.delete(fullKey);\r\n if (trackStats && result) stats.deletes++;\r\n return result;\r\n },\r\n\r\n async has(key: string): Promise<boolean> {\r\n return adapter.has(prefixKey(key));\r\n },\r\n\r\n async clear(): Promise<void> {\r\n await adapter.clear();\r\n localTagIndex.clear();\r\n },\r\n\r\n async invalidateTag(tag: string): Promise<void> {\r\n const keys = await getTagMembers(tag);\r\n\r\n for (const key of keys) {\r\n await adapter.delete(key);\r\n }\r\n\r\n await removeTag(tag);\r\n },\r\n\r\n async invalidateTags(tags: string[]): Promise<void> {\r\n for (const tag of tags) {\r\n await this.invalidateTag(tag);\r\n }\r\n },\r\n\r\n async getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n opts?: CacheOptions\r\n ): Promise<T> {\r\n const cached = await this.get<T>(key);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const value = await factory();\r\n await this.set(key, value, opts);\r\n return value;\r\n },\r\n\r\n async getMany<T>(keys: string[]): Promise<Map<string, T | undefined>> {\r\n const result = new Map<string, T | undefined>();\r\n\r\n if (adapter.getMany) {\r\n // Use batch operation if adapter supports it\r\n const entries = await adapter.getMany<T>(keys.map(prefixKey));\r\n for (const [key, entry] of entries) {\r\n const originalKey = prefix ? key.slice(prefix.length + 1) : key;\r\n result.set(originalKey, entry?.value);\r\n }\r\n } else {\r\n // Fallback to individual gets\r\n for (const key of keys) {\r\n result.set(key, await this.get<T>(key));\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n async setMany<T>(entries: Map<string, T>, opts?: CacheOptions): Promise<void> {\r\n const ttl = opts?.ttl ?? defaultTTL;\r\n const now = Date.now();\r\n\r\n const cacheEntries = new Map<string, CacheEntry<T>>();\r\n\r\n for (const [key, value] of entries) {\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: now,\r\n tags: opts?.tags,\r\n };\r\n\r\n if (ttl) {\r\n entry.expiresAt = now + (ttl * 1000);\r\n if (opts?.swr) {\r\n entry.staleAt = now + ((ttl - opts.swr) * 1000);\r\n }\r\n }\r\n\r\n const fullKey = prefixKey(key);\r\n cacheEntries.set(fullKey, entry);\r\n await registerTags(fullKey, opts?.tags);\r\n }\r\n\r\n if (adapter.setMany) {\r\n await adapter.setMany(cacheEntries);\r\n } else {\r\n for (const [key, entry] of cacheEntries) {\r\n await adapter.set(key, entry);\r\n }\r\n }\r\n\r\n if (trackStats) stats.sets += entries.size;\r\n },\r\n\r\n getStats() {\r\n return trackStats ? { ...stats } : undefined;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Cache Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a cache key from multiple parts\r\n * \r\n * @example\r\n * ```typescript\r\n * cacheKey('user', userId, 'profile'); // \"user:123:profile\"\r\n * ```\r\n */\r\nexport function cacheKey(...parts: (string | number | boolean | undefined)[]): string {\r\n return parts\r\n .filter(p => p !== undefined)\r\n .map(p => String(p))\r\n .join(':');\r\n}\r\n\r\n/**\r\n * Wrap a function with caching\r\n * \r\n * @example\r\n * ```typescript\r\n * const getCachedUser = cached(cache, getUser, {\r\n * ttl: 300,\r\n * keyFn: (userId) => `user:${userId}`,\r\n * });\r\n * \r\n * const user = await getCachedUser(123);\r\n * ```\r\n */\r\nexport function cached<T extends (...args: unknown[]) => Promise<unknown>>(\r\n cache: Cache,\r\n fn: T,\r\n options?: CacheOptions & { keyFn?: (...args: Parameters<T>) => string }\r\n): T {\r\n const { keyFn = (...args: unknown[]) => JSON.stringify(args), ...cacheOpts } = options ?? {};\r\n\r\n return (async (...args: Parameters<T>) => {\r\n const key = keyFn(...args);\r\n return cache.getOrSet(key, () => fn(...args) as Promise<unknown>, cacheOpts);\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Create a deduplication wrapper to prevent duplicate concurrent requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const dedupedFetch = dedupe(fetchUser);\r\n * \r\n * // These will share the same request\r\n * const [user1, user2] = await Promise.all([\r\n * dedupedFetch(123),\r\n * dedupedFetch(123),\r\n * ]);\r\n * ```\r\n */\r\nexport function dedupe<T extends (...args: unknown[]) => Promise<unknown>>(\r\n fn: T,\r\n keyFn: (...args: Parameters<T>) => string = (...args) => JSON.stringify(args)\r\n): T {\r\n const pending = new Map<string, Promise<unknown>>();\r\n\r\n return (async (...args: Parameters<T>) => {\r\n const key = keyFn(...args);\r\n\r\n if (pending.has(key)) {\r\n return pending.get(key);\r\n }\r\n\r\n const promise = fn(...args).finally(() => {\r\n pending.delete(key);\r\n });\r\n\r\n pending.set(key, promise);\r\n return promise;\r\n }) as T;\r\n}\r\n"]}
@@ -217,5 +217,5 @@ async function streamSequential(boundaries) {
217
217
  }
218
218
 
219
219
  export { createLazyContent, createStreamingResponse, createStreamingSSR, renderWithStreaming, streamParallel, streamSequential };
220
- //# sourceMappingURL=chunk-CNY3ZUVG.js.map
221
- //# sourceMappingURL=chunk-CNY3ZUVG.js.map
220
+ //# sourceMappingURL=chunk-RSVA2EYO.js.map
221
+ //# sourceMappingURL=chunk-RSVA2EYO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/streaming/index.ts"],"names":[],"mappings":"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","file":"chunk-RSVA2EYO.js","sourcesContent":["/**\r\n * @flight-framework/core - Streaming SSR\r\n * \r\n * Full streaming server-side rendering implementation following React 18+/19 patterns.\r\n * Supports both Node.js (renderToPipeableStream) and Edge (renderToReadableStream) environments.\r\n * \r\n * Best Practices 2025/2026:\r\n * - Progressive HTML streaming with Suspense boundaries\r\n * - Shell-first rendering for fast TTFB\r\n * - Nested Suspense for granular loading states\r\n * - Error boundaries for graceful degradation\r\n * - Web Streams API for Edge runtime compatibility\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Streaming render options following React's conventions\r\n */\r\nexport interface StreamingRenderOptions {\r\n /** Bootstrap scripts to load on client */\r\n bootstrapScripts?: string[];\r\n /** Bootstrap ES modules */\r\n bootstrapModules?: string[];\r\n /** Inline script content */\r\n bootstrapScriptContent?: string;\r\n /** Prefix for React IDs (useId) */\r\n identifierPrefix?: string;\r\n /** Nonce for CSP */\r\n nonce?: string;\r\n /** Callback when shell is ready (main content before Suspense) */\r\n onShellReady?: () => void;\r\n /** Callback when shell errors */\r\n onShellError?: (error: Error) => void;\r\n /** Callback when all content is ready */\r\n onAllReady?: () => void;\r\n /** Callback for any error */\r\n onError?: (error: Error) => void;\r\n /** Timeout before aborting stream */\r\n timeoutMs?: number;\r\n /** Progressive hydration enabled */\r\n progressiveHydration?: boolean;\r\n}\r\n\r\n/**\r\n * Streaming render result\r\n */\r\nexport interface StreamingRenderResult {\r\n /** The readable stream to pipe to response */\r\n stream: ReadableStream<Uint8Array>;\r\n /** Abort the stream */\r\n abort: () => void;\r\n /** Promise that resolves when shell is ready */\r\n shellReady: Promise<void>;\r\n /** Promise that resolves when all content is ready */\r\n allReady: Promise<void>;\r\n}\r\n\r\n/**\r\n * Suspense boundary configuration\r\n */\r\nexport interface SuspenseBoundaryConfig {\r\n /** Unique ID for this boundary */\r\n id: string;\r\n /** Fallback HTML to show while loading */\r\n fallback: string;\r\n /** Content resolver promise */\r\n contentPromise: Promise<string>;\r\n /** \r\n * IDs of boundaries that must resolve before this one.\r\n * Enables dependency-aware streaming for complex data relationships.\r\n * @example ['user'] - Wait for 'user' boundary before starting\r\n */\r\n dependsOn?: string[];\r\n /** Custom metadata for observability */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Renderer\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming SSR response using Web Streams API.\r\n * Compatible with Edge Runtime (Cloudflare, Vercel Edge, Deno).\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = await createStreamingSSR({\r\n * shell: '<html><body><div id=\"root\">',\r\n * shellEnd: '</div></body></html>',\r\n * suspenseBoundaries: [\r\n * {\r\n * id: 'posts',\r\n * fallback: '<div>Loading posts...</div>',\r\n * contentPromise: fetchAndRenderPosts(),\r\n * }\r\n * ],\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return new Response(result.stream, {\r\n * headers: { 'Content-Type': 'text/html' },\r\n * });\r\n * ```\r\n */\r\nexport async function createStreamingSSR(config: {\r\n /** Initial HTML shell (before suspense content) */\r\n shell: string;\r\n /** Closing HTML shell */\r\n shellEnd: string;\r\n /** Suspense boundaries with async content */\r\n suspenseBoundaries?: SuspenseBoundaryConfig[];\r\n /** Streaming options */\r\n options?: StreamingRenderOptions;\r\n}): Promise<StreamingRenderResult> {\r\n const { shell, shellEnd, suspenseBoundaries = [], options = {} } = config;\r\n\r\n let shellResolved = false;\r\n let allResolved = false;\r\n let abortController: AbortController | null = null;\r\n\r\n // Shell ready promise\r\n let resolveShell: () => void;\r\n const shellReady = new Promise<void>((resolve) => {\r\n resolveShell = resolve;\r\n });\r\n\r\n // All ready promise\r\n let resolveAll: () => void;\r\n const allReady = new Promise<void>((resolve) => {\r\n resolveAll = resolve;\r\n });\r\n\r\n const encoder = new TextEncoder();\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n try {\r\n // 1. Send the shell immediately (fast TTFB)\r\n const shellWithPlaceholders = buildShellWithPlaceholders(\r\n shell,\r\n suspenseBoundaries,\r\n shellEnd,\r\n options\r\n );\r\n\r\n controller.enqueue(encoder.encode(shellWithPlaceholders));\r\n\r\n shellResolved = true;\r\n options.onShellReady?.();\r\n resolveShell!();\r\n\r\n // 2. Stream Suspense boundary contents as they resolve\r\n if (suspenseBoundaries.length > 0) {\r\n await streamSuspenseContent(controller, encoder, suspenseBoundaries, options);\r\n }\r\n\r\n // 3. Send hydration script if needed\r\n if (options.bootstrapScripts?.length || options.bootstrapModules?.length) {\r\n const hydrationScript = buildHydrationScript(options);\r\n controller.enqueue(encoder.encode(hydrationScript));\r\n }\r\n\r\n allResolved = true;\r\n options.onAllReady?.();\r\n resolveAll!();\r\n\r\n controller.close();\r\n } catch (error) {\r\n if (!shellResolved) {\r\n options.onShellError?.(error as Error);\r\n }\r\n options.onError?.(error as Error);\r\n controller.error(error);\r\n }\r\n },\r\n\r\n cancel() {\r\n abortController?.abort();\r\n },\r\n });\r\n\r\n const abort = () => {\r\n abortController?.abort();\r\n };\r\n\r\n // Timeout handling\r\n if (options.timeoutMs) {\r\n abortController = new AbortController();\r\n setTimeout(() => {\r\n if (!allResolved) {\r\n abort();\r\n }\r\n }, options.timeoutMs);\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 * Build shell HTML with Suspense placeholders\r\n */\r\nfunction buildShellWithPlaceholders(\r\n shell: string,\r\n boundaries: SuspenseBoundaryConfig[],\r\n shellEnd: string,\r\n options: StreamingRenderOptions\r\n): string {\r\n let html = shell;\r\n\r\n // Add inline bootstrap script if provided\r\n if (options.bootstrapScriptContent) {\r\n html += `<script>${options.bootstrapScriptContent}</script>`;\r\n }\r\n\r\n // Add Suspense fallbacks with placeholder markers\r\n for (const boundary of boundaries) {\r\n html += `\r\n<!--$?--><template id=\"B:${boundary.id}\"></template>\r\n${boundary.fallback}\r\n<!--/$-->`;\r\n }\r\n\r\n html += shellEnd;\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * Stream Suspense content as promises resolve\r\n */\r\nasync function streamSuspenseContent(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n boundaries: SuspenseBoundaryConfig[],\r\n options: StreamingRenderOptions\r\n): Promise<void> {\r\n // Race all boundaries - stream each as it completes\r\n const pending = boundaries.map(async (boundary) => {\r\n try {\r\n const content = await boundary.contentPromise;\r\n return { boundary, content, error: null };\r\n } catch (error) {\r\n return { boundary, content: null, error: error as Error };\r\n }\r\n });\r\n\r\n // Process as each resolves\r\n const results = await Promise.allSettled(pending);\r\n\r\n for (const result of results) {\r\n if (result.status === 'fulfilled') {\r\n const { boundary, content, error } = result.value;\r\n\r\n if (error) {\r\n // Send error replacement\r\n const errorScript = buildErrorReplacement(boundary.id, error.message);\r\n controller.enqueue(encoder.encode(errorScript));\r\n options.onError?.(error);\r\n } else if (content) {\r\n // Send content replacement script\r\n const replacementScript = buildContentReplacement(boundary.id, content);\r\n controller.enqueue(encoder.encode(replacementScript));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Build script to replace Suspense placeholder with actual content\r\n * This follows React's streaming hydration pattern\r\n */\r\nfunction buildContentReplacement(id: string, content: string): string {\r\n // Escape script-breaking characters\r\n const escaped = content\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/\\n/g, '\\\\n')\r\n .replace(/\\r/g, '\\\\r');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var p=b.previousSibling;\r\n while(p&&p.nodeType===8&&p.data===\"$?\")p=p.previousSibling;\r\n var n=b.nextSibling;\r\n var f=document.createDocumentFragment();\r\n var t=document.createElement(\"template\");\r\n t.innerHTML=\"${escaped}\";\r\n while(t.content.firstChild)f.appendChild(t.content.firstChild);\r\n if(n&&n.nodeType===8&&n.data===\"/$\"){\r\n var s=n.nextSibling;\r\n while(s&&s!==b){var x=s.nextSibling;s.parentNode.removeChild(s);s=x;}\r\n }\r\n b.parentNode.replaceChild(f,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build script to show error in place of Suspense content\r\n */\r\nfunction buildErrorReplacement(id: string, message: string): string {\r\n const escaped = message.replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var t=document.createElement(\"div\");\r\n t.className=\"streaming-error\";\r\n t.textContent=\"Error: ${escaped}\";\r\n b.parentNode.replaceChild(t,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build hydration bootstrap script\r\n */\r\nfunction buildHydrationScript(options: StreamingRenderOptions): string {\r\n let scripts = '';\r\n\r\n if (options.bootstrapScripts?.length) {\r\n for (const src of options.bootstrapScripts) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script src=\"${src}\"${nonceAttr} async></script>`;\r\n }\r\n }\r\n\r\n if (options.bootstrapModules?.length) {\r\n for (const src of options.bootstrapModules) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script type=\"module\" src=\"${src}\"${nonceAttr}></script>`;\r\n }\r\n }\r\n\r\n return scripts;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming HTML Response object\r\n */\r\nexport function createStreamingResponse(\r\n stream: ReadableStream<Uint8Array>,\r\n options: {\r\n status?: number;\r\n headers?: Record<string, string>;\r\n } = {}\r\n): Response {\r\n return new Response(stream, {\r\n status: options.status || 200,\r\n headers: {\r\n 'Content-Type': 'text/html; charset=utf-8',\r\n 'Transfer-Encoding': 'chunked',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...options.headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Higher-level API: Render page with Suspense boundaries\r\n * \r\n * @example\r\n * ```typescript\r\n * return renderWithStreaming({\r\n * layout: ({ children }) => `\r\n * <html>\r\n * <head><title>My App</title></head>\r\n * <body><div id=\"root\">${children}</div></body>\r\n * </html>\r\n * `,\r\n * page: async () => '<h1>Welcome</h1>',\r\n * suspense: {\r\n * posts: {\r\n * fallback: '<div class=\"skeleton\">Loading...</div>',\r\n * content: fetchPosts().then(renderPosts),\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function renderWithStreaming(config: {\r\n /** Layout wrapper */\r\n layout: (props: { children: string }) => string;\r\n /** Main page content (sync part) */\r\n page: () => string | Promise<string>;\r\n /** Suspense boundaries keyed by ID */\r\n suspense?: Record<string, { fallback: string; content: Promise<string> }>;\r\n /** Bootstrap scripts */\r\n bootstrapScripts?: string[];\r\n /** Timeout in ms */\r\n timeoutMs?: number;\r\n}): Promise<Response> {\r\n const { layout, page, suspense = {}, bootstrapScripts, timeoutMs } = config;\r\n\r\n // Get synchronous page content\r\n const pageContent = await page();\r\n\r\n // Build suspense boundaries\r\n const boundaries: SuspenseBoundaryConfig[] = Object.entries(suspense).map(\r\n ([id, { fallback, content }]) => ({\r\n id,\r\n fallback,\r\n contentPromise: content,\r\n })\r\n );\r\n\r\n // Create streaming result\r\n const result = await createStreamingSSR({\r\n shell: layout({ children: pageContent }),\r\n shellEnd: '',\r\n suspenseBoundaries: boundaries,\r\n options: {\r\n bootstrapScripts,\r\n timeoutMs,\r\n },\r\n });\r\n\r\n return createStreamingResponse(result.stream);\r\n}\r\n\r\n// ============================================================================\r\n// Progressive Rendering Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a lazy component that streams its content\r\n */\r\nexport function createLazyContent<T>(\r\n fetcher: () => Promise<T>,\r\n renderer: (data: T) => string,\r\n fallback: string\r\n): { fallback: string; content: Promise<string> } {\r\n return {\r\n fallback,\r\n content: fetcher().then(renderer),\r\n };\r\n}\r\n\r\n/**\r\n * Parallel streaming: resolve multiple boundaries simultaneously\r\n */\r\nexport async function streamParallel(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n return boundaries.map((b) => ({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n }));\r\n}\r\n\r\n/**\r\n * Sequential streaming: resolve boundaries in order\r\n */\r\nexport async function streamSequential(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n const result: SuspenseBoundaryConfig[] = [];\r\n\r\n for (const b of boundaries) {\r\n result.push({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Export for use with React\r\n// ============================================================================\r\n\r\n/**\r\n * NOTE: For React-specific streaming with renderToPipeableStream or \r\n * renderToReadableStream, use the dedicated React adapter:\r\n * \r\n * ```typescript\r\n * import { renderToReadableStream } from 'react-dom/server';\r\n * import { createStreamingResponse } from '@flight-framework/core/streaming';\r\n * \r\n * const stream = await renderToReadableStream(<App />, {\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return createStreamingResponse(stream);\r\n * ```\r\n * \r\n * This module provides framework-agnostic streaming primitives that work\r\n * with any UI library or custom HTML generation.\r\n */\r\n"]}
@@ -1,4 +1,4 @@
1
- import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-5XHOLZBJ.js';
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
2
2
 
3
3
  // src/rsc/plugins/esbuild.ts
4
4
  function flightRSCEsbuild(options = {}) {
@@ -281,5 +281,5 @@ function extractExportNames(code) {
281
281
  var esbuild_default = flightRSCEsbuild;
282
282
 
283
283
  export { esbuild_default, flightRSCEsbuild };
284
- //# sourceMappingURL=chunk-PAVI5W6M.js.map
285
- //# sourceMappingURL=chunk-PAVI5W6M.js.map
284
+ //# sourceMappingURL=chunk-T4Z4HM4W.js.map
285
+ //# sourceMappingURL=chunk-T4Z4HM4W.js.map