@flight-framework/core 0.2.5 → 0.3.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 (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +346 -0
  3. package/dist/actions/index.js +1 -1
  4. package/dist/adapters/index.js +1 -1
  5. package/dist/cache/index.js +1 -1
  6. package/dist/{chunk-FSJNOPYE.js → chunk-2JVEH76V.js} +3 -3
  7. package/dist/chunk-2JVEH76V.js.map +1 -0
  8. package/dist/{chunk-3ZSSRE6M.js → chunk-2R23X5Z3.js} +2 -2
  9. package/dist/chunk-2R23X5Z3.js.map +1 -0
  10. package/dist/{chunk-VPFMHGEV.js → chunk-3N5ZBVZJ.js} +2 -2
  11. package/dist/chunk-3N5ZBVZJ.js.map +1 -0
  12. package/dist/{chunk-2F2QU6RC.js → chunk-3UQJE3XZ.js} +2 -2
  13. package/dist/chunk-3UQJE3XZ.js.map +1 -0
  14. package/dist/{chunk-PDW5WCMW.js → chunk-5XHOLZBJ.js} +2 -2
  15. package/dist/chunk-5XHOLZBJ.js.map +1 -0
  16. package/dist/{chunk-MDQNNIHH.js → chunk-65JYF3DJ.js} +2 -2
  17. package/dist/chunk-65JYF3DJ.js.map +1 -0
  18. package/dist/{chunk-K2CQZPCG.js → chunk-6GI6HFSQ.js} +2 -2
  19. package/dist/chunk-6GI6HFSQ.js.map +1 -0
  20. package/dist/{chunk-PVUMB632.js → chunk-A2QRUBVE.js} +2 -2
  21. package/dist/chunk-A2QRUBVE.js.map +1 -0
  22. package/dist/{chunk-W6D62JCI.js → chunk-A4TKWQBU.js} +2 -2
  23. package/dist/chunk-A4TKWQBU.js.map +1 -0
  24. package/dist/{chunk-GCQZ4FHI.js → chunk-ARBKF6VI.js} +2 -2
  25. package/dist/{chunk-GCQZ4FHI.js.map → chunk-ARBKF6VI.js.map} +1 -1
  26. package/dist/{chunk-ZVC3ZWLM.js → chunk-B2LPSCES.js} +2 -2
  27. package/dist/chunk-B2LPSCES.js.map +1 -0
  28. package/dist/{chunk-62C7LX2E.js → chunk-CKJHJPKQ.js} +2 -2
  29. package/dist/chunk-CKJHJPKQ.js.map +1 -0
  30. package/dist/{chunk-RSVA2EYO.js → chunk-CNY3ZUVG.js} +2 -2
  31. package/dist/chunk-CNY3ZUVG.js.map +1 -0
  32. package/dist/{chunk-IXMD5QH2.js → chunk-EHVUAFNH.js} +2 -2
  33. package/dist/chunk-EHVUAFNH.js.map +1 -0
  34. package/dist/{chunk-P6WSBVDT.js → chunk-FRAH5QNY.js} +4 -4
  35. package/dist/chunk-FRAH5QNY.js.map +1 -0
  36. package/dist/{chunk-MQQLYWZZ.js → chunk-GNS2FGPC.js} +2 -2
  37. package/dist/chunk-GNS2FGPC.js.map +1 -0
  38. package/dist/{chunk-TASAT7KB.js → chunk-HNPO6LFW.js} +2 -2
  39. package/dist/chunk-HNPO6LFW.js.map +1 -0
  40. package/dist/{chunk-KWFX6WHG.js → chunk-JFUKVWSO.js} +2 -2
  41. package/dist/chunk-JFUKVWSO.js.map +1 -0
  42. package/dist/{chunk-NWMJYTMB.js → chunk-LAKHYTHL.js} +3 -3
  43. package/dist/chunk-LAKHYTHL.js.map +1 -0
  44. package/dist/{chunk-R7SQAREQ.js → chunk-LKOPJ3GS.js} +2 -2
  45. package/dist/chunk-LKOPJ3GS.js.map +1 -0
  46. package/dist/{chunk-WOEIJWGJ.js → chunk-NZS2YJ43.js} +2 -2
  47. package/dist/chunk-NZS2YJ43.js.map +1 -0
  48. package/dist/{chunk-3QP3E7HS.js → chunk-OZ3EXPLE.js} +2 -2
  49. package/dist/chunk-OZ3EXPLE.js.map +1 -0
  50. package/dist/{chunk-YHEVHRLH.js → chunk-OZBPR27I.js} +2 -2
  51. package/dist/chunk-OZBPR27I.js.map +1 -0
  52. package/dist/{chunk-T4Z4HM4W.js → chunk-PAVI5W6M.js} +3 -3
  53. package/dist/chunk-PAVI5W6M.js.map +1 -0
  54. package/dist/{chunk-XSY5AAXT.js → chunk-PO7IHPFF.js} +2 -2
  55. package/dist/chunk-PO7IHPFF.js.map +1 -0
  56. package/dist/{chunk-SUILH4ID.js → chunk-QK6UEQ75.js} +2 -2
  57. package/dist/chunk-QK6UEQ75.js.map +1 -0
  58. package/dist/{chunk-WFAWAHJH.js → chunk-UFWGOJL7.js} +2 -2
  59. package/dist/chunk-UFWGOJL7.js.map +1 -0
  60. package/dist/{chunk-54HPVE7N.js → chunk-UGTETAJ2.js} +2 -2
  61. package/dist/chunk-UGTETAJ2.js.map +1 -0
  62. package/dist/{chunk-LBYDTULN.js → chunk-UL4Q5CIJ.js} +5 -5
  63. package/dist/chunk-UL4Q5CIJ.js.map +1 -0
  64. package/dist/{chunk-XOIYNY4I.js → chunk-VNO2YUVD.js} +2 -2
  65. package/dist/chunk-VNO2YUVD.js.map +1 -0
  66. package/dist/{chunk-ZIE56LCA.js → chunk-XU6MRYG2.js} +3 -3
  67. package/dist/chunk-XU6MRYG2.js.map +1 -0
  68. package/dist/{chunk-6BDCTUQY.js → chunk-YNTMYL36.js} +3 -3
  69. package/dist/chunk-YNTMYL36.js.map +1 -0
  70. package/dist/config/index.js +1 -1
  71. package/dist/errors/index.js +2 -2
  72. package/dist/file-router/index.js +1 -1
  73. package/dist/file-router/streaming-hints.js +1 -1
  74. package/dist/handlers/index.js +1 -1
  75. package/dist/index.js +30 -30
  76. package/dist/index.js.map +1 -1
  77. package/dist/islands/index.js +1 -1
  78. package/dist/middleware/index.js +1 -1
  79. package/dist/react/index.js +2 -2
  80. package/dist/react/index.js.map +1 -1
  81. package/dist/render/index.js +1 -1
  82. package/dist/router/index.js +1 -1
  83. package/dist/rsc/adapters/index.js +4 -4
  84. package/dist/rsc/adapters/preact.js +1 -1
  85. package/dist/rsc/adapters/react.js +1 -1
  86. package/dist/rsc/adapters/solid.js +1 -1
  87. package/dist/rsc/adapters/vue.js +1 -1
  88. package/dist/rsc/boundaries.js +1 -1
  89. package/dist/rsc/context.js +1 -1
  90. package/dist/rsc/index.js +11 -11
  91. package/dist/rsc/legacy.js +1 -1
  92. package/dist/rsc/payload.js +1 -1
  93. package/dist/rsc/plugins/esbuild.js +2 -2
  94. package/dist/rsc/plugins/index.js +4 -4
  95. package/dist/rsc/plugins/rollup.js +2 -2
  96. package/dist/rsc/renderer.js +3 -3
  97. package/dist/rsc/stream.js +1 -1
  98. package/dist/rsc/vite-plugin.js +2 -2
  99. package/dist/server/index.js +4 -4
  100. package/dist/streaming/adapters/index.js +1 -1
  101. package/dist/streaming/conditional.js +1 -1
  102. package/dist/streaming/index.js +1 -1
  103. package/dist/streaming/observability.js +2 -2
  104. package/dist/streaming/priority.js +1 -1
  105. package/dist/utils/index.js +1 -1
  106. package/package.json +207 -207
  107. package/dist/chunk-2F2QU6RC.js.map +0 -1
  108. package/dist/chunk-3QP3E7HS.js.map +0 -1
  109. package/dist/chunk-3ZSSRE6M.js.map +0 -1
  110. package/dist/chunk-54HPVE7N.js.map +0 -1
  111. package/dist/chunk-62C7LX2E.js.map +0 -1
  112. package/dist/chunk-6BDCTUQY.js.map +0 -1
  113. package/dist/chunk-FSJNOPYE.js.map +0 -1
  114. package/dist/chunk-IXMD5QH2.js.map +0 -1
  115. package/dist/chunk-K2CQZPCG.js.map +0 -1
  116. package/dist/chunk-KWFX6WHG.js.map +0 -1
  117. package/dist/chunk-LBYDTULN.js.map +0 -1
  118. package/dist/chunk-MDQNNIHH.js.map +0 -1
  119. package/dist/chunk-MQQLYWZZ.js.map +0 -1
  120. package/dist/chunk-NWMJYTMB.js.map +0 -1
  121. package/dist/chunk-P6WSBVDT.js.map +0 -1
  122. package/dist/chunk-PDW5WCMW.js.map +0 -1
  123. package/dist/chunk-PVUMB632.js.map +0 -1
  124. package/dist/chunk-R7SQAREQ.js.map +0 -1
  125. package/dist/chunk-RSVA2EYO.js.map +0 -1
  126. package/dist/chunk-SUILH4ID.js.map +0 -1
  127. package/dist/chunk-T4Z4HM4W.js.map +0 -1
  128. package/dist/chunk-TASAT7KB.js.map +0 -1
  129. package/dist/chunk-VPFMHGEV.js.map +0 -1
  130. package/dist/chunk-W6D62JCI.js.map +0 -1
  131. package/dist/chunk-WFAWAHJH.js.map +0 -1
  132. package/dist/chunk-WOEIJWGJ.js.map +0 -1
  133. package/dist/chunk-XOIYNY4I.js.map +0 -1
  134. package/dist/chunk-XSY5AAXT.js.map +0 -1
  135. package/dist/chunk-YHEVHRLH.js.map +0 -1
  136. package/dist/chunk-ZIE56LCA.js.map +0 -1
  137. package/dist/chunk-ZVC3ZWLM.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/file-router/index.ts"],"names":[],"mappings":"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","file":"chunk-UGTETAJ2.js","sourcesContent":["/**\n * @flight-framework/core - File Router\n * \n * Auto-discovery of routes from file system.\n * Similar to Next.js App Router and Nuxt server/api patterns.\n */\n\nimport { readdir } from 'node:fs/promises';\nimport { join, basename, extname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\n\nexport type Handler = (context: unknown) => Response | Promise<Response>;\nexport type Middleware = (context: unknown, next: () => Promise<Response>) => Response | Promise<Response>;\n\nexport interface FileRoute {\n /** HTTP method (GET, POST, etc) or 'ALL' */\n method: HttpMethod | 'ALL';\n /** Route path with params (e.g., /users/:id) */\n path: string;\n /** Original file path */\n filePath: string;\n /** Handler function (for APIs) */\n handler?: Handler;\n /** Route-specific middleware */\n middleware?: Middleware[];\n /** Route type: 'page' for SSR pages, 'api' for API endpoints */\n type: 'page' | 'api';\n /** Component function (for pages) */\n component?: () => unknown;\n /** Page metadata (title, description, etc) */\n meta?: Record<string, unknown>;\n /** Parallel route slot name (for @folder convention) */\n slot?: string;\n /** Intercepting route info (for (.) (..) (...) convention) */\n interceptInfo?: {\n /** Number of levels to intercept: 1 = same, 2 = parent, 3+ = root */\n level: number;\n /** Target route segment to intercept */\n target: string;\n /** Original path that triggers interception */\n interceptPath: string;\n };\n}\n\nexport interface FileRouterOptions {\n /** Root directory to scan (default: src/routes) */\n directory: string;\n /** File extensions to consider (default: ['.ts', '.js']) */\n extensions?: string[];\n /** Whether to watch for changes (default: false in prod) */\n watch?: boolean;\n /** \n * Custom module loader for development with Vite.\n * Pass vite.ssrLoadModule to load TSX files correctly.\n * Falls back to native import() if not provided.\n */\n moduleLoader?: (filePath: string) => Promise<any>;\n}\n\nexport interface ScanResult {\n routes: FileRoute[];\n errors: string[];\n}\n\n// ============================================================================\n// File Scanner\n// ============================================================================\n\n/**\n * Scan a directory for route files\n */\nexport async function scanRoutes(options: FileRouterOptions): Promise<ScanResult> {\n const {\n directory,\n extensions = ['.ts', '.js'],\n } = options;\n\n const routes: FileRoute[] = [];\n const errors: string[] = [];\n\n async function scanDir(dir: string, basePath: string = ''): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n\n // Detect parallel route slots (@folder convention)\n if (entry.name.startsWith('@')) {\n const slotName = entry.name.slice(1);\n // Scan slot directory and mark routes with slot name\n const slotRoutes = await scanSlotDir(fullPath, basePath, slotName, extensions);\n routes.push(...slotRoutes);\n continue;\n }\n\n // Detect intercepting routes ((.) (..) (...) convention)\n const interceptMatch = entry.name.match(/^\\((\\.+)\\)(.+)$/);\n if (interceptMatch) {\n const level = interceptMatch[1].length;\n const targetSegment = interceptMatch[2];\n // Scan intercept directory and mark routes with interceptInfo\n const interceptRoutes = await scanInterceptDir(\n fullPath,\n basePath,\n level,\n targetSegment,\n extensions\n );\n routes.push(...interceptRoutes);\n continue;\n }\n\n // Recurse into subdirectory\n await scanDir(fullPath, `${basePath}/${entry.name}`);\n } else if (entry.isFile()) {\n const ext = extname(entry.name);\n\n if (!extensions.includes(ext)) {\n continue;\n }\n\n // Parse route from filename\n const routeInfo = parseRouteFile(entry.name, basePath);\n\n if (routeInfo && routeInfo.method && routeInfo.path) {\n routes.push({\n method: routeInfo.method,\n path: routeInfo.path,\n filePath: fullPath,\n type: routeInfo.type,\n });\n }\n }\n }\n } catch (error) {\n errors.push(`Failed to scan ${dir}: ${error}`);\n }\n }\n\n await scanDir(directory);\n\n return { routes, errors };\n}\n\n/**\n * Scan a parallel route slot directory\n */\nasync function scanSlotDir(\n dir: string,\n basePath: string,\n slotName: string,\n extensions: string[] = ['.ts', '.js', '.tsx', '.jsx']\n): Promise<FileRoute[]> {\n const routes: FileRoute[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isFile()) {\n const ext = extname(entry.name);\n\n if (!extensions.includes(ext)) {\n continue;\n }\n\n const routeInfo = parseRouteFile(entry.name, basePath);\n\n if (routeInfo && routeInfo.method && routeInfo.path) {\n routes.push({\n method: routeInfo.method,\n path: routeInfo.path,\n filePath: fullPath,\n type: routeInfo.type,\n slot: slotName,\n });\n }\n }\n }\n } catch (error) {\n console.error(`[Flight] Failed to scan slot @${slotName}:`, error);\n }\n\n return routes;\n}\n\n/**\n * Scan an intercepting route directory\n * Uses (.) (..) (...) convention similar to Next.js\n * - (.)segment - intercepts from same level\n * - (..)segment - intercepts from parent level\n * - (...)segment - intercepts from root\n */\nasync function scanInterceptDir(\n dir: string,\n basePath: string,\n level: number,\n targetSegment: string,\n extensions: string[] = ['.ts', '.js', '.tsx', '.jsx']\n): Promise<FileRoute[]> {\n const routes: FileRoute[] = [];\n\n // Calculate the intercept path based on level\n const pathParts = basePath.split('/').filter(Boolean);\n let interceptPath: string;\n\n if (level === 1) {\n // (.) - Same level, intercepts sibling route\n interceptPath = `${basePath}/${targetSegment}`;\n } else if (level === 2) {\n // (..) - Parent level\n pathParts.pop();\n interceptPath = `/${pathParts.join('/')}/${targetSegment}`;\n } else {\n // (...) - Root level (3 or more dots)\n interceptPath = `/${targetSegment}`;\n }\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isFile()) {\n const ext = extname(entry.name);\n\n if (!extensions.includes(ext)) {\n continue;\n }\n\n const routeInfo = parseRouteFile(entry.name, basePath);\n\n if (routeInfo && routeInfo.method && routeInfo.path) {\n routes.push({\n method: routeInfo.method,\n path: routeInfo.path,\n filePath: fullPath,\n type: routeInfo.type,\n interceptInfo: {\n level,\n target: targetSegment,\n interceptPath: interceptPath.replace(/\\/+/g, '/') || '/',\n },\n });\n }\n } else if (entry.isDirectory()) {\n // Recurse into subdirectories within intercept folder\n const subRoutes = await scanInterceptDir(\n fullPath,\n `${basePath}/${entry.name}`,\n level,\n targetSegment,\n extensions\n );\n routes.push(...subRoutes);\n }\n }\n } catch (error) {\n console.error(`[Flight] Failed to scan intercept (${'.'.repeat(level)})${targetSegment}:`, error);\n }\n\n return routes;\n}\n\n// ============================================================================\n// Route Parser\n// ============================================================================\n\ninterface ParsedRoute {\n method: HttpMethod | 'ALL';\n path: string;\n type: 'page' | 'api';\n}\n\n/**\n * Parse route information from filename and path\n * \n * Patterns:\n * - index.ts → /\n * - users.ts → /users\n * - users.get.ts → GET /users (API)\n * - users.post.ts → POST /users (API)\n * - about.page.tsx → GET /about (Page)\n * - blog/[slug].page.tsx → GET /blog/:slug (Page)\n * - [id].ts → /:id\n * - [...slug].ts → /* (catch-all)\n * - [[...slug]].ts → /* (optional catch-all)\n */\nfunction parseRouteFile(filename: string, basePath: string): ParsedRoute | null {\n const ext = extname(filename);\n const nameWithoutExt = basename(filename, ext);\n\n // Skip files starting with underscore (private)\n if (nameWithoutExt.startsWith('_')) {\n return null;\n }\n\n // Detect route type\n let type: 'page' | 'api' = 'api';\n let routeName = nameWithoutExt;\n let method: HttpMethod | 'ALL' = 'ALL';\n\n // Check for page suffix (e.g., about.page.tsx, index.page.tsx)\n const pageMatch = nameWithoutExt.match(/^(.+)?\\.page$/i);\n if (pageMatch) {\n type = 'page';\n method = 'GET'; // Pages are always GET\n routeName = pageMatch[1] || 'index';\n } else {\n // Check for method suffix (e.g., users.get.ts)\n const methodMatch = nameWithoutExt.match(/^(.+)\\.(get|post|put|delete|patch|head|options)$/i);\n if (methodMatch) {\n routeName = methodMatch[1] || nameWithoutExt;\n method = (methodMatch[2] || 'ALL').toUpperCase() as HttpMethod;\n }\n }\n\n // Also check if file is in /api/ directory\n if (basePath.startsWith('/api') || basePath.includes('/api/')) {\n type = 'api';\n }\n\n // Build route path\n let path = basePath;\n\n if (routeName !== 'index') {\n path = `${basePath}/${convertToRoutePath(routeName)}`;\n }\n\n // Ensure path starts with /\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n\n // Remove trailing slash (except for root)\n if (path !== '/' && path.endsWith('/')) {\n path = path.slice(0, -1);\n }\n\n return { method, path, type };\n}\n\n/**\n * Convert filename segment to route path segment\n * \n * - [id] → :id\n * - [...slug] → *\n * - [[...slug]] → *?\n */\nfunction convertToRoutePath(name: string): string {\n // Optional catch-all: [[...slug]]\n if (name.startsWith('[[...') && name.endsWith(']]')) {\n const paramName = name.slice(5, -2);\n return `:${paramName}*`;\n }\n\n // Catch-all: [...slug]\n if (name.startsWith('[...') && name.endsWith(']')) {\n const paramName = name.slice(4, -1);\n return `:${paramName}+`;\n }\n\n // Dynamic param: [id]\n if (name.startsWith('[') && name.endsWith(']')) {\n const paramName = name.slice(1, -1);\n return `:${paramName}`;\n }\n\n return name;\n}\n\n// ============================================================================\n// Route Loader\n// ============================================================================\n\n/**\n * Load routes with their handlers or components\n * @param scanResult - Result from scanRoutes\n * @param moduleLoader - Optional custom loader (use vite.ssrLoadModule for dev)\n */\nexport async function loadRoutes(\n scanResult: ScanResult,\n moduleLoader?: (filePath: string) => Promise<any>\n): Promise<FileRoute[]> {\n const loadedRoutes: FileRoute[] = [];\n\n for (const route of scanResult.routes) {\n try {\n // Use custom loader if provided (Vite ssrLoadModule for TSX)\n // Otherwise fall back to native import() for production\n let module: any;\n if (moduleLoader) {\n module = await moduleLoader(route.filePath);\n } else {\n // Convert to file:// URL for Windows ESM compatibility\n const fileUrl = pathToFileURL(route.filePath).href;\n module = await import(fileUrl);\n }\n\n // Handle PAGE routes\n if (route.type === 'page') {\n // Pages export default component\n const component = module.default;\n const meta = module.meta || module.metadata || {};\n\n if (component) {\n loadedRoutes.push({\n ...route,\n component,\n meta,\n });\n }\n continue;\n }\n\n // Handle API routes\n if (route.method === 'ALL') {\n // Look for named exports: GET, POST, PUT, DELETE, etc\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];\n\n for (const method of methods) {\n if (typeof module[method] === 'function') {\n loadedRoutes.push({\n ...route,\n method,\n handler: module[method],\n });\n }\n }\n\n // Also check for default export as handler\n if (typeof module.default === 'function') {\n loadedRoutes.push({\n ...route,\n method: 'ALL',\n handler: module.default,\n });\n }\n } else {\n // Specific method from filename suffix\n const handler = module[route.method] || module.default;\n\n if (typeof handler === 'function') {\n loadedRoutes.push({\n ...route,\n handler,\n });\n }\n }\n } catch (error) {\n console.error(`[Flight] Failed to load route ${route.filePath}:`, error);\n }\n }\n\n return loadedRoutes;\n}\n\n// ============================================================================\n// File Router Factory\n// ============================================================================\n\nexport interface FileRouter {\n routes: FileRoute[];\n refresh: () => Promise<void>;\n}\n\n/**\n * Create a file-based router\n * \n * @example\n * ```typescript\n * import { createFileRouter } from '@flight-framework/core/file-router';\n * import { createServer } from '@flight-framework/http';\n * \n * const router = await createFileRouter({ directory: './src/routes' });\n * const app = createServer();\n * \n * // Register all discovered routes\n * for (const route of router.routes) {\n * app[route.method.toLowerCase()](route.path, route.handler);\n * }\n * ```\n */\nexport async function createFileRouter(options: FileRouterOptions): Promise<FileRouter> {\n let routes: FileRoute[] = [];\n const { moduleLoader } = options;\n\n async function refresh(): Promise<void> {\n const scanResult = await scanRoutes(options);\n\n if (scanResult.errors.length > 0) {\n console.warn('[Flight] Route scan errors:', scanResult.errors);\n }\n\n routes = await loadRoutes(scanResult, moduleLoader);\n\n console.log(`[Flight] Loaded ${routes.length} routes from ${options.directory}`);\n }\n\n // Initial load\n await refresh();\n\n return {\n get routes() {\n return routes;\n },\n refresh,\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { resolveConfig } from './chunk-IXMD5QH2.js';
2
- import { createRouter } from './chunk-GCQZ4FHI.js';
3
- import { createMiddlewareChain, createContextFromRequest, createResponseFromContext } from './chunk-KWFX6WHG.js';
1
+ import { resolveConfig } from './chunk-EHVUAFNH.js';
2
+ import { createRouter } from './chunk-ARBKF6VI.js';
3
+ import { createMiddlewareChain, createContextFromRequest, createResponseFromContext } from './chunk-JFUKVWSO.js';
4
4
 
5
5
  // src/server/index.ts
6
6
  function detectRuntime() {
@@ -219,5 +219,5 @@ function getRuntime() {
219
219
  }
220
220
 
221
221
  export { createServer, getRuntime, isFlightServer };
222
- //# sourceMappingURL=chunk-LBYDTULN.js.map
223
- //# sourceMappingURL=chunk-LBYDTULN.js.map
222
+ //# sourceMappingURL=chunk-UL4Q5CIJ.js.map
223
+ //# sourceMappingURL=chunk-UL4Q5CIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/index.ts"],"names":[],"mappings":"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","file":"chunk-UL4Q5CIJ.js","sourcesContent":["/**\n * Flight Server - Main server factory\n * \n * Creates a Flight server instance that handles routing, middleware, and rendering.\n * This is the primary entry point for Flight applications.\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/core';\n * \n * const server = createServer();\n * \n * server.get('/api/health', () => Response.json({ status: 'ok' }));\n * \n * // Just works! Auto-detects Node.js, Bun, or Deno\n * server.listen(3000);\n * ```\n */\n\nimport { createRouter, type Router } from '../router/index.js';\nimport {\n createMiddlewareChain,\n createContextFromRequest,\n createResponseFromContext,\n type MiddlewareChain,\n type Middleware,\n} from '../middleware/index.js';\nimport { type FlightConfig, type FlightUserConfig, resolveConfig } from '../config/index.js';\nimport type { FlightAdapter } from '../adapters/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Route handler function signature */\nexport type RouteHandler = (context: RouteHandlerContext) => Promise<Response> | Response;\n\n/** Context passed to route handlers */\nexport interface RouteHandlerContext {\n /** The incoming request */\n request: Request;\n /** URL parameters from routing */\n params: Record<string, string | string[]>;\n /** Query parameters */\n query: URLSearchParams;\n /** Parsed URL */\n url: URL;\n /** Local data from middleware */\n locals: Record<string, unknown>;\n /** Database instance (if configured) */\n db?: unknown;\n /** Auth instance (if configured) */\n auth?: unknown;\n /** Email instance (if configured) */\n email?: unknown;\n}\n\n/** Server options */\nexport interface ServerOptions {\n /** Server configuration */\n config?: FlightUserConfig;\n /** Deployment adapter */\n adapter?: FlightAdapter;\n /** Database instance */\n db?: unknown;\n /** Auth instance */\n auth?: unknown;\n /** Email instance */\n email?: unknown;\n}\n\n/** Route definition for the server */\nexport interface ServerRoute {\n /** HTTP method (GET, POST, etc.) */\n method: string | string[];\n /** Route path pattern */\n path: string;\n /** Route handler */\n handler: RouteHandler;\n}\n\n/** Listen options */\nexport interface ListenOptions {\n /** Port to listen on (default: 3000) */\n port?: number;\n /** Hostname to bind to (default: 'localhost') */\n hostname?: string;\n /** Callback when server starts */\n onListen?: (info: { port: number; hostname: string }) => void;\n}\n\n/** Flight Server instance */\nexport interface FlightServer {\n /** Add a route */\n route(method: string | string[], path: string, handler: RouteHandler): FlightServer;\n\n /** Convenience methods for common HTTP methods */\n get(path: string, handler: RouteHandler): FlightServer;\n post(path: string, handler: RouteHandler): FlightServer;\n put(path: string, handler: RouteHandler): FlightServer;\n delete(path: string, handler: RouteHandler): FlightServer;\n patch(path: string, handler: RouteHandler): FlightServer;\n\n /** Add middleware */\n use(middleware: Middleware): FlightServer;\n use(path: string, middleware: Middleware): FlightServer;\n\n /** Handle incoming request (Web standard Request/Response) */\n handle(request: Request): Promise<Response>;\n\n /** \n * Start the HTTP server\n * Auto-detects runtime: Node.js, Bun, or Deno\n */\n listen(port?: number | ListenOptions): Promise<void>;\n\n /** Fetch handler for Bun.serve() and Deno.serve() */\n fetch(request: Request): Promise<Response>;\n\n /** Get the resolved configuration */\n readonly config: FlightConfig;\n\n /** Get the router instance */\n readonly router: Router<RouteHandler>;\n\n /** Get the middleware chain */\n readonly middleware: MiddlewareChain;\n}\n\n// ============================================================================\n// Runtime Detection\n// ============================================================================\n\ntype Runtime = 'node' | 'bun' | 'deno' | 'unknown';\n\nfunction detectRuntime(): Runtime {\n // @ts-expect-error - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n // @ts-expect-error - Deno global \n if (typeof Deno !== 'undefined') return 'deno';\n if (typeof process !== 'undefined' && process.versions?.node) return 'node';\n return 'unknown';\n}\n\n// ============================================================================\n// Server Implementation\n// ============================================================================\n\ninterface RouteEntry {\n methods: Set<string>;\n handler: RouteHandler;\n}\n\n/**\n * Create a new Flight server instance\n * \n * @example\n * ```typescript\n * import { createServer } from '@flight-framework/core';\n * \n * const server = createServer();\n * \n * server.get('/api/users', async ({ db }) => {\n * const users = await db.query('SELECT * FROM users');\n * return Response.json(users);\n * });\n * \n * // Works on Node.js, Bun, and Deno!\n * server.listen(3000);\n * ```\n */\nexport function createServer(options: ServerOptions = {}): FlightServer {\n const config = resolveConfig(options.config ?? {});\n const router = createRouter<RouteEntry>();\n const middlewareChain = createMiddlewareChain();\n\n // Store dependencies\n const deps = {\n db: options.db,\n auth: options.auth,\n email: options.email,\n };\n\n function addRoute(method: string | string[], path: string, handler: RouteHandler): FlightServer {\n const methods = Array.isArray(method) ? method : [method];\n const methodSet = new Set(methods.map(m => m.toUpperCase()));\n\n // Check if route already exists\n const existingMatch = router.match(path);\n if (existingMatch && existingMatch.route.path === path) {\n // Merge methods\n for (const m of methodSet) {\n existingMatch.route.handler.methods.add(m);\n }\n existingMatch.route.handler.handler = handler;\n } else {\n router.add({\n path,\n handler: { methods: methodSet, handler },\n });\n }\n\n return server;\n }\n\n function useMiddleware(\n pathOrMiddleware: string | Middleware,\n maybeMiddleware?: Middleware\n ): FlightServer {\n if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\n middlewareChain.use(pathOrMiddleware, maybeMiddleware);\n } else if (typeof pathOrMiddleware === 'function') {\n middlewareChain.use(pathOrMiddleware);\n }\n return server;\n }\n\n async function handle(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n\n // Run middleware\n const ctx = createContextFromRequest(request);\n await middlewareChain.execute(ctx);\n\n // If middleware already set a response, return it\n if (ctx.responseBody !== undefined) {\n return createResponseFromContext(ctx);\n }\n\n // Match route\n const match = router.match(url.pathname);\n if (!match) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Check method\n if (!match.route.handler.methods.has(method) && !match.route.handler.methods.has('*')) {\n return new Response('Method Not Allowed', { status: 405 });\n }\n\n // Build handler context\n const handlerContext: RouteHandlerContext = {\n request,\n params: match.params,\n query: url.searchParams,\n url,\n locals: ctx.locals,\n ...deps,\n };\n\n try {\n return await match.route.handler.handler(handlerContext);\n } catch (error) {\n console.error('Route handler error:', error);\n return new Response('Internal Server Error', { status: 500 });\n }\n }\n\n /**\n * Start the HTTP server\n * Auto-detects the runtime and uses the appropriate server\n */\n async function listen(portOrOptions?: number | ListenOptions): Promise<void> {\n const opts: ListenOptions = typeof portOrOptions === 'number'\n ? { port: portOrOptions }\n : portOrOptions ?? {};\n\n const port = opts.port ?? config.dev.port ?? 3000;\n const hostname = opts.hostname ?? 'localhost';\n\n // Check for custom adapter first\n const adapter = options.adapter ?? config.adapter;\n if (adapter?.listen) {\n await adapter.listen(server, port);\n return;\n }\n\n const runtime = detectRuntime();\n\n switch (runtime) {\n case 'bun':\n await startBunServer(port, hostname, opts.onListen);\n break;\n case 'deno':\n await startDenoServer(port, hostname, opts.onListen);\n break;\n case 'node':\n default:\n await startNodeServer(port, hostname, opts.onListen);\n break;\n }\n }\n\n /**\n * Start Node.js HTTP server\n */\n async function startNodeServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\n const { createServer: createHttpServer } = await import('node:http');\n\n const httpServer = createHttpServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://${hostname}:${port}`);\n\n // Build headers\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n const headerValue = Array.isArray(value) ? value[0] : value;\n if (headerValue) headers.set(key, headerValue);\n }\n }\n\n // Read body for POST/PUT/PATCH\n let body: string | undefined;\n if (['POST', 'PUT', 'PATCH'].includes(req.method || '')) {\n body = await new Promise<string>((resolve) => {\n let data = '';\n req.on('data', chunk => data += chunk);\n req.on('end', () => resolve(data));\n });\n }\n\n const request = new Request(url.toString(), {\n method: req.method,\n headers,\n body: body || undefined,\n });\n\n try {\n const response = await handle(request);\n\n res.statusCode = response.status;\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n const responseBody = await response.text();\n res.end(responseBody);\n } catch (error) {\n console.error('Server error:', error);\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n });\n\n return new Promise((resolve) => {\n httpServer.listen(port, hostname, () => {\n const info = { port, hostname };\n if (onListen) {\n onListen(info);\n } else {\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ Flight Server (Node.js) ║\n╠═══════════════════════════════════════════════════════════╣\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\n╚═══════════════════════════════════════════════════════════╝\n`);\n }\n resolve();\n });\n });\n }\n\n /**\n * Start Bun server\n */\n async function startBunServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\n // @ts-expect-error - Bun types\n Bun.serve({\n port,\n hostname,\n fetch: handle,\n });\n\n const info = { port, hostname };\n if (onListen) {\n onListen(info);\n } else {\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ Flight Server (Bun) ║\n╠═══════════════════════════════════════════════════════════╣\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\n╚═══════════════════════════════════════════════════════════╝\n`);\n }\n }\n\n /**\n * Start Deno server\n */\n async function startDenoServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\n // @ts-expect-error - Deno types\n Deno.serve({ port, hostname }, handle);\n\n const info = { port, hostname };\n if (onListen) {\n onListen(info);\n } else {\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ Flight Server (Deno) ║\n╠═══════════════════════════════════════════════════════════╣\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\n╚═══════════════════════════════════════════════════════════╝\n`);\n }\n }\n\n const server: FlightServer = {\n route: addRoute,\n get: (path, handler) => addRoute('GET', path, handler),\n post: (path, handler) => addRoute('POST', path, handler),\n put: (path, handler) => addRoute('PUT', path, handler),\n delete: (path, handler) => addRoute('DELETE', path, handler),\n patch: (path, handler) => addRoute('PATCH', path, handler),\n use: useMiddleware as FlightServer['use'],\n handle,\n listen,\n fetch: handle, // Alias for Bun/Deno compatibility\n get config() { return config; },\n get router() { return router as unknown as Router<RouteHandler>; },\n get middleware() { return middlewareChain; },\n };\n\n return server;\n}\n\n// ============================================================================\n// Helper Exports\n// ============================================================================\n\n/** Type guard to check if an object is a FlightServer */\nexport function isFlightServer(obj: unknown): obj is FlightServer {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n 'handle' in obj &&\n 'route' in obj &&\n typeof (obj as FlightServer).handle === 'function'\n );\n}\n\n/** Get current runtime */\nexport function getRuntime(): Runtime {\n return detectRuntime();\n}\n\n"]}
@@ -160,5 +160,5 @@ function createStaticResponse(html, options) {
160
160
  }
161
161
 
162
162
  export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStaticResponse, createStreamingResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming };
163
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
164
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
163
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map
164
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/streaming/conditional.ts"],"names":["result"],"mappings":"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","file":"chunk-VNO2YUVD.js","sourcesContent":["/**\n * @flight-framework/core - Conditional Streaming\n * \n * Smart streaming decisions based on request context.\n * Bots get full HTML, users get streaming - YOU control the logic.\n * \n * Best Practices 2026:\n * - SEO-friendly: Crawlers receive complete HTML\n * - Performance: Users get progressive streaming\n * - Flexibility: Custom conditions for any use case\n * \n * @example\n * ```typescript\n * import { streamIf } from '@flight-framework/core/streaming';\n * \n * const response = await streamIf({\n * request,\n * condition: (req) => !isBot(req), // YOUR logic\n * stream: () => createStreamingSSR({ ... }),\n * static: () => renderToString(<App />),\n * });\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Condition function to determine if streaming should be used\n */\nexport type StreamingCondition = (request: Request) => boolean | Promise<boolean>;\n\n/**\n * Built-in condition types\n */\nexport type BuiltInCondition =\n | 'always-stream' // Always use streaming\n | 'never-stream' // Always use static\n | 'no-bots' // Stream for users, static for bots\n | 'fast-network' // Stream only on fast connections\n | 'modern-browser'; // Stream only on modern browsers\n\n/**\n * Configuration for conditional streaming\n */\nexport interface StreamIfConfig<T = Response> {\n /** The incoming request */\n request: Request;\n /** Condition to check (function or built-in) */\n condition: StreamingCondition | BuiltInCondition;\n /** Factory for streaming response */\n stream: () => Promise<T> | T;\n /** Factory for static response */\n static: () => Promise<T> | T;\n /** Optional: Custom bot patterns */\n botPatterns?: RegExp[];\n /** Optional: Force streaming via query param (for testing) */\n forceStreamParam?: string;\n /** Optional: Force static via query param (for testing) */\n forceStaticParam?: string;\n}\n\n/**\n * Result of condition evaluation\n */\nexport interface StreamingDecision {\n /** Whether streaming was used */\n streaming: boolean;\n /** Reason for the decision */\n reason: string;\n /** The response */\n response: Response;\n}\n\n// ============================================================================\n// Bot Detection\n// ============================================================================\n\n/**\n * Default bot patterns for detection\n */\nexport const DEFAULT_BOT_PATTERNS: RegExp[] = [\n /googlebot/i,\n /bingbot/i,\n /slurp/i, // Yahoo\n /duckduckbot/i,\n /baiduspider/i,\n /yandexbot/i,\n /sogou/i,\n /facebot/i, // Facebook\n /twitterbot/i,\n /linkedinbot/i,\n /whatsapp/i,\n /telegrambot/i,\n /discordbot/i,\n /slackbot/i,\n /applebot/i,\n /crawler/i,\n /spider/i,\n /bot\\//i,\n /bot;/i,\n /headless/i, // Headless browsers\n /lighthouse/i, // Google Lighthouse\n /pagespeed/i,\n /gtmetrix/i,\n /pingdom/i,\n /uptimerobot/i,\n];\n\n/**\n * Check if a request is from a bot/crawler\n */\nexport function isBot(request: Request, customPatterns?: RegExp[]): boolean {\n const userAgent = request.headers.get('user-agent') || '';\n const patterns = customPatterns || DEFAULT_BOT_PATTERNS;\n return patterns.some(pattern => pattern.test(userAgent));\n}\n\n/**\n * Check if request explicitly asks for no streaming\n */\nexport function prefersNoStream(request: Request): boolean {\n // Check for custom header\n if (request.headers.get('x-no-stream') === 'true') return true;\n if (request.headers.get('x-prefer-static') === 'true') return true;\n\n // Check Accept header for preference\n const accept = request.headers.get('accept') || '';\n if (accept.includes('text/html; streaming=false')) return true;\n\n return false;\n}\n\n/**\n * Check if a connection is likely slow (based on headers)\n */\nexport function isSlowConnection(request: Request): boolean {\n // ECT (Effective Connection Type) header\n const ect = request.headers.get('ect');\n if (ect && ['slow-2g', '2g'].includes(ect)) return true;\n\n // Save-Data header\n if (request.headers.get('save-data') === 'on') return true;\n\n // Downlink header (Mbps)\n const downlink = request.headers.get('downlink');\n if (downlink && parseFloat(downlink) < 1) return true;\n\n return false;\n}\n\n/**\n * Check if browser supports streaming well\n */\nexport function supportsStreaming(request: Request): boolean {\n const userAgent = request.headers.get('user-agent') || '';\n\n // IE doesn't support streaming well\n if (/MSIE|Trident/i.test(userAgent)) return false;\n\n // Very old browsers\n if (/Opera Mini/i.test(userAgent)) return false;\n\n // Check for modern browser features via client hints\n const secChUa = request.headers.get('sec-ch-ua');\n if (secChUa) {\n // Has client hints = modern browser\n return true;\n }\n\n return true; // Default to supporting streaming\n}\n\n// ============================================================================\n// Built-in Conditions\n// ============================================================================\n\nfunction getBuiltInCondition(\n condition: BuiltInCondition,\n botPatterns?: RegExp[]\n): StreamingCondition {\n switch (condition) {\n case 'always-stream':\n return () => true;\n case 'never-stream':\n return () => false;\n case 'no-bots':\n return (req) => !isBot(req, botPatterns) && !prefersNoStream(req);\n case 'fast-network':\n return (req) => !isSlowConnection(req) && !isBot(req, botPatterns);\n case 'modern-browser':\n return (req) => supportsStreaming(req) && !isBot(req, botPatterns);\n }\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Conditionally use streaming or static rendering based on request context\n */\nexport async function streamIf<T = Response>(\n config: StreamIfConfig<T>\n): Promise<{ result: T; streaming: boolean; reason: string }> {\n const {\n request,\n condition,\n stream,\n static: staticFn,\n botPatterns,\n forceStreamParam = '__stream',\n forceStaticParam = '__static',\n } = config;\n\n // Check for forced mode via query params (useful for testing)\n const url = new URL(request.url);\n if (url.searchParams.has(forceStreamParam)) {\n const result = await stream();\n return { result, streaming: true, reason: 'forced via query param' };\n }\n if (url.searchParams.has(forceStaticParam)) {\n const result = await staticFn();\n return { result, streaming: false, reason: 'forced via query param' };\n }\n\n // Resolve condition\n const conditionFn = typeof condition === 'function'\n ? condition\n : getBuiltInCondition(condition, botPatterns);\n\n // Evaluate condition\n let shouldStream: boolean;\n let reason: string;\n\n try {\n shouldStream = await conditionFn(request);\n reason = shouldStream ? 'condition passed' : 'condition failed';\n } catch (error) {\n // On error, default to static (safer for SEO)\n shouldStream = false;\n reason = `condition error: ${error instanceof Error ? error.message : 'unknown'}`;\n }\n\n // Add specific reason for built-in conditions\n if (typeof condition === 'string') {\n if (!shouldStream && condition === 'no-bots') {\n reason = isBot(request, botPatterns)\n ? 'bot detected'\n : 'user prefers no streaming';\n } else if (!shouldStream && condition === 'fast-network') {\n reason = isSlowConnection(request)\n ? 'slow connection detected'\n : 'bot detected';\n }\n }\n\n // Execute appropriate renderer\n const result = shouldStream ? await stream() : await staticFn();\n return { result, streaming: shouldStream, reason };\n}\n\n/**\n * Create a middleware-style conditional streamer\n */\nexport function createConditionalStreamer<T = Response>(\n defaultCondition: StreamingCondition | BuiltInCondition,\n options?: {\n botPatterns?: RegExp[];\n forceStreamParam?: string;\n forceStaticParam?: string;\n }\n) {\n return async (config: {\n request: Request;\n stream: () => Promise<T> | T;\n static: () => Promise<T> | T;\n condition?: StreamingCondition | BuiltInCondition;\n }) => {\n return streamIf({\n request: config.request,\n condition: config.condition || defaultCondition,\n stream: config.stream,\n static: config.static,\n ...options,\n });\n };\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\n/**\n * Add streaming decision headers to response (for debugging)\n */\nexport function addStreamingHeaders(\n response: Response,\n decision: { streaming: boolean; reason: string }\n): Response {\n const headers = new Headers(response.headers);\n headers.set('X-Flight-Streaming', decision.streaming ? 'true' : 'false');\n headers.set('X-Flight-Streaming-Reason', decision.reason);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n/**\n * Create a streaming-aware Response with appropriate headers\n */\nexport function createStreamingResponse(\n stream: ReadableStream<Uint8Array>,\n options?: {\n status?: number;\n headers?: Record<string, string>;\n isStreaming?: boolean;\n }\n): Response {\n const { status = 200, headers = {}, isStreaming = true } = options || {};\n\n return new Response(stream, {\n status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Transfer-Encoding': isStreaming ? 'chunked' : undefined,\n 'X-Content-Type-Options': 'nosniff',\n 'X-Flight-Streaming': isStreaming ? 'true' : 'false',\n ...headers,\n } as HeadersInit,\n });\n}\n\n/**\n * Create a static HTML Response\n */\nexport function createStaticResponse(\n html: string,\n options?: {\n status?: number;\n headers?: Record<string, string>;\n }\n): Response {\n const { status = 200, headers = {} } = options || {};\n\n return new Response(html, {\n status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'X-Flight-Streaming': 'false',\n ...headers,\n },\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-5XHOLZBJ.js';
2
2
 
3
3
  // src/rsc/vite-plugin.ts
4
4
  function flightRSC(options = {}) {
@@ -337,5 +337,5 @@ function extractExportNames(code) {
337
337
  var vite_plugin_default = flightRSC;
338
338
 
339
339
  export { flightRSC, vite_plugin_default };
340
- //# sourceMappingURL=chunk-ZIE56LCA.js.map
341
- //# sourceMappingURL=chunk-ZIE56LCA.js.map
340
+ //# sourceMappingURL=chunk-XU6MRYG2.js.map
341
+ //# sourceMappingURL=chunk-XU6MRYG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/vite-plugin.ts"],"names":["exports"],"mappings":"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","file":"chunk-XU6MRYG2.js","sourcesContent":["/**\n * @flight-framework/vite-plugin-rsc\n * \n * Vite plugin for Flight Server Components.\n * Transforms 'use client' and 'use server' directives at build time.\n * \n * Philosophy:\n * - Zero config for common cases\n * - Full control when needed\n * - Works with any Vite project\n * - No Next.js dependencies\n * \n * @module @flight-framework/vite-plugin-rsc\n */\n\nimport type { Plugin, ResolvedConfig } from 'vite';\nimport {\n analyzeModule,\n hasUseClientDirective,\n hasUseServerDirective,\n detectInlineServerActions,\n} from './boundaries.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Plugin configuration\n */\nexport interface FlightRSCPluginOptions {\n /** Include patterns (glob) */\n include?: string[];\n\n /** Exclude patterns (glob) */\n exclude?: string[];\n\n /** Server actions endpoint */\n actionsEndpoint?: string;\n\n /** Client manifest output path */\n clientManifest?: string;\n\n /** Server manifest output path */\n serverManifest?: string;\n\n /** Enable dev mode features */\n dev?: boolean;\n\n /** Custom transforms */\n transforms?: {\n /** Transform client components */\n client?: (code: string, id: string) => string | null;\n /** Transform server actions */\n server?: (code: string, id: string) => string | null;\n };\n}\n\n/**\n * Client manifest entry\n */\nexport interface ClientManifestEntry {\n id: string;\n file: string;\n exports: string[];\n chunks?: string[];\n}\n\n/**\n * Server manifest entry\n */\nexport interface ServerManifestEntry {\n id: string;\n file: string;\n actions: string[];\n}\n\n// ============================================================================\n// Plugin Implementation\n// ============================================================================\n\n/**\n * Flight RSC Vite Plugin\n * \n * @example\n * ```typescript\n * // vite.config.ts\n * import { flightRSC } from '@flight-framework/core/rsc/vite-plugin';\n * \n * export default defineConfig({\n * plugins: [\n * flightRSC({\n * actionsEndpoint: '/_flight/action',\n * }),\n * ],\n * });\n * ```\n */\nexport function flightRSC(options: FlightRSCPluginOptions = {}): Plugin[] {\n const {\n include = ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude = ['**/node_modules/**', '**/.git/**'],\n actionsEndpoint = '/_flight/action',\n clientManifest = '.flight/client-manifest.json',\n serverManifest = '.flight/server-manifest.json',\n // dev flag reserved for future use\n } = options;\n\n // State\n const clientModules = new Map<string, ClientManifestEntry>();\n const serverActions = new Map<string, ServerManifestEntry>();\n let config: ResolvedConfig;\n let isSSR = false;\n\n return [\n // ================================================================\n // 1. Analyze modules and track boundaries\n // ================================================================\n {\n name: 'flight-rsc:analyze',\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n\n transform(code, id) {\n // Skip excluded files\n if (!shouldProcess(id, include, exclude)) {\n return null;\n }\n\n // Analyze module\n const analysis = analyzeModule(code, id);\n\n // Track client modules\n if (analysis.fileDirective === 'client') {\n clientModules.set(id, {\n id: createModuleId(id, config),\n file: id,\n exports: analysis.clientComponents,\n });\n }\n\n // Track server actions\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\n serverActions.set(id, {\n id: createModuleId(id, config),\n file: id,\n actions: analysis.serverActions,\n });\n }\n\n return null;\n },\n },\n\n // ================================================================\n // 2. Transform client components to references (server bundle)\n // ================================================================\n {\n name: 'flight-rsc:client-transform',\n\n transform(code, id, opts) {\n isSSR = opts?.ssr ?? false;\n\n if (!isSSR) return null;\n if (!hasUseClientDirective(code)) return null;\n if (!shouldProcess(id, include, exclude)) return null;\n\n // Custom transform\n if (options.transforms?.client) {\n const result = options.transforms.client(code, id);\n if (result) return result;\n }\n\n // Replace client component with reference proxy\n const moduleId = createModuleId(id, config);\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Client Component Reference\n// Original: ${id}\n\nconst __flight_client_module_id = ${JSON.stringify(moduleId)};\n\n`;\n\n // Create proxy for each export\n for (const exportName of exports) {\n if (exportName === 'default') {\n transformed += `\nconst __flight_default_proxy = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_client_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_client_module_id + '#default',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_client_module_id,\n __flight_export: 'default',\n }\n);\n\nexport default __flight_default_proxy;\n`;\n } else {\n transformed += `\nexport const ${exportName} = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_client_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_client_module_id + '#${exportName}',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_client_module_id,\n __flight_export: '${exportName}',\n }\n);\n`;\n }\n }\n\n return {\n code: transformed,\n map: null,\n };\n },\n },\n\n // ================================================================\n // 3. Transform server actions to RPC calls (client bundle)\n // ================================================================\n {\n name: 'flight-rsc:server-transform',\n\n transform(code, id, opts) {\n isSSR = opts?.ssr ?? false;\n\n if (isSSR) return null; // Only transform for client\n if (!shouldProcess(id, include, exclude)) return null;\n\n // Check for file-level 'use server'\n if (hasUseServerDirective(code)) {\n // Custom transform\n if (options.transforms?.server) {\n const result = options.transforms.server(code, id);\n if (result) return result;\n }\n\n // Replace all exports with RPC calls\n const moduleId = createModuleId(id, config);\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Server Actions (RPC Proxies)\n// Original: ${id}\n\nconst __flight_actions_endpoint = ${JSON.stringify(actionsEndpoint)};\nconst __flight_module_id = ${JSON.stringify(moduleId)};\n\nasync function __flight_call_action(actionId, args) {\n const response = await fetch(__flight_actions_endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Flight-Action': actionId,\n },\n body: JSON.stringify({ actionId, args }),\n });\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\n throw new Error(error.message || 'Server action failed');\n }\n \n return response.json();\n}\n\n`;\n\n for (const exportName of exports) {\n const actionId = `${moduleId}#${exportName}`;\n if (exportName === 'default') {\n transformed += `\nexport default async function(...args) {\n return __flight_call_action(${JSON.stringify(actionId)}, args);\n}\n`;\n } else {\n transformed += `\nexport async function ${exportName}(...args) {\n return __flight_call_action(${JSON.stringify(actionId)}, args);\n}\n`;\n }\n }\n\n return {\n code: transformed,\n map: null,\n };\n }\n\n // Check for inline 'use server' in functions\n const inlineActions = detectInlineServerActions(code);\n if (inlineActions.length > 0) {\n // Transform specific functions to RPC calls\n let transformed = code;\n const moduleId = createModuleId(id, config);\n\n for (const actionName of inlineActions) {\n const actionId = `${moduleId}#${actionName}`;\n\n // Replace function with RPC call\n // This is a simplified transform - a real implementation would use AST\n const asyncFnPattern = new RegExp(\n `(async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[^}]*['\"]use server['\"][^}]*\\\\})`,\n 'g'\n );\n\n transformed = transformed.replace(asyncFnPattern, `\nasync function ${actionName}(...args) {\n const response = await fetch(${JSON.stringify(actionsEndpoint)}, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Flight-Action': ${JSON.stringify(actionId)},\n },\n body: JSON.stringify({ actionId: ${JSON.stringify(actionId)}, args }),\n });\n if (!response.ok) throw new Error('Server action failed');\n return response.json();\n}`\n );\n }\n\n if (transformed !== code) {\n return {\n code: transformed,\n map: null,\n };\n }\n }\n\n return null;\n },\n },\n\n // ================================================================\n // 4. Generate manifests\n // ================================================================\n {\n name: 'flight-rsc:manifest',\n\n generateBundle() {\n // Client manifest\n if (clientModules.size > 0) {\n const manifest = Object.fromEntries(clientModules);\n this.emitFile({\n type: 'asset',\n fileName: clientManifest,\n source: JSON.stringify(manifest, null, 2),\n });\n }\n\n // Server manifest\n if (serverActions.size > 0) {\n const manifest = Object.fromEntries(serverActions);\n this.emitFile({\n type: 'asset',\n fileName: serverManifest,\n source: JSON.stringify(manifest, null, 2),\n });\n }\n },\n },\n\n // ================================================================\n // 5. Dev server middleware for server actions\n // ================================================================\n {\n name: 'flight-rsc:dev-server',\n apply: 'serve',\n\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.startsWith(actionsEndpoint) && req.method === 'POST') {\n try {\n // Parse request body\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = JSON.parse(Buffer.concat(chunks).toString());\n\n const { actionId, args } = body;\n\n // Find and execute action\n const [moduleId, actionName] = actionId.split('#');\n const entry = [...serverActions.values()].find(e => e.id === moduleId);\n\n if (!entry) {\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Action not found' }));\n return;\n }\n\n // Load module and execute action\n const mod = await server.ssrLoadModule(entry.file);\n const action = mod[actionName] || mod.default;\n\n if (typeof action !== 'function') {\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Action not found' }));\n return;\n }\n\n const result = await action(...args);\n\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(result));\n\n } catch (error) {\n console.error('[Flight RSC] Action error:', error);\n res.statusCode = 500;\n res.end(JSON.stringify({\n error: (error as Error).message\n }));\n }\n return;\n }\n\n next();\n });\n },\n },\n ];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if file should be processed\n */\nfunction shouldProcess(id: string, include: string[], exclude: string[]): boolean {\n // Simple glob matching (for production, use picomatch)\n const isIncluded = include.some(pattern => {\n const regex = globToRegex(pattern);\n return regex.test(id);\n });\n\n const isExcluded = exclude.some(pattern => {\n const regex = globToRegex(pattern);\n return regex.test(id);\n });\n\n return isIncluded && !isExcluded;\n}\n\n/**\n * Convert glob pattern to regex (simplified)\n */\nfunction globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/{{GLOBSTAR}}/g, '.*');\n\n return new RegExp(escaped);\n}\n\n/**\n * Create a stable module ID from file path\n */\nfunction createModuleId(id: string, config: ResolvedConfig): string {\n // Remove root prefix\n let moduleId = id;\n if (config?.root && id.startsWith(config.root)) {\n moduleId = id.slice(config.root.length);\n }\n\n // Normalize path\n moduleId = moduleId.replace(/\\\\/g, '/');\n if (!moduleId.startsWith('/')) {\n moduleId = '/' + moduleId;\n }\n\n return moduleId;\n}\n\n/**\n * Extract export names from source code\n */\nfunction extractExportNames(code: string): string[] {\n const exports: string[] = [];\n\n // export default\n if (/export\\s+default\\s+/.test(code)) {\n exports.push('default');\n }\n\n // export function/const/let/class Name\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\n let match;\n while ((match = namedPattern.exec(code)) !== null) {\n if (match[1] && match[1] !== 'default') {\n exports.push(match[1]);\n }\n }\n\n // export { a, b, c }\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\n while ((match = bracketPattern.exec(code)) !== null) {\n if (match[1]) {\n const names = match[1].split(',').map(n => {\n const parts = n.trim().split(/\\s+as\\s+/);\n return parts[parts.length - 1]!.trim();\n });\n exports.push(...names.filter(n => n && n !== 'default'));\n }\n }\n\n return [...new Set(exports)];\n}\n\nexport default flightRSC;\n"]}
@@ -1,4 +1,4 @@
1
- import { createStreamingSSR } from './chunk-RSVA2EYO.js';
1
+ import { createStreamingSSR } from './chunk-CNY3ZUVG.js';
2
2
 
3
3
  // src/streaming/observability.ts
4
4
  function generateStreamId() {
@@ -278,5 +278,5 @@ function createHttpObserver(endpoint, options) {
278
278
  }
279
279
 
280
280
  export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver };
281
- //# sourceMappingURL=chunk-6BDCTUQY.js.map
282
- //# sourceMappingURL=chunk-6BDCTUQY.js.map
281
+ //# sourceMappingURL=chunk-YNTMYL36.js.map
282
+ //# sourceMappingURL=chunk-YNTMYL36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/streaming/observability.ts"],"names":[],"mappings":";;;AA2IA,SAAS,gBAAA,GAA2B;AAChC,EAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACzE;AAKA,eAAsB,yBAClB,MAAA,EACiC;AACjC,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACJ,GAAI,MAAA;AAEJ,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,kBAAoC,EAAC;AAC3C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAC/C,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,IAAI,cAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAA0B,CAAC,CAAA,KAAM;AAAE,IAAA,cAAA,GAAiB,CAAA;AAAA,EAAG,CAAC,CAAA;AAGnF,EAAA,QAAA,EAAU,gBAAgB,QAAQ,CAAA;AAGlC,EAAA,MAAM,sBAAA,GAAmD,kBAAA,CAAmB,GAAA,CAAI,CAAA,QAAA,KAAY;AACxF,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,IAAA,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,aAAa,CAAA;AAE7C,IAAA,QAAA,EAAU,eAAA,GAAkB;AAAA,MACxB,QAAA;AAAA,MACA,YAAY,QAAA,CAAS,EAAA;AAAA,MACrB,WAAW,aAAA,GAAgB;AAAA,KAC9B,CAAA;AAED,IAAA,OAAO;AAAA,MACH,GAAG,QAAA;AAAA,MACH,cAAA,EAAgB,SAAS,cAAA,CAAe,IAAA;AAAA,QACpC,CAAC,OAAA,KAAY;AACT,UAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,UAAA,MAAM,MAAA,GAAyB;AAAA,YAC3B,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,GAAK,SAAA;AAAA,YAC9C,SAAS,OAAA,GAAU,SAAA;AAAA,YACnB,QAAA,EAAU,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,YAClD,OAAA,EAAS,IAAA;AAAA,YACT,aAAa,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE;AAAA,WACnD;AACA,UAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAC3B,UAAA,QAAA,EAAU,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAQ,UAAU,CAAA;AACjD,UAAA,OAAO,OAAA;AAAA,QACX,CAAA;AAAA,QACA,CAAC,KAAA,KAAU;AACP,UAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,UAAA,MAAM,MAAA,GAAyB;AAAA,YAC3B,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,GAAK,SAAA;AAAA,YAC9C,SAAS,OAAA,GAAU,SAAA;AAAA,YACnB,QAAA,EAAU,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,YAClD,OAAA,EAAS,KAAA;AAAA,YACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAChE;AACA,UAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAC3B,UAAA,QAAA,EAAU,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAQ,UAAU,CAAA;AACjD,UAAA,QAAA,EAAU,UAAU,EAAE,QAAA,EAAU,YAAY,QAAA,CAAS,EAAA,EAAI,OAAuB,CAAA;AAChF,UAAA,MAAM,KAAA;AAAA,QACV;AAAA;AACJ,KACJ;AAAA,EACJ,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB;AAAA,IACpC,KAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA,EAAoB,sBAAA;AAAA,IACpB,OAAA,EAAS;AAAA,MACL,GAAG,OAAA;AAAA,MACH,cAAc,MAAM;AAChB,QAAA,SAAA,GAAY,IAAA,CAAK,KAAI,GAAI,SAAA;AACzB,QAAA,QAAA,EAAU,YAAA,GAAe,EAAE,QAAA,EAAU,QAAA,EAAU,WAAW,CAAA;AAC1D,QAAA,OAAA,CAAQ,YAAA,IAAe;AAAA,MAC3B,CAAA;AAAA,MACA,YAAY,MAAM;AACd,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAErC,QAAA,MAAM,OAAA,GAA4B;AAAA,UAC9B,QAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,eAAA;AAAA,UACA,UAAA,EAAY,eAAA;AAAA,UACZ,cAAc,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,UACrD,YAAY,eAAA,CAAgB,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,UACpD,UAAA;AAAA,UACA;AAAA,SACJ;AAEA,QAAA,QAAA,EAAU,cAAc,OAAO,CAAA;AAC/B,QAAA,SAAA,GAAY,OAAO,CAAA;AACnB,QAAA,cAAA,CAAgB,OAAO,CAAA;AACvB,QAAA,OAAA,CAAQ,UAAA,IAAa;AAAA,MACzB,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAChB,QAAA,QAAA,EAAU,OAAA,GAAU,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AACvC,QAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,MAC3B;AAAA;AACJ,GACH,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,WAAA;AAAA,IACjC,IAAI,eAAA,CAAwC;AAAA,MACxC,SAAA,CAAU,OAAO,UAAA,EAAY;AACzB,QAAA,UAAA,IAAc,KAAA,CAAM,MAAA;AACpB,QAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,MAC5B;AAAA,KACH;AAAA,GACL;AAEA,EAAA,OAAO;AAAA,IACH,MAAA,EAAQ,cAAA;AAAA,IACR,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,OAAA,EAAS,cAAA;AAAA,IACT;AAAA,GACJ;AACJ;AASO,IAAM,oBAAN,MAAwB;AAAA,EACnB,UAA8B,EAAC;AAAA,EAC/B,UAAA;AAAA,EAER,WAAA,CAAY,aAAa,GAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAAiC;AACjC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AACzB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AACvC,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA8B;AAC1B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,SAAA,EAAW,CAAC,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA8B;AAC1B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,eAAA,EAAiB,CAAC,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,QAAQ,CAAA,EAA6D;AACtF,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsE;AAEhG,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC1B,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,UAAA,EAAY;AAC1B,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAE,aAAA,EAAe,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AACjF,QAAA,KAAA,CAAM,iBAAiB,CAAA,CAAE,QAAA;AACzB,QAAA,KAAA,CAAM,KAAA,EAAA;AACN,QAAA,IAAI,CAAC,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,MAAA,EAAA;AACtB,QAAA,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,KAAK,CAAA;AAAA,MACjC;AAAA,IACJ;AAEA,IAAA,OAAO,CAAC,GAAG,aAAA,CAAc,OAAA,EAAS,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,KAAK,CAAA,MAAO;AAAA,MACnB,EAAA;AAAA,MACA,WAAA,EAAa,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,KAAA;AAAA,MACzC,SAAA,EAAW,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM;AAAA,KACpC,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAW,CAAA,CAC5C,KAAA,CAAM,GAAG,KAAK,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AACpE,IAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,KAAA,GAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAAqE;AACjE,IAAA,MAAM,SAAS,CAAC,GAAG,IAAA,CAAK,OAAO,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC3E,IAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAE/C,IAAA,OAAO;AAAA,MACH,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,GAAM,GAAG,CAAC,CAAA,IAAK,CAAA;AAAA,MACtC,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,GAAM,GAAG,CAAC,CAAA,IAAK,CAAA;AAAA,MACtC,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,GAAM,IAAI,CAAC,CAAA,IAAK;AAAA,KAC3C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA6B;AACzB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EACpB;AACJ;AASO,SAAS,qBACZ,GAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACH,aAAA,EAAe,CAAC,QAAA,KAAa;AACzB,MAAA,GAAA,CAAI,yBAAA,EAA2B,EAAE,QAAA,EAAU,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,EAAE,QAAA,EAAU,UAAS,KAAM;AACtC,MAAA,GAAA,CAAI,wBAAwB,EAAE,QAAA,EAAU,UAAU,CAAA,EAAG,QAAQ,MAAM,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,iBAAiB,CAAC,EAAE,QAAA,EAAU,UAAA,EAAY,WAAU,KAAM;AACtD,MAAA,GAAA,CAAI,2BAAA,EAA6B,EAAE,QAAA,EAAU,UAAA,EAAY,WAAW,CAAA,EAAG,SAAS,MAAM,CAAA;AAAA,IAC1F,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,MAAA,KAAW;AACvB,MAAA,GAAA,CAAI,6BAAA,EAA+B;AAAA,QAC/B,UAAW,MAAA,CAAe,QAAA;AAAA,QAC1B,YAAY,MAAA,CAAO,EAAA;AAAA,QACnB,QAAA,EAAU,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAA,CAAA;AAAA,QAC5B,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,MAAM,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,CAAA,CAAA,GAAM;AAAA,OACzD,CAAA;AAAA,IACL,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,OAAA,KAAY;AACtB,MAAA,GAAA,CAAI,2BAAA,EAA6B;AAAA,QAC7B,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAA,EAAW,CAAA,EAAG,OAAA,CAAQ,eAAe,CAAA,EAAA,CAAA;AAAA,QACrC,SAAA,EAAW,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,EAAA,CAAA;AAAA,QAC/B,UAAA,EAAY,QAAQ,UAAA,CAAW,MAAA;AAAA,QAC/B,QAAQ,OAAA,CAAQ;AAAA,OACnB,CAAA;AAAA,IACL,CAAA;AAAA,IACA,SAAS,CAAC,EAAE,QAAA,EAAU,UAAA,EAAY,OAAM,KAAM;AAC1C,MAAA,GAAA,CAAI,yBAAyB,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IAC/E;AAAA,GACJ;AACJ;AAKO,SAAS,kBAAA,CAAmB,UAAkB,OAAA,EAI/B;AAClB,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAG,SAAA,GAAY,IAAI,aAAA,GAAgB,GAAA,EAAK,GAAI,OAAA,IAAW,EAAC;AAC3E,EAAA,MAAM,SAA6B,EAAC;AACpC,EAAA,IAAI,UAAA,GAAmD,IAAA;AAEvD,EAAA,MAAM,QAAQ,YAAY;AACtB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAO,MAAM,CAAA;AAE5C,IAAA,IAAI;AACA,MAAA,MAAM,MAAM,QAAA,EAAU;AAAA,QAClB,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACL,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG;AAAA,SACP;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,OAAO,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG;AAAA,OACjE,CAAA;AAAA,IACL,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAEvD,MAAA,MAAA,CAAO,OAAA,CAAQ,GAAG,KAAK,CAAA;AAAA,IAC3B;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,UAAA,GAAa,WAAW,MAAM;AAC1B,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,KAAA,EAAM;AAAA,IACV,GAAG,aAAa,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,OAAO;AAAA,IACH,WAAA,EAAa,CAAC,OAAA,KAAY;AACtB,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAC5B,QAAA,KAAA,EAAM;AAAA,MACV,CAAA,MAAO;AACH,QAAA,aAAA,EAAc;AAAA,MAClB;AAAA,IACJ;AAAA,GACJ;AACJ","file":"chunk-YNTMYL36.js","sourcesContent":["/**\n * @flight-framework/core - Streaming Observability\n * \n * Zero-telemetry metrics and instrumentation for streaming SSR.\n * All data stays on YOUR infrastructure - never sent anywhere.\n * \n * Best Practices 2026:\n * - Comprehensive timing metrics for each boundary\n * - Hook-based observability for custom integrations\n * - Performance insights without vendor lock-in\n * \n * @example\n * ```typescript\n * import { createInstrumentedStream } from '@flight-framework/core/streaming';\n * \n * const { stream, metrics } = await createInstrumentedStream({\n * shell: '<html>...',\n * boundaries: [...],\n * onMetrics: (m) => myAnalytics.track(m), // YOUR system\n * });\n * ```\n */\n\nimport type { StreamingRenderOptions, SuspenseBoundaryConfig } from './index.js';\nimport { createStreamingSSR } from './index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Timing information for a single boundary\n */\nexport interface BoundaryTiming {\n /** Boundary identifier */\n id: string;\n /** When the boundary started resolving (ms since stream start) */\n startTime: number;\n /** When the boundary finished resolving */\n endTime: number;\n /** Total duration in milliseconds */\n duration: number;\n /** Whether it resolved successfully */\n success: boolean;\n /** Size of content in bytes (if successful) */\n contentSize?: number;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Overall streaming metrics\n */\nexport interface StreamingMetrics {\n /** Unique ID for this stream session */\n streamId: string;\n /** When streaming started */\n startTime: number;\n /** Time to shell ready (TTFB improvement) */\n shellTime: number;\n /** Time until all boundaries resolved */\n totalStreamTime: number;\n /** Individual boundary timings */\n boundaries: BoundaryTiming[];\n /** Number of boundaries that resolved successfully */\n successCount: number;\n /** Number of boundaries that failed */\n errorCount: number;\n /** Total bytes streamed */\n totalBytes: number;\n /** Strategy used (if priority streaming) */\n strategy?: string;\n /** Custom metadata you can add */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Observability hooks for streaming events\n */\nexport interface StreamingObserver {\n /** Called when streaming starts */\n onStreamStart?: (streamId: string) => void;\n /** Called when shell is sent */\n onShellReady?: (timing: { streamId: string; duration: number }) => void;\n /** Called when a boundary starts resolving */\n onBoundaryStart?: (info: { streamId: string; boundaryId: string; startTime: number }) => void;\n /** Called when a boundary finishes */\n onBoundaryEnd?: (timing: BoundaryTiming & { streamId: string }) => void;\n /** Called when streaming completes */\n onStreamEnd?: (metrics: StreamingMetrics) => void;\n /** Called on any error */\n onError?: (error: { streamId: string; boundaryId?: string; error: Error }) => void;\n}\n\n/**\n * Configuration for instrumented streaming\n */\nexport interface InstrumentedStreamConfig {\n /** Initial HTML shell */\n shell: string;\n /** Closing HTML */\n shellEnd: string;\n /** Suspense boundaries */\n suspenseBoundaries: SuspenseBoundaryConfig[];\n /** Streaming options */\n options?: StreamingRenderOptions;\n /** Observer hooks */\n observer?: StreamingObserver;\n /** Callback when all metrics are ready */\n onMetrics?: (metrics: StreamingMetrics) => void;\n /** Custom metadata to include in metrics */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Result of instrumented streaming\n */\nexport interface InstrumentedStreamResult {\n /** The readable stream */\n stream: ReadableStream<Uint8Array>;\n /** Abort the stream */\n abort: () => void;\n /** Shell ready promise */\n shellReady: Promise<void>;\n /** All content ready promise */\n allReady: Promise<void>;\n /** Final metrics (resolves when stream completes) */\n metrics: Promise<StreamingMetrics>;\n /** Stream ID for correlation */\n streamId: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Generate a unique stream ID\n */\nfunction generateStreamId(): string {\n return `stream_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create an instrumented streaming SSR response with full observability\n */\nexport async function createInstrumentedStream(\n config: InstrumentedStreamConfig\n): Promise<InstrumentedStreamResult> {\n const {\n shell,\n shellEnd,\n suspenseBoundaries,\n options = {},\n observer,\n onMetrics,\n meta,\n } = config;\n\n const streamId = generateStreamId();\n const startTime = Date.now();\n const boundaryTimings: BoundaryTiming[] = [];\n const boundaryStarts = new Map<string, number>();\n let shellTime = 0;\n let totalBytes = 0;\n\n // Metrics promise\n let resolveMetrics: (m: StreamingMetrics) => void;\n const metricsPromise = new Promise<StreamingMetrics>((r) => { resolveMetrics = r; });\n\n // Notify stream start\n observer?.onStreamStart?.(streamId);\n\n // Wrap boundaries with instrumentation\n const instrumentedBoundaries: SuspenseBoundaryConfig[] = suspenseBoundaries.map(boundary => {\n const boundaryStart = Date.now();\n boundaryStarts.set(boundary.id, boundaryStart);\n\n observer?.onBoundaryStart?.({\n streamId,\n boundaryId: boundary.id,\n startTime: boundaryStart - startTime,\n });\n\n return {\n ...boundary,\n contentPromise: boundary.contentPromise.then(\n (content) => {\n const endTime = Date.now();\n const timing: BoundaryTiming = {\n id: boundary.id,\n startTime: boundaryStarts.get(boundary.id)! - startTime,\n endTime: endTime - startTime,\n duration: endTime - boundaryStarts.get(boundary.id)!,\n success: true,\n contentSize: new TextEncoder().encode(content).length,\n };\n boundaryTimings.push(timing);\n observer?.onBoundaryEnd?.({ ...timing, streamId });\n return content;\n },\n (error) => {\n const endTime = Date.now();\n const timing: BoundaryTiming = {\n id: boundary.id,\n startTime: boundaryStarts.get(boundary.id)! - startTime,\n endTime: endTime - startTime,\n duration: endTime - boundaryStarts.get(boundary.id)!,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n boundaryTimings.push(timing);\n observer?.onBoundaryEnd?.({ ...timing, streamId });\n observer?.onError?.({ streamId, boundaryId: boundary.id, error: error as Error });\n throw error;\n }\n ),\n };\n });\n\n // Create the underlying stream with instrumented callbacks\n const result = await createStreamingSSR({\n shell,\n shellEnd,\n suspenseBoundaries: instrumentedBoundaries,\n options: {\n ...options,\n onShellReady: () => {\n shellTime = Date.now() - startTime;\n observer?.onShellReady?.({ streamId, duration: shellTime });\n options.onShellReady?.();\n },\n onAllReady: () => {\n const totalStreamTime = Date.now() - startTime;\n\n const metrics: StreamingMetrics = {\n streamId,\n startTime,\n shellTime,\n totalStreamTime,\n boundaries: boundaryTimings,\n successCount: boundaryTimings.filter(b => b.success).length,\n errorCount: boundaryTimings.filter(b => !b.success).length,\n totalBytes,\n meta,\n };\n\n observer?.onStreamEnd?.(metrics);\n onMetrics?.(metrics);\n resolveMetrics!(metrics);\n options.onAllReady?.();\n },\n onError: (error) => {\n observer?.onError?.({ streamId, error });\n options.onError?.(error);\n },\n },\n });\n\n // Wrap stream to count bytes\n const countingStream = result.stream.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n totalBytes += chunk.length;\n controller.enqueue(chunk);\n },\n })\n );\n\n return {\n stream: countingStream,\n abort: result.abort,\n shellReady: result.shellReady,\n allReady: result.allReady,\n metrics: metricsPromise,\n streamId,\n };\n}\n\n// ============================================================================\n// Utility: Metrics Aggregator\n// ============================================================================\n\n/**\n * Aggregate metrics from multiple streams for analysis\n */\nexport class MetricsAggregator {\n private metrics: StreamingMetrics[] = [];\n private maxSamples: number;\n\n constructor(maxSamples = 1000) {\n this.maxSamples = maxSamples;\n }\n\n /**\n * Add metrics from a stream\n */\n add(metrics: StreamingMetrics): void {\n this.metrics.push(metrics);\n if (this.metrics.length > this.maxSamples) {\n this.metrics.shift();\n }\n }\n\n /**\n * Get average shell time\n */\n getAverageShellTime(): number {\n if (this.metrics.length === 0) return 0;\n return this.metrics.reduce((sum, m) => sum + m.shellTime, 0) / this.metrics.length;\n }\n\n /**\n * Get average total stream time\n */\n getAverageTotalTime(): number {\n if (this.metrics.length === 0) return 0;\n return this.metrics.reduce((sum, m) => sum + m.totalStreamTime, 0) / this.metrics.length;\n }\n\n /**\n * Get slowest boundaries (by average duration)\n */\n getSlowestBoundaries(limit = 5): { id: string; avgDuration: number; errorRate: number }[] {\n const boundaryStats = new Map<string, { totalDuration: number; count: number; errors: number }>();\n\n for (const m of this.metrics) {\n for (const b of m.boundaries) {\n const stats = boundaryStats.get(b.id) || { totalDuration: 0, count: 0, errors: 0 };\n stats.totalDuration += b.duration;\n stats.count++;\n if (!b.success) stats.errors++;\n boundaryStats.set(b.id, stats);\n }\n }\n\n return [...boundaryStats.entries()]\n .map(([id, stats]) => ({\n id,\n avgDuration: stats.totalDuration / stats.count,\n errorRate: stats.errors / stats.count,\n }))\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, limit);\n }\n\n /**\n * Get overall error rate\n */\n getErrorRate(): number {\n const total = this.metrics.reduce((sum, m) => sum + m.boundaries.length, 0);\n const errors = this.metrics.reduce((sum, m) => sum + m.errorCount, 0);\n return total > 0 ? errors / total : 0;\n }\n\n /**\n * Get percentiles for shell time\n */\n getShellTimePercentiles(): { p50: number; p90: number; p99: number } {\n const sorted = [...this.metrics].map(m => m.shellTime).sort((a, b) => a - b);\n const len = sorted.length;\n if (len === 0) return { p50: 0, p90: 0, p99: 0 };\n\n return {\n p50: sorted[Math.floor(len * 0.5)] ?? 0,\n p90: sorted[Math.floor(len * 0.9)] ?? 0,\n p99: sorted[Math.floor(len * 0.99)] ?? 0,\n };\n }\n\n /**\n * Export all metrics for external analysis\n */\n export(): StreamingMetrics[] {\n return [...this.metrics];\n }\n\n /**\n * Clear all metrics\n */\n clear(): void {\n this.metrics = [];\n }\n}\n\n// ============================================================================\n// Utility: Create Observer from Logger\n// ============================================================================\n\n/**\n * Create a streaming observer from a simple logger function\n */\nexport function createLoggerObserver(\n log: (message: string, data?: Record<string, unknown>) => void\n): StreamingObserver {\n return {\n onStreamStart: (streamId) => {\n log('[Flight] Stream started', { streamId });\n },\n onShellReady: ({ streamId, duration }) => {\n log('[Flight] Shell ready', { streamId, duration: `${duration}ms` });\n },\n onBoundaryStart: ({ streamId, boundaryId, startTime }) => {\n log('[Flight] Boundary started', { streamId, boundaryId, startTime: `${startTime}ms` });\n },\n onBoundaryEnd: (timing) => {\n log('[Flight] Boundary completed', {\n streamId: (timing as any).streamId,\n boundaryId: timing.id,\n duration: `${timing.duration}ms`,\n success: timing.success,\n size: timing.contentSize ? `${timing.contentSize}b` : undefined,\n });\n },\n onStreamEnd: (metrics) => {\n log('[Flight] Stream completed', {\n streamId: metrics.streamId,\n totalTime: `${metrics.totalStreamTime}ms`,\n shellTime: `${metrics.shellTime}ms`,\n boundaries: metrics.boundaries.length,\n errors: metrics.errorCount,\n });\n },\n onError: ({ streamId, boundaryId, error }) => {\n log('[Flight] Stream error', { streamId, boundaryId, error: error.message });\n },\n };\n}\n\n/**\n * Create observer that sends metrics to a custom endpoint (YOUR infrastructure)\n */\nexport function createHttpObserver(endpoint: string, options?: {\n headers?: Record<string, string>;\n batchSize?: number;\n flushInterval?: number;\n}): StreamingObserver {\n const { headers = {}, batchSize = 10, flushInterval = 5000 } = options || {};\n const buffer: StreamingMetrics[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n const flush = async () => {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n\n try {\n await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({ metrics: batch, timestamp: Date.now() }),\n });\n } catch (error) {\n console.error('[Flight] Failed to send metrics:', error);\n // Re-add to buffer for retry\n buffer.unshift(...batch);\n }\n };\n\n const scheduleFlush = () => {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flush();\n }, flushInterval);\n };\n\n return {\n onStreamEnd: (metrics) => {\n buffer.push(metrics);\n if (buffer.length >= batchSize) {\n flush();\n } else {\n scheduleFlush();\n }\n },\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
- export { defineConfig, findConfigFile, loadConfig, resolveConfig } from '../chunk-IXMD5QH2.js';
1
+ export { defineConfig, findConfigFile, loadConfig, resolveConfig } from '../chunk-EHVUAFNH.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest } from '../chunk-FSJNOPYE.js';
2
- import '../chunk-YHEVHRLH.js';
1
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest } from '../chunk-2JVEH76V.js';
2
+ import '../chunk-OZBPR27I.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- export { createFileRouter, loadRoutes, scanRoutes } from '../chunk-54HPVE7N.js';
1
+ export { createFileRouter, loadRoutes, scanRoutes } from '../chunk-UGTETAJ2.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from '../chunk-XSY5AAXT.js';
1
+ export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from '../chunk-PO7IHPFF.js';
2
2
  //# sourceMappingURL=streaming-hints.js.map
3
3
  //# sourceMappingURL=streaming-hints.js.map
@@ -1,3 +1,3 @@
1
- export { createRouteContext, error, json, parseBody, redirect } from '../chunk-W6D62JCI.js';
1
+ export { createRouteContext, error, json, parseBody, redirect } from '../chunk-A4TKWQBU.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -1,36 +1,36 @@
1
- export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver } from './chunk-6BDCTUQY.js';
2
- export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStreamingResponse as createConditionalStreamingResponse, createStaticResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming } from './chunk-XOIYNY4I.js';
3
- export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter } from './chunk-MQQLYWZZ.js';
4
- export { createIslandRegistry, createPreactIslandAdapter, createReactIslandAdapter, createSolidIslandAdapter, createVueIslandAdapter, defineIsland, hydrateIslands, registerFlightIslandElement, registerIsland, renderIsland, renderIslands, setIslandAdapter } from './chunk-WFAWAHJH.js';
5
- export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from './chunk-XSY5AAXT.js';
6
- export { streamWithPriority, validateDependencies } from './chunk-WOEIJWGJ.js';
7
- import './chunk-SUILH4ID.js';
8
- export { createServer } from './chunk-LBYDTULN.js';
9
- export { defineConfig } from './chunk-IXMD5QH2.js';
10
- export { createFileRouter, loadRoutes, scanRoutes } from './chunk-54HPVE7N.js';
11
- export { RedirectError, redirect as actionRedirect, cookies, executeAction, executeFormAction, getAction, handleActionRequest, isRedirectError, parseFormData, registerAction } from './chunk-3QP3E7HS.js';
12
- export { createRouteContext, error, json, parseBody, redirect } from './chunk-W6D62JCI.js';
13
- export { createLazyContent, createStreamingResponse, createStreamingSSR, renderWithStreaming, streamParallel, streamSequential } from './chunk-RSVA2EYO.js';
1
+ export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver } from './chunk-YNTMYL36.js';
2
+ export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStreamingResponse as createConditionalStreamingResponse, createStaticResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming } from './chunk-VNO2YUVD.js';
3
+ export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter } from './chunk-GNS2FGPC.js';
4
+ export { createIslandRegistry, createPreactIslandAdapter, createReactIslandAdapter, createSolidIslandAdapter, createVueIslandAdapter, defineIsland, hydrateIslands, registerFlightIslandElement, registerIsland, renderIsland, renderIslands, setIslandAdapter } from './chunk-UFWGOJL7.js';
5
+ export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from './chunk-PO7IHPFF.js';
6
+ export { streamWithPriority, validateDependencies } from './chunk-NZS2YJ43.js';
7
+ import './chunk-QK6UEQ75.js';
8
+ export { createServer } from './chunk-UL4Q5CIJ.js';
9
+ export { defineConfig } from './chunk-EHVUAFNH.js';
10
+ export { createFileRouter, loadRoutes, scanRoutes } from './chunk-UGTETAJ2.js';
11
+ export { RedirectError, redirect as actionRedirect, cookies, executeAction, executeFormAction, getAction, handleActionRequest, isRedirectError, parseFormData, registerAction } from './chunk-OZ3EXPLE.js';
12
+ export { createRouteContext, error, json, parseBody, redirect } from './chunk-A4TKWQBU.js';
13
+ export { createLazyContent, createStreamingResponse, createStreamingSSR, renderWithStreaming, streamParallel, streamSequential } from './chunk-CNY3ZUVG.js';
14
14
  import './chunk-63SCEXD7.js';
