@flight-framework/core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +541 -346
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-3UQJE3XZ.js → chunk-2F2QU6RC.js} +2 -2
- package/dist/chunk-2F2QU6RC.js.map +1 -0
- package/dist/{chunk-UGTETAJ2.js → chunk-3KRBRSRJ.js} +157 -3
- package/dist/chunk-3KRBRSRJ.js.map +1 -0
- package/dist/{chunk-OZ3EXPLE.js → chunk-3QP3E7HS.js} +2 -2
- package/dist/chunk-3QP3E7HS.js.map +1 -0
- package/dist/{chunk-2R23X5Z3.js → chunk-3ZSSRE6M.js} +2 -2
- package/dist/chunk-3ZSSRE6M.js.map +1 -0
- package/dist/{chunk-CKJHJPKQ.js → chunk-62C7LX2E.js} +2 -2
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/{chunk-YNTMYL36.js → chunk-6BDCTUQY.js} +3 -3
- package/dist/chunk-6BDCTUQY.js.map +1 -0
- package/dist/{chunk-2JVEH76V.js → chunk-FSJNOPYE.js} +3 -3
- package/dist/chunk-FSJNOPYE.js.map +1 -0
- package/dist/{chunk-ARBKF6VI.js → chunk-GCQZ4FHI.js} +2 -2
- package/dist/{chunk-ARBKF6VI.js.map → chunk-GCQZ4FHI.js.map} +1 -1
- package/dist/{chunk-EHVUAFNH.js → chunk-IXMD5QH2.js} +2 -2
- package/dist/chunk-IXMD5QH2.js.map +1 -0
- package/dist/{chunk-6GI6HFSQ.js → chunk-K2CQZPCG.js} +2 -2
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/{chunk-65JYF3DJ.js → chunk-MDQNNIHH.js} +2 -2
- package/dist/chunk-MDQNNIHH.js.map +1 -0
- package/dist/{chunk-GNS2FGPC.js → chunk-MQQLYWZZ.js} +2 -2
- package/dist/chunk-MQQLYWZZ.js.map +1 -0
- package/dist/{chunk-LAKHYTHL.js → chunk-NWMJYTMB.js} +3 -3
- package/dist/chunk-NWMJYTMB.js.map +1 -0
- package/dist/{chunk-JFUKVWSO.js → chunk-OYF2OAKS.js} +115 -32
- package/dist/chunk-OYF2OAKS.js.map +1 -0
- package/dist/{chunk-FRAH5QNY.js → chunk-P6WSBVDT.js} +4 -4
- package/dist/chunk-P6WSBVDT.js.map +1 -0
- package/dist/{chunk-5XHOLZBJ.js → chunk-PDW5WCMW.js} +2 -2
- package/dist/chunk-PDW5WCMW.js.map +1 -0
- package/dist/{chunk-A2QRUBVE.js → chunk-PVUMB632.js} +2 -2
- package/dist/chunk-PVUMB632.js.map +1 -0
- package/dist/{chunk-LKOPJ3GS.js → chunk-R7SQAREQ.js} +2 -2
- package/dist/chunk-R7SQAREQ.js.map +1 -0
- package/dist/{chunk-UL4Q5CIJ.js → chunk-ROJFQCGV.js} +5 -5
- package/dist/chunk-ROJFQCGV.js.map +1 -0
- package/dist/{chunk-CNY3ZUVG.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/{chunk-QK6UEQ75.js → chunk-SUILH4ID.js} +2 -2
- package/dist/chunk-SUILH4ID.js.map +1 -0
- package/dist/{chunk-PAVI5W6M.js → chunk-T4Z4HM4W.js} +3 -3
- package/dist/chunk-T4Z4HM4W.js.map +1 -0
- package/dist/{chunk-HNPO6LFW.js → chunk-TASAT7KB.js} +2 -2
- package/dist/chunk-TASAT7KB.js.map +1 -0
- package/dist/{chunk-3N5ZBVZJ.js → chunk-VPFMHGEV.js} +2 -2
- package/dist/chunk-VPFMHGEV.js.map +1 -0
- package/dist/{chunk-A4TKWQBU.js → chunk-W6D62JCI.js} +2 -2
- package/dist/chunk-W6D62JCI.js.map +1 -0
- package/dist/{chunk-UFWGOJL7.js → chunk-WFAWAHJH.js} +2 -2
- package/dist/chunk-WFAWAHJH.js.map +1 -0
- package/dist/{chunk-NZS2YJ43.js → chunk-WOEIJWGJ.js} +2 -2
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/{chunk-VNO2YUVD.js → chunk-XOIYNY4I.js} +2 -2
- package/dist/chunk-XOIYNY4I.js.map +1 -0
- package/dist/{chunk-PO7IHPFF.js → chunk-XSY5AAXT.js} +2 -2
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/{chunk-OZBPR27I.js → chunk-YHEVHRLH.js} +2 -2
- package/dist/chunk-YHEVHRLH.js.map +1 -0
- package/dist/{chunk-XU6MRYG2.js → chunk-ZIE56LCA.js} +3 -3
- package/dist/chunk-ZIE56LCA.js.map +1 -0
- package/dist/{chunk-B2LPSCES.js → chunk-ZVC3ZWLM.js} +2 -2
- package/dist/chunk-ZVC3ZWLM.js.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/file-router/index.d.ts +95 -1
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/handlers/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/islands/index.js +1 -1
- package/dist/middleware/index.d.ts +163 -10
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/router/index.js +1 -1
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/context.js +1 -1
- package/dist/rsc/index.js +11 -11
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/payload.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.js +3 -3
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/dist/server/index.js +4 -4
- package/dist/streaming/adapters/index.js +1 -1
- package/dist/streaming/conditional.js +1 -1
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +222 -210
- package/LICENSE +0 -21
- package/dist/chunk-2JVEH76V.js.map +0 -1
- package/dist/chunk-2R23X5Z3.js.map +0 -1
- package/dist/chunk-3N5ZBVZJ.js.map +0 -1
- package/dist/chunk-3UQJE3XZ.js.map +0 -1
- package/dist/chunk-5XHOLZBJ.js.map +0 -1
- package/dist/chunk-65JYF3DJ.js.map +0 -1
- package/dist/chunk-6GI6HFSQ.js.map +0 -1
- package/dist/chunk-A2QRUBVE.js.map +0 -1
- package/dist/chunk-A4TKWQBU.js.map +0 -1
- package/dist/chunk-B2LPSCES.js.map +0 -1
- package/dist/chunk-CKJHJPKQ.js.map +0 -1
- package/dist/chunk-CNY3ZUVG.js.map +0 -1
- package/dist/chunk-EHVUAFNH.js.map +0 -1
- package/dist/chunk-FRAH5QNY.js.map +0 -1
- package/dist/chunk-GNS2FGPC.js.map +0 -1
- package/dist/chunk-HNPO6LFW.js.map +0 -1
- package/dist/chunk-JFUKVWSO.js.map +0 -1
- package/dist/chunk-LAKHYTHL.js.map +0 -1
- package/dist/chunk-LKOPJ3GS.js.map +0 -1
- package/dist/chunk-NZS2YJ43.js.map +0 -1
- package/dist/chunk-OZ3EXPLE.js.map +0 -1
- package/dist/chunk-OZBPR27I.js.map +0 -1
- package/dist/chunk-PAVI5W6M.js.map +0 -1
- package/dist/chunk-PO7IHPFF.js.map +0 -1
- package/dist/chunk-QK6UEQ75.js.map +0 -1
- package/dist/chunk-UFWGOJL7.js.map +0 -1
- package/dist/chunk-UGTETAJ2.js.map +0 -1
- package/dist/chunk-UL4Q5CIJ.js.map +0 -1
- package/dist/chunk-VNO2YUVD.js.map +0 -1
- package/dist/chunk-XU6MRYG2.js.map +0 -1
- package/dist/chunk-YNTMYL36.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/streaming/observability.ts"],"names":[],"mappings":"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","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"]}
|