15
- export { createServerContext, isNotFoundError, isRedirectError as isRscRedirectError, notFound, redirect as rscRedirect } from './chunk-62C7LX2E.js';
16
- import './chunk-PVUMB632.js';
17
- import './chunk-P6WSBVDT.js';
18
- import './chunk-K2CQZPCG.js';
19
- export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, revalidatePath as rscRevalidatePath, revalidateTag as rscRevalidateTag, serializeProps, serverFetch, withErrorBoundary } from './chunk-3ZSSRE6M.js';
20
- import './chunk-ZIE56LCA.js';
21
- export { detectBoundaryType, hasUseClientDirective, hasUseServerDirective } from './chunk-PDW5WCMW.js';
15
+ export { createServerContext, isNotFoundError, isRedirectError as isRscRedirectError, notFound, redirect as rscRedirect } from './chunk-CKJHJPKQ.js';
16
+ import './chunk-A2QRUBVE.js';
17
+ import './chunk-FRAH5QNY.js';
18
+ import './chunk-6GI6HFSQ.js';
19
+ export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, revalidatePath as rscRevalidatePath, revalidateTag as rscRevalidateTag, serializeProps, serverFetch, withErrorBoundary } from './chunk-2R23X5Z3.js';
20
+ import './chunk-XU6MRYG2.js';
21
+ export { detectBoundaryType, hasUseClientDirective, hasUseServerDirective } from './chunk-5XHOLZBJ.js';
22
22
  import './chunk-Y22AMGTM.js';
23
- import './chunk-TASAT7KB.js';
24
- import './chunk-2F2QU6RC.js';
25
- import './chunk-VPFMHGEV.js';
26
- import './chunk-MDQNNIHH.js';
27
- export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden as createForbidden, notFound as createNotFound, unauthorized as createUnauthorized, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError, wrapWithDigest } from './chunk-FSJNOPYE.js';
23
+ import './chunk-HNPO6LFW.js';
24
+ import './chunk-3UQJE3XZ.js';
25
+ import './chunk-3N5ZBVZJ.js';
26
+ import './chunk-65JYF3DJ.js';
27
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden as createForbidden, notFound as createNotFound, unauthorized as createUnauthorized, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError, wrapWithDigest } from './chunk-2JVEH76V.js';
28
28
  import './chunk-PL37KFRJ.js';
29
- export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-YHEVHRLH.js';
30
- export { createRouter } from './chunk-GCQZ4FHI.js';
31
- import './chunk-ZVC3ZWLM.js';
32
- export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-R7SQAREQ.js';
33
- export { createMiddlewareChain } from './chunk-KWFX6WHG.js';
29
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-OZBPR27I.js';
30
+ export { createRouter } from './chunk-ARBKF6VI.js';
31
+ import './chunk-B2LPSCES.js';
32
+ export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-LKOPJ3GS.js';
33
+ export { createMiddlewareChain } from './chunk-JFUKVWSO.js';
34
34
  import { promises } from 'fs';
35
35
  import { dirname, join } from 'path';
36
36