@plyaz/core 1.18.1 → 1.18.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/frameworks/base/index.ts","../../src/frameworks/base/route-handler.ts","../../src/frameworks/nextjs/index.ts","../../src/frameworks/nextjs/config.ts","../../src/utils/common/id.ts","../../src/events/CoreEventManager.ts","../../src/services/ApiClientService.ts","../../src/base/observability/BaseAdapter.ts","../../src/base/observability/LoggerAdapter.ts","../../src/base/observability/ObservabilityService.ts","../../src/config/dependencies.ts","../../src/init/ServiceRegistry.ts","../../src/events/streaming/StreamConnectionManager.ts","../../src/events/streaming/StreamBroadcaster.ts","../../src/events/streaming/auth/BaseAuthAdapter.ts","../../src/events/streaming/auth/adapters/AnonymousAuthAdapter.ts","../../src/events/streaming/transports/BaseTransportAdapter.ts","../../src/events/streaming/transports/adapters/SSETransportAdapter.ts","../../src/events/streaming/frameworks/BaseFrameworkAdapter.ts","../../src/events/streaming/frameworks/NextJSFrameworkAdapter.ts","../../src/events/streaming/frameworks/ExpressFrameworkAdapter.ts","../../src/events/streaming/frameworks/NestJSFrameworkAdapter.ts","../../src/events/streaming/StreamServer.ts","../../src/events/streaming/StreamRegistry.ts","../../src/events/streaming/base/BaseStreamEndpoint.ts","../../src/events/streaming/channels/BaseChannelController.ts","../../src/domain/files/streaming/FilesChannelController.ts","../../src/domain/files/streaming/FilesStreamEndpoint.ts","../../src/events/streaming/endpoints/system/SystemChannelController.ts","../../src/events/streaming/endpoints/system/SystemStreamEndpoint.ts","../../src/utils/runtime.ts","../../src/init/CoreInitializer.ts","../../src/frameworks/nextjs/route-factory.ts","../../src/frameworks/nextjs/helpers.ts","../../src/frameworks/express/index.ts","../../src/frameworks/express/route-factory.ts","../../src/frameworks/express/helpers.ts"],"names":["DEFAULT_SUCCESS_MESSAGES","EventEmitter","PRODUCTION_CONFIG","STAGING_CONFIG","DEVELOPMENT_CONFIG","setDefaultApiClient","ApiPackageError","PACKAGE_STATUS_CODES","API_ERROR_CODES","OPERATIONS","generateRequestId","ERROR_CODES","ERROR_CATEGORY","HTTP_STATUS","CORE_EVENTS","mergeConfigs","createApiClient","PackageLogger","logger","errors","CorePackageError","OBSERVABILITY_METRICS","BACKEND_RUNTIMES","UNIVERSAL_RUNTIMES","FRONTEND_RUNTIMES","TIME_CONSTANTS","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","StreamPackageError","STREAM_ERROR_CODES","STREAMING_DEFAULTS","CoreLogger","FILES_STREAM_CHANNEL_PREFIX","FILES_STREAM_BROADCAST_CHANNEL","STORAGE_ERROR_CODES","SYSTEM_STREAM_CHANNEL","STORE_KEYS","clearEventEmitter","BaseError","ServerErrorMiddleware","createStandaloneFeatureFlagStore","initializeErrorSystem","setEventEmitter","initializeGlobalErrorHandler","SuccessResponseStandard","exports","extractBearerToken","extractHeader","extractHeaders","extractJsonBody","extractQueryParams","extractRouteParams","safeExtractJsonBody","parseQueryParams","parseHeaders","getStatusForMethod","getInjectedServices","createServiceGetter","emptyServices","BEARER_PREFIX_LENGTH"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Framework Utilities\n *\n * Framework-agnostic interfaces and utilities for route handling.\n */\n\nexport { getSuccessMessage } from './route-handler';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - RouteContext, RouteHandler, RouteHandlerConfig\n// - MethodHandlerTypes, HandlersTypeMap, HttpMethod\n// - DEFAULT_SUCCESS_MESSAGES\n","/**\n * ============================================================================\n * FRAMEWORK-AGNOSTIC ROUTE HANDLER UTILITIES\n * ============================================================================\n *\n * Utility functions for route handlers.\n * Types are in @plyaz/types/core - import them directly from there.\n */\n\nimport { DEFAULT_SUCCESS_MESSAGES } from '@plyaz/types/core';\n\n/**\n * Get the default success message for an HTTP method\n */\nexport function getSuccessMessage(\n method: string,\n customMessage?: string | ((m: string) => string)\n): string {\n if (typeof customMessage === 'function') {\n return customMessage(method);\n }\n return customMessage ?? DEFAULT_SUCCESS_MESSAGES[method] ?? 'Operation successful';\n}\n","/**\n * Next.js Framework Utilities\n *\n * Helpers and utilities for integrating Plyaz with Next.js applications.\n *\n * @example Config helper\n * ```typescript\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * // In next.config.ts\n * export default withPlyazNextConfig({\n * experimental: { serverActions: { bodySizeLimit: '100mb' } },\n * });\n * ```\n *\n * @example Route factory\n * ```typescript\n * import { createNextApiRoute } from '@plyaz/core/frameworks/nextjs';\n *\n * // In app/api/users/[id]/route.ts\n * export const { GET, PATCH, DELETE } = createNextApiRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id),\n * PATCH: async (service, { params, body }) => service.update(params.id, body),\n * DELETE: async (service, { params }) => service.delete(params.id),\n * },\n * });\n * ```\n */\n\n// Config helpers\nexport {\n withPlyazNextConfig,\n plyazServerExternalPackages,\n plyazWebpackClientFallbacks,\n plyazWebpackClientAliases,\n} from './config';\n\n// Route factory\nexport { createNextApiRoute } from './route-factory';\n\n// Request helpers\nexport {\n extractQueryParams,\n extractJsonBody,\n safeExtractJsonBody,\n extractRouteParams,\n extractHeaders,\n extractHeader,\n extractBearerToken,\n} from './helpers';\n","/**\n * ============================================================================\n * NEXT.JS CONFIG HELPERS\n * ============================================================================\n *\n * Helpers for configuring Next.js projects using Plyaz packages.\n * These handle common webpack fallbacks, server external packages, and other\n * configurations needed when using @plyaz/core and related packages.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n * experimental: {\n * serverActions: { bodySizeLimit: '100mb' },\n * },\n * });\n * ```\n */\n\nimport type { NextConfig } from 'next';\nimport type { CorePlyazNextConfigOptions } from '@plyaz/types/core';\n\n/**\n * Packages that should be externalized from the server bundle.\n * These are packages with native dependencies or server-only code.\n */\nexport const plyazServerExternalPackages = [\n // Plyaz packages with native/server dependencies\n '@plyaz/core',\n '@plyaz/storage',\n '@plyaz/notifications',\n '@plyaz/db',\n\n // NestJS (included in @plyaz/core backend)\n '@nestjs/common',\n '@nestjs/core',\n '@nestjs/platform-express',\n 'reflect-metadata',\n\n // Native/binary packages\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'puppeteer-core',\n 'sharp',\n\n // File handling\n 'file-type',\n 'load-esm',\n\n // Redis\n 'ioredis',\n] as const;\n\n/**\n * Webpack fallbacks for client-side bundling.\n * These stub out Node.js modules that might leak into the frontend bundle.\n */\nexport const plyazWebpackClientFallbacks = {\n dns: false,\n net: false,\n tls: false,\n fs: false,\n child_process: false,\n async_hooks: false,\n perf_hooks: false,\n} as const;\n\n/**\n * Packages to alias to false for client-side bundling.\n * These are backend-only packages that should never be in the client bundle.\n */\nexport const plyazWebpackClientAliases = {\n ioredis: false,\n} as const;\n\n/**\n * Wraps a Next.js config with Plyaz-specific settings.\n *\n * This function adds:\n * - Server external packages for @plyaz/* and native modules\n * - Webpack client fallbacks for Node.js modules\n * - Webpack client aliases for backend-only packages\n *\n * @param config - Your Next.js configuration\n * @param options - Optional Plyaz-specific options\n * @returns The wrapped Next.js configuration\n *\n * @example\n * ```typescript\n * // Basic usage\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n * experimental: {\n * serverActions: { bodySizeLimit: '100mb' },\n * },\n * });\n *\n * // With next-intl or other plugins\n * import createNextIntlPlugin from 'next-intl/plugin';\n *\n * const withNextIntl = createNextIntlPlugin();\n * export default withNextIntl(withPlyazNextConfig({ ... }));\n *\n * // With custom options\n * export default withPlyazNextConfig(\n * { ... },\n * {\n * additionalExternalPackages: ['my-native-package'],\n * additionalClientFallbacks: { http: false },\n * }\n * );\n * ```\n */\n// eslint-disable-next-line complexity\nexport function withPlyazNextConfig(\n config: NextConfig,\n options: CorePlyazNextConfigOptions = {}\n): NextConfig {\n const {\n additionalExternalPackages = [],\n additionalClientFallbacks = {},\n additionalClientAliases = {},\n disableDefaultExternalPackages = false,\n disableDefaultClientFallbacks = false,\n } = options;\n\n // Build server external packages list\n const serverExternalPackages = [\n ...(config.serverExternalPackages ?? []),\n ...(disableDefaultExternalPackages ? [] : plyazServerExternalPackages),\n ...additionalExternalPackages,\n ];\n\n // Build client fallbacks\n const clientFallbacks = {\n ...(disableDefaultClientFallbacks ? {} : plyazWebpackClientFallbacks),\n ...additionalClientFallbacks,\n };\n\n // Build client aliases\n const clientAliases = {\n ...plyazWebpackClientAliases,\n ...additionalClientAliases,\n };\n\n return {\n ...config,\n serverExternalPackages,\n webpack: (webpackConfig, context) => {\n // Apply client-side fallbacks and aliases\n if (!context.isServer) {\n webpackConfig.resolve = webpackConfig.resolve ?? {};\n webpackConfig.resolve.fallback = {\n ...webpackConfig.resolve.fallback,\n ...clientFallbacks,\n };\n webpackConfig.resolve.alias = {\n ...webpackConfig.resolve.alias,\n ...clientAliases,\n };\n }\n\n // Call user's webpack config if provided\n return config.webpack?.(webpackConfig, context) ?? webpackConfig;\n },\n };\n}\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * UUID v4 regex pattern.\n * Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check if a string is a valid UUID v4.\n *\n * @param value - The string to check\n * @returns true if the string is a valid UUID\n *\n * @example\n * ```typescript\n * isValidUUID('a1b2c3d4-e5f6-4890-abcd-ef1234567890'); // true\n * isValidUUID('not-a-uuid'); // false\n * isValidUUID('bulk-upload-123456'); // false\n * ```\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n if (!value) return false;\n return UUID_REGEX.test(value);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\n isValidUUID,\n} as const;\n","/**\n * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * error: new Error('Failed'),\n * duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n * userId: '123',\n * method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n private emitter = new EventEmitter();\n private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n constructor() {\n // Increase max listeners for large apps\n this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n }\n\n /**\n * Emit an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param data - Event payload (type-safe when using CORE_EVENTS)\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n *\n * // Custom event\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean {\n const [scope] = eventType.split(':');\n const event: CoreEvent<TData, string> = {\n type: eventType,\n scope: scope ?? 'system',\n timestamp: Date.now(),\n correlationId: this.getCorrelationId(),\n data: data as TData,\n };\n\n // Emit to specific listeners\n this.emitter.emit(eventType, event);\n\n // Emit to wildcard listeners\n this.emitter.emit('*', event);\n\n return true;\n }\n\n /**\n * Subscribe to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler (type-safe when using CORE_EVENTS)\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom event\n * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n * console.log(event.data.custom);\n * });\n * ```\n */\n on<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe once to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n once<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n handler(event);\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n\n this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions\n .get(eventType)!\n .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe to all events in a scope\n *\n * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n * // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n * console.log(`Auth event: ${event.type}`, event.data);\n * });\n * ```\n */\n onScope<TScope extends string = string, TData = unknown>(\n scope: TScope,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n if (event.scope === scope) {\n handler(event);\n }\n };\n return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Remove a specific handler from an event\n *\n * @param eventType - Event type\n * @param handler - Handler to remove\n */\n off<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): void {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Dispose all subscriptions\n */\n dispose(): void {\n this.subscriptions.forEach((handlers, eventType) => {\n handlers.forEach(handler => this.emitter.off(eventType, handler));\n });\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n\n /**\n * Generate correlation ID for event tracing\n */\n private getCorrelationId(): string {\n return generateCorrelationId();\n }\n}\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * WHY THIS IS NEEDED:\n * In Next.js (and similar frameworks with module isolation), different parts of the application\n * can have separate module instances. For example:\n * - API routes may run in isolated module contexts\n * - Hot Module Replacement (HMR) during development creates new module instances\n * - Server Components vs API routes may have different module caches\n *\n * This causes a critical issue: if CoreEventManager is instantiated as a simple module-level\n * singleton (`export const X = new XClass()`), each isolated context gets its OWN instance.\n * Events emitted in one context (e.g., API route) won't reach listeners in another context\n * (e.g., streaming endpoints).\n *\n * THE SOLUTION:\n * Using `globalThis` with `Symbol.for()` ensures a TRUE singleton across all module boundaries:\n * - `globalThis` is the global object in any JavaScript environment (Node.js, browsers, workers)\n * - `Symbol.for('key')` returns the SAME symbol from the global symbol registry, even across\n * different module instances\n * - This combination guarantees ONE instance per process, regardless of how many times the\n * module is loaded\n *\n * WORKS WITH:\n * - Next.js (API routes, server components, middleware)\n * - Express/NestJS/Fastify (single process, but safe for hot reload)\n * - Bun/Deno (same globalThis semantics)\n *\n * DOES NOT HELP WITH:\n * - Truly isolated serverless functions (each invocation = new process)\n * - Multi-process clusters (need Redis pub/sub or similar for cross-process events)\n */\nconst GLOBAL_KEY = Symbol.for('plyaz.CoreEventManager');\n\nfunction getCoreEventManager(): CoreEventManagerClass {\n const globalAny = globalThis as unknown as { [key: symbol]: CoreEventManagerClass };\n\n if (!globalAny[GLOBAL_KEY]) {\n globalAny[GLOBAL_KEY] = new CoreEventManagerClass();\n }\n\n return globalAny[GLOBAL_KEY];\n}\n\nexport const CoreEventManager = getCoreEventManager();\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api/frontend';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api/frontend';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport {\n API_ERROR_CODES,\n PACKAGE_STATUS_CODES,\n OPERATIONS,\n ERROR_CODES,\n ERROR_CATEGORY,\n HTTP_STATUS,\n CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG as Partial<ApiConfig>;\n case 'staging':\n return STAGING_CONFIG as Partial<ApiConfig>;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\n }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n * // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n // Allow empty string '' for same-origin requests (e.g., Next.js API routes on same host)\n // Only require baseURL when it's undefined or null\n if (mergedConfig.baseURL === undefined || mergedConfig.baseURL === null) {\n errors.push('baseURL is required in API configuration (apiConfig parameter)');\n }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED when encryption is enabled in production. ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in production. ' +\n 'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n );\n }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (!mergedConfig.networkAware?.enabled) {\n warnings.push(\n '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n 'Enable it for better user experience on varying network conditions.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in production. ' +\n 'Enable it for production monitoring and alerting.'\n );\n }\n\n if (\n mergedConfig.retry &&\n mergedConfig.retry.attempts !== undefined &&\n mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n ) {\n warnings.push(\n `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n 'Consider increasing to 3-5 for better reliability in production.'\n );\n }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED in staging (aligned with production). ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in staging. ' +\n 'Staging should mirror production for accurate testing.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in staging. ' +\n 'Enable it to test monitoring before production deployment.'\n );\n }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n warnings.push(\n '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n 'Encryption will be skipped in development (this is normal).'\n );\n }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `CoreApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: CoreApiEnvironmentConfig,\n envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n const mapped: Partial<ApiConfig> = {};\n\n // Add API key to headers if provided\n if (envConfig.apiKey) {\n // Extract existing static headers if headers is an object with static property\n const existingStatic =\n envDefaults.headers &&\n typeof envDefaults.headers === 'object' &&\n 'static' in envDefaults.headers &&\n typeof envDefaults.headers.static === 'object'\n ? envDefaults.headers.static\n : {};\n\n mapped.headers = {\n static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n };\n }\n\n // Note: rateLimit from envConfig is not mapped to ApiConfig\n // Rate limiting is typically handled at the server/API gateway level\n // If needed in the future, it should be added to ApiConfig interface first\n\n return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n * { date: '2025-10-16' },\n * { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n envConfig: CoreApiEnvironmentConfig\n): void {\n const shouldSetAsDefault = envConfig.setAsDefault !== false;\n if (shouldSetAsDefault) {\n setDefaultApiClient(client);\n }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n envConfig: CoreApiEnvironmentConfig,\n mergedConfig: ApiClientOptions\n): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required base URL\n validateBaseURL(mergedConfig, errors);\n\n // Environment-specific validation\n if (envConfig.env === 'production') {\n validateProductionEncryption(mergedConfig, errors, warnings);\n validateProductionPerformance(mergedConfig, warnings);\n } else if (envConfig.env === 'staging') {\n validateStagingEncryption(mergedConfig, errors, warnings);\n } else if (envConfig.env === 'development') {\n validateDevelopmentEncryption(mergedConfig, warnings);\n }\n\n // Log warnings (intentional console usage for config validation)\n if (warnings.length > 0) {\n globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n }\n\n // Throw if there are errors\n if (errors.length > 0) {\n throw new ApiPackageError(\n 'service.validation.failed',\n PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n {\n context: {\n operation: OPERATIONS.VALIDATION,\n // Ensure error details conform to ErrorDetail shape (include errorCode)\n errors: errors.map(err => ({\n field: 'config',\n message: err,\n errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n })),\n i18n: {\n errors: errors.join('; '),\n warnings: warnings.join('; '),\n },\n },\n }\n );\n }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n * baseURL: process.env.API_URL!,\n * encryption: {\n * key: {\n * id: 'prod-key-v1',\n * key: process.env.ENCRYPTION_KEY!,\n * algorithm: 'AES-GCM'\n * }\n * },\n * clientEvents: {\n * onRequestStart: (event) => apiStore.trackRequest(event),\n * },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple API client instances with different configurations across API routes.\n */\ninterface ApiClientServiceState {\n instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null;\n isInitializing: boolean;\n initPromise: Promise<void> | null;\n}\n\nconst API_CLIENT_SERVICE_KEY = Symbol.for('plyaz.ApiClientService');\n\nfunction getApiClientServiceState(): ApiClientServiceState {\n const globalAny = globalThis as unknown as { [key: symbol]: ApiClientServiceState };\n if (!globalAny[API_CLIENT_SERVICE_KEY]) {\n globalAny[API_CLIENT_SERVICE_KEY] = {\n instance: null,\n isInitializing: false,\n initPromise: null,\n };\n }\n return globalAny[API_CLIENT_SERVICE_KEY];\n}\n\nexport class ApiClientService {\n // State accessors using globalThis\n private static get instance(): ApiClientWithEvents<ClientEventManager, EndpointsList> | null {\n return getApiClientServiceState().instance;\n }\n private static set instance(\n value: ApiClientWithEvents<ClientEventManager, EndpointsList> | null\n ) {\n getApiClientServiceState().instance = value;\n }\n private static get isInitializing(): boolean {\n return getApiClientServiceState().isInitializing;\n }\n private static set isInitializing(value: boolean) {\n getApiClientServiceState().isInitializing = value;\n }\n private static get initPromise(): Promise<void> | null {\n return getApiClientServiceState().initPromise;\n }\n private static set initPromise(value: Promise<void> | null) {\n getApiClientServiceState().initPromise = value;\n }\n\n /**\n * Build the core error handler for API clients.\n * This handler emits errors to CoreEventManager for global error handling.\n *\n * Handles:\n * - Single errors (network, timeout)\n * - Array of errors from API responses (validation, business logic)\n * - Serialization to unified SerializedError format\n * - Event emission to CORE_EVENTS.SYSTEM.ERROR and CORE_EVENTS.API.REQUEST_ERROR\n *\n * @returns Error handler function compatible with ApiClientOptions.onError\n */\n\n static buildCoreErrorHandler(): (\n error: ResponseError<unknown, unknown, unknown, unknown>\n ) => Promise<void> {\n // eslint-disable-next-line complexity\n return async (error: ResponseError<unknown, unknown, unknown, unknown>): Promise<void> => {\n const requestId = generateRequestId();\n const method = error.config?.method ?? 'UNKNOWN';\n const url = error.config?.url ?? 'unknown';\n\n // CRITICAL: Emit error event to Core\n // Core will handle updating the appropriate store based on runtime context:\n // - Backend: In-memory store (ServerErrorMiddleware)\n // - Frontend: Zustand store (useRootStore)\n try {\n // API returns ErrorResponse (array of error details)\n const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n // If no error details from API, create a fallback error\n if (errorDetails.length === 0) {\n const serializedError = {\n id: requestId,\n code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n },\n };\n\n // Emit single error to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n } else {\n // Convert ErrorResponse (API error details array) to SerializedError[]\n const serializedErrors = errorDetails.map(\n (detail: Record<string, unknown>, index: number) => ({\n id: `${requestId}-${index}`,\n code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: (detail.message as string) ?? error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n field: detail.field as string | undefined,\n valueGiven: detail.valueGiven,\n allowedValues: detail.allowedValues,\n constraints: detail.constraints,\n },\n })\n );\n\n // Emit array of errors to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n }\n } catch (e) {\n // If event emission fails, log but don't break the error flow\n console.error('[ApiClientService] Failed to emit error event:', e);\n }\n\n // Also emit API-specific error event for logging, monitoring, etc.\n ApiClientService.emitApiError(error, {\n method,\n url,\n requestId,\n status: error.status,\n duration: 0,\n });\n };\n }\n\n /**\n * Initialize the API client with environment config and API options\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n * @returns Promise that resolves to the initialized client\n */\n static async init(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n // If already initialized, return existing instance\n if (this.instance) {\n globalThis.console.warn(\n '[ApiClientService] Client already initialized. Returning existing instance.'\n );\n return this.instance;\n }\n\n // If currently initializing, wait for that to complete\n if (this.isInitializing && this.initPromise) {\n await this.initPromise;\n return this.instance!;\n }\n\n // Start initialization\n this.isInitializing = true;\n this.initPromise = this.createClient(envConfig, apiConfig);\n\n try {\n await this.initPromise;\n return this.instance!;\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n * Merges environment-specific defaults with API configuration\n *\n * Merge Priority (lowest to highest):\n * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n * 2. Environment metadata (envConfig - apiKey)\n * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n */\n // eslint-disable-next-line complexity\n private static async createClient(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<void> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n ) as ApiClientOptions;\n\n // Step 5: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 6: Create the client instance with merged configuration\n this.instance = await createApiClient(mergedOptions);\n\n // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n applyDefaultClientSetting(this.instance, envConfig);\n } catch (error) {\n throw new ApiPackageError(\n 'service.initialization.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Get the initialized client instance\n *\n * @throws {ApiPackageError} If client not initialized\n */\n static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n if (!this.instance) {\n throw new ApiPackageError(\n 'service.not_initialized',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n context: {\n operation: OPERATIONS.INITIALIZATION,\n i18n: {\n hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n },\n },\n }\n );\n }\n return this.instance;\n }\n\n /**\n * Check if client is initialized\n */\n static isInitialized(): boolean {\n return this.instance !== null;\n }\n\n /**\n * Reinitialize with new config and options\n */\n static async reinitialize(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n this.dispose();\n return this.init(envConfig, apiConfig);\n }\n\n /**\n * Dispose of the client instance\n */\n static dispose(): void {\n if (this.instance && 'dispose' in this.instance) {\n this.instance.dispose?.();\n }\n this.instance = null;\n this.isInitializing = false;\n this.initPromise = null;\n }\n\n /**\n * Emits an API error event via CoreEventManager.\n * Called when API operations fail to integrate with global error handling.\n *\n * **CRITICAL**: This event emission triggers automatic error state updates.\n * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n * 1. Capture all API errors automatically\n * 2. Update global error state for UI display\n * 3. Ensure individual domain stores remain error-free (only domain data)\n *\n * This is the unified error hook that:\n * - On frontend: Emits event that global error store subscribes to\n * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n *\n * @param error - The error that occurred\n * @param options - Additional context for the error\n * @param options.method - HTTP method (GET, POST, etc.)\n * @param options.url - Request URL\n * @param options.requestId - Unique request identifier\n * @param options.status - HTTP status code (if available)\n * @param options.duration - Request duration in ms\n * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n *\n * @example\n * ```typescript\n * // Global error store setup (in @plyaz/store)\n * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n * errorStore.setError({\n * message: payload.error.message,\n * status: payload.status,\n * url: payload.url,\n * requestId: payload.requestId,\n * });\n * });\n *\n * // Frontend usage - emit to store\n * ApiClientService.emitApiError(error, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * duration: 500,\n * });\n *\n * // Backend usage - emit and rethrow\n * ApiClientService.emitApiError(error, {\n * method: 'POST',\n * url: '/api/orders',\n * requestId: '456',\n * duration: 1200,\n * rethrow: true,\n * });\n * ```\n */\n static emitApiError(\n error: unknown,\n options: {\n method: string;\n url: string;\n requestId: string;\n status?: number;\n duration: number;\n rethrow?: boolean;\n }\n ): void {\n const payload: CoreApiRequestErrorPayload = {\n method: options.method,\n url: options.url,\n requestId: options.requestId,\n status: options.status,\n error,\n duration: options.duration,\n };\n\n CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n // Optionally rethrow for backend error propagation\n if (options.rethrow && error instanceof Error) {\n throw error;\n }\n }\n\n /**\n * Create a dedicated API client instance (NOT the singleton)\n *\n * Use this when you need an isolated client with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n * @returns Promise that resolves to a new dedicated client instance\n *\n * @example\n * ```typescript\n * // Create a dedicated client for feature flags service\n * const flagsClient = await ApiClientService.createInstance(\n * { env: 'production' },\n * {\n * baseURL: 'https://flags.example.com',\n * timeout: 5000,\n * }\n * );\n *\n * // This client is independent from ApiClientService.getClient()\n * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n * ```\n */\n // eslint-disable-next-line complexity\n static async createInstance(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Step 4: Merge user onError with core error handler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n // Step 5: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const mergedOptions = mergeConfigs(envDefaults, envMetadataMapped, {\n ...(apiConfig ?? {}),\n onError: combinedOnError,\n }) as ApiClientOptions;\n\n // Step 6: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 7: Create a NEW client instance (not stored as singleton)\n const dedicatedClient = await createApiClient(mergedOptions);\n\n // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n // that should not become the default client for @plyaz/api services\n\n return dedicatedClient;\n } catch (error) {\n throw new ApiPackageError(\n 'service.instance_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Create a standalone API client with Core error handling.\n *\n * This is a simpler alternative to `createInstance()` that doesn't require\n * environment config. Use this when you just need the error handling without\n * environment-specific defaults (production validation, etc.).\n *\n * **Use cases:**\n * - Domain services that need their own API client\n * - Testing with isolated API clients\n * - Simple client creation without environment setup\n *\n * @param apiConfig - API configuration (baseURL, timeout, etc.)\n * @returns Promise that resolves to a client with Core error handling\n *\n * @example\n * ```typescript\n * // In BaseDomainService or any service\n * const client = await ApiClientService.createStandaloneClient({\n * baseURL: '/api/examples',\n * timeout: 10000,\n * });\n *\n * // Errors are automatically emitted to CoreEventManager\n * const response = await client.get('/items');\n * ```\n */\n static async createStandaloneClient(\n apiConfig: ApiClientOptions\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Merge user onError with core error handler\n const userOnError = apiConfig.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n // Create client with combined error handler\n const client = await createApiClient({\n ...apiConfig,\n onError: combinedOnError,\n });\n\n return client;\n } catch (error) {\n throw new ApiPackageError(\n 'service.standalone_client_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createInstance(envConfig, apiConfig);\n\nexport const createStandaloneApiClient = (\n apiConfig: ApiClientOptions\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createStandaloneClient(apiConfig);\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n ObservabilityProvider,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n abstract readonly provider: ObservabilityProvider;\n abstract readonly name: string;\n\n protected _isInitialized = false;\n protected _config: ObservabilityAdapterConfig | null = null;\n protected readonly logger: PackageLogger;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityAdapter',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get config(): ObservabilityAdapterConfig | null {\n return this._config;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn(`${this.name} already initialized`);\n return;\n }\n\n this._config = config;\n\n if (config.enabled === false) {\n this.logger.info(`${this.name} disabled by configuration`);\n return;\n }\n\n await this.doInitialize(config);\n this._isInitialized = true;\n this.logger.info(`${this.name} initialized`, {\n provider: this.provider,\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n\n async shutdown(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n\n await this.flush();\n await this.doShutdown();\n this._isInitialized = false;\n this.logger.info(`${this.name} shut down`);\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this._isInitialized) {\n return false;\n }\n return this.doHealthCheck();\n }\n\n // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n protected abstract doShutdown(): Promise<void>;\n protected abstract doHealthCheck(): Promise<boolean>;\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const metricWithDefaults = this.applyDefaultTags(metric);\n await this.doRecordMetric(metricWithDefaults);\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.recordMetric({\n type: 'counter',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'gauge',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'histogram',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n if (!this._isInitialized || this._config?.enabled === false) {\n return this.createNoopSpan(options);\n }\n\n // Apply sampling\n if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n if (Math.random() > this._config.samplingRate) {\n return this.createNoopSpan(options);\n }\n }\n\n return this.doStartSpan(options);\n }\n\n getActiveSpan(): Span | null {\n if (!this._isInitialized) {\n return null;\n }\n return this.doGetActiveSpan();\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const span = this.startSpan(options);\n try {\n const result = await fn(span);\n span.setStatus('ok');\n return result;\n } catch (error) {\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n protected abstract doStartSpan(options: SpanOptions): Span;\n protected abstract doGetActiveSpan(): Span | null;\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const entryWithDefaults = {\n ...entry,\n timestamp: entry.timestamp ?? Date.now(),\n service: entry.service ?? this._config?.serviceName,\n };\n\n await this.doLog(entryWithDefaults);\n }\n\n protected abstract doLog(entry: LogEntry): Promise<void>;\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const eventWithDefaults = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n tags: { ...this._config?.defaultTags, ...event.tags },\n };\n\n await this.doSendEvent(eventWithDefaults);\n }\n\n protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n // ─── Flush ─────────────────────────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n await this.doFlush();\n }\n\n protected abstract doFlush(): Promise<void>;\n\n // ─── Helpers ───────────────────────────────────────────────────────────────\n\n /**\n * Apply default tags to a metric\n */\n protected applyDefaultTags(metric: Metric): Metric {\n if (!this._config?.defaultTags) {\n return metric;\n }\n\n return {\n ...metric,\n tags: {\n ...this._config.defaultTags,\n ...metric.tags,\n },\n };\n }\n\n /**\n * Create a no-op span (for disabled/sampled-out traces)\n */\n // eslint-disable-next-line no-unused-vars\n protected createNoopSpan(_options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n\n return {\n context,\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n readonly provider = 'noop' as const;\n readonly name = 'NoopAdapter';\n\n protected async doInitialize(): Promise<void> {}\n protected async doShutdown(): Promise<void> {}\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n protected async doRecordMetric(): Promise<void> {}\n protected doStartSpan(options: SpanOptions): Span {\n return this.createNoopSpan(options);\n }\n protected doGetActiveSpan(): Span | null {\n return null;\n }\n protected async doLog(): Promise<void> {}\n protected async doSendEvent(): Promise<void> {}\n protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n SpanAttributes,\n SpanEvent,\n SpanStatus,\n ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n readonly provider = 'console' as const;\n readonly name = 'LoggerAdapter';\n\n private observabilityLogger!: PackageLogger;\n private logMetrics = true;\n private logSpans = true;\n private logEvents = true;\n\n protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n const consoleConfig = config as ConsoleAdapterConfig;\n\n // Create dedicated logger for observability output\n this.observabilityLogger = new PackageLogger({\n packageName: 'observability',\n service: config.serviceName ?? 'LoggerAdapter',\n environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n minLevel: consoleConfig.logLevel ?? 'debug',\n });\n\n // All logging enabled by default\n this.logMetrics = true;\n this.logSpans = true;\n this.logEvents = true;\n }\n\n protected async doShutdown(): Promise<void> {\n // Logger doesn't need explicit shutdown\n }\n\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n\n protected async doRecordMetric(metric: Metric): Promise<void> {\n if (!this.logMetrics) return;\n\n this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n metricType: metric.type,\n metricName: metric.name,\n value: 'value' in metric ? metric.value : undefined,\n unit: metric.unit,\n tags: metric.tags,\n });\n }\n\n protected doStartSpan(options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: options.parentContext?.spanId,\n };\n\n const startTime = options.startTime ?? Date.now();\n\n if (this.logSpans) {\n this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n parentSpanId: context.parentSpanId,\n kind: options.kind,\n attributes: options.attributes,\n });\n }\n\n const events: SpanEvent[] = [];\n let attributes: SpanAttributes = { ...options.attributes };\n let status: SpanStatus = 'unset';\n let statusMessage: string | undefined;\n\n const logSpans = this.logSpans;\n const logger = this.observabilityLogger;\n\n return {\n context,\n setAttribute: (key, value) => {\n attributes[key] = value;\n },\n setAttributes: attrs => {\n attributes = { ...attributes, ...attrs };\n },\n addEvent: event => {\n events.push(event);\n if (logSpans) {\n logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n eventAttributes: event.attributes,\n });\n }\n },\n setStatus: (s, message) => {\n status = s;\n statusMessage = message;\n },\n end: endTime => {\n const duration = (endTime ?? Date.now()) - startTime;\n if (logSpans) {\n const logMethod = status === 'error' ? 'warn' : 'debug';\n logger[logMethod](`[SPAN END] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n durationMs: duration,\n status,\n statusMessage,\n attributes,\n eventCount: events.length,\n });\n }\n },\n recordException: error => {\n if (logSpans) {\n logger.error(`[SPAN ERROR] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n error: error.message,\n stack: error.stack,\n });\n }\n },\n };\n }\n\n protected doGetActiveSpan(): Span | null {\n return null; // Logger adapter doesn't track active spans\n }\n\n protected async doLog(entry: LogEntry): Promise<void> {\n const meta = {\n service: entry.service,\n traceId: entry.traceId,\n spanId: entry.spanId,\n ...entry.context,\n };\n\n // Map observability log levels to logger methods\n switch (entry.level) {\n case 'debug':\n this.observabilityLogger.debug(entry.message, meta);\n break;\n case 'info':\n this.observabilityLogger.info(entry.message, meta);\n break;\n case 'warn':\n this.observabilityLogger.warn(entry.message, meta);\n break;\n case 'error':\n this.observabilityLogger.error(entry.message, meta);\n break;\n case 'fatal':\n this.observabilityLogger.fatal(entry.message, meta);\n break;\n }\n }\n\n protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this.logEvents) return;\n\n this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n eventName: event.name,\n properties: event.properties,\n tags: event.tags,\n });\n }\n\n protected async doFlush(): Promise<void> {\n // Logger handles its own buffering/flushing\n }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n OperationContext,\n MonitoringOperationResult,\n AdapterWithPriority,\n AdapterEntry,\n ObservabilityServiceConfig,\n ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n * mode: 'parallel',\n * adapters: [datadogAdapter], // Logger added automatically\n * serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n readonly provider = 'custom' as const;\n readonly name = 'ObservabilityService';\n\n private _isInitialized = false;\n private _config: ObservabilityServiceConfig | null = null;\n private readonly logger: PackageLogger;\n private readonly adapterEntries: AdapterEntry[] = [];\n private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n private readonly noopAdapter = new NoopAdapter();\n private loggerAdapter: LoggerAdapter | null = null;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityService',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Check if service has at least one working adapter\n */\n get isReady(): boolean {\n return this.adapterEntries.some(e => e.adapter.isInitialized);\n }\n\n /**\n * Get all adapters (for compatibility)\n */\n private get adapters(): ObservabilityAdapter[] {\n return this.adapterEntries.map(e => e.adapter);\n }\n\n /**\n * Get initialized adapter entries\n */\n private get initializedEntries(): AdapterEntry[] {\n return this.adapterEntries.filter(e => e.adapter.isInitialized);\n }\n\n /**\n * Get primary (non-failover) initialized adapters\n */\n private get primaryEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => !e.failover);\n }\n\n /**\n * Get failover initialized adapters\n */\n private get failoverEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => e.failover);\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /**\n * Check if input is an adapter with priority config\n */\n private isAdapterWithPriority(\n input: ObservabilityAdapter | AdapterWithPriority\n ): input is AdapterWithPriority {\n return (\n 'adapter' in input &&\n typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n );\n }\n\n /**\n * Normalize adapter input to adapter with priority and failover config\n */\n private normalizeAdapter(\n input: ObservabilityAdapter | AdapterWithPriority,\n defaultPriority: number\n ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n if (this.isAdapterWithPriority(input)) {\n return {\n adapter: input.adapter,\n priority: input.priority ?? defaultPriority,\n failover: input.failover ?? false,\n };\n }\n return { adapter: input, priority: defaultPriority, failover: false };\n }\n\n /**\n * Initialize the observability service.\n * Logger adapter is always added by default unless explicitly disabled.\n * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n */\n async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn('ObservabilityService already initialized');\n return;\n }\n\n this._config = config;\n this.mode = config.mode ?? 'parallel';\n\n // Collect adapters with priorities\n const entries: AdapterEntry[] = [];\n\n // Add provided adapters\n if (config.adapter) {\n entries.push(this.normalizeAdapter(config.adapter, 0));\n }\n if (config.adapters) {\n config.adapters.forEach((a, index) => {\n // Default priority decreases with array position for stable sorting\n entries.push(this.normalizeAdapter(a, -index));\n });\n }\n\n // Always add logger adapter by default (for console output)\n // Unless there's already a console/logger adapter\n const hasLoggerAdapter = entries.some(\n e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n );\n if (!hasLoggerAdapter) {\n this.loggerAdapter = new LoggerAdapter();\n await this.loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: config.environment,\n defaultTags: config.defaultTags,\n });\n // Logger is a failover by default with lowest priority\n entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n }\n\n // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n entries.sort((a, b) => {\n // Primary adapters come before failover\n if (a.failover !== b.failover) {\n return a.failover ? 1 : -1;\n }\n // Within same category, sort by priority (higher first)\n return b.priority - a.priority;\n });\n\n // Store sorted entries\n this.adapterEntries.push(...entries);\n\n this._isInitialized = true;\n\n this.logger.debug('ObservabilityService initialized', {\n mode: this.mode,\n adapterCount: this.adapterEntries.length,\n primaryCount: this.primaryEntries.length,\n failoverCount: this.failoverEntries.length,\n adapters: this.adapterEntries.map(e => ({\n name: e.adapter.name,\n provider: e.adapter.provider,\n priority: e.priority,\n failover: e.failover,\n initialized: e.adapter.isInitialized,\n })),\n });\n }\n\n async shutdown(): Promise<void> {\n await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n this._isInitialized = false;\n this.logger.info('ObservabilityService shut down');\n }\n\n async isHealthy(): Promise<boolean> {\n if (this.adapters.length === 0) {\n return false;\n }\n\n const results = await Promise.all(\n this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n );\n\n // For parallel mode, all must be healthy; for priority/single, at least one\n return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n }\n\n async flush(): Promise<void> {\n await this.executeOnAdapters('flush', adapter => adapter.flush());\n }\n\n // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n private get config(): ObservabilityServiceConfig {\n return this._config ?? {};\n }\n\n private async executeOnAdapters<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>\n ): Promise<void> {\n const entries = this.initializedEntries;\n if (entries.length === 0) {\n return;\n }\n\n const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n switch (this.mode) {\n case 'parallel':\n await this.executeParallelWithFailover(operation, fn, timeout);\n break;\n case 'priority':\n await this.executePriorityWithFailover(operation, fn, timeout);\n break;\n case 'single':\n default:\n await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n break;\n }\n }\n\n private async executeSingle<T>(\n operation: string,\n adapter: ObservabilityAdapter,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n try {\n await this.withTimeout(fn(adapter), timeout);\n } catch (error) {\n this.logger.error(`${operation} failed on ${adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Execute on primary adapters in parallel.\n * If all primary adapters fail, execute on failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executeParallelWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Execute on primary adapters\n if (primary.length > 0) {\n const results = await Promise.allSettled(\n primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n )\n .filter(Boolean);\n\n const allFailed = errors.length === primary.length;\n\n if (errors.length > 0 && !allFailed) {\n this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n }\n\n // If all primary adapters failed, use failover\n if (allFailed && failover.length > 0) {\n this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n return;\n }\n\n if (this.config.failOnAnyError && errors.length > 0) {\n throw new CorePackageError(\n `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n } else if (failover.length > 0) {\n // No primary adapters, use failover directly\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n }\n }\n\n private async executeParallel<T>(\n operation: string,\n adapters: ObservabilityAdapter[],\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const results = await Promise.allSettled(\n adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n )\n .filter(Boolean);\n\n if (errors.length > 0) {\n this.logger.warn(`${operation} failed on some adapters`, { errors });\n }\n }\n\n /**\n * Execute on primary adapters in priority order.\n * If all primary adapters fail, try failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executePriorityWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Try primary adapters first\n for (const entry of primary) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success - stop trying\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Error';\n const shouldFallback =\n !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n if (shouldFallback) {\n this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n throw error;\n }\n }\n\n // All primary failed, try failover adapters\n for (const entry of failover) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success\n } catch (error) {\n this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n // Continue to next failover adapter\n }\n }\n\n this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n }\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.executeOnAdapters('incrementCounter', adapter =>\n adapter.incrementCounter(name, value, tags)\n );\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('recordHistogram', adapter =>\n adapter.recordHistogram(name, value, tags)\n );\n }\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n // For tracing, use first initialized adapter\n const entry = this.initializedEntries[0];\n return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const entry = this.initializedEntries[0];\n if (!entry) {\n return fn(this.noopAdapter.startSpan(options));\n }\n return entry.adapter.withSpan(options, fn);\n }\n\n getActiveSpan(): Span | null {\n const entry = this.initializedEntries[0];\n return entry?.adapter.getActiveSpan() ?? null;\n }\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n await this.executeOnAdapters('log', adapter => adapter.log(entry));\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n }\n\n // ─── Service Operation Tracking ────────────────────────────────────────────\n\n /**\n * Track a service operation with automatic metrics and tracing.\n *\n * @example\n * ```typescript\n * const { result, metrics } = await observability.trackOperation(\n * {\n * serviceName: 'UserService',\n * operation: 'create',\n * entityType: 'user',\n * startTime: Date.now(),\n * },\n * async () => {\n * return await this.repository.create(userData);\n * }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async trackOperation<T>(\n context: OperationContext,\n operation: () => Promise<T>\n ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n const startTime = context.startTime ?? Date.now();\n\n // Start span\n const span = this.startSpan({\n name: `${context.serviceName}.${context.operation}`,\n attributes: {\n 'service.name': context.serviceName,\n 'operation.name': context.operation,\n ...(context.entityType && { 'entity.type': context.entityType }),\n ...(context.entityId && { 'entity.id': context.entityId }),\n ...context.attributes,\n },\n parentContext: context.parentContext,\n });\n\n // Increment operation counter\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n service: context.serviceName,\n operation: context.operation,\n ...(context.entityType && { entity_type: context.entityType }),\n });\n\n try {\n const result = await operation();\n const duration = Date.now() - startTime;\n\n span.setStatus('ok');\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'success',\n });\n\n return {\n result,\n metrics: { success: true, duration, data: result },\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n service: context.serviceName,\n operation: context.operation,\n error_type: error instanceof Error ? error.name : 'UnknownError',\n });\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter],\n * serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n * mode: 'priority',\n * adapters: [datadogAdapter, grafanaAdapter],\n * serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n const service = new ObservabilityService();\n await service.initialize(config);\n return service;\n}\n","/**\n * Core Dependencies Configuration\n *\n * Similar to @plyaz/api's setGlobalConfig pattern.\n * Backend services are registered here by entry points, not imported directly.\n *\n * IMPORTANT: This file must NOT import from backend service files (DbService, CacheService, etc.)\n * as that would cause the bundler to include backend dependencies in the frontend bundle.\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { setCoreDependencies } from './config/dependencies';\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * StorageService,\n * NotificationService,\n * });\n *\n * // entry-frontend.ts\n * // Don't call setCoreDependencies - no backend deps loaded\n * ```\n */\n\nimport type {\n CoreDbServiceStatic,\n CoreCacheServiceStatic,\n CoreStorageServiceStatic,\n CoreNotificationServiceStatic,\n CoreServerErrorMiddlewareStatic,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dependencies Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CoreDependencies {\n DbService?: CoreDbServiceStatic;\n CacheService?: CoreCacheServiceStatic;\n StorageService?: CoreStorageServiceStatic;\n NotificationService?: CoreNotificationServiceStatic;\n ServerErrorMiddleware?: CoreServerErrorMiddlewareStatic;\n}\n\n// Global dependencies container\nlet _dependencies: CoreDependencies = {};\n\n/**\n * Set core dependencies (called by entry points)\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * });\n * ```\n */\nexport function setCoreDependencies(deps: CoreDependencies): void {\n _dependencies = { ..._dependencies, ...deps };\n}\n\n/**\n * Get core dependencies\n */\nexport function getCoreDependencies(): CoreDependencies {\n return _dependencies;\n}\n\n/**\n * Check if a dependency is available\n */\nexport function hasCoreDependency(key: keyof CoreDependencies): boolean {\n return _dependencies[key] !== undefined;\n}\n\n/**\n * Get a specific dependency\n */\nexport function getCoreDependency<K extends keyof CoreDependencies>(\n key: K\n): CoreDependencies[K] | undefined {\n return _dependencies[key];\n}\n\n/**\n * Clear all dependencies (useful for testing)\n */\nexport function clearCoreDependencies(): void {\n _dependencies = {};\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n * ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES, UNIVERSAL_RUNTIMES } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreDomainServiceInstance,\n CoreServiceCreateOptions,\n CoreServiceEntry,\n CoreServiceInitConfig,\n CoreServiceRegistryConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreRuntimeEnvironment,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheManagerInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { createObservabilityService } from '../base/observability';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { getCoreDependency } from '../config/dependencies';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n entry: CoreServiceEntry;\n initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n entry: CoreServiceEntry;\n isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Global Singleton Pattern for Static Class State\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like services being registered in\n * one module context but not accessible from another (e.g., API routes).\n */\n\ninterface ServiceRegistryState {\n services: Map<string, CoreDomainServiceInstance>;\n pending: Map<string, PendingService>;\n metadata: Map<string, ServiceMetadata>;\n environment: 'production' | 'staging' | 'development' | 'test';\n runtime: CoreRuntimeEnvironment;\n apiClientOptions: ApiClientOptions | null;\n dbConfig: Partial<CoreDbServiceConfig> | null;\n cacheConfig: CoreCacheConfig | null;\n observabilityConfig: CoreObservabilityConfig | null;\n observabilityInstance: ObservabilityAdapter | null;\n storageConfig: CoreStorageConfig | null;\n notificationsConfig: CoreNotificationConfig | null;\n storeRegistry: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null;\n initPromises: Map<string, Promise<CoreDomainServiceInstance>>;\n}\n\nconst SERVICE_REGISTRY_KEY = Symbol.for('plyaz.ServiceRegistry');\n\nfunction getServiceRegistryState(): ServiceRegistryState {\n const globalAny = globalThis as unknown as { [key: symbol]: ServiceRegistryState };\n if (!globalAny[SERVICE_REGISTRY_KEY]) {\n globalAny[SERVICE_REGISTRY_KEY] = {\n services: new Map(),\n pending: new Map(),\n metadata: new Map(),\n environment: 'development',\n runtime: 'node',\n apiClientOptions: null,\n dbConfig: null,\n cacheConfig: null,\n observabilityConfig: null,\n observabilityInstance: null,\n storageConfig: null,\n notificationsConfig: null,\n storeRegistry: null,\n initPromises: new Map(),\n };\n }\n return globalAny[SERVICE_REGISTRY_KEY];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n private static readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'ServiceRegistry',\n });\n\n // State accessors using globalThis\n private static get _services(): Map<string, CoreDomainServiceInstance> {\n return getServiceRegistryState().services;\n }\n private static get _pending(): Map<string, PendingService> {\n return getServiceRegistryState().pending;\n }\n private static get _metadata(): Map<string, ServiceMetadata> {\n return getServiceRegistryState().metadata;\n }\n private static get _environment(): 'production' | 'staging' | 'development' | 'test' {\n return getServiceRegistryState().environment;\n }\n private static set _environment(value: 'production' | 'staging' | 'development' | 'test') {\n getServiceRegistryState().environment = value;\n }\n private static get _runtime(): CoreRuntimeEnvironment {\n return getServiceRegistryState().runtime;\n }\n private static set _runtime(value: CoreRuntimeEnvironment) {\n getServiceRegistryState().runtime = value;\n }\n private static get _apiClientOptions(): ApiClientOptions | null {\n return getServiceRegistryState().apiClientOptions;\n }\n private static set _apiClientOptions(value: ApiClientOptions | null) {\n getServiceRegistryState().apiClientOptions = value;\n }\n private static get _dbConfig(): Partial<CoreDbServiceConfig> | null {\n return getServiceRegistryState().dbConfig;\n }\n private static set _dbConfig(value: Partial<CoreDbServiceConfig> | null) {\n getServiceRegistryState().dbConfig = value;\n }\n private static get _cacheConfig(): CoreCacheConfig | null {\n return getServiceRegistryState().cacheConfig;\n }\n private static set _cacheConfig(value: CoreCacheConfig | null) {\n getServiceRegistryState().cacheConfig = value;\n }\n private static get _observabilityConfig(): CoreObservabilityConfig | null {\n return getServiceRegistryState().observabilityConfig;\n }\n private static set _observabilityConfig(value: CoreObservabilityConfig | null) {\n getServiceRegistryState().observabilityConfig = value;\n }\n private static get _observabilityInstance(): ObservabilityAdapter | null {\n return getServiceRegistryState().observabilityInstance;\n }\n private static set _observabilityInstance(value: ObservabilityAdapter | null) {\n getServiceRegistryState().observabilityInstance = value;\n }\n private static get _storageConfig(): CoreStorageConfig | null {\n return getServiceRegistryState().storageConfig;\n }\n private static set _storageConfig(value: CoreStorageConfig | null) {\n getServiceRegistryState().storageConfig = value;\n }\n private static get _notificationsConfig(): CoreNotificationConfig | null {\n return getServiceRegistryState().notificationsConfig;\n }\n private static set _notificationsConfig(value: CoreNotificationConfig | null) {\n getServiceRegistryState().notificationsConfig = value;\n }\n private static get _storeRegistry(): {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null {\n return getServiceRegistryState().storeRegistry;\n }\n private static set _storeRegistry(\n value: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null\n ) {\n getServiceRegistryState().storeRegistry = value;\n }\n private static get _initPromises(): Map<string, Promise<CoreDomainServiceInstance>> {\n return getServiceRegistryState().initPromises;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the service registry with the provided configuration.\n *\n * @param config - Registry configuration with services to initialize\n *\n * @example\n * ```typescript\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n * ],\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n ServiceRegistry._environment = config.environment ?? 'development';\n ServiceRegistry._runtime = config.runtime ?? 'node';\n ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n ServiceRegistry._dbConfig = config.db ?? null;\n ServiceRegistry._cacheConfig = config.cache ?? null;\n ServiceRegistry._observabilityConfig = config.observability ?? null;\n ServiceRegistry._storageConfig = config.storage ?? null;\n ServiceRegistry._notificationsConfig = config.notifications ?? null;\n ServiceRegistry._storeRegistry = config.stores ?? null;\n\n const immediatePromises: Promise<void>[] = [];\n\n for (const entry of config.services) {\n const serviceKey = entry.service.serviceKey;\n const initWhen = entry.config.initWhen ?? 'immediate';\n const enabled = entry.config.enabled !== false;\n const isSingleton = entry.config.singleton !== false; // Default: true\n\n // Store metadata for all services (even disabled)\n ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n // Skip disabled services\n if (!enabled) {\n ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n continue;\n }\n\n // Handle initialization timing\n if (initWhen === 'immediate' && isSingleton) {\n // Only auto-initialize singletons\n immediatePromises.push(\n ServiceRegistry.initializeService(entry).then(() => {\n ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n })\n );\n } else if (isSingleton) {\n // Store for lazy/conditional initialization\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n } else {\n // Non-singleton: just store metadata, create on demand via create()\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered (non-singleton, use create())`\n );\n }\n }\n\n // Wait for all immediate initializations\n await Promise.all(immediatePromises);\n\n const initializedKeys = [...ServiceRegistry._services.keys()];\n const pendingKeys = [...ServiceRegistry._pending.keys()];\n const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n\n ServiceRegistry.logger.info('Service registry initialized', {\n initialized: initializedKeys,\n pending: pendingKeys,\n nonSingleton: nonSingletonKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a singleton service instance by key (synchronous).\n * Throws if the service is not initialized or is non-singleton.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws CorePackageError if service not found, not initialized, or non-singleton\n *\n * @example\n * ```typescript\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n return service as T;\n }\n\n // Check if non-singleton (must use create())\n const metadata = ServiceRegistry._metadata.get(key);\n if (metadata && !metadata.isSingleton) {\n throw new CorePackageError(\n `Service '${key}' is configured as non-singleton. ` +\n `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n throw new CorePackageError(\n `Service '${key}' is configured for lazy initialization. ` +\n `Use await ServiceRegistry.getAsync('${key}') instead.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Create a new instance of a service.\n * Use this for non-singleton services or when you need a fresh instance.\n *\n * Note: The caller is responsible for disposing the returned instance.\n *\n * @param key - Service key\n * @param configOverrides - Optional config overrides for this instance\n * @returns Promise resolving to a new service instance\n *\n * @example\n * ```typescript\n * // Non-singleton service - always creates new instance\n * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n * instance1 !== instance2; // true\n *\n * // With config overrides\n * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n * apiClient: { baseURL: 'https://custom-api.com' },\n * });\n *\n * // Don't forget to dispose when done!\n * instance1.dispose();\n * instance2.dispose();\n * ```\n */\n static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string,\n configOverrides?: Partial<CoreServiceInitConfig>\n ): Promise<T> {\n const metadata = ServiceRegistry._metadata.get(key);\n if (!metadata) {\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Merge config with overrides\n const mergedEntry: CoreServiceEntry = {\n service: metadata.entry.service,\n config: { ...metadata.entry.config, ...configOverrides },\n };\n\n // Create new instance (don't store in registry)\n return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n }\n\n /**\n * Get a service instance by key with async initialization if needed.\n * Use this for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n *\n * @example\n * ```typescript\n * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n * const entities = await example.getAll();\n * ```\n */\n static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n // Return immediately if already initialized\n const existing = ServiceRegistry._services.get(key);\n if (existing) {\n return existing as T;\n }\n\n // Check for in-progress initialization\n const inProgress = ServiceRegistry._initPromises.get(key);\n if (inProgress) {\n return (await inProgress) as T;\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n // Handle conditional initialization\n if (typeof pending.initWhen === 'function') {\n const shouldInit = await pending.initWhen();\n if (!shouldInit) {\n throw new CorePackageError(\n `Service '${key}' initialization condition returned false`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // Initialize and return\n const service = await ServiceRegistry.initializeService(pending.entry);\n ServiceRegistry._pending.delete(key);\n return service as T;\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Check if a service is registered (either initialized or pending).\n *\n * @param key - Service key\n */\n static has(key: string): boolean {\n return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n }\n\n /**\n * Check if a service is initialized and ready.\n *\n * @param key - Service key\n */\n static isInitialized(key: string): boolean {\n return ServiceRegistry._services.has(key);\n }\n\n /**\n * Get all initialized service keys.\n */\n static getInitializedKeys(): string[] {\n return [...ServiceRegistry._services.keys()];\n }\n\n /**\n * Get all pending (lazy) service keys.\n */\n static getPendingKeys(): string[] {\n return [...ServiceRegistry._pending.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Service Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Build API client options and instance for service */\n // eslint-disable-next-line complexity\n private static async buildApiClientOptions(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n const dedicatedApiClient = config.dedicatedApiClient;\n const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const options: ApiClientOptions | undefined = isDedicated\n ? typeof dedicatedApiClient === 'object'\n ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n : (ServiceRegistry._apiClientOptions ?? undefined)\n : (ServiceRegistry._apiClientOptions ?? undefined);\n\n if (!options) {\n return undefined;\n }\n\n // Get or create API client instance\n let apiInstance: unknown;\n if (isDedicated && options) {\n // Create dedicated API client instance for this service\n try {\n // Use the global environment from initialization\n const envConfig = {\n env: ServiceRegistry._environment,\n setAsDefault: false, // Dedicated instances should not become default\n };\n apiInstance = await ApiClientService.createInstance(envConfig, options);\n ServiceRegistry.logger.debug(\n `Created dedicated API client instance for service '${serviceKey}'`,\n {\n environment: ServiceRegistry._environment,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated API client for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared API client\n try {\n apiInstance = ApiClientService.getClient();\n } catch {\n ServiceRegistry.logger.debug(\n `Global API client not initialized, service '${serviceKey}' will not have API`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n options,\n instance: apiInstance,\n };\n }\n\n /** Build DB config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildDbConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: Partial<CoreDbServiceConfig>;\n instance?: CoreDbServiceInstance;\n }\n | undefined\n > {\n const dedicatedDb = config.dedicatedDb;\n const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: DB should only be injected for backend services (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have database access.`\n );\n return undefined; // Skip DB injection for non-backend runtimes\n }\n\n const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n ? typeof dedicatedDb === 'object'\n ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n : (ServiceRegistry._dbConfig ?? undefined)\n : (ServiceRegistry._dbConfig ?? undefined);\n\n if (!dbConfig) {\n return undefined;\n }\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n ServiceRegistry.logger.debug(\n `DbService not registered, service '${serviceKey}' will not have DB`\n );\n return undefined;\n }\n\n // Get or create DB instance\n let dbInstance: CoreDbServiceInstance | undefined;\n if (isDedicated && dbConfig) {\n // Create dedicated database instance for this service\n try {\n dbInstance = await DbService.createInstance?.(dbConfig as CoreDbServiceConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated database instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated database instance for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared database\n try {\n dbInstance = DbService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global DB not initialized, service '${serviceKey}' will not have DB`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: dbConfig,\n instance: dbInstance,\n };\n }\n\n /** Build cache config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildCacheConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreCacheConfig; instance?: CoreCacheManagerInstance }\n | undefined\n > {\n const dedicatedCache = config.dedicatedCache;\n const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const cacheConfig: CoreCacheConfig | undefined = isDedicated\n ? typeof dedicatedCache === 'object'\n ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n : (ServiceRegistry._cacheConfig ?? undefined)\n : (ServiceRegistry._cacheConfig ?? undefined);\n\n if (!cacheConfig) {\n return undefined;\n }\n\n // Runtime validation: Cache on frontend is not supported (CacheManager uses ioredis which requires Node.js)\n const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if (isFrontendRuntime) {\n ServiceRegistry.logger.debug(\n `Service '${serviceKey}' skipping cache (frontend runtime - use Zustand store + react-query instead)`\n );\n return undefined;\n }\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n ServiceRegistry.logger.debug(\n `CacheService not registered, service '${serviceKey}' will not have cache`\n );\n return undefined;\n }\n\n // Backend-only: Get cache manager instance from CacheService\n let cacheInstance: CoreCacheManagerInstance | undefined;\n try {\n cacheInstance = CacheService.getInstance().getCacheManager();\n if (isDedicated) {\n ServiceRegistry.logger.debug(\n `Using shared cache for service '${serviceKey}' (dedicated cache not implemented via DI)`,\n { strategy: cacheConfig.strategy }\n );\n }\n } catch {\n ServiceRegistry.logger.debug(\n `Global cache not initialized, service '${serviceKey}' will not have cache`\n );\n }\n\n return {\n dedicated: isDedicated,\n config: cacheConfig,\n instance: cacheInstance,\n };\n }\n\n /** Build observability config and instance for service */\n // eslint-disable-next-line complexity\n private static buildObservabilityConfig(\n config: CoreServiceInitConfig,\n // eslint-disable-next-line no-unused-vars\n _entry: CoreServiceEntry\n ):\n | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n | undefined {\n const dedicatedObservability = config.dedicatedObservability;\n const isDedicated =\n dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n ? typeof dedicatedObservability === 'object'\n ? ({\n ...ServiceRegistry._observabilityConfig,\n ...dedicatedObservability,\n } as CoreObservabilityConfig)\n : (ServiceRegistry._observabilityConfig ?? undefined)\n : (ServiceRegistry._observabilityConfig ?? undefined);\n\n if (!observabilityConfig) {\n return undefined;\n }\n\n // Instance will be set async if dedicated\n return {\n dedicated: isDedicated,\n config: observabilityConfig,\n instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n };\n }\n\n /** Build storage config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildStorageConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreStorageConfig; instance?: CoreStorageServiceInstance }\n | undefined\n > {\n const dedicatedStorage = config.dedicatedStorage;\n const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Storage is backend-only (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have storage access.`\n );\n return undefined;\n }\n\n const storageConfig: CoreStorageConfig | undefined = isDedicated\n ? typeof dedicatedStorage === 'object'\n ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n : (ServiceRegistry._storageConfig ?? undefined)\n : (ServiceRegistry._storageConfig ?? undefined);\n\n if (!storageConfig) {\n return undefined;\n }\n\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n ServiceRegistry.logger.debug(\n `StorageService not registered, service '${serviceKey}' will not have storage`\n );\n return undefined;\n }\n\n // Get or create storage instance\n let storageInstance: CoreStorageServiceInstance | undefined;\n if (isDedicated && storageConfig) {\n try {\n storageInstance = await StorageService.createInstance?.(storageConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated storage instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated storage instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n storageInstance = StorageService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global storage not initialized, service '${serviceKey}' will not have storage`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: storageConfig,\n instance: storageInstance,\n };\n }\n\n /** Build notifications config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildNotificationsConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: CoreNotificationConfig;\n instance?: CoreNotificationServiceInstance;\n }\n | undefined\n > {\n const dedicatedNotifications = config.dedicatedNotifications;\n const isDedicated =\n dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Notifications is backend-only (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have notifications access.`\n );\n return undefined;\n }\n\n const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n ? typeof dedicatedNotifications === 'object'\n ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n : (ServiceRegistry._notificationsConfig ?? undefined)\n : (ServiceRegistry._notificationsConfig ?? undefined);\n\n if (!notificationsConfig) {\n return undefined;\n }\n\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n ServiceRegistry.logger.debug(\n `NotificationService not registered, service '${serviceKey}' will not have notifications`\n );\n return undefined;\n }\n\n // Get or create notifications instance\n let notificationsInstance: CoreNotificationServiceInstance | undefined;\n if (isDedicated && notificationsConfig) {\n try {\n notificationsInstance = await NotificationService.createInstance?.(notificationsConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated notifications instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n notificationsInstance = NotificationService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: notificationsConfig,\n instance: notificationsInstance,\n };\n }\n\n /**\n * Create a dedicated ObservabilityService instance for a service.\n * Uses the same adapter pattern as global observability but with service-specific config.\n */\n private static async createDedicatedObservability(\n serviceKey: string,\n config: CoreObservabilityConfig\n ): Promise<ObservabilityAdapter | undefined> {\n // Skip if explicitly disabled\n if (config.enabled === false) {\n return undefined;\n }\n\n try {\n // createObservabilityService auto-adds LoggerAdapter as failover\n const dedicatedService = await createObservabilityService({\n mode: config.mode ?? 'parallel',\n serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n environment: config.environment,\n adapters: config.adapters,\n });\n\n ServiceRegistry.logger.debug(\n `Created dedicated ObservabilityService for service '${serviceKey}'`\n );\n\n return dedicatedService;\n } catch (err) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n { error: err instanceof Error ? err.message : String(err) }\n );\n return ServiceRegistry._observabilityInstance ?? undefined;\n }\n }\n\n /**\n * Set the global observability adapter instance.\n * Called by Core.initialize() after creating the adapter.\n */\n static setObservabilityInstance(instance: ObservabilityAdapter): void {\n ServiceRegistry._observabilityInstance = instance;\n ServiceRegistry.logger.debug('Global observability instance set');\n }\n\n /**\n * Get the global observability adapter instance.\n */\n static getObservabilityInstance(): ObservabilityAdapter | null {\n return ServiceRegistry._observabilityInstance;\n }\n\n /**\n * Initialize a single service from an entry.\n * Uses the service class's static create() method.\n * Merges per-service config with global config.\n */\n private static async initializeService(\n entry: CoreServiceEntry,\n storeSingleton = true\n ): Promise<CoreDomainServiceInstance> {\n const { service: ServiceClass, config } = entry;\n const serviceKey = ServiceClass.serviceKey;\n const isSingleton = config.singleton !== false;\n\n // For singletons, check for concurrent initialization\n if (storeSingleton && isSingleton) {\n const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n if (existingPromise) return existingPromise;\n }\n\n const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.set(serviceKey, initPromise);\n }\n\n return initPromise;\n }\n\n /** Build stores for service injection */\n // eslint-disable-next-line complexity\n private static buildStoresForService(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Partial<RootStoreSlice> | undefined {\n const allKeys = new Set<keyof RootStoreSlice>();\n\n // Add primary store - check config first, then service's static primaryStoreKey\n if (config.store) {\n allKeys.add(config.store);\n } else if (\n 'primaryStoreKey' in entry.service &&\n typeof entry.service.primaryStoreKey === 'string'\n ) {\n // Auto-resolve from service class's static primaryStoreKey property\n allKeys.add(entry.service.primaryStoreKey as keyof RootStoreSlice);\n ServiceRegistry.logger.debug(\n `Auto-resolved store key '${entry.service.primaryStoreKey}' from service class`\n );\n }\n\n // Add read stores\n if (config.readStores) {\n config.readStores.forEach(key => allKeys.add(key));\n }\n\n if (allKeys.size === 0) {\n return undefined;\n }\n\n if (!ServiceRegistry._storeRegistry) {\n ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n return undefined;\n }\n\n const stores: Partial<RootStoreSlice> = {};\n for (const key of allKeys) {\n const store = ServiceRegistry._storeRegistry.getStore(key);\n if (store) {\n (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n } else {\n ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n }\n }\n\n return Object.keys(stores).length > 0 ? stores : undefined;\n }\n\n /** Perform the actual service initialization */\n // eslint-disable-next-line complexity\n private static async doInitializeService(\n entry: CoreServiceEntry,\n options: { isSingleton: boolean; storeSingleton: boolean }\n ): Promise<CoreDomainServiceInstance> {\n const { service: serviceClass, config } = entry;\n const serviceKey = serviceClass.serviceKey;\n const { isSingleton, storeSingleton } = options;\n\n try {\n ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n // Build dependencies (async operations) with runtime validation\n const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n const db = await ServiceRegistry.buildDbConfig(config, entry);\n const cache = await ServiceRegistry.buildCacheConfig(config, entry);\n const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n const stores = ServiceRegistry.buildStoresForService(config, entry);\n\n // Create dedicated observability instance if requested\n let observabilityInstance = observability?.instance;\n if (observability?.dedicated && observability.config) {\n observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n serviceKey,\n observability.config\n );\n }\n\n const createOptions: CoreServiceCreateOptions = {\n apiClient,\n db,\n cache,\n observability: observability\n ? { ...observability, instance: observabilityInstance }\n : undefined,\n storage,\n notifications,\n injected: {\n ...(stores ? { stores } : {}),\n cache: cache?.instance,\n db: db?.instance,\n api: apiClient?.instance,\n observability: observabilityInstance,\n storage: storage?.instance,\n notifications: notifications?.instance,\n },\n isSingleton,\n };\n\n ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n apiClientDedicated: createOptions.apiClient?.dedicated,\n dbDedicated: createOptions.db?.dedicated,\n observabilityDedicated: createOptions.observability?.dedicated,\n storageDedicated: createOptions.storage?.dedicated,\n notificationsDedicated: createOptions.notifications?.dedicated,\n injected: {\n hasCache: !!createOptions.injected?.cache,\n hasDb: !!createOptions.injected?.db,\n hasApi: !!createOptions.injected?.api,\n hasObservability: !!createOptions.injected?.observability,\n hasStorage: !!createOptions.injected?.storage,\n hasNotifications: !!createOptions.injected?.notifications,\n hasStores: !!createOptions.injected?.stores,\n },\n });\n\n const instance = await serviceClass.create(config, createOptions);\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._services.set(serviceKey, instance);\n ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n } else {\n ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n }\n\n return instance;\n } catch (error) {\n ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.delete(serviceKey);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disposal\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose a specific service by key.\n *\n * @param key - Service key to dispose\n */\n static dispose(key: string): void {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n service.dispose();\n ServiceRegistry._services.delete(key);\n ServiceRegistry.logger.info(`Service disposed: ${key}`);\n }\n ServiceRegistry._pending.delete(key);\n }\n\n /**\n * Dispose all services and clear the registry.\n */\n static disposeAll(): void {\n // Dispose all initialized services\n for (const [key, service] of ServiceRegistry._services) {\n try {\n service.dispose();\n ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n } catch (error) {\n ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Clear all state\n ServiceRegistry._services.clear();\n ServiceRegistry._pending.clear();\n ServiceRegistry._metadata.clear();\n ServiceRegistry._initPromises.clear();\n ServiceRegistry._apiClientOptions = null;\n ServiceRegistry._dbConfig = null;\n ServiceRegistry._cacheConfig = null;\n ServiceRegistry._observabilityConfig = null;\n ServiceRegistry._observabilityInstance = null;\n ServiceRegistry._storageConfig = null;\n ServiceRegistry._notificationsConfig = null;\n\n ServiceRegistry.logger.info('Service registry disposed');\n }\n\n /**\n * Check if a service is configured as singleton.\n *\n * @param key - Service key\n * @returns true if singleton (default), false if non-singleton\n */\n static isSingleton(key: string): boolean {\n const metadata = ServiceRegistry._metadata.get(key);\n return metadata?.isSingleton ?? true;\n }\n\n /**\n * Get all non-singleton service keys.\n * These services must be created via `create()` method.\n */\n static getNonSingletonKeys(): string[] {\n return [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Dynamic Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a new service dynamically after initialization.\n *\n * @param entry - Service entry to register\n * @param initNow - Whether to initialize immediately (default: true)\n *\n * @example\n * ```typescript\n * // Register and initialize immediately\n * await ServiceRegistry.register({\n * service: NewDomainService,\n * config: { enabled: true },\n * });\n *\n * // Register for lazy initialization\n * ServiceRegistry.register({\n * service: LazyService,\n * config: { enabled: true, initWhen: 'lazy' },\n * }, false);\n * ```\n */\n static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n const serviceKey = entry.service.serviceKey;\n\n // Check if already registered\n if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n return;\n }\n\n const initWhen = entry.config.initWhen ?? 'immediate';\n\n if (initNow && initWhen === 'immediate') {\n await ServiceRegistry.initializeService(entry);\n } else {\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n }\n }\n\n /**\n * Unregister a service (dispose if initialized).\n *\n * @param key - Service key to unregister\n */\n static unregister(key: string): void {\n ServiceRegistry.dispose(key);\n }\n}\n","/**\n * Stream Connection Manager\n *\n * Manages active streaming connections and channel subscriptions.\n * Provides connection lifecycle and subscription management.\n */\n\nimport type {\n StreamChannel,\n StreamConnection,\n StreamConnectionInfo,\n StreamManagerStats,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Default configuration\n */\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamConnectionManager - Manages streaming connections\n *\n * Features:\n * - Connection lifecycle management\n * - Channel-based subscriptions\n * - Activity tracking for stale connection cleanup\n * - Statistics and debugging info\n *\n * @example\n * ```ts\n * const manager = new StreamConnectionManager();\n *\n * // Add connection\n * manager.addConnection({\n * id: 'conn-1',\n * transport: 'sse',\n * channels: new Set(),\n * createdAt: new Date(),\n * lastActivity: new Date(),\n * });\n *\n * // Subscribe to channel\n * manager.subscribe('conn-1', 'upload:abc123');\n *\n * // Get connections for broadcasting\n * const connections = manager.getConnectionsByChannel('upload:abc123');\n * ```\n */\nexport class StreamConnectionManager {\n /** Active connections by ID */\n private connections = new Map<string, StreamConnection>();\n\n /** Channel → connection IDs mapping for efficient broadcasting */\n private channelSubscriptions = new Map<string, Set<string>>();\n\n /**\n * Add a new connection\n *\n * @param connection - Connection to add\n */\n addConnection(connection: StreamConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n /**\n * Remove a connection and its subscriptions\n *\n * @param connectionId - Connection to remove\n */\n removeConnection(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Remove from all channel subscriptions\n for (const channel of connection.channels) {\n this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n // Clean up empty channel sets\n if (this.channelSubscriptions.get(channel)?.size === 0) {\n this.channelSubscriptions.delete(channel);\n }\n }\n\n // Remove connection\n this.connections.delete(connectionId);\n }\n\n /**\n * Get a connection by ID\n *\n * @param connectionId - Connection ID\n */\n getConnection(connectionId: string): StreamConnection | undefined {\n return this.connections.get(connectionId);\n }\n\n /**\n * Check if connection exists\n *\n * @param connectionId - Connection ID\n */\n hasConnection(connectionId: string): boolean {\n return this.connections.has(connectionId);\n }\n\n /**\n * Subscribe connection to a channel\n *\n * @param connectionId - Connection to subscribe\n * @param channel - Channel to subscribe to\n */\n subscribe(connectionId: string, channel: StreamChannel): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Add to connection's channels\n connection.channels.add(channel);\n\n // Add to channel subscriptions index\n if (!this.channelSubscriptions.has(channel)) {\n this.channelSubscriptions.set(channel, new Set());\n }\n this.channelSubscriptions.get(channel)!.add(connectionId);\n\n // Update activity\n connection.lastActivity = new Date();\n }\n\n /**\n * Unsubscribe connection from a channel\n *\n * @param connectionId - Connection to unsubscribe\n * @param channel - Channel to unsubscribe from\n */\n unsubscribe(connectionId: string, channel: StreamChannel): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Remove from connection's channels\n connection.channels.delete(channel);\n\n // Remove from channel subscriptions index\n this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n // Clean up empty channel sets\n if (this.channelSubscriptions.get(channel)?.size === 0) {\n this.channelSubscriptions.delete(channel);\n }\n\n // Update activity\n connection.lastActivity = new Date();\n }\n\n /**\n * Get all connections subscribed to a channel\n *\n * @param channel - Channel to query\n */\n getConnectionsByChannel(channel: StreamChannel): StreamConnection[] {\n const connectionIds = this.channelSubscriptions.get(channel);\n if (!connectionIds) return [];\n\n return Array.from(connectionIds)\n .map(id => this.connections.get(id))\n .filter((conn): conn is StreamConnection => conn !== undefined);\n }\n\n /**\n * Get all channels a connection is subscribed to\n *\n * @param connectionId - Connection ID\n */\n getChannelsByConnection(connectionId: string): StreamChannel[] {\n const connection = this.connections.get(connectionId);\n if (!connection) return [];\n\n return Array.from(connection.channels) as StreamChannel[];\n }\n\n /**\n * Update connection's last activity timestamp\n *\n * @param connectionId - Connection ID\n */\n updateActivity(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (connection) {\n connection.lastActivity = new Date();\n }\n }\n\n /**\n * Clean up stale connections\n *\n * @param maxAge - Maximum age in milliseconds (default: 5 minutes)\n * @returns Removed connection IDs\n */\n cleanupStale(maxAge: number = DEFAULT_MAX_STALE_AGE): string[] {\n const now = Date.now();\n const removed: string[] = [];\n\n for (const [id, connection] of this.connections) {\n const age = now - connection.lastActivity.getTime();\n if (age > maxAge) {\n this.removeConnection(id);\n removed.push(id);\n }\n }\n\n return removed;\n }\n\n /**\n * Get all connection IDs\n */\n getConnectionIds(): string[] {\n return Array.from(this.connections.keys());\n }\n\n /**\n * Get all connections\n */\n getAllConnections(): StreamConnection[] {\n return Array.from(this.connections.values());\n }\n\n /**\n * Get all active channels\n */\n getActiveChannels(): StreamChannel[] {\n return Array.from(this.channelSubscriptions.keys()) as StreamChannel[];\n }\n\n /**\n * Get connection info (serializable)\n *\n * @param connectionId - Connection ID\n */\n getConnectionInfo(connectionId: string): StreamConnectionInfo | undefined {\n const connection = this.connections.get(connectionId);\n if (!connection) return undefined;\n\n return {\n id: connection.id,\n userId: connection.userId,\n transport: connection.transport,\n channels: Array.from(connection.channels),\n createdAt: connection.createdAt.toISOString(),\n lastActivity: connection.lastActivity.toISOString(),\n metadata: connection.metadata,\n };\n }\n\n /**\n * Get manager statistics\n */\n getStats(): StreamManagerStats {\n const connectionsByTransport: Record<StreamTransportType, number> = {\n sse: 0,\n websocket: 0,\n };\n\n for (const connection of this.connections.values()) {\n connectionsByTransport[connection.transport]++;\n }\n\n return {\n totalConnections: this.connections.size,\n connectionsByTransport,\n totalSubscriptions: Array.from(this.channelSubscriptions.values()).reduce(\n (sum, set) => sum + set.size,\n 0\n ),\n activeChannels: this.channelSubscriptions.size,\n };\n }\n\n /**\n * Clear all connections (for shutdown)\n */\n clear(): void {\n this.connections.clear();\n this.channelSubscriptions.clear();\n }\n}\n","/**\n * Stream Broadcaster\n *\n * Core infrastructure for streaming to clients.\n * Orchestrates auth, transport, and connection management.\n *\n * Note: Event subscriptions are handled by ChannelControllers,\n * not directly by StreamBroadcaster.\n */\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { StreamConnectionManager } from './StreamConnectionManager';\nimport type {\n StreamAuthResult,\n StreamBroadcasterConfig,\n StreamChannel,\n StreamConnection,\n StreamManagerStats,\n StreamMessage,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { StreamPackageError } from '@plyaz/errors';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CLEANUP_INTERVAL = TIME_CONSTANTS.MINUTE; // 1 minute\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamBroadcaster - Core streaming infrastructure\n *\n * Features:\n * - Manages connections via StreamConnectionManager\n * - Routes messages through transport adapters (SSE, WebSocket)\n * - Handles auth via adapter\n * - Automatic stale connection cleanup\n * - Channel-based message broadcasting\n *\n * Note: Event subscriptions are handled by endpoint controllers\n * registered via StreamRegistry (e.g., FilesChannelController).\n *\n * @example\n * ```ts\n * const broadcaster = new StreamBroadcaster(\n * new AnonymousAuthAdapter(),\n * [new SSETransportAdapter()]\n * );\n *\n * broadcaster.initialize();\n *\n * // Register with StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster,\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n *\n * // In API route\n * const authResult = await broadcaster.authenticate(request);\n * const response = await broadcaster.createConnection('conn-1', 'sse', request);\n * broadcaster.subscribe('conn-1', 'upload:abc123', authResult);\n * return response;\n * ```\n */\nexport class StreamBroadcaster {\n private readonly connectionManager: StreamConnectionManager;\n private readonly authAdapter: BaseAuthAdapter;\n private readonly transports: Map<StreamTransportType, BaseTransportAdapter>;\n private readonly maxStaleAge: number;\n\n private unsubscribers: (() => void)[] = [];\n private cleanupTimer?: ReturnType<typeof setInterval>;\n private initialized = false;\n\n constructor(\n authAdapter: BaseAuthAdapter,\n transports: BaseTransportAdapter[],\n config?: StreamBroadcasterConfig\n ) {\n this.connectionManager = new StreamConnectionManager();\n this.authAdapter = authAdapter;\n this.transports = new Map(transports.map(t => [t.type, t]));\n this.maxStaleAge = config?.maxStaleAge ?? DEFAULT_MAX_STALE_AGE;\n }\n\n /**\n * Initialize cleanup timer\n * Call once on startup\n *\n * Note: Event subscriptions are now handled by endpoint controllers\n * registered via StreamRegistry (e.g., FilesChannelController, SystemChannelController).\n */\n initialize(): void {\n if (this.initialized) return;\n\n // Start cleanup timer for stale connections\n this.cleanupTimer = setInterval(() => {\n this.cleanupStaleConnections();\n }, DEFAULT_CLEANUP_INTERVAL);\n\n this.initialized = true;\n }\n\n /**\n * Authenticate a connection request\n *\n * @param request - HTTP request\n * @returns Authentication result\n */\n async authenticate(request: Request): Promise<StreamAuthResult> {\n return this.authAdapter.authenticate(request);\n }\n\n /**\n * Check if user can subscribe to a channel\n *\n * @param authResult - Authentication result\n * @param channel - Channel to subscribe\n */\n canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n return this.authAdapter.canSubscribe(authResult.userId, channel, authResult.scopes);\n }\n\n /**\n * Create a new streaming connection\n *\n * @param connectionId - Unique connection ID\n * @param transportType - Transport to use (sse or websocket)\n * @param request - HTTP request\n * @param authResult - Optional auth result (if already authenticated)\n * @returns Response (for SSE) or void (for WebSocket)\n */\n async createConnection(\n connectionId: string,\n transportType: StreamTransportType,\n request: Request,\n authResult?: StreamAuthResult\n ): Promise<Response | void> {\n const transport = this.transports.get(transportType);\n if (!transport) {\n throw new StreamPackageError(\n `Transport not available: ${transportType}`,\n STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n { context: { transport: transportType } }\n );\n }\n\n // Create connection in transport\n const response = await transport.createConnection(connectionId, request);\n\n // Track connection\n const connection: StreamConnection = {\n id: connectionId,\n userId: authResult?.userId,\n transport: transportType,\n channels: new Set(),\n createdAt: new Date(),\n lastActivity: new Date(),\n metadata: authResult?.metadata,\n };\n this.connectionManager.addConnection(connection);\n\n return response;\n }\n\n /**\n * Subscribe connection to a channel\n *\n * @param connectionId - Connection ID\n * @param channel - Channel to subscribe\n * @param authResult - Auth result for permission check\n * @returns Whether subscription succeeded\n */\n subscribe(connectionId: string, channel: StreamChannel, authResult?: StreamAuthResult): boolean {\n // Check permission if auth result provided\n if (authResult && !this.canSubscribe(authResult, channel)) {\n return false;\n }\n\n this.connectionManager.subscribe(connectionId, channel);\n return true;\n }\n\n /**\n * Unsubscribe connection from a channel\n *\n * @param connectionId - Connection ID\n * @param channel - Channel to unsubscribe\n */\n unsubscribe(connectionId: string, channel: StreamChannel): void {\n this.connectionManager.unsubscribe(connectionId, channel);\n }\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n async closeConnection(connectionId: string): Promise<void> {\n const connection = this.connectionManager.getConnection(connectionId);\n if (!connection) return;\n\n // Close in transport\n const transport = this.transports.get(connection.transport);\n if (transport) {\n await transport.close(connectionId);\n }\n\n // Remove from manager\n this.connectionManager.removeConnection(connectionId);\n }\n\n /**\n * Broadcast message to all connections on a channel\n *\n * @param channel - Channel to broadcast to\n * @param message - Message to send\n */\n broadcastToChannel(channel: StreamChannel, message: StreamMessage): void {\n const connections = this.connectionManager.getConnectionsByChannel(channel);\n\n for (const conn of connections) {\n const transport = this.transports.get(conn.transport);\n if (transport) {\n transport.send(conn.id, { ...message, channel }).catch(() => {\n // Connection likely dead, will be cleaned up\n });\n }\n }\n }\n\n /**\n * Send message to a specific connection\n *\n * @param connectionId - Connection ID\n * @param message - Message to send\n */\n async sendToConnection(connectionId: string, message: StreamMessage): Promise<void> {\n const connection = this.connectionManager.getConnection(connectionId);\n if (!connection) return;\n\n const transport = this.transports.get(connection.transport);\n if (transport) {\n await transport.send(connectionId, message);\n }\n }\n\n /**\n * Broadcast to all connections (system-wide)\n *\n * @param message - Message to send\n */\n broadcastToAll(message: StreamMessage): void {\n for (const connection of this.connectionManager.getAllConnections()) {\n const transport = this.transports.get(connection.transport);\n if (transport) {\n transport.send(connection.id, message).catch(() => {\n // Connection likely dead\n });\n }\n }\n }\n\n /**\n * Get manager statistics\n */\n getStats(): StreamManagerStats {\n return this.connectionManager.getStats();\n }\n\n /**\n * Dispose broadcaster (for shutdown)\n */\n dispose(): void {\n // Stop event subscriptions\n this.unsubscribers.forEach(unsub => unsub());\n this.unsubscribers = [];\n\n // Stop cleanup timer\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n // Close all connections\n for (const [, transport] of this.transports) {\n if ('closeAll' in transport && typeof transport.closeAll === 'function') {\n void (transport as { closeAll: () => Promise<void> }).closeAll();\n }\n }\n\n // Clear connection manager\n this.connectionManager.clear();\n\n this.initialized = false;\n }\n\n /**\n * Clean up stale connections\n */\n private cleanupStaleConnections(): void {\n const removed = this.connectionManager.cleanupStale(this.maxStaleAge);\n\n // Also close in transports\n for (const connectionId of removed) {\n for (const [, transport] of this.transports) {\n if (transport.isAlive(connectionId)) {\n transport.close(connectionId).catch(() => {\n // Already closed\n });\n }\n }\n }\n }\n}\n","/**\n * Base Auth Adapter\n *\n * Abstract base class for stream authentication adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type { StreamAuthAdapterConfig, StreamAuthResult, StreamChannel } from '@plyaz/types/core';\n\n/**\n * BaseAuthAdapter - Abstract base class for all stream auth adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for authentication and authorization\n *\n * Subclasses must implement:\n * - authenticate() - Validate connection request\n * - canSubscribe() - Check channel subscription permissions\n *\n * @example\n * ```ts\n * class MyAuthAdapter extends BaseAuthAdapter {\n * async authenticate(request: Request): Promise<StreamAuthResult> {\n * // Custom authentication logic\n * }\n *\n * canSubscribe(userId, channel, scopes): boolean {\n * // Custom authorization logic\n * }\n * }\n * ```\n */\nexport abstract class BaseAuthAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Whether this adapter is enabled */\n readonly enabled: boolean;\n\n constructor(config: StreamAuthAdapterConfig) {\n this.name = config.name;\n this.enabled = config.enabled ?? true;\n }\n\n /**\n * Authenticate a connection request\n *\n * @param request - HTTP request or WebSocket upgrade request\n * @returns Authentication result with user info if authenticated\n */\n abstract authenticate(request: Request): Promise<StreamAuthResult>;\n\n /**\n * Check if user can subscribe to a channel\n *\n * @param userId - User ID (undefined for anonymous connections)\n * @param channel - Channel to subscribe to\n * @param scopes - User's allowed scopes from authentication\n * @returns Whether subscription is allowed\n */\n abstract canSubscribe(\n userId: string | undefined,\n channel: StreamChannel,\n scopes?: string[]\n ): boolean;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): { name: string; enabled: boolean } {\n return {\n name: this.name,\n enabled: this.enabled,\n };\n }\n}\n","/**\n * Anonymous Auth Adapter\n *\n * No-op authentication adapter for local/development use.\n * Allows all connections and channel subscriptions.\n */\n\nimport type { StreamAuthResult, StreamChannel } from '@plyaz/types/core';\nimport { BaseAuthAdapter } from '../BaseAuthAdapter';\n\n/**\n * AnonymousAuthAdapter - Allows all connections without authentication\n *\n * Use cases:\n * - Local development\n * - Internal services without auth requirements\n * - Testing environments\n *\n * @example\n * ```ts\n * const authAdapter = new AnonymousAuthAdapter();\n *\n * // Always returns authenticated: true\n * const result = await authAdapter.authenticate(request);\n * console.log(result.authenticated); // true\n *\n * // Always allows subscription\n * const canSub = authAdapter.canSubscribe(undefined, 'uploads');\n * console.log(canSub); // true\n * ```\n */\nexport class AnonymousAuthAdapter extends BaseAuthAdapter {\n constructor() {\n super({ name: 'anonymous' });\n }\n\n /**\n * Authenticate request (always succeeds)\n *\n * @returns Always returns { authenticated: true }\n */\n async authenticate(): Promise<StreamAuthResult> {\n return { authenticated: true };\n }\n\n /**\n * Check subscription permission (always allowed)\n *\n * @returns Always returns true\n */\n // eslint-disable-next-line no-unused-vars\n canSubscribe(_userId: string | undefined, _channel: StreamChannel, _scopes?: string[]): boolean {\n return true;\n }\n}\n","/**\n * Base Transport Adapter\n *\n * Abstract base class for stream transport adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type {\n StreamMessage,\n StreamTransportAdapterConfig,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\n\n/**\n * BaseTransportAdapter - Abstract base class for all transport adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for connection management\n * - Message sending abstraction\n *\n * Subclasses must implement:\n * - createConnection() - Create new connection\n * - send() - Send message to connection\n * - close() - Close connection\n * - isAlive() - Check connection status\n *\n * @example\n * ```ts\n * class MyTransportAdapter extends BaseTransportAdapter {\n * async createConnection(connectionId: string, request: Request): Promise<Response> {\n * // Implementation\n * }\n * // ... other methods\n * }\n * ```\n */\nexport abstract class BaseTransportAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Transport type identifier */\n readonly type: StreamTransportType;\n\n /** Heartbeat interval in milliseconds */\n protected readonly heartbeatInterval: number;\n\n /** Maximum concurrent connections */\n protected readonly maxConnections: number;\n\n constructor(config: StreamTransportAdapterConfig & { type: StreamTransportType }) {\n this.name = config.name;\n this.type = config.type;\n this.heartbeatInterval = config.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS;\n this.maxConnections = config.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS;\n }\n\n /**\n * Create a new streaming connection\n *\n * For SSE: Returns a Response with streaming body\n * For WebSocket: Modifies socket directly, returns void\n *\n * @param connectionId - Unique connection identifier\n * @param request - HTTP request or WebSocket upgrade request\n * @returns Response for SSE, void for WebSocket\n */\n abstract createConnection(connectionId: string, request: Request): Promise<Response | void>;\n\n /**\n * Send a message to a specific connection\n *\n * @param connectionId - Connection to send to\n * @param message - Message to send\n */\n abstract send(connectionId: string, message: StreamMessage): Promise<void>;\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n abstract close(connectionId: string): Promise<void>;\n\n /**\n * Check if a connection is still alive\n *\n * @param connectionId - Connection to check\n * @returns Whether connection is alive\n */\n abstract isAlive(connectionId: string): boolean;\n\n /**\n * Get current connection count\n *\n * @returns Number of active connections\n */\n abstract getConnectionCount(): number;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): {\n name: string;\n type: StreamTransportType;\n heartbeatInterval: number;\n maxConnections: number;\n connectionCount: number;\n } {\n return {\n name: this.name,\n type: this.type,\n heartbeatInterval: this.heartbeatInterval,\n maxConnections: this.maxConnections,\n connectionCount: this.getConnectionCount(),\n };\n }\n\n /**\n * Check if adapter can accept more connections\n */\n canAcceptConnection(): boolean {\n return this.getConnectionCount() < this.maxConnections;\n }\n}\n","/**\n * SSE Transport Adapter\n *\n * Server-Sent Events transport for real-time streaming.\n * Uses Web Streams API for compatibility with Next.js/Edge runtime.\n */\n\n/* eslint-disable n/no-unsupported-features/node-builtins */\n// ReadableStream and ReadableStreamDefaultController are stable Web APIs,\n// supported in all modern browsers and Edge runtime\n\nimport type { StreamMessage, StreamTransportAdapterConfig } from '@plyaz/types/core';\nimport { BaseTransportAdapter } from '../BaseTransportAdapter';\n\n/**\n * Internal connection state\n */\ninterface SSEConnection {\n controller: ReadableStreamDefaultController;\n heartbeatTimer?: ReturnType<typeof setInterval>;\n createdAt: Date;\n}\n\n/**\n * SSETransportAdapter - Server-Sent Events transport\n *\n * Features:\n * - Web Streams API for Edge runtime compatibility\n * - Automatic heartbeat to keep connections alive\n * - Proper SSE formatting with event, id, retry, data fields\n * - Connection cleanup on disconnect\n *\n * @example\n * ```ts\n * const sseAdapter = new SSETransportAdapter({ heartbeatInterval: 15000 });\n *\n * // In API route\n * const response = await sseAdapter.createConnection(connectionId, request);\n * return response; // Returns SSE stream\n *\n * // Send message\n * await sseAdapter.send(connectionId, {\n * event: 'progress',\n * data: { percentage: 50 },\n * });\n * ```\n */\nexport class SSETransportAdapter extends BaseTransportAdapter {\n private connections = new Map<string, SSEConnection>();\n\n constructor(config?: Partial<StreamTransportAdapterConfig>) {\n super({\n name: config?.name ?? 'sse',\n type: 'sse',\n heartbeatInterval: config?.heartbeatInterval,\n maxConnections: config?.maxConnections,\n });\n }\n\n /**\n * Create a new SSE connection\n *\n * @param connectionId - Unique connection identifier\n * @returns Response with SSE stream\n */\n async createConnection(connectionId: string): Promise<Response> {\n // Check if we can accept more connections\n if (!this.canAcceptConnection()) {\n return new Response('Too many connections', { status: 503 });\n }\n\n // Create the SSE stream\n const stream = new ReadableStream({\n start: controller => {\n // Store connection\n const connection: SSEConnection = {\n controller,\n createdAt: new Date(),\n };\n this.connections.set(connectionId, connection);\n\n // Send initial connection message\n this.sendImmediate(controller, {\n event: 'connected',\n data: { connectionId, timestamp: Date.now() },\n });\n\n // Start heartbeat\n connection.heartbeatTimer = setInterval(() => {\n if (!this.isAlive(connectionId)) {\n this.cleanup(connectionId);\n return;\n }\n this.sendImmediate(controller, {\n event: 'heartbeat',\n data: { timestamp: Date.now() },\n });\n }, this.heartbeatInterval);\n },\n cancel: () => {\n this.cleanup(connectionId);\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no', // Disable nginx buffering\n },\n });\n }\n\n /**\n * Send a message to a connection\n *\n * @param connectionId - Connection to send to\n * @param message - Message to send\n */\n async send(connectionId: string, message: StreamMessage): Promise<void> {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n try {\n this.sendImmediate(connection.controller, message);\n } catch {\n // Connection likely closed, cleanup\n this.cleanup(connectionId);\n }\n }\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n async close(connectionId: string): Promise<void> {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n try {\n // Send close event before closing\n this.sendImmediate(connection.controller, {\n event: 'close',\n data: { reason: 'server_close' },\n });\n connection.controller.close();\n } catch {\n // Already closed\n }\n\n this.cleanup(connectionId);\n }\n\n /**\n * Check if a connection is alive\n *\n * @param connectionId - Connection to check\n */\n isAlive(connectionId: string): boolean {\n return this.connections.has(connectionId);\n }\n\n /**\n * Get current connection count\n */\n getConnectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Get all connection IDs\n */\n getConnectionIds(): string[] {\n return Array.from(this.connections.keys());\n }\n\n /**\n * Send message immediately to controller\n */\n private sendImmediate(controller: ReadableStreamDefaultController, message: StreamMessage): void {\n const formatted = this.formatSSE(message);\n controller.enqueue(new TextEncoder().encode(formatted));\n }\n\n /**\n * Format message as SSE\n *\n * SSE format:\n * ```\n * id: messageId\n * retry: retryMs\n * data: {\"event\":\"eventName\",\"channel\":\"channelName\",\"data\":{...}}\n *\n * ```\n *\n * Note: We intentionally DON'T use SSE named events (event: line) because:\n * 1. EventSource silently drops events without registered listeners\n * 2. Hardcoding all possible event names is not scalable\n * 3. Including event in JSON payload is more flexible\n *\n * The client extracts event/channel from the JSON payload in onmessage.\n */\n private formatSSE(message: StreamMessage): string {\n let output = '';\n\n if (message.id) {\n output += `id: ${message.id}\\n`;\n }\n\n if (message.retry !== undefined) {\n output += `retry: ${message.retry}\\n`;\n }\n\n // Include event and channel in the data payload for the client to extract\n const payload = {\n event: message.event,\n channel: message.channel,\n data: message.data,\n timestamp: message.timestamp ?? Date.now(),\n };\n\n output += `data: ${JSON.stringify(payload)}\\n`;\n\n // Double newline to end message\n output += '\\n';\n\n return output;\n }\n\n /**\n * Cleanup connection resources\n */\n private cleanup(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Clear heartbeat timer\n if (connection.heartbeatTimer) {\n clearInterval(connection.heartbeatTimer);\n }\n\n // Remove from map\n this.connections.delete(connectionId);\n }\n\n /**\n * Close all connections (for shutdown)\n */\n async closeAll(): Promise<void> {\n const connectionIds = this.getConnectionIds();\n await Promise.all(connectionIds.map(id => this.close(id)));\n }\n}\n","/**\n * Base Framework Adapter\n *\n * Abstract base class for framework-specific streaming adapters.\n * Converts framework-specific request/response to Web Request/Response.\n *\n * Follows the adapter pattern used in BaseTransportAdapter and BaseAuthAdapter.\n *\n * @example\n * ```typescript\n * class MyFrameworkAdapter extends BaseFrameworkAdapter {\n * readonly framework = 'myframework' as const;\n *\n * createHandler(handleRequest, options) {\n * return (req, res) => {\n * const webRequest = this.convertRequest(req);\n * const response = await handleRequest(webRequest, options?.transport);\n * await this.handleResponse(response, req, res);\n * };\n * }\n * // ... other methods\n * }\n * ```\n */\n\nimport type {\n FrameworkType,\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n} from '@plyaz/types/core';\n\n/**\n * BaseFrameworkAdapter - Abstract base class for framework adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for request/response conversion\n * - Handler creation abstraction\n *\n * Subclasses must implement:\n * - framework - Framework identifier\n * - createHandler() - Create framework-specific handler\n * - convertRequest() - Convert framework request to Web Request\n * - handleResponse() - Handle Web Response for framework\n */\nexport abstract class BaseFrameworkAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Framework type identifier */\n abstract readonly framework: FrameworkType;\n\n /** Whether adapter is enabled */\n readonly enabled: boolean;\n\n constructor(config: FrameworkAdapterConfig = {} as FrameworkAdapterConfig) {\n this.name = config.name ?? this.constructor.name;\n this.enabled = config.enabled ?? true;\n }\n\n /**\n * Create a handler function for the framework.\n *\n * The returned handler type varies by framework:\n * - Next.js: `(request: Request) => Promise<Response>`\n * - Express: `(req: Request, res: Response) => Promise<void>`\n * - NestJS: `(req: Request, res: Response) => Promise<void>`\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options (transport type, etc.)\n * @returns Framework-specific handler function\n *\n * @example\n * ```typescript\n * // Next.js\n * export const GET = adapter.createHandler(streamServer.handleRequest);\n *\n * // Express\n * app.get('/stream', adapter.createHandler(streamServer.handleRequest));\n * ```\n */\n abstract createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): unknown;\n\n /**\n * Convert framework-specific request to Web Request.\n *\n * @param frameworkRequest - Framework-specific request object\n * @returns Web Request object\n */\n abstract convertRequest(frameworkRequest: unknown): Request;\n\n /**\n * Handle Web Response and send to framework response.\n *\n * For Next.js/Edge: Returns Response directly\n * For Express/NestJS: Streams to res object\n *\n * @param response - Web Response from core handler\n * @param frameworkRequest - Original framework request\n * @param frameworkResponse - Framework response object (for Express-like frameworks)\n * @returns Response for return-based frameworks, void for stream-based\n */\n abstract handleResponse(\n response: Response,\n frameworkRequest: unknown,\n frameworkResponse?: unknown\n ): Promise<Response | void>;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): {\n name: string;\n framework: FrameworkType;\n enabled: boolean;\n } {\n return {\n name: this.name,\n framework: this.framework,\n enabled: this.enabled,\n };\n }\n}\n","/**\n * Next.js Framework Adapter\n *\n * Framework adapter for Next.js App Router (Route Handlers).\n * Next.js uses Web Request/Response natively, so this is mostly a passthrough.\n *\n * @example\n * ```typescript\n * // app/api/events/stream/route.ts\n * import { streamServer } from '@/lib/stream';\n *\n * export const GET = streamServer.getHandler('nextjs');\n * ```\n */\n\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n NextJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NextJSFrameworkAdapter - Next.js App Router adapter\n *\n * Features:\n * - Native Web Request/Response support (zero conversion overhead)\n * - Works with Next.js App Router route handlers\n * - Edge Runtime compatible\n *\n * @example\n * ```typescript\n * const adapter = new NextJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * export const GET = handler;\n * ```\n */\nexport class NextJSFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'nextjs' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'nextjs',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create Next.js route handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns Next.js route handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): NextJSHandler {\n const transport = options?.transport ?? 'sse';\n\n return (request: Request): Promise<Response> => {\n return handleRequest(request, transport);\n };\n }\n\n /**\n * Convert Next.js request to Web Request.\n * Next.js already uses Web Request, so this is a passthrough.\n *\n * @param request - Next.js Request (which is a Web Request)\n * @returns The same Request object\n */\n convertRequest(request: Request): Request {\n return request;\n }\n\n /**\n * Handle Web Response for Next.js.\n * Next.js returns Response directly, so this is a passthrough.\n *\n * @param response - Web Response from core handler\n * @returns The same Response object\n */\n async handleResponse(response: Response): Promise<Response> {\n return response;\n }\n}\n","/**\n * Express Framework Adapter\n *\n * Framework adapter for Express.js and compatible frameworks (Fastify, Koa, etc.).\n * Converts Express req/res to Web Request/Response and handles SSE streaming.\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { streamServer } from './stream';\n *\n * const app = express();\n * app.get('/events/stream', streamServer.getHandler('express'));\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n ExpressRequest,\n ExpressResponse,\n ExpressHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * ExpressFrameworkAdapter - Express/Fastify adapter\n *\n * Features:\n * - Converts Express req/res to Web Request/Response\n * - Handles SSE streaming to Express response\n * - Manages connection cleanup on client disconnect\n * - Compatible with Express, Fastify, Koa (with adapters)\n *\n * @example\n * ```typescript\n * const adapter = new ExpressFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * app.get('/stream', handler);\n * ```\n */\nexport class ExpressFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'express' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'express',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create Express route handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns Express route handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): ExpressHandler {\n const transport = options?.transport ?? 'sse';\n\n return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\n const webRequest = this.convertRequest(req);\n const response = await handleRequest(webRequest, transport);\n await this.handleResponse(response, req, res);\n };\n }\n\n /**\n * Convert Express request to Web Request.\n *\n * @param req - Express request object\n * @returns Web Request object\n */\n convertRequest(req: ExpressRequest): Request {\n const url = new URL(req.url, 'http://localhost');\n\n // Convert headers, handling array values\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value as string);\n }\n }\n }\n\n return new Request(url, {\n headers,\n method: req.method ?? 'GET',\n });\n }\n\n /**\n * Handle Web Response and stream to Express response.\n *\n * @param response - Web Response from core handler\n * @param _req - Original Express request (unused)\n * @param res - Express response object\n */\n async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n const expressRes = res as ExpressResponse;\n\n // Write SSE headers\n expressRes.writeHead(HTTP_STATUS.OK, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n\n // Stream response body\n const reader = response.body?.getReader();\n if (reader) {\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) return;\n expressRes.write(new TextDecoder().decode(value));\n return pump();\n };\n void pump();\n\n // Handle client disconnect\n expressRes.on('close', () => {\n void reader.cancel();\n });\n }\n }\n}\n","/**\n * NestJS Framework Adapter\n *\n * Framework adapter for NestJS controllers.\n * NestJS typically uses Express under the hood, so this adapter handles\n * the Express-style req/res pattern used in NestJS controllers.\n *\n * @example\n * ```typescript\n * // In a NestJS controller\n * @Controller('events')\n * export class StreamingController {\n * constructor(@Inject(STREAM_SERVER) private streamServer: StreamServer) {}\n *\n * @Get('stream')\n * async stream(@Req() req: Request, @Res() res: Response) {\n * const handler = this.streamServer.getHandler('nestjs');\n * await handler(req, res);\n * }\n * }\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n NestJSRequest,\n NestJSResponse,\n NestJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NestJSFrameworkAdapter - NestJS adapter\n *\n * Features:\n * - Works with NestJS Express-based controllers\n * - Handles @Req() and @Res() decorated parameters\n * - Supports both writeHead and setHeader patterns\n * - Manages SSE streaming to response\n *\n * @example\n * ```typescript\n * const adapter = new NestJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n *\n * // In controller method:\n * await handler(req, res);\n * ```\n */\nexport class NestJSFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'nestjs' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'nestjs',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create NestJS controller handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns NestJS controller handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): NestJSHandler {\n const transport = options?.transport ?? 'sse';\n\n return async (req: NestJSRequest, res: NestJSResponse): Promise<void> => {\n const webRequest = this.convertRequest(req);\n const response = await handleRequest(webRequest, transport);\n await this.handleResponse(response, req, res);\n };\n }\n\n /**\n * Convert NestJS request to Web Request.\n *\n * @param req - NestJS request object\n * @returns Web Request object\n */\n convertRequest(req: NestJSRequest): Request {\n const url = new URL(req.url, 'http://localhost');\n\n // Convert headers, handling array values\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value as string);\n }\n }\n }\n\n return new Request(url, {\n headers,\n method: req.method ?? 'GET',\n });\n }\n\n /**\n * Handle Web Response and stream to NestJS response.\n *\n * @param response - Web Response from core handler\n * @param _req - Original NestJS request (unused)\n * @param res - NestJS response object\n */\n async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n const nestRes = res as NestJSResponse;\n\n // Set SSE headers using available method\n if (nestRes.writeHead) {\n nestRes.writeHead(HTTP_STATUS.OK, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n } else {\n // Fallback to setHeader for NestJS\n nestRes.status(HTTP_STATUS.OK);\n nestRes.setHeader('Content-Type', 'text/event-stream');\n nestRes.setHeader('Cache-Control', 'no-cache');\n nestRes.setHeader('Connection', 'keep-alive');\n // Flush headers to start streaming\n if (nestRes.flushHeaders) {\n nestRes.flushHeaders();\n }\n }\n\n // Stream response body\n const reader = response.body?.getReader();\n if (reader) {\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) return;\n nestRes.write(new TextDecoder().decode(value));\n return pump();\n };\n void pump();\n\n // Handle client disconnect\n nestRes.on('close', () => {\n void reader.cancel();\n });\n }\n }\n}\n","/**\n * Stream Server\n *\n * Framework-agnostic streaming server factory.\n * Provides easy configuration and integration with Next.js, NestJS, Express, etc.\n *\n * Uses framework adapters for handling different runtimes:\n * - NextJSFrameworkAdapter - Next.js App Router (Web Request/Response)\n * - ExpressFrameworkAdapter - Express/Fastify (req/res pattern)\n * - NestJSFrameworkAdapter - NestJS controllers\n *\n * @example\n * ```ts\n * // Create server with builder pattern\n * const streamServer = StreamServer.create()\n * .withAuth(new AnonymousAuthAdapter())\n * .withSSE({ heartbeatInterval: 15000 })\n * .build();\n *\n * // Use in Next.js\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Use in Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // Use in NestJS\n * const handler = streamServer.getHandler('nestjs');\n * await handler(req, res);\n * ```\n */\n\nimport { StreamBroadcaster } from './StreamBroadcaster';\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport { AnonymousAuthAdapter } from './auth/adapters/AnonymousAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { SSETransportAdapter } from './transports/adapters/SSETransportAdapter';\nimport type { BaseFrameworkAdapter } from './frameworks';\nimport {\n NextJSFrameworkAdapter,\n ExpressFrameworkAdapter,\n NestJSFrameworkAdapter,\n type FrameworkType,\n type FrameworkHandlerOptions,\n} from './frameworks';\nimport type {\n StreamAuthResult,\n StreamBroadcasterConfig,\n StreamChannel,\n StreamManagerStats,\n StreamTransportType,\n SSEConfig,\n WebSocketConfig,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { StreamPackageError } from '@plyaz/errors';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Stream server configuration\n */\nexport interface StreamServerConfig {\n /** Auth adapter to use */\n auth?: BaseAuthAdapter;\n /** Transport adapters to use */\n transports?: BaseTransportAdapter[];\n /** Broadcaster configuration */\n broadcaster?: StreamBroadcasterConfig;\n /** Default channels for new connections */\n defaultChannels?: StreamChannel[];\n /** Parse channels from request (default: query param 'channels') */\n parseChannels?: (request: Request) => StreamChannel[];\n /** Custom framework adapters (NextJS, Express, NestJS registered by default) */\n frameworkAdapters?: BaseFrameworkAdapter[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server Builder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Builder for StreamServer\n */\nexport class StreamServerBuilder {\n private authAdapter?: BaseAuthAdapter;\n private transports: BaseTransportAdapter[] = [];\n private broadcasterConfig?: StreamBroadcasterConfig;\n private defaultChannels: StreamChannel[] = ['uploads'];\n private channelParser?: (request: Request) => StreamChannel[];\n\n /**\n * Configure authentication\n */\n withAuth(adapter: BaseAuthAdapter): this {\n this.authAdapter = adapter;\n return this;\n }\n\n /**\n * Enable SSE transport\n */\n withSSE(config?: SSEConfig): this {\n if (config?.enabled === false) return this;\n this.transports.push(new SSETransportAdapter(config));\n return this;\n }\n\n /**\n * Enable WebSocket transport (future)\n */\n // eslint-disable-next-line no-unused-vars\n withWebSocket(_config?: WebSocketConfig): this {\n // Future: this.transports.push(new WebSocketTransportAdapter(config));\n console.warn('WebSocket transport not yet implemented');\n return this;\n }\n\n /**\n * Add custom transport\n */\n withTransport(adapter: BaseTransportAdapter): this {\n this.transports.push(adapter);\n return this;\n }\n\n /**\n * Configure broadcaster\n */\n withBroadcaster(config: StreamBroadcasterConfig): this {\n this.broadcasterConfig = config;\n return this;\n }\n\n /**\n * Set default channels for new connections\n */\n withDefaultChannels(channels: StreamChannel[]): this {\n this.defaultChannels = channels;\n return this;\n }\n\n /**\n * Custom channel parser\n */\n withChannelParser(parser: (request: Request) => StreamChannel[]): this {\n this.channelParser = parser;\n return this;\n }\n\n /**\n * Build the stream server\n */\n build(): StreamServer {\n // Default to anonymous auth if not specified\n const auth = this.authAdapter ?? new AnonymousAuthAdapter();\n\n // Default to SSE if no transports specified\n const transports = this.transports.length > 0 ? this.transports : [new SSETransportAdapter()];\n\n return new StreamServer({\n auth,\n transports,\n broadcaster: this.broadcasterConfig,\n defaultChannels: this.defaultChannels,\n parseChannels: this.channelParser,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * StreamServer - Framework-agnostic streaming server\n *\n * Features:\n * - Builder pattern for easy configuration\n * - Framework adapter pattern for easy integration\n * - Automatic connection lifecycle management\n * - Channel-based subscriptions\n *\n * @example\n * ```ts\n * const server = StreamServer.create()\n * .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n * .withSSE({ heartbeatInterval: 30000 })\n * .build();\n *\n * // Initialize on startup\n * server.initialize();\n *\n * // Get handler for your framework\n * export const GET = server.getHandler('nextjs');\n * // or\n * app.get('/stream', server.getHandler('express'));\n *\n * // Register endpoints via StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: server.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\nexport class StreamServer {\n private readonly broadcaster: StreamBroadcaster;\n private readonly config: StreamServerConfig;\n private readonly frameworkAdapters = new Map<FrameworkType, BaseFrameworkAdapter>();\n private initialized = false;\n\n constructor(config: StreamServerConfig) {\n this.config = config;\n\n // Create broadcaster\n this.broadcaster = new StreamBroadcaster(\n config.auth ?? new AnonymousAuthAdapter(),\n config.transports ?? [new SSETransportAdapter()],\n config.broadcaster\n );\n\n // Register default framework adapters\n this.registerFrameworkAdapter(new NextJSFrameworkAdapter());\n this.registerFrameworkAdapter(new ExpressFrameworkAdapter());\n this.registerFrameworkAdapter(new NestJSFrameworkAdapter());\n\n // Register custom framework adapters if provided\n if (config.frameworkAdapters) {\n for (const adapter of config.frameworkAdapters) {\n this.registerFrameworkAdapter(adapter);\n }\n }\n }\n\n /**\n * Create a new builder\n */\n static create(): StreamServerBuilder {\n return new StreamServerBuilder();\n }\n\n /**\n * Initialize the stream server\n * Call once on application startup\n */\n initialize(): void {\n if (this.initialized) return;\n this.broadcaster.initialize();\n this.initialized = true;\n }\n\n /**\n * Dispose the stream server\n * Call on application shutdown\n */\n dispose(): void {\n this.broadcaster.dispose();\n this.initialized = false;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Request Handling\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Handle a streaming request (framework-agnostic)\n *\n * @param request - HTTP request\n * @param transportType - Transport to use (default: 'sse')\n */\n async handleRequest(\n request: Request,\n transportType: StreamTransportType = 'sse'\n ): Promise<Response> {\n // Ensure initialized\n if (!this.initialized) {\n this.initialize();\n }\n\n // Parse channels from request\n const channels = this.parseChannels(request);\n\n // Authenticate\n const authResult = await this.broadcaster.authenticate(request);\n\n // Generate connection ID\n const connectionId = crypto.randomUUID();\n\n // Create connection\n const response = await this.broadcaster.createConnection(\n connectionId,\n transportType,\n request,\n authResult\n );\n\n if (!response) {\n return new Response('Failed to create connection', { status: 500 });\n }\n\n // Subscribe to channels\n for (const channel of channels) {\n if (this.broadcaster.canSubscribe(authResult, channel)) {\n this.broadcaster.subscribe(connectionId, channel, authResult);\n }\n }\n\n return response;\n }\n\n /**\n * Parse channels from request\n */\n private parseChannels(request: Request): StreamChannel[] {\n // Use custom parser if provided\n if (this.config.parseChannels) {\n return this.config.parseChannels(request);\n }\n\n // Default: parse from query param\n const { searchParams } = new URL(request.url);\n const channelsParam = searchParams.get('channels');\n\n if (!channelsParam) {\n return this.config.defaultChannels ?? ['uploads'];\n }\n\n return channelsParam.split(',').filter(Boolean) as StreamChannel[];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Framework Adapters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a framework adapter.\n *\n * Default adapters (NextJS, Express, NestJS) are registered automatically.\n * Use this to add custom adapters or override existing ones.\n *\n * @param adapter - Framework adapter to register\n *\n * @example\n * ```ts\n * // Register custom adapter\n * streamServer.registerFrameworkAdapter(new MyCustomAdapter());\n *\n * // Override default adapter\n * streamServer.registerFrameworkAdapter(new NextJSFrameworkAdapter({ name: 'custom-nextjs' }));\n * ```\n */\n registerFrameworkAdapter(adapter: BaseFrameworkAdapter): void {\n this.frameworkAdapters.set(adapter.framework, adapter);\n }\n\n /**\n * Get a framework adapter by type.\n *\n * @param framework - Framework type to get\n * @returns Framework adapter or undefined if not registered\n */\n getFrameworkAdapter<T extends BaseFrameworkAdapter>(framework: FrameworkType): T | undefined {\n return this.frameworkAdapters.get(framework) as T | undefined;\n }\n\n /**\n * Get handler for a specific framework.\n *\n * This is the primary API for integrating with frameworks.\n *\n * @param framework - Framework type ('nextjs', 'express', 'nestjs')\n * @param options - Handler options (transport type, etc.)\n * @returns Framework-specific handler function\n *\n * @example\n * ```ts\n * // Next.js App Router\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // NestJS controller\n * const handler = streamServer.getHandler('nestjs');\n * await handler(req, res);\n *\n * // With options\n * export const GET = streamServer.getHandler('nextjs', { transport: 'sse' });\n * ```\n */\n getHandler<T = unknown>(framework: FrameworkType, options?: FrameworkHandlerOptions): T {\n const adapter = this.frameworkAdapters.get(framework);\n\n if (!adapter) {\n throw new StreamPackageError(\n `Framework adapter '${framework}' not registered. Available adapters: ${Array.from(this.frameworkAdapters.keys()).join(', ')}`,\n STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND,\n { context: { framework, availableAdapters: Array.from(this.frameworkAdapters.keys()) } }\n );\n }\n\n if (!adapter.enabled) {\n throw new StreamPackageError(\n `Framework adapter '${framework}' is disabled`,\n STREAM_ERROR_CODES.ENDPOINT_DISABLED,\n { context: { framework } }\n );\n }\n\n return adapter.createHandler(\n (request, transport) => this.handleRequest(request, transport),\n options\n ) as T;\n }\n\n /**\n * Get list of registered framework adapters.\n */\n getRegisteredFrameworks(): FrameworkType[] {\n return Array.from(this.frameworkAdapters.keys());\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Direct Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the underlying broadcaster for advanced usage\n */\n getBroadcaster(): StreamBroadcaster {\n return this.broadcaster;\n }\n\n /**\n * Authenticate a request\n */\n async authenticate(request: Request): Promise<StreamAuthResult> {\n return this.broadcaster.authenticate(request);\n }\n\n /**\n * Check if user can subscribe to a channel\n */\n canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n return this.broadcaster.canSubscribe(authResult, channel);\n }\n\n /**\n * Get server statistics\n */\n getStats(): StreamManagerStats {\n return this.broadcaster.getStats();\n }\n\n /**\n * Check if server is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Stream Registry\n *\n * Auto-discovery and initialization for stream endpoints.\n * Similar to ServiceRegistry but for real-time streaming.\n *\n * @example\n * ```typescript\n * import { StreamServer, StreamRegistry } from '@plyaz/core/events/streaming';\n * import { FilesStreamEndpoint } from '@plyaz/core/domain/files/streaming';\n * import { SystemStreamEndpoint } from '@plyaz/core/events/streaming/endpoints';\n *\n * // Create stream server\n * const streamServer = StreamServer.create()\n * .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n * .withSSE({ heartbeatInterval: 15000 })\n * .build();\n *\n * // Initialize stream registry (like ServiceRegistry)\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport { StreamPackageError } from '@plyaz/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n StreamEndpointConfig,\n StreamRegistryConfig,\n StreamBroadcasterInterface,\n} from '@plyaz/types/core';\nimport type { BaseStreamEndpoint } from './base/BaseStreamEndpoint';\nimport type { BaseChannelController } from './channels/BaseChannelController';\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like stream endpoints being registered\n * in one module context but not accessible from another (e.g., API routes).\n */\ninterface StreamRegistryState {\n endpoints: Map<string, BaseStreamEndpoint>;\n controllers: Map<string, BaseChannelController>;\n broadcaster: StreamBroadcasterInterface | null;\n initialized: boolean;\n}\n\nconst STREAM_REGISTRY_KEY = Symbol.for('plyaz.StreamRegistry');\n\nfunction getStreamRegistryState(): StreamRegistryState {\n const globalAny = globalThis as unknown as { [key: symbol]: StreamRegistryState };\n if (!globalAny[STREAM_REGISTRY_KEY]) {\n globalAny[STREAM_REGISTRY_KEY] = {\n endpoints: new Map(),\n controllers: new Map(),\n broadcaster: null,\n initialized: false,\n };\n }\n return globalAny[STREAM_REGISTRY_KEY];\n}\n\n/**\n * StreamRegistry - Auto-discovery and initialization for stream endpoints\n *\n * Features:\n * - Auto-initialization of stream endpoints\n * - get() and getAsync() access patterns (like ServiceRegistry)\n * - Lifecycle management\n * - Controller registration with broadcaster\n */\nexport class StreamRegistry {\n private static readonly logger = new CoreLogger({\n service: 'StreamRegistry',\n });\n\n // State accessors using globalThis\n private static get _endpoints(): Map<string, BaseStreamEndpoint> {\n return getStreamRegistryState().endpoints;\n }\n private static get _controllers(): Map<string, BaseChannelController> {\n return getStreamRegistryState().controllers;\n }\n private static get _broadcaster(): StreamBroadcasterInterface | null {\n return getStreamRegistryState().broadcaster;\n }\n private static set _broadcaster(value: StreamBroadcasterInterface | null) {\n getStreamRegistryState().broadcaster = value;\n }\n private static get _initialized(): boolean {\n return getStreamRegistryState().initialized;\n }\n private static set _initialized(value: boolean) {\n getStreamRegistryState().initialized = value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the stream registry with endpoints.\n *\n * @param config - Registry configuration\n * @throws StreamPackageError if already initialized or endpoint fails\n *\n * @example\n * ```typescript\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n static async initialize(config: StreamRegistryConfig): Promise<void> {\n if (StreamRegistry._initialized) {\n StreamRegistry.logger.warn('StreamRegistry already initialized');\n return;\n }\n\n StreamRegistry._broadcaster = config.broadcaster;\n\n for (const entry of config.endpoints) {\n const endpointKey = entry.endpoint.endpointKey;\n const enabled = entry.config.enabled !== false;\n\n if (!enabled) {\n StreamRegistry.logger.debug(`Endpoint ${endpointKey} is disabled, skipping`);\n continue;\n }\n\n try {\n // Create endpoint configuration\n const endpointConfig: StreamEndpointConfig = {\n endpointKey,\n name: entry.config.name ?? endpointKey,\n channels: entry.config.channels ?? [],\n enabled: entry.config.enabled,\n supportedRuntimes: entry.config.supportedRuntimes,\n };\n\n // Create endpoint instance via static create()\n const instance = (await entry.endpoint.create(endpointConfig, {\n broadcaster: config.broadcaster,\n })) as BaseStreamEndpoint;\n\n // Initialize the endpoint\n instance.initialize();\n\n // Get the channel controller\n const controller = instance.getChannelController();\n\n // Register controller with broadcaster (if it supports this)\n if ('registerController' in config.broadcaster) {\n (\n config.broadcaster as { registerController: (c: BaseChannelController) => void }\n ).registerController(controller);\n }\n\n // Store endpoint and controller\n StreamRegistry._endpoints.set(endpointKey, instance);\n StreamRegistry._controllers.set(controller.scope, controller);\n\n StreamRegistry.logger.info(`Endpoint initialized: ${endpointKey}`, {\n scope: controller.scope,\n patterns: controller.getPatterns(),\n });\n } catch (error) {\n StreamRegistry.logger.error(`Failed to initialize endpoint: ${endpointKey}`, { error });\n throw error;\n }\n }\n\n StreamRegistry._initialized = true;\n StreamRegistry.logger.info('StreamRegistry initialized', {\n endpoints: [...StreamRegistry._endpoints.keys()],\n controllers: [...StreamRegistry._controllers.keys()],\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Endpoint Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get an endpoint by key (synchronous).\n *\n * @param key - Endpoint key\n * @returns Endpoint instance\n * @throws StreamPackageError if endpoint not found\n *\n * @example\n * ```typescript\n * const filesEndpoint = StreamRegistry.get<FilesStreamEndpoint>('files');\n * ```\n */\n static get<T extends BaseStreamEndpoint>(key: string): T {\n const endpoint = StreamRegistry._endpoints.get(key);\n if (!endpoint) {\n throw new StreamPackageError(\n `Stream endpoint '${key}' not found. Register it in StreamRegistry.initialize()`,\n STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND\n );\n }\n return endpoint as T;\n }\n\n /**\n * Get an endpoint by key (async for lazy initialization if needed).\n *\n * @param key - Endpoint key\n * @returns Promise resolving to endpoint instance\n */\n static async getAsync<T extends BaseStreamEndpoint>(key: string): Promise<T> {\n return StreamRegistry.get<T>(key);\n }\n\n /**\n * Check if an endpoint is registered.\n *\n * @param key - Endpoint key\n * @returns true if endpoint is registered\n */\n static has(key: string): boolean {\n return StreamRegistry._endpoints.has(key);\n }\n\n /**\n * Get all registered endpoint keys.\n *\n * @returns Array of endpoint keys\n */\n static getRegisteredKeys(): string[] {\n return [...StreamRegistry._endpoints.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Controller Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a controller by scope.\n *\n * @param scope - Controller scope\n * @returns Controller instance or undefined\n */\n static getController(scope: string): BaseChannelController | undefined {\n return StreamRegistry._controllers.get(scope);\n }\n\n /**\n * Get controller for a channel.\n *\n * @param channel - Channel name\n * @returns Controller that handles the channel, or undefined\n */\n static getControllerForChannel(channel: string): BaseChannelController | undefined {\n for (const controller of StreamRegistry._controllers.values()) {\n if (controller.handlesChannel(channel)) {\n return controller;\n }\n }\n return undefined;\n }\n\n /**\n * Get all registered controller scopes.\n *\n * @returns Array of controller scopes\n */\n static getRegisteredScopes(): string[] {\n return [...StreamRegistry._controllers.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Broadcaster Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the broadcaster instance.\n *\n * @returns Broadcaster instance\n * @throws StreamPackageError if not initialized\n */\n static getBroadcaster(): StreamBroadcasterInterface {\n if (!StreamRegistry._broadcaster) {\n throw new StreamPackageError(\n 'StreamRegistry not initialized. Call StreamRegistry.initialize() first.',\n STREAM_ERROR_CODES.INITIALIZATION_FAILED\n );\n }\n return StreamRegistry._broadcaster;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Status\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if registry is initialized.\n *\n * @returns true if initialized\n */\n static isInitialized(): boolean {\n return StreamRegistry._initialized;\n }\n\n /**\n * Get registry statistics.\n *\n * @returns Statistics object\n */\n static getStats(): {\n initialized: boolean;\n endpointCount: number;\n controllerCount: number;\n endpoints: string[];\n controllers: string[];\n } {\n return {\n initialized: StreamRegistry._initialized,\n endpointCount: StreamRegistry._endpoints.size,\n controllerCount: StreamRegistry._controllers.size,\n endpoints: StreamRegistry.getRegisteredKeys(),\n controllers: StreamRegistry.getRegisteredScopes(),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose all endpoints and reset registry.\n */\n static dispose(): void {\n StreamRegistry.logger.info('Disposing StreamRegistry');\n\n // Dispose all endpoints\n StreamRegistry._endpoints.forEach((endpoint, key) => {\n try {\n endpoint.dispose();\n StreamRegistry.logger.debug(`Disposed endpoint: ${key}`);\n } catch (error) {\n StreamRegistry.logger.error(`Error disposing endpoint: ${key}`, { error });\n }\n });\n\n // Clear all maps\n StreamRegistry._endpoints.clear();\n StreamRegistry._controllers.clear();\n StreamRegistry._broadcaster = null;\n StreamRegistry._initialized = false;\n\n StreamRegistry.logger.info('StreamRegistry disposed');\n }\n\n /**\n * Reset registry (for testing).\n */\n static reset(): void {\n StreamRegistry.dispose();\n }\n}\n","/**\n * Base Stream Endpoint\n *\n * Abstract base class for stream endpoints, following patterns from BaseBackendDomainService.\n * Each endpoint manages a set of channels and their event handlers.\n *\n * @example\n * ```typescript\n * class FilesStreamEndpoint extends BaseStreamEndpoint {\n * static readonly endpointKey = 'files';\n *\n * protected createChannelController(): BaseChannelController {\n * return new FilesChannelController();\n * }\n *\n * initialize(): void {\n * this.channelController.initialize(this.broadcaster);\n * this.logger.info('FilesStreamEndpoint initialized');\n * }\n *\n * static async create(\n * config: StreamEndpointConfig,\n * options: StreamEndpointCreateOptions\n * ): Promise<FilesStreamEndpoint> {\n * return new FilesStreamEndpoint(config, options);\n * }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n StreamEndpointConfig,\n StreamEndpointCreateOptions,\n StreamBroadcasterInterface,\n StreamResponse,\n StreamErrorEvent,\n StreamChannel,\n StreamConnection,\n StreamAuthResult,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { StreamPackageError } from '@plyaz/errors';\nimport type { BaseChannelController } from '../channels/BaseChannelController';\n\n/**\n * BaseStreamEndpoint - Abstract base for stream endpoints\n *\n * Similar to BaseBackendDomainService but for real-time streaming.\n * Provides:\n * - Static create() for initialization (like domain services)\n * - Lifecycle hooks (beforeSubscribe, afterSubscribe, etc.)\n * - Channel controller management\n * - Error handling with standard ErrorResponse format\n * - Response formatting consistent with API patterns\n */\nexport abstract class BaseStreamEndpoint {\n /**\n * Static endpoint key (like serviceKey in domain services).\n * Override in subclass.\n */\n static readonly endpointKey: string;\n\n /** Logger instance */\n protected readonly logger: CoreLogger;\n\n /** Endpoint configuration */\n protected readonly config: StreamEndpointConfig;\n\n /** Broadcaster interface */\n protected readonly broadcaster: StreamBroadcasterInterface;\n\n /** Channel controller for this endpoint */\n protected readonly channelController: BaseChannelController;\n\n /** Unsubscribe functions for cleanup */\n protected readonly unsubscribers: Array<() => void> = [];\n\n constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n this.config = config;\n this.broadcaster = options.broadcaster;\n\n this.logger = new CoreLogger({\n service: `StreamEndpoint:${config.endpointKey}`,\n });\n\n // Create channel controller for this endpoint\n this.channelController = this.createChannelController();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Abstract Methods (must implement)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create the channel controller for this endpoint.\n * Called during construction.\n */\n protected abstract createChannelController(): BaseChannelController;\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n abstract initialize(): void;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static Factory (like domain services)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create endpoint instance.\n * Override in subclass with proper typing.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n\n static async create(\n // eslint-disable-next-line no-unused-vars\n _config: StreamEndpointConfig,\n // eslint-disable-next-line no-unused-vars\n _options: StreamEndpointCreateOptions\n ): Promise<BaseStreamEndpoint> {\n throw new StreamPackageError(\n 'Subclass must implement static create()',\n STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n { context: { endpoint: this.endpointKey ?? 'unknown' } }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (optional - override in subclass)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before a connection subscribes to a channel.\n * Return false to prevent subscription.\n *\n * @param channel - Channel being subscribed to\n * @param connection - Connection subscribing\n * @param authResult - Authentication result for the connection\n * @returns true to allow subscription, false to deny\n */\n protected async beforeSubscribe?(\n channel: StreamChannel,\n connection: StreamConnection,\n authResult: StreamAuthResult\n ): Promise<boolean>;\n\n /**\n * Called after a connection subscribes to a channel.\n *\n * @param channel - Channel subscribed to\n * @param connection - Connection that subscribed\n */\n protected async afterSubscribe?(\n channel: StreamChannel,\n connection: StreamConnection\n ): Promise<void>;\n\n /**\n * Called before a connection unsubscribes from a channel.\n *\n * @param channel - Channel being unsubscribed from\n * @param connectionId - Connection ID unsubscribing\n */\n protected async beforeUnsubscribe?(channel: StreamChannel, connectionId: string): Promise<void>;\n\n /**\n * Called when a new connection is established.\n *\n * @param connection - The new connection\n */\n protected async onConnect?(connection: StreamConnection): Promise<void>;\n\n /**\n * Called when a connection is closed.\n *\n * @param connectionId - ID of the closed connection\n */\n protected async onDisconnect?(connectionId: string): Promise<void>;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Response Helpers (consistent with API patterns)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a success response.\n *\n * @param data - Response data payload\n * @param channel - Channel this response is for\n * @param message - Human-readable message (default: 'Success')\n * @returns Formatted StreamResponse\n */\n protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n return {\n success: true,\n message,\n data,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create an error response using standard ErrorResponse format.\n *\n * @param errors - Array of error details\n * @param channel - Channel this error occurred on\n * @returns Formatted StreamErrorEvent\n */\n protected createErrorResponse(\n errors: Array<{ errorCode: string; message: string; field?: string }>,\n channel: string\n ): StreamErrorEvent {\n // Convert to standard ErrorResponse format\n const errorResponse: ErrorResponse = errors.map(e => ({\n errorCode: e.errorCode,\n message: e.message,\n field: e.field,\n }));\n\n return {\n success: false,\n errors: errorResponse,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get endpoint configuration.\n */\n getConfig(): StreamEndpointConfig {\n return this.config;\n }\n\n /**\n * Get the endpoint key.\n */\n getEndpointKey(): string {\n return this.config.endpointKey;\n }\n\n /**\n * Get channel controller.\n */\n getChannelController(): BaseChannelController {\n return this.channelController;\n }\n\n /**\n * Check if endpoint handles a channel.\n *\n * @param channel - Channel to check\n * @returns true if this endpoint handles the channel\n */\n handlesChannel(channel: StreamChannel): boolean {\n return this.channelController.handlesChannel(channel);\n }\n\n /**\n * Check if endpoint is enabled.\n */\n isEnabled(): boolean {\n return this.config.enabled !== false;\n }\n\n /**\n * Check if endpoint supports the current runtime.\n *\n * @param runtime - Runtime to check\n * @returns true if supported\n */\n supportsRuntime(runtime: 'node' | 'bun' | 'deno' | 'edge'): boolean {\n if (!this.config.supportedRuntimes) return true;\n return this.config.supportedRuntimes.includes(runtime);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose endpoint and cleanup.\n */\n dispose(): void {\n this.logger.debug('Disposing endpoint', { key: this.config.endpointKey });\n\n // Call all unsubscribe functions\n this.unsubscribers.forEach(unsub => {\n try {\n unsub();\n } catch (error) {\n this.logger.error('Error during unsubscribe', { error });\n }\n });\n\n // Clear unsubscribers\n this.unsubscribers.length = 0;\n\n // Dispose channel controller\n this.channelController.dispose();\n\n this.logger.debug('Endpoint disposed', { key: this.config.endpointKey });\n }\n\n /**\n * Add an unsubscribe function to be called on dispose.\n *\n * @param unsub - Unsubscribe function\n */\n protected addUnsubscriber(unsub: () => void): void {\n this.unsubscribers.push(unsub);\n }\n}\n","/**\n * Base Channel Controller\n *\n * Abstract base class for channel event handlers.\n * Each controller manages a specific scope of channels (e.g., 'upload:', 'generate:', 'system').\n *\n * @example\n * ```typescript\n * class FilesChannelController extends BaseChannelController {\n * constructor() {\n * super({\n * scope: 'files',\n * patterns: ['upload:', 'uploads', 'generate:'],\n * });\n * }\n *\n * initialize(broadcaster: StreamBroadcasterInterface): void {\n * this.unsubscribers.push(\n * CoreEventManager.on('files:upload:progress', event => {\n * broadcaster.broadcastToChannel(`upload:${event.data.fileId}`, {\n * event: 'progress',\n * data: this.createResponse(event.data, `upload:${event.data.fileId}`),\n * });\n * })\n * );\n * }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n ChannelControllerConfig,\n StreamBroadcasterInterface,\n StreamResponse,\n StreamErrorEvent,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\n\n/**\n * BaseChannelController - Abstract base for channel event handlers\n *\n * Features:\n * - Pattern matching for channels\n * - Response formatting helpers (consistent with API patterns)\n * - Subscription management with automatic cleanup\n * - Error response using standard ErrorResponse format\n */\nexport abstract class BaseChannelController {\n /** Channel scope (e.g., 'upload', 'generate', 'system') */\n readonly scope: string;\n\n /** Channel patterns this controller handles */\n readonly patterns: string[];\n\n /** Whether controller is enabled */\n readonly enabled: boolean;\n\n /** Logger instance */\n protected readonly logger: CoreLogger;\n\n /** Unsubscribe functions for cleanup */\n protected unsubscribers: Array<() => void> = [];\n\n constructor(config: ChannelControllerConfig) {\n this.scope = config.scope;\n this.patterns = config.patterns;\n this.enabled = config.enabled ?? true;\n\n this.logger = new CoreLogger({\n service: `ChannelController:${config.scope}`,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Abstract Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize event subscriptions.\n * Called when the controller is registered with the broadcaster.\n *\n * @param broadcaster - The broadcaster to send messages through\n */\n abstract initialize(broadcaster: StreamBroadcasterInterface): void;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Channel Matching\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if this controller handles a given channel.\n *\n * @param channel - Channel name to check\n * @returns true if this controller handles the channel\n */\n handlesChannel(channel: string): boolean {\n // Check exact match or scope prefix\n return this.patterns.some(\n pattern => channel === pattern || channel.startsWith(`${this.scope}:`)\n );\n }\n\n /**\n * Get all patterns this controller handles.\n */\n getPatterns(): string[] {\n return [...this.patterns];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Response Helpers (consistent with API ReturnResponseType)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a success response.\n *\n * @param data - Response data payload\n * @param channel - Channel this response is for\n * @param message - Human-readable message (default: 'Success')\n * @returns Formatted StreamResponse\n */\n protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n return {\n success: true,\n message,\n data,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create an error response using standard ErrorResponse format.\n *\n * @param errors - Array of error details\n * @param channel - Channel this error occurred on\n * @returns Formatted StreamErrorEvent\n */\n protected createErrorResponse(\n errors: Array<{ errorCode: string; message: string; field?: string }>,\n channel: string\n ): StreamErrorEvent {\n // Convert to standard ErrorResponse format\n const errorResponse: ErrorResponse = errors.map(e => ({\n errorCode: e.errorCode,\n message: e.message,\n field: e.field,\n }));\n\n return {\n success: false,\n errors: errorResponse,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create a single error response.\n *\n * @param errorCode - Error code\n * @param message - Error message\n * @param channel - Channel this error occurred on\n * @param field - Optional field that caused the error\n * @returns Formatted StreamErrorEvent\n */\n protected createSingleError(\n errorCode: string,\n message: string,\n channel: string,\n field?: string\n ): StreamErrorEvent {\n return this.createErrorResponse([{ errorCode, message, field }], channel);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose controller and cleanup subscriptions.\n */\n dispose(): void {\n this.logger.debug('Disposing controller', { scope: this.scope });\n\n // Call all unsubscribe functions\n this.unsubscribers.forEach(unsub => {\n try {\n unsub();\n } catch (error) {\n this.logger.error('Error during unsubscribe', { error });\n }\n });\n\n this.unsubscribers = [];\n this.logger.debug('Controller disposed', { scope: this.scope });\n }\n\n /**\n * Add an unsubscribe function to be called on dispose.\n *\n * @param unsub - Unsubscribe function\n */\n protected addUnsubscriber(unsub: () => void): void {\n this.unsubscribers.push(unsub);\n }\n}\n","/**\n * Files Channel Controller\n *\n * Handles file-related streaming channels: upload, download, generate.\n * Listens to CoreEventManager events and broadcasts to connected clients.\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type {\n StreamBroadcasterInterface,\n FilesUploadStreamProgress,\n FilesDownloadStreamProgress,\n FilesGenerateStreamProgress,\n CoreEvent,\n} from '@plyaz/types/core';\nimport { FILES_STREAM_CHANNEL_PREFIX, FILES_STREAM_BROADCAST_CHANNEL } from '@plyaz/types/core';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * FilesChannelController - Handles file streaming channels\n *\n * Channels:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - Broadcast channel for all uploads\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - Broadcast channel for all downloads\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - Broadcast channel for all generations\n */\nexport class FilesChannelController extends BaseChannelController {\n constructor() {\n super({\n scope: 'files',\n patterns: [\n // Upload channels\n FILES_STREAM_CHANNEL_PREFIX.UPLOAD,\n FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n // Download channels\n FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD,\n FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n // Generate channels\n FILES_STREAM_CHANNEL_PREFIX.GENERATE,\n FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS,\n ],\n });\n }\n\n /**\n * Initialize event subscriptions.\n * Listens to CoreEventManager events and broadcasts to appropriate channels.\n */\n // eslint-disable-next-line max-lines-per-function\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('[FilesChannelController] initialize() called');\n\n // Listen for upload progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:progress',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n this.logger.debug('[FilesChannelController] Received upload:progress event', {\n fileId: progress.fileId,\n percentage: progress.percentage,\n channel,\n broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n });\n\n // Broadcast to file-specific channel with prefixed event name\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:progress',\n data: this.createResponse(progress, channel, 'Upload progress'),\n });\n\n // Also broadcast to general uploads channel\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:progress',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n });\n }\n )\n );\n\n // Listen for upload completed events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:completed',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:completed',\n data: this.createResponse(progress, channel, 'Upload completed'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:completed',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n });\n }\n )\n );\n\n // Listen for upload error events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:error',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n progress.error ?? 'Upload failed',\n channel\n ),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n progress.error ?? 'Upload failed',\n FILES_STREAM_BROADCAST_CHANNEL.UPLOADS\n ),\n });\n }\n )\n );\n\n // Listen for download progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:progress',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n this.logger.debug('[FilesChannelController] Received download:progress event', {\n fileId: progress.fileId,\n percentage: progress.percentage,\n channel,\n broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n });\n\n // Broadcast to file-specific channel with prefixed event name\n broadcaster.broadcastToChannel(channel, {\n event: 'download:progress',\n data: this.createResponse(progress, channel, 'Download progress'),\n });\n\n // Also broadcast to general downloads channel\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:progress',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n });\n }\n )\n );\n\n // Listen for download completed events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:completed',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'download:completed',\n data: this.createResponse(progress, channel, 'Download completed'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:completed',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n });\n }\n )\n );\n\n // Listen for download error events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:error',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'download:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n progress.error ?? 'Download failed',\n channel\n ),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n progress.error ?? 'Download failed',\n FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS\n ),\n });\n }\n )\n );\n\n // Listen for generate progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesGenerateStreamProgress>(\n 'generate:progress',\n (event: CoreEvent<FilesGenerateStreamProgress>) => {\n const data = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.GENERATE}${data.templateId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'generate:progress',\n data: this.createResponse(data, channel, 'Generation progress'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS, {\n event: 'generate:progress',\n data: this.createResponse(data, FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS),\n });\n }\n )\n );\n\n this.logger.info('FilesChannelController initialized');\n }\n\n /**\n * Override handlesChannel to match file patterns.\n */\n override handlesChannel(channel: string): boolean {\n // Check if channel starts with any of the prefixes\n return (\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.UPLOAD) ||\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD) ||\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.GENERATE) ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.UPLOADS ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS\n );\n }\n}\n","/**\n * Files Stream Endpoint\n *\n * Stream endpoint for file-related real-time events.\n * Handles upload, download, and document generation progress.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { FilesChannelController } from './FilesChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * FilesStreamEndpoint - Handles file streaming events\n *\n * Channels managed:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - All uploads broadcast\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - All downloads broadcast\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - All generations broadcast\n */\nexport class FilesStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'files';\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new FilesChannelController();\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('[FilesStreamEndpoint] initialize() called');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.debug('[FilesStreamEndpoint] initialized', {\n patterns: this.channelController.getPatterns(),\n });\n }\n\n /**\n * Static factory method for creating endpoint instances.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n static async create(\n config: StreamEndpointConfig,\n options: StreamEndpointCreateOptions\n ): Promise<FilesStreamEndpoint> {\n return new FilesStreamEndpoint(config, options);\n }\n}\n","/**\n * System Channel Controller\n *\n * Handles system-level streaming channels: heartbeat, connection lifecycle.\n */\n\nimport { BaseChannelController } from '../../channels/BaseChannelController';\nimport type { StreamBroadcasterInterface } from '@plyaz/types/core';\nimport { SYSTEM_STREAM_CHANNEL } from '@plyaz/types/core';\n\n/**\n * SystemChannelController - Handles system streaming channels\n *\n * Channels:\n * - `system` - System-level events (heartbeat, connected, disconnected)\n */\nexport class SystemChannelController extends BaseChannelController {\n /** Heartbeat interval timer */\n private heartbeatTimer?: ReturnType<typeof setInterval>;\n\n /** Heartbeat interval in milliseconds */\n private readonly heartbeatInterval: number;\n\n constructor(heartbeatInterval = 30000) {\n super({\n scope: 'system',\n patterns: [SYSTEM_STREAM_CHANNEL.SYSTEM],\n });\n this.heartbeatInterval = heartbeatInterval;\n }\n\n /**\n * Initialize event subscriptions.\n * Sets up heartbeat broadcasting.\n */\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('Initializing SystemChannelController');\n\n // Start heartbeat timer\n this.heartbeatTimer = setInterval(() => {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'heartbeat',\n data: this.createResponse(\n { timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Heartbeat'\n ),\n });\n }, this.heartbeatInterval);\n\n this.logger.info('SystemChannelController initialized', {\n heartbeatInterval: this.heartbeatInterval,\n });\n }\n\n /**\n * Override handlesChannel to match system patterns.\n */\n override handlesChannel(channel: string): boolean {\n return channel === SYSTEM_STREAM_CHANNEL.SYSTEM || channel.startsWith('system:');\n }\n\n /**\n * Override dispose to clean up heartbeat timer.\n */\n override dispose(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n }\n super.dispose();\n }\n\n /**\n * Broadcast a connection established event.\n */\n broadcastConnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'connected',\n data: this.createResponse(\n { connectionId, timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Connected'\n ),\n });\n }\n\n /**\n * Broadcast a connection closed event.\n */\n broadcastDisconnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'disconnected',\n data: this.createResponse(\n { connectionId, timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Disconnected'\n ),\n });\n }\n}\n","/**\n * System Stream Endpoint\n *\n * Stream endpoint for system-level events like heartbeat and connection lifecycle.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../base/BaseStreamEndpoint';\nimport { SystemChannelController } from './SystemChannelController';\nimport type { BaseChannelController } from '../../channels/BaseChannelController';\nimport type {\n StreamEndpointConfig,\n StreamEndpointCreateOptions,\n StreamConnection,\n} from '@plyaz/types/core';\n\n/**\n * SystemStreamEndpoint - Handles system-level streaming events\n *\n * Channels managed:\n * - `system` - System events (heartbeat, connected, disconnected)\n */\nexport class SystemStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'system';\n\n /** Heartbeat interval in milliseconds */\n private readonly heartbeatInterval: number;\n\n constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n super(config, options);\n // Allow configuring heartbeat interval via config\n const DEFAULT_HEARTBEAT_MS = 30000;\n this.heartbeatInterval =\n (config as { heartbeatInterval?: number }).heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;\n }\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new SystemChannelController(this.heartbeatInterval);\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('Initializing SystemStreamEndpoint');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.info('SystemStreamEndpoint initialized', {\n heartbeatInterval: this.heartbeatInterval,\n });\n }\n\n /**\n * Called when a new connection is established.\n * Broadcasts a connected event.\n */\n protected override async onConnect(connection: StreamConnection): Promise<void> {\n const controller = this.channelController as SystemChannelController;\n controller.broadcastConnected(this.broadcaster, connection.id);\n }\n\n /**\n * Called when a connection is closed.\n * Broadcasts a disconnected event.\n */\n protected override async onDisconnect(connectionId: string): Promise<void> {\n const controller = this.channelController as SystemChannelController;\n controller.broadcastDisconnected(this.broadcaster, connectionId);\n }\n\n /**\n * Static factory method for creating endpoint instances.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n static async create(\n config: StreamEndpointConfig,\n options: StreamEndpointCreateOptions\n ): Promise<SystemStreamEndpoint> {\n return new SystemStreamEndpoint(config, options);\n }\n}\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Type-safe access to alternative runtime globals\nconst getGlobalProperty = (key: string): unknown => {\n return (globalThis as Record<string, unknown>)[key];\n};\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('Deno') !== 'undefined') return 'deno';\n if (typeof getGlobalProperty('Bun') !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('EdgeRuntime') !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * db: { adapter: 'drizzle' },\n * api: {\n * env: 'production',\n * baseURL: 'https://api.example.com',\n * },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * skipDb: true,\n * api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n * FeatureFlagModule.forRoot({ provider: 'database' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport { StreamRegistry, StreamServer } from '../events/streaming';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\nimport type {\n CoreRuntimeEnvironment,\n CoreRuntimeContext,\n CoreEnvVars,\n CoreAppEnvironment,\n CoreAppContext,\n CoreApiInitOptions,\n CoreServiceRuntime,\n CoreInitOptionsBase as BaseCoreInitOptions,\n CoreServicesResultBase,\n CoreServiceEntry,\n CoreDomainServiceInstance,\n CoreSystemErrorPayload,\n CoreFeatureFlagInitConfig,\n CoreErrorHandlerInitConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n StreamEndpointEntry,\n CoreDbServiceInstance,\n CoreCacheServiceInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\n// Core error handling (frontend-safe)\nimport {\n initializeGlobalErrorHandler,\n setEventEmitter,\n clearEventEmitter,\n} from '@plyaz/errors/middleware';\n// ServerErrorMiddleware is backend-only, import dynamically where needed\nimport type {\n ErrorStoreActions,\n GlobalErrorHandler,\n SerializedError,\n PackageErrorLike,\n} from '@plyaz/types/errors';\nimport { ERROR_CATEGORY } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport { generateId } from '../utils/common';\nimport { createStandaloneFeatureFlagStore, STORE_KEYS, type StoreKey } from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice, RootStoreHook } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\nimport { getCoreDependency } from '../config/dependencies';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n extends Omit<\n BaseCoreInitOptions<\n Partial<CoreDbServiceConfig>,\n CoreApiInitOptions,\n CoreStorageConfig,\n CoreNotificationConfig\n >,\n 'observability' | 'skipObservability'\n > {\n /** Observability configuration */\n observability?: CoreObservabilityConfig;\n /** Skip observability initialization */\n skipObservability?: boolean;\n /**\n * Global error handler configuration.\n * Auto-initializes by default to catch all uncaught errors.\n * Set `enabled: false` to disable if you want to use your own error handling.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * errorHandler: {\n * enabled: true,\n * logToConsole: true,\n * maxErrors: 200,\n * filter: (error) => error instanceof MyError,\n * },\n * });\n * ```\n */\n errorHandler?: CoreErrorHandlerInitConfig;\n\n /** Feature flags configuration */\n featureFlags?: CoreFeatureFlagInitConfig;\n\n /**\n * Domain services to auto-initialize (frontend pattern).\n * Uses ServiceRegistry for automatic initialization.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n * ],\n * });\n *\n * // Access via ServiceRegistry\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * ```\n */\n services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n CoreDbServiceInstance,\n typeof ApiClientService,\n CoreCacheServiceInstance,\n ObservabilityAdapter,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Function type for getting core domain services.\n * Used by entry points to inject runtime-appropriate services.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreDomainServicesFn = (isFrontend: boolean) => Promise<CoreServiceEntry[]>;\n\n/**\n * Injected function to get core domain services.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - they just don't load default services.\n */\nlet _getCoreDomainServices: GetCoreDomainServicesFn | null = null;\n\n/**\n * Set the function to get core domain services.\n * Called by entry-backend.ts to inject the backend-aware service loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreDomainServices(fn: GetCoreDomainServicesFn): void {\n _getCoreDomainServices = fn;\n}\n\n/**\n * Function type for getting core stream endpoints.\n * Used by entry points to inject backend stream endpoints.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreStreamEndpointsFn = () => Promise<StreamEndpointEntry[]>;\n\n/**\n * Injected function to get core stream endpoints.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - streaming is backend-only.\n */\nlet _getCoreStreamEndpoints: GetCoreStreamEndpointsFn | null = null;\n\n/**\n * Set the function to get core stream endpoints.\n * Called by entry-backend.ts to inject the backend stream endpoint loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreStreamEndpoints(fn: GetCoreStreamEndpointsFn): void {\n _getCoreStreamEndpoints = fn;\n}\n\nexport class Core {\n private static initialized = false;\n private static _coreServices: CoreServicesResult = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n\n /**\n * Logger for Core initialization (created lazily)\n */\n private static _logger: PackageLogger | null = null;\n\n /**\n * Logger transport config (set during initialize)\n */\n private static _loggerTransport: 'pino' | 'console' = 'pino';\n\n /**\n * Get or create the Core logger\n */\n private static get logger(): PackageLogger {\n Core._logger ??= new PackageLogger({\n packageName: 'core',\n service: 'Core',\n transport: Core._loggerTransport,\n });\n return Core._logger;\n }\n\n /**\n * Configure logger transport (call before first log)\n */\n private static configureLogger(transport?: 'pino' | 'console'): void {\n if (transport && transport !== Core._loggerTransport) {\n Core._loggerTransport = transport;\n // Reset logger so it gets recreated with new transport\n Core._logger = null;\n }\n }\n\n /**\n * Get the configured logger transport.\n * Used by services to create loggers with the same transport setting.\n */\n static get loggerTransport(): 'pino' | 'console' {\n return Core._loggerTransport;\n }\n\n /**\n * Log a message during initialization.\n * Uses PackageLogger, respects verbose flag.\n */\n private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n if (!verbose) return;\n if (data) {\n Core.logger.info(message, data);\n } else {\n Core.logger.info(message);\n }\n }\n\n /**\n * Log a debug message during initialization.\n */\n private static logDebug(\n message: string,\n verbose?: boolean,\n data?: Record<string, unknown>\n ): void {\n if (!verbose) return;\n if (data) {\n Core.logger.debug(message, data);\n } else {\n Core.logger.debug(message);\n }\n }\n\n /**\n * Observability configuration\n */\n private static _observabilityConfig: CoreObservabilityConfig = {};\n\n /**\n * Global error handler instance\n */\n private static _errorHandler: GlobalErrorHandler | null = null;\n\n /**\n * Error handler configuration\n */\n private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n /**\n * HTTP error handler/middleware based on runtime.\n * Auto-created during initialization.\n */\n private static _httpErrorHandler: unknown = null;\n\n /**\n * Event listener cleanup functions\n */\n private static _eventCleanupFns: (() => void)[] = [];\n\n /**\n * Feature flag configuration\n */\n private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n /**\n * Root store instance (contains errors, feature flags, and all other slices)\n * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n * All store access should go through Core.rootStore - no separate stores needed\n */\n private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n /**\n * Injected store hook for frontend (set via setRootStoreHook before initialize).\n * This is used instead of directly importing from @plyaz/store to prevent\n * duplicate store instances when bundlers create multiple module copies.\n */\n private static _injectedStoreHook: RootStoreHook | null = null;\n\n /**\n * Set the root store hook for frontend use.\n * Must be called before Core.initialize() when running in browser.\n * PlyazProvider calls this automatically with the store prop.\n *\n * @param store - The useRootStore hook from @plyaz/store\n */\n public static setRootStoreHook(store: RootStoreHook): void {\n Core._injectedStoreHook = store;\n }\n\n /**\n * Setup environment and context\n */\n private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n const { envPath, environment, appContext, env, verbose } = options;\n\n Core._coreServices.appContext = appContext ?? 'webapp';\n Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n const globalEnvironment: CoreAppEnvironment =\n environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n Core._coreServices.runtime = detectRuntime();\n Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n if (envPath) await loadEnvFile(envPath, verbose);\n Core._coreServices.env = { ...process.env, ...env };\n\n return globalEnvironment;\n }\n\n /**\n * Initialize a service with error handling\n */\n private static async initService<T>(\n name: string,\n init: () => Promise<T>,\n verbose?: boolean\n ): Promise<T | undefined> {\n try {\n return await init();\n } catch (error) {\n Core.logger.error(`Failed to initialize ${name}`, { error: (error as Error).message });\n if (verbose) Core.logger.error('Full error', { error });\n return undefined;\n }\n }\n\n /** Initialize error handler if enabled */\n private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n const { errorHandler: config, verbose } = options;\n if (config?.enabled === false) {\n Core.log('Global error handler disabled by configuration', verbose);\n return;\n }\n await Core.initService(\n 'error handler',\n async () => {\n await Core.initializeErrorHandler(config, verbose);\n Core.subscribeToErrorEvents(verbose);\n },\n verbose\n );\n }\n\n /** Initialize API client if not skipped */\n private static async initApiIfEnabled(\n options: CoreInitOptions,\n env: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, skipApi, verbose } = options;\n if (skipApi) return;\n\n await Core.initService(\n 'API client',\n async () => {\n await Core.initializeApi(apiConfig, env, verbose);\n Core._coreServices.api = ApiClientService;\n Core.log('API client service initialized', verbose);\n },\n verbose\n );\n Core._coreServices.api = ApiClientService;\n }\n\n /** Initialize cache service if not skipped (backend-only due to ioredis dependency) */\n private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n const { cache: cacheConfig, skipCache, verbose } = options;\n if (skipCache) {\n Core.log('Cache service skipped (skipCache: true)', verbose);\n return;\n }\n\n // Skip cache initialization if no config provided\n if (!cacheConfig) {\n Core.log('Cache service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (CacheService pulls in ioredis which requires Node.js)\n if (Core.isFrontend) {\n Core.log('Cache service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'cache',\n async () => {\n await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n const CacheService = getCoreDependency('CacheService');\n if (CacheService) {\n Core._coreServices.cache = CacheService.getInstance();\n Core.log('Cache service initialized', verbose);\n }\n },\n verbose\n );\n }\n\n /** Initialize observability if not skipped */\n private static async initObservabilityIfEnabled(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { observability: observabilityConfig, skipObservability, verbose } = options;\n if (skipObservability) {\n Core.log('Observability service skipped (skipObservability: true)', verbose);\n return;\n }\n\n // Always use ObservabilityService - it adds LoggerAdapter by default\n const config = observabilityConfig ?? { enabled: true };\n\n await Core.initService(\n 'observability',\n async () => {\n await Core.initializeObservability(config, verbose, globalEnvironment);\n Core.log('Observability service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize storage service if not skipped (backend-only) */\n private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n const { storage: storageConfig, skipStorage, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStorage) {\n Core.log('Storage service skipped (skipStorage: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!storageConfig) {\n Core.log('Storage service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (storage is backend-only)\n if (Core.isFrontend) {\n Core.log('Storage service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'storage',\n async () => {\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n Core.log('Storage service skipped (dependency not registered)', verbose);\n return;\n }\n await StorageService.initialize(storageConfig);\n Core._coreServices.storage = StorageService.getInstance();\n Core.log('Storage service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize notifications service if not skipped (backend-only) */\n private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipNotifications) {\n Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!notificationsConfig) {\n Core.log('Notifications service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (notifications is backend-only)\n if (Core.isFrontend) {\n Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'notifications',\n async () => {\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n Core.log('Notifications service skipped (dependency not registered)', verbose);\n return;\n }\n await NotificationService.initialize(notificationsConfig);\n Core._coreServices.notifications = NotificationService.getInstance();\n Core.log('Notifications service initialized', verbose);\n },\n verbose\n );\n }\n\n /**\n * StreamServer instance (created during streaming initialization)\n */\n private static _streamServer: InstanceType<typeof StreamServer> | null = null;\n\n /**\n * Get the stream server instance (if initialized)\n */\n static get streamServer(): InstanceType<typeof StreamServer> | null {\n return Core._streamServer;\n }\n\n /**\n * Initialize streaming service (SSE/WebSocket real-time events)\n *\n * Sets up StreamServer and StreamRegistry with domain endpoints.\n * Streaming is backend-only for server-sent events.\n *\n * @param options - Core init options with streaming config\n */\n private static async initStreamingIfConfigured(options: CoreInitOptions): Promise<void> {\n const { streaming: streamConfig, skipStreaming, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStreaming) {\n Core.log('Streaming service skipped (skipStreaming: true)', verbose);\n return;\n }\n\n // Skip if no config or disabled\n if (!streamConfig || streamConfig.enabled === false) {\n Core.log('Streaming service skipped (not configured or disabled)', verbose);\n return;\n }\n\n // Skip on frontend (streaming is server-side only)\n if (Core.isFrontend) {\n Core.log('Streaming service skipped (frontend runtime)', verbose);\n return;\n }\n\n await Core.initService(\n 'streaming',\n // eslint-disable-next-line complexity\n async () => {\n // Create stream server with config\n const serverConfig = streamConfig.server ?? {};\n Core._streamServer = StreamServer.create()\n .withSSE({\n heartbeatInterval:\n serverConfig.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS,\n maxConnections: serverConfig.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS,\n })\n .withDefaultChannels(\n (serverConfig.defaultChannels ?? STREAMING_DEFAULTS.DEFAULT_CHANNELS) as never\n )\n .build();\n\n // Initialize server\n Core._streamServer.initialize();\n\n // Get endpoints from config or use injected defaults\n let endpoints = streamConfig.endpoints;\n if (!endpoints && _getCoreStreamEndpoints) {\n endpoints = await _getCoreStreamEndpoints();\n }\n\n // Skip if no endpoints available\n if (!endpoints || endpoints.length === 0) {\n Core.log('Streaming: No endpoints configured, skipping StreamRegistry', verbose);\n return;\n }\n\n // Debug: Log endpoints being registered\n Core.log('Streaming endpoints to register', verbose, {\n count: endpoints.length,\n endpoints: endpoints.map(e => ({\n key: e.endpoint?.endpointKey,\n enabled: e.config?.enabled,\n name: e.config?.name,\n channels: e.config?.channels,\n })),\n });\n\n // Initialize StreamRegistry with endpoints\n await StreamRegistry.initialize({\n broadcaster: Core._streamServer.getBroadcaster(),\n endpoints,\n });\n\n Core.log('Streaming service initialized', verbose, {\n endpoints: StreamRegistry.getRegisteredKeys(),\n channels: serverConfig.defaultChannels ?? ['uploads', 'system'],\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize domain services\n *\n * Loads core domain services using the injected loader (if available),\n * then merges with any user-provided services.\n * User-provided service configs override core defaults.\n *\n * Note: Frontend entries don't inject a loader, so they only use user-provided services.\n */\n private static async initDomainServicesIfConfigured(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, services: userServices, verbose } = options;\n const runtime = Core._coreServices.runtime;\n\n // Load core services using injected loader (backend sets this, frontend doesn't)\n const coreDomainServices = _getCoreDomainServices\n ? await _getCoreDomainServices(Core.isFrontend)\n : [];\n\n // Merge core services with user-provided services\n // User services can override core service configs by using the same service class\n const coreServiceKeys = new Set(coreDomainServices.map(s => s.service.serviceKey));\n const userOverrides = (userServices ?? []).filter(s =>\n coreServiceKeys.has(s.service.serviceKey)\n );\n const additionalUserServices = (userServices ?? []).filter(\n s => !coreServiceKeys.has(s.service.serviceKey)\n );\n\n // Build merged services: core (with overrides applied) + additional user services\n const mergedServices: CoreServiceEntry[] = coreDomainServices\n .map(coreService => {\n const override = userOverrides.find(\n u => u.service.serviceKey === coreService.service.serviceKey\n );\n return override\n ? { ...coreService, config: { ...coreService.config, ...override.config } }\n : coreService;\n })\n .concat(additionalUserServices);\n\n // Skip if somehow no services\n if (mergedServices.length === 0) return;\n\n await Core.initService(\n 'domain services',\n async () => {\n Core.log('Initializing domain services via ServiceRegistry...', verbose);\n Core.logDebug('Core services', verbose, {\n services: coreDomainServices.map(s => s.service.serviceKey),\n });\n if (userServices?.length) {\n Core.logDebug('User services', verbose, {\n services: userServices.map(s => s.service.serviceKey),\n });\n }\n await ServiceRegistry.initialize({\n environment: globalEnvironment,\n runtime,\n apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n db: options.db,\n cache: options.cache,\n storage: options.storage,\n notifications: options.notifications,\n observability: options.observability,\n services: mergedServices,\n stores: {\n // Returns specific slice from namespaced root store (type-safe)\n getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n Core.getDomainStore(key),\n },\n });\n Core.log('Domain services initialized', verbose, {\n keys: ServiceRegistry.getInitializedKeys(),\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize all core services\n */\n\n static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n // Configure logger transport first (before any logs)\n Core.configureLogger(options.logger?.transport);\n\n if (Core.initialized) {\n Core.log('Already initialized, returning existing services', options.verbose);\n return Core._coreServices;\n }\n\n const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n const globalEnvironment = await Core.setupEnvironment(options);\n\n await Core.initErrorHandlerIfEnabled(options);\n\n if (!Core.shouldSkipDbService(skipDb, verbose)) {\n const db = await Core.initService(\n 'database',\n () => Core.initializeDb(dbConfig, verbose),\n verbose\n );\n Core._coreServices.db = db ?? null;\n }\n\n await Core.initApiIfEnabled(options, globalEnvironment);\n\n await Core.initCacheIfEnabled(options);\n\n await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n await Core.initStorageIfEnabled(options);\n\n await Core.initNotificationsIfEnabled(options);\n\n await Core.initStreamingIfConfigured(options);\n\n if (featureFlagsConfig?.enabled !== false) {\n await Core.initService(\n 'feature flags',\n () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n verbose\n );\n }\n\n await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n Core.initialized = true;\n Core.log('Initialization complete', verbose);\n return Core._coreServices;\n }\n\n /**\n * Get initialized domain service keys\n * Use Core.getService(key) or ServiceRegistry.get(key) to access individual services.\n *\n * @example\n * ```typescript\n * const keys = Core.serviceKeys;\n * const exampleService = Core.getService('example');\n * ```\n */\n static get serviceKeys(): string[] {\n return ServiceRegistry.getInitializedKeys();\n }\n\n /**\n * All stores - unified access to ALL slices from single root store\n * All stores (global + domain) are slices of ONE Zustand store instance.\n *\n * **Auto-generated from STORE_KEYS** - No manual registration needed!\n *\n * **Benefits:**\n * - ✅ Access without hooks (store.getState())\n * - ✅ Cross-slice subscriptions work automatically\n * - ✅ Single source of truth\n * - ✅ Automatically scales with new stores\n *\n * @example\n * const errorStore = Core.stores.error; // Global slice\n * const flagsStore = Core.stores.featureFlags; // Global slice\n * const exampleStore = Core.stores.example; // Domain slice\n */\n static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n const rootState = Core._rootStore?.getState();\n\n // Dynamically generate store accessors from STORE_KEYS\n return Object.values(STORE_KEYS).reduce(\n (acc, key) => {\n Object.defineProperty(acc, key, {\n get: () => rootState,\n enumerable: true,\n });\n return acc;\n },\n {} as Record<StoreKey, RootStoreSlice | undefined>\n );\n }\n\n /**\n * Get a specific store slice by key (for ServiceRegistry injection).\n * Returns the actual slice from the namespaced root store.\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice or undefined\n *\n * @example\n * ```typescript\n * const exampleSlice = Core.getDomainStore('example'); // ✅ Returns ExampleFrontendStoreSlice\n * const errorSlice = Core.getDomainStore('errors'); // ✅ Returns ErrorStoreSlice\n * const invalid = Core.getDomainStore('invalid'); // ❌ TypeScript error!\n * ```\n */\n static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n static getDomainStore<T = RootStoreSlice>(): T | undefined;\n static getDomainStore<K extends keyof RootStoreSlice>(\n key?: K\n ): RootStoreSlice[K] | RootStoreSlice | undefined {\n const rootState = Core._rootStore?.getState();\n if (!rootState) return undefined;\n\n // If no key provided, return entire root store\n if (!key) return rootState;\n\n // Return specific slice from namespaced store (type-safe)\n return rootState[key];\n }\n\n /**\n * Event manager for subscribing to domain events\n * @example Core.events.on('example:created', handler)\n */\n static get events(): typeof CoreEventManager {\n return CoreEventManager;\n }\n\n /**\n * Get database service instance\n * @throws Error if not initialized\n */\n static get db(): CoreDbServiceInstance {\n if (!Core._coreServices.db) {\n throw new CorePackageError(\n 'Database service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.db;\n }\n\n /**\n * Get API client service\n */\n static get api(): typeof ApiClientService {\n if (!Core._coreServices.api) {\n throw new CorePackageError(\n 'API client service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.api;\n }\n\n /**\n * Get cache service instance (backend-only)\n * @throws Error if not initialized\n */\n static get cache(): CoreCacheServiceInstance {\n if (!Core._coreServices.cache) {\n throw new CorePackageError(\n 'Cache service not initialized. Call Core.initialize() with cache config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.cache;\n }\n\n /**\n * Get observability adapter instance\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * // Record a metric\n * await Core.observability.recordMetric({\n * type: 'counter',\n * name: 'api.requests',\n * value: 1,\n * tags: { endpoint: '/users' },\n * });\n *\n * // Start a span\n * const span = Core.observability.startSpan({ name: 'processOrder' });\n * try {\n * // ... do work\n * span.setStatus('ok');\n * } catch (e) {\n * span.recordException(e);\n * span.setStatus('error');\n * } finally {\n * span.end();\n * }\n * ```\n */\n static get observability(): ObservabilityAdapter {\n if (!Core._coreServices.observability) {\n throw new CorePackageError(\n 'Observability service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.observability;\n }\n\n /**\n * Check if observability is initialized\n */\n static get isObservabilityInitialized(): boolean {\n return Core._coreServices.observability !== null;\n }\n\n /**\n * Get observability configuration\n */\n static get observabilityConfig(): CoreObservabilityConfig {\n return Core._observabilityConfig;\n }\n\n /**\n * Get storage service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const storage = Core.storage.getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * ```\n */\n static get storage(): CoreStorageServiceInstance {\n if (!Core._coreServices.storage) {\n throw new CorePackageError(\n 'Storage service not initialized. Call Core.initialize() with storage config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.storage;\n }\n\n /**\n * Check if storage is initialized\n */\n static get isStorageInitialized(): boolean {\n return Core._coreServices.storage !== null;\n }\n\n /**\n * Get notifications service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const notifications = Core.notifications.getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * ```\n */\n static get notifications(): CoreNotificationServiceInstance {\n if (!Core._coreServices.notifications) {\n throw new CorePackageError(\n 'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.notifications;\n }\n\n /**\n * Check if notifications is initialized\n */\n static get isNotificationsInitialized(): boolean {\n return Core._coreServices.notifications !== null;\n }\n\n /**\n * Get root store (contains all slices: errors, feature flags, etc.)\n * Use this to access the full store state and all slice actions globally.\n *\n * @example\n * ```typescript\n * // Access error actions\n * const state = Core.rootStore.getState();\n * state.addError({ ... });\n *\n * // Access flags\n * console.log(state.flags);\n *\n * // Subscribe to store changes\n * Core.rootStore.subscribe((state) => {\n * console.log('Errors:', state.errors);\n * console.log('Flags:', state.flags);\n * });\n * ```\n */\n static get rootStore(): StoreApi<RootStoreSlice> {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore;\n }\n\n /**\n * Get global error store actions.\n * Provides access to the error store for querying and managing errors.\n *\n * @example\n * ```typescript\n * // Get all errors\n * const allErrors = useErrorStore.getState().errors;\n *\n * // Clear all errors\n * Core.errors.clearErrors();\n *\n * // Dismiss an error\n * Core.errors.dismissError(errorId);\n * ```\n */\n static get errors(): ErrorStoreActions {\n if (!Core._errorHandler) {\n throw new CorePackageError(\n 'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._errorHandler.getStore();\n }\n\n /**\n * Get feature flags store\n * Provides synchronous access to feature flag values from the store.\n *\n * @example\n * ```typescript\n * // Check if a flag is enabled\n * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n *\n * // Get a flag value\n * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n *\n * // Refresh flags from source\n * await Core.flags.refresh();\n * ```\n */\n static get flags(): FeatureFlagStoreSlice {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n // Return the feature flag slice from root store\n // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n }\n\n /**\n * Check if error handler is initialized\n */\n static get isErrorHandlerInitialized(): boolean {\n return Core._errorHandler !== null;\n }\n\n /**\n * Get the HTTP error handler/middleware based on runtime.\n * Returns different types based on detected runtime:\n *\n * - **Express**: Error handler middleware function\n * ```typescript\n * app.use(Core.httpErrorHandler);\n * ```\n *\n * - **NestJS**: Exception filter class\n * ```typescript\n * app.useGlobalFilters(new (Core.httpErrorHandler)());\n * ```\n *\n * - **Next.js**: Object with App Router and Pages Router handlers\n * ```typescript\n * // App Router\n * export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n * // Pages Router\n * export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n * ```\n *\n * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n * ```typescript\n * Core.httpErrorHandler.handleError(error, req, res);\n * ```\n *\n * - **Browser**: null (no HTTP handler needed)\n *\n * @returns The HTTP error handler for the current runtime\n */\n static get httpErrorHandler(): unknown {\n return Core._httpErrorHandler;\n }\n\n /**\n * Check if feature flags are initialized\n */\n static get isFlagsInitialized(): boolean {\n return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n }\n\n /**\n * Get error handler configuration\n */\n static get errorConfig(): CoreErrorHandlerInitConfig {\n return Core._errorConfig;\n }\n\n /**\n * Get feature flag configuration\n */\n static get flagConfig(): CoreFeatureFlagInitConfig {\n return Core._flagConfig;\n }\n\n /**\n * Get loaded environment variables\n */\n static get env(): CoreEnvVars {\n return Core._coreServices.env;\n }\n\n /**\n * Get detected runtime environment\n */\n static get runtime(): CoreRuntimeEnvironment {\n return Core._coreServices.runtime;\n }\n\n /**\n * Get current app context\n */\n static get appContext(): CoreAppContext {\n return Core._coreServices.appContext;\n }\n\n /**\n * Check if Core is initialized\n */\n static get isInitialized(): boolean {\n return Core.initialized;\n }\n\n /**\n * Check if running on a backend runtime\n */\n static get isBackend(): boolean {\n return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Check if running on a frontend runtime\n */\n static get isFrontend(): boolean {\n return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Get runtime context (backend, frontend, or universal)\n * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n */\n static getRuntimeContext(): CoreRuntimeContext {\n if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'backend';\n }\n if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'frontend';\n }\n return 'universal';\n }\n\n /**\n * Assert that the current runtime matches the expected runtime(s)\n * Throws an error if the runtime doesn't match\n *\n * @param expected - Expected runtime(s) to check against\n * @param serviceName - Name of the service for error message\n * @throws CorePackageError if runtime doesn't match\n *\n * @example\n * ```typescript\n * // Assert backend-only\n * Core.assertRuntime('backend', 'DatabaseService');\n *\n * // Assert multiple runtimes\n * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n * ```\n */\n static assertRuntime(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n serviceName: string\n ): void {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n // Check if current context matches any of the expected runtimes\n const isAllowed = runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n // Universal context (SSR) can run both frontend and backend code\n if (currentContext === 'universal') return true;\n return false;\n });\n\n if (!isAllowed) {\n throw new CorePackageError(\n `${serviceName} cannot run in ${currentContext} runtime. ` +\n `Allowed runtimes: ${runtimes.join(', ')}. ` +\n `Current runtime: ${Core._coreServices.runtime}`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Check if a service runtime is compatible with current runtime\n * Returns true/false instead of throwing\n *\n * @param expected - Expected runtime(s) to check against\n */\n static isRuntimeCompatible(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n ): boolean {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n return runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n if (currentContext === 'universal') return true;\n return false;\n });\n }\n\n /**\n * Get a registered domain service by key.\n * Convenience method that wraps ServiceRegistry.get().\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n *\n * @example\n * ```typescript\n * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): T {\n return ServiceRegistry.get<T>(key);\n }\n\n /**\n * Get a registered domain service by key with async initialization if needed.\n * Convenience method that wraps ServiceRegistry.getAsync().\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n */\n static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n return ServiceRegistry.getAsync<T>(key);\n }\n\n /**\n * Check if a domain service is registered.\n */\n static hasService(key: string): boolean {\n return ServiceRegistry.has(key);\n }\n\n /**\n * Reset Core (useful for testing)\n */\n // eslint-disable-next-line complexity\n static async reset(): Promise<void> {\n // Close database\n if (Core._coreServices.db) {\n await Core._coreServices.db.getDatabase()?.close?.();\n }\n\n // Dispose cache\n if (Core._coreServices.cache) {\n const CacheService = getCoreDependency('CacheService');\n CacheService?.reset?.();\n }\n\n // Dispose observability\n if (Core._coreServices.observability) {\n await Core._coreServices.observability.shutdown();\n }\n Core._observabilityConfig = {};\n\n // Dispose storage\n if (Core._coreServices.storage) {\n await Core._coreServices.storage.close();\n const StorageService = getCoreDependency('StorageService');\n await StorageService?.reset?.();\n }\n\n // Dispose notifications\n if (Core._coreServices.notifications) {\n await Core._coreServices.notifications.close();\n const NotificationService = getCoreDependency('NotificationService');\n await NotificationService?.reset?.();\n }\n\n // Dispose streaming\n if (Core._streamServer) {\n Core._streamServer.dispose();\n Core._streamServer = null;\n }\n StreamRegistry.dispose();\n\n // Dispose error handler\n if (Core._errorHandler) {\n Core._errorHandler.destroy();\n Core._errorHandler = null;\n clearEventEmitter(); // Clean up global error handler's CoreEventManager integration\n BaseError.clearEventEmitter(); // Clean up BaseError auto-emit integration\n }\n Core._errorConfig = {};\n Core._httpErrorHandler = null;\n\n // Cleanup event listeners\n for (const cleanup of Core._eventCleanupFns) {\n cleanup();\n }\n Core._eventCleanupFns = [];\n\n // Dispose feature flags slice and reset files store from root store\n if (Core._rootStore) {\n const state = Core._rootStore.getState();\n if (state.featureFlags?.dispose) {\n state.featureFlags.dispose();\n }\n // Reset files store slice\n if (state.files?.reset) {\n state.files.reset();\n }\n Core._rootStore = null;\n }\n Core._flagConfig = {};\n\n // Dispose all registered services via ServiceRegistry\n ServiceRegistry.disposeAll();\n\n // Dispose event manager\n CoreEventManager.dispose();\n\n Core._coreServices = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n Core.initialized = false;\n }\n\n /**\n * Determines whether to skip DbService initialization.\n *\n * DbService is backend-only and should never be initialized on frontend runtimes.\n * This method:\n * - Returns true (skip) if skipDb was explicitly set to true\n * - Returns true (skip) if running on frontend, with a warning\n * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n *\n * @param skipDb - User-provided skipDb option\n * @param verbose - Enable verbose logging\n * @returns true if DbService should be skipped\n */\n private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n // User explicitly requested to skip\n if (skipDb === true) {\n Core.log('Database service skipped (skipDb: true)', verbose);\n return true;\n }\n\n // Check if running on frontend\n const isFrontend = Core.isFrontend;\n\n if (isFrontend) {\n // User explicitly tried to init DbService on frontend (skipDb: false)\n if (skipDb === false) {\n Core.logger.warn(\n 'DbService cannot be initialized on frontend runtime. ' +\n 'DbService is backend-only and requires Node.js. ' +\n 'Use API calls from frontend instead. Skipping database initialization.'\n );\n } else if (verbose) {\n // skipDb was undefined (default) - just log that we're skipping\n Core.log(\n 'Database service skipped (frontend runtime detected). ' +\n 'DbService is only available on backend.',\n verbose\n );\n }\n return true;\n }\n\n // Backend or universal runtime - don't skip\n return false;\n }\n\n /**\n * Initialize database service\n * Config validation is handled by DbService\n */\n private static async initializeDb(\n config?: Partial<CoreDbServiceConfig>,\n verbose?: boolean\n ): Promise<CoreDbServiceInstance> {\n Core.log(`Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`, verbose);\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n throw new CorePackageError(\n 'DbService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return DbService.initialize({\n adapter: 'drizzle',\n ...config,\n } as CoreDbServiceConfig);\n }\n\n /**\n * Initialize API client service\n * Config validation is handled by ApiClientService\n */\n private static async initializeApi(\n config?: CoreApiInitOptions,\n globalEnvironment?: CoreAppEnvironment,\n verbose?: boolean\n ): Promise<void> {\n const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n Core.log(`Initializing API client for environment: ${resolvedEnv}`, verbose);\n\n await ApiClientService.init(\n {\n env: resolvedEnv,\n setAsDefault: setAsDefault ?? true,\n },\n apiClientOptions\n );\n }\n\n /**\n * Initialize cache service (backend-only)\n * Config validation is handled by CacheService\n */\n private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n Core.log(`Initializing cache with strategy: ${config.strategy}`, verbose);\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n throw new CorePackageError(\n 'CacheService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n await CacheService.initialize(config);\n }\n\n /**\n * Initialize observability service based on config.\n * Always includes LoggerAdapter as failover for console output.\n */\n private static async initializeObservability(\n config: CoreObservabilityConfig,\n verbose?: boolean,\n environment?: CoreAppEnvironment\n ): Promise<void> {\n Core.log(`Initializing observability with provider: ${config.provider ?? 'auto'}`, verbose);\n\n // Use environment from config or passed parameter\n const env = config.environment ?? environment ?? 'development';\n Core._observabilityConfig = { ...config, environment: env };\n\n // Collect adapters with priorities\n const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n // Always add LoggerAdapter as failover for console output\n const loggerAdapter = new LoggerAdapter();\n await loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n });\n adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n // TODO: Add DatadogAdapter when configured (high priority, primary)\n // if (config.provider === 'datadog' || config.datadog) {\n // const datadogAdapter = new DatadogAdapter();\n // await datadogAdapter.initialize({\n // ...config,\n // ...config.datadog,\n // environment: env,\n // });\n // adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n // }\n\n // Create ObservabilityService with all adapters\n const observability = new ObservabilityService();\n await observability.initialize({\n mode: config.mode ?? 'parallel',\n adapters,\n enabled: config.enabled,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n samplingRate: config.samplingRate,\n flushInterval: config.flushInterval,\n adapterTimeout: config.flushInterval,\n });\n\n Core.log(\n `ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`,\n verbose\n );\n\n Core._coreServices.observability = observability;\n // Set on ServiceRegistry for injection\n ServiceRegistry.setObservabilityInstance(observability);\n }\n\n /**\n * Initialize global error handler\n */\n /** Create and initialize root store (includes error store + all other slices) */\n private static async initializeRootStore(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const isFrontend = typeof window !== 'undefined';\n\n if (isFrontend) {\n if (!Core._injectedStoreHook) {\n throw new CorePackageError(\n 'Root store hook not set. Call Core.setRootStoreHook(useRootStore) before Core.initialize(), ' +\n 'or use PlyazProvider with the store prop: <PlyazProvider store={useRootStore} ...>',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n Core.log('Using frontend root store (Zustand) - injected via setRootStoreHook', verbose);\n // Frontend: use the injected store hook's vanilla store API\n Core._rootStore = Core._injectedStoreHook as unknown as StoreApi<RootStoreSlice>;\n } else {\n Core.log('Creating backend composite store (in-memory)', verbose);\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n throw new CorePackageError(\n 'ServerErrorMiddleware not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Backend: create in-memory error store + feature flag store (NOT Zustand)\n const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n onErrorAdded: config?.onError as ((error: unknown) => void) | undefined,\n });\n\n // Create standalone feature flag store for backend\n const backendFlagStore = createStandaloneFeatureFlagStore();\n\n // Combine error + feature flag stores to match RootStoreSlice interface\n // IMPORTANT: Must use namespaced keys (errors, featureFlags) to match frontend structure\n const compositeStore = {\n errors: backendErrorStore,\n featureFlags: backendFlagStore,\n };\n\n // Wrap backend composite store to match root store interface (getState() pattern)\n Core._rootStore = {\n getState: () => compositeStore,\n subscribe: () => () => {}, // No-op for backend\n destroy: () => {\n backendErrorStore.reset();\n backendFlagStore.dispose?.();\n },\n } as unknown as StoreApi<RootStoreSlice>;\n }\n }\n\n /**\n * Serialize a PackageErrorLike to SerializedError format.\n * Used by BaseError.setEventEmitter() to convert errors for the store.\n */\n private static serializePackageError(error: PackageErrorLike): SerializedError {\n const serviceName = typeof error.context?.service === 'string' ? error.context.service : 'core';\n\n return {\n id: generateId(),\n code: (error.errorCode as SerializedError['code']) ?? ERROR_CODES.UNKNOWN_ERROR,\n message: error.message,\n status: error.statusCode,\n category: error.category ?? ERROR_CATEGORY.Server,\n timestamp: error.timestamp ?? new Date().toISOString(),\n isRetryable: error.retryable ?? false,\n source: serviceName,\n dismissed: false,\n context: {\n correlationId: error.correlationId,\n ...error.context,\n },\n };\n }\n\n /** Get error store actions from root store */\n private static getErrorStoreActions(): ErrorStoreActions {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore.getState().errors;\n }\n\n /** Build global error handler config */\n\n private static buildErrorHandlerConfig(\n config?: CoreErrorHandlerInitConfig\n ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n // Compose filter: skip BaseError instances (they auto-emit via setEventEmitter)\n // then apply user's custom filter if provided\n const baseErrorFilter = (error: unknown): boolean => {\n // Skip BaseError instances - they already emit SYSTEM.ERROR via BaseError.setEventEmitter()\n // This prevents duplicate entries in the error store for uncaught BaseErrors\n if (error instanceof BaseError) {\n return false;\n }\n // Apply user's custom filter if provided\n return config?.filter ? config.filter(error) : true;\n };\n\n return {\n source: config?.source ?? 'global',\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n filter: baseErrorFilter,\n onError: config?.onError,\n logToConsole: config?.logToConsole ?? false,\n };\n }\n\n // eslint-disable-next-line complexity\n private static async initializeErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Error handler disabled by configuration', verbose);\n return;\n }\n\n Core._errorConfig = config ?? {};\n Core.log('Initializing global error handler...', verbose);\n\n // Initialize error system (translations, catalogs)\n // This is safe to call multiple times - it checks if already initialized\n initializeErrorSystem({\n defaultLocale: Core._errorConfig.localization?.defaultLocale,\n fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n });\n\n // Initialize root store (contains error store + all slices)\n await Core.initializeRootStore(Core._errorConfig, verbose);\n\n // Wire up CoreEventManager for automatic error event emission\n // This allows errors captured by the global handler to emit events\n setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n // Wire up BaseError to auto-emit CORE_EVENTS.SYSTEM.ERROR when ANY error is created\n // This covers ALL BaseError subclasses: CorePackageError, DatabasePackageError,\n // ValidationError, ApiPackageError, StoragePackageError, NotificationPackageError, etc.\n BaseError.setEventEmitter(error => {\n const serializedError = Core.serializePackageError(error);\n const serviceName = serializedError.source ?? 'core';\n\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, {\n errors: [serializedError],\n context: serviceName,\n recoverable: error.retryable ?? false,\n } satisfies CoreSystemErrorPayload);\n });\n\n const errorStore = Core.getErrorStoreActions();\n Core._errorHandler = initializeGlobalErrorHandler(\n errorStore,\n Core.buildErrorHandlerConfig(Core._errorConfig)\n );\n\n // Subscribe to SYSTEM.ERROR events and setup store subscriptions\n Core.setupErrorEventSubscription(verbose);\n Core.setupErrorStoreSubscription(verbose);\n\n Core.log('Global error handler initialized with CoreEventManager integration', verbose);\n\n // Auto-create HTTP error handler based on runtime (unless disabled)\n if (Core._errorConfig.httpHandler !== false) {\n await Core.createHttpErrorHandler(Core._errorConfig, verbose);\n }\n }\n\n /**\n * Log serialized errors with full details.\n */\n private static logErrors(errors: SerializedError[], prefix = 'ErrorStore'): void {\n for (const err of errors) {\n Core.logger.error(`[${prefix}] ${err.code}: ${err.message}`, {\n id: err.id,\n code: err.code,\n message: err.message,\n category: err.category,\n source: err.source,\n status: err.status,\n isRetryable: err.isRetryable,\n context: err.context,\n timestamp: err.timestamp,\n });\n }\n }\n\n /**\n * Setup SYSTEM.ERROR event subscription for error store updates.\n * Backend: Also logs errors with full details.\n * Frontend: Only updates store (logging handled by store subscription).\n */\n private static setupErrorEventSubscription(verbose?: boolean): void {\n const isBackend = BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n\n const errorEventCleanup = CoreEventManager.on(\n CORE_EVENTS.SYSTEM.ERROR,\n (event: CoreEvent<CoreSystemErrorPayload>) => {\n if (!Core._rootStore) return;\n\n try {\n const { errors } = event.data;\n if (!errors || errors.length === 0) return;\n\n Core._rootStore.getState().errors.addErrors(errors);\n if (isBackend) Core.logErrors(errors);\n Core.log(`Added ${errors.length} error(s) to store`, verbose);\n } catch (e) {\n Core.logger.error('Failed to handle error event', { error: e });\n }\n }\n );\n\n Core._eventCleanupFns.push(errorEventCleanup);\n }\n\n /**\n * Setup error store subscription for frontend logging.\n * Logs new errors when they're added to the store.\n * Only active for non-backend runtimes (browser, nextjs, nuxt, edge).\n */\n private static setupErrorStoreSubscription(verbose?: boolean): void {\n const isFrontend = !BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n if (!isFrontend || !Core._rootStore) return;\n\n let prevErrorCount = 0;\n const storeUnsubscribe = Core._rootStore.subscribe(state => {\n const currentCount = state.errors.errorCount;\n if (currentCount <= prevErrorCount) {\n prevErrorCount = currentCount;\n return;\n }\n const newErrors = state.errors.errors.slice(0, currentCount - prevErrorCount);\n Core.logErrors(newErrors, 'ErrorStore:FE');\n prevErrorCount = currentCount;\n });\n\n Core._eventCleanupFns.push(storeUnsubscribe);\n Core.log('Error store subscription initialized for frontend', verbose);\n }\n\n /**\n * Create HTTP error handler based on detected runtime.\n * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n */\n // eslint-disable-next-line complexity\n private static async createHttpErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const runtime = Core._coreServices.runtime;\n const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n // Skip for browser runtime (no HTTP error handler needed)\n if (runtime === 'browser') {\n Core._httpErrorHandler = null;\n Core.log('Skipping HTTP handler for browser runtime', verbose);\n return;\n }\n\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n Core.log('Skipping HTTP handler (ServerErrorMiddleware not registered)', verbose);\n return;\n }\n\n // Build common config for all HTTP handlers\n const httpConfig = {\n source: runtime,\n includeStack: config?.includeStack ?? !isProduction,\n logErrors: config?.logger ?? config?.logToConsole ?? true,\n errorHandler: Core._errorHandler ?? undefined,\n };\n\n switch (runtime) {\n case 'express':\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log('Created Express error handler middleware', verbose);\n break;\n\n case 'nestjs':\n Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n Core.log('Created NestJS exception filter', verbose);\n break;\n\n case 'nextjs':\n // For Next.js, provide both App Router and Pages Router handlers\n Core._httpErrorHandler = {\n /** For App Router: export const GET = withErrorHandler(handler) */\n withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n ServerErrorMiddleware.withErrorHandler(\n handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n { ...httpConfig, ...overrideConfig }\n ),\n /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n createNextApiErrorHandler: (overrideConfig = {}) =>\n ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n };\n Core.log('Created Next.js error handlers', verbose);\n break;\n\n case 'node':\n case 'bun':\n case 'deno':\n // Generic Node.js handler\n Core._httpErrorHandler = {\n /** Handle error: handleNodeError(error, req, res) */\n handleError: (error: unknown, req: unknown, res: unknown) =>\n ServerErrorMiddleware.handleNodeError(\n error,\n req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n httpConfig\n ),\n /** Create middleware for use with native http */\n createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n };\n Core.log(`Created ${runtime} error handler`, verbose);\n break;\n\n default:\n // For unknown runtimes, provide generic handler\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log(`Created generic HTTP error handler for ${runtime}`, verbose);\n }\n }\n\n /**\n * Subscribe to CoreEventManager error events\n * Forwards entity, API, validation, database, and auth errors to the global error handler.\n *\n * NOTE: SYSTEM.ERROR is NOT subscribed here - it's handled in initializeErrorHandler()\n * via the BaseError.setEventEmitter() + addErrors() pattern to avoid duplicate subscriptions.\n *\n * For non-BaseError errors, domain-specific events (ENTITY.ERROR, API.REQUEST_ERROR, etc.)\n * are captured here. BaseError instances are skipped (they already auto-emit via SYSTEM.ERROR).\n *\n * Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n * DbService is backend-only (skipDb: true on frontend).\n */\n private static subscribeToErrorEvents(verbose?: boolean): void {\n if (!Core._errorHandler) {\n return;\n }\n\n Core.log('Subscribing to error events...', verbose);\n\n // NOTE: SYSTEM.ERROR subscription is in initializeErrorHandler() to avoid duplicates.\n // All BaseError instances auto-emit to SYSTEM.ERROR via BaseError.setEventEmitter(),\n // and that handler adds errors directly via addErrors().\n\n // Helper: subscribe to error event, skip BaseError (already auto-emits via SYSTEM.ERROR)\n const subscribeError = (event: string, source: string): (() => void) => {\n return CoreEventManager.on(event, (e: CoreEvent<{ error?: unknown }>) => {\n if (Core._errorHandler && e.data?.error && !(e.data.error instanceof BaseError)) {\n Core._errorHandler.captureError(e.data.error, source);\n }\n });\n };\n\n // Universal error subscriptions (frontend + backend)\n Core._eventCleanupFns.push(\n subscribeError(CORE_EVENTS.ENTITY.ERROR, 'entity'),\n subscribeError(CORE_EVENTS.API.REQUEST_ERROR, 'api'),\n subscribeError(CORE_EVENTS.VALIDATION.FAILED, 'validation'),\n subscribeError(CORE_EVENTS.AUTH.UNAUTHORIZED, 'auth'),\n subscribeError(CORE_EVENTS.AUTH.SESSION_EXPIRED, 'auth')\n );\n\n // Backend-only error subscriptions\n if (Core.isRuntimeCompatible('backend')) {\n Core._eventCleanupFns.push(\n subscribeError(CORE_EVENTS.DATABASE.ERROR, 'database'),\n subscribeError(CORE_EVENTS.STORAGE.ERROR, 'storage'),\n subscribeError(CORE_EVENTS.NOTIFICATION.ERROR, 'notification'),\n subscribeError(CORE_EVENTS.CACHE.ERROR, 'cache')\n );\n Core.log(\n 'Subscribed to backend error events (database, storage, notification, cache)',\n verbose\n );\n }\n\n const eventTypes = ['entity', 'api', 'validation', 'auth'];\n if (Core.isRuntimeCompatible('backend'))\n eventTypes.push('database', 'storage', 'notification', 'cache');\n Core.log(`Subscribed to domain error events: ${eventTypes.join(', ')}`, verbose);\n }\n\n /** Handle fetch flags error and return empty flags */\n private static handleFetchFlagsError(\n error: unknown,\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Record<string, FeatureFlagValue> {\n if (verbose) Core.logger.error('Failed to fetch feature flags', { error });\n\n // If already a package error, use as-is; otherwise wrap it\n const packageError =\n error instanceof BaseError\n ? (error as CorePackageError)\n : new CorePackageError(\n error instanceof Error ? error.message : String(error),\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n config?.onError?.(packageError);\n return {};\n }\n\n /** Create fetch flags function */\n private static createFetchFlagsFn(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): () => Promise<Record<string, FeatureFlagValue>> {\n // eslint-disable-next-line complexity\n return async () => {\n // Only fetch from API when provider is explicitly 'api'\n // All other providers (memory, undefined) use local defaults\n if (config?.provider !== 'api') {\n Core.log(\n `Feature flags using ${config?.provider ?? 'default'} provider (no API fetch)`,\n verbose\n );\n return config?.defaults ?? {};\n }\n\n try {\n const client = ApiClientService.getClient();\n const endpoint = config?.apiEndpoint ?? '/feature-flags';\n const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to fetch feature flags',\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n );\n }\n\n return response.data?.flags ?? {};\n } catch (error) {\n return Core.handleFetchFlagsError(error, config, verbose);\n }\n };\n }\n\n /**\n * Initialize feature flags slice within root store\n */\n\n // eslint-disable-next-line complexity\n private static async initializeFeatureFlags(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Feature flags disabled by configuration', verbose);\n return;\n }\n\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initializeErrorHandler() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n Core._flagConfig = config ?? {};\n const isApiProvider = config?.provider === 'api';\n Core.log(\n `Initializing feature flags from root store (provider: ${config?.provider ?? 'default'})...`,\n verbose\n );\n\n // Initialize the feature flag slice within the root store\n const state = Core._rootStore.getState();\n await state.featureFlags.initialize({\n defaults: Core._flagConfig.defaults,\n // Only enable polling for API provider\n polling: isApiProvider ? Core._flagConfig.polling : undefined,\n fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n onFlagChange: Core._flagConfig.onFlagChange,\n onError: Core._flagConfig.onError,\n });\n\n Core.log('Feature flags initialized', verbose);\n }\n}\n\n// Export for convenience (excluding server-only services - use backend entry for those)\n// Note: CacheService and DEFAULT_ENCRYPTION_FIELDS are only exported from entry-backend.ts\nexport { ApiClientService };\n","/**\n * ============================================================================\n * NEXT.JS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Next.js App Router API routes with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * export const { GET, POST } = createNextApiRoute({\n * service: 'example',\n * handlers: {\n * GET: async (service, ctx) => service.getAll(),\n * POST: async (service, ctx) => service.create(ctx.body),\n * },\n * });\n * ```\n *\n * @example With full type safety\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * export const { GET, POST } = createNextApiRoute<\n * UserService,\n * { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id), // params.id is typed\n * POST: async (service, { body }) => service.create(body), // body is CreateUserBody\n * },\n * });\n * ```\n *\n * @example With injected services\n * ```typescript\n * export const { POST } = createNextApiRoute({\n * service: 'files',\n * handlers: {\n * POST: async (service, { body, services }) => {\n * // Access Core services\n * const dbRecord = await services.db?.query(...);\n * const cached = await services.cache?.get('key');\n * await services.notifications?.send(...);\n * return service.upload(body);\n * },\n * },\n * });\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n HandlersTypeMap,\n CoreInjectedServices,\n CoreNextJSRouteContext,\n CoreNextJSRouteConfig,\n CoreNextJSRouteExports,\n CoreNextRequestCompat,\n CoreNextRouteContext,\n CoreGenericRouteHandler,\n} from '@plyaz/types/core';\nimport * as ServerErrorMiddleware from '@plyaz/errors/middleware/backend';\n\nimport { ServiceRegistry } from '../../init';\nimport { Core } from '../../init/CoreInitializer';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Next.js request\n */\nfunction parseQueryParams(request: NextRequest): Record<string, string> {\n const query: Record<string, string> = {};\n request.nextUrl.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n}\n\n/**\n * Parse headers from Next.js request\n */\nfunction parseHeaders(request: NextRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n switch (method) {\n case 'POST':\n return HTTP_STATUS.CREATED;\n case 'DELETE':\n return HTTP_STATUS.OK;\n default:\n return HTTP_STATUS.OK;\n }\n}\n\n/**\n * Get injected Core services\n */\nfunction getInjectedServices(): CoreInjectedServices {\n return {\n db: Core.db,\n cache: Core.cache,\n storage: Core.storage,\n notifications: Core.notifications,\n api: Core.api,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service getter function\n */\nfunction createServiceGetter<TService>(\n service: string | (() => Promise<TService>),\n getCore?: () => Promise<unknown>\n): () => Promise<TService> {\n return async () => {\n if (getCore) await getCore();\n if (typeof service === 'function') return service();\n return ServiceRegistry.get(service) as TService;\n };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n db: undefined,\n cache: undefined,\n storage: undefined,\n notifications: undefined,\n api: undefined,\n};\n\n/**\n * Parse request body for mutation methods\n */\nasync function parseMutationBody(request: NextRequest, method: string): Promise<unknown> {\n if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined;\n try {\n return await request.json();\n } catch {\n return undefined;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Next.js App Router API route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD handlers\n */\nexport function createNextApiRoute<\n TService,\n THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreNextJSRouteConfig<TService, THandlerTypes>): CoreNextJSRouteExports {\n const {\n service,\n handlers,\n getCore,\n successMessage,\n errorSource = 'api',\n injectServices = true,\n } = config;\n\n const getService = createServiceGetter(service, getCore);\n\n function createHandler(\n method: string,\n handler: CoreGenericRouteHandler<TService>\n ): (request: NextRequest, context?: CoreNextRouteContext) => Promise<Response> {\n return ServerErrorMiddleware.withErrorHandler(\n async (request: NextRequest, context?: unknown): Promise<Response> => {\n const svc = await getService();\n const routeContext = context as CoreNextRouteContext | undefined;\n const params = routeContext?.params ? await routeContext.params : {};\n const query = parseQueryParams(request);\n const headers = parseHeaders(request);\n const body = await parseMutationBody(request, method);\n const services = injectServices ? getInjectedServices() : emptyServices;\n\n const ctx: CoreNextJSRouteContext = {\n params,\n query,\n headers,\n method,\n request: request as unknown as CoreNextRequestCompat,\n body,\n services,\n };\n\n const result = await handler(svc, ctx);\n const status = getStatusForMethod(method);\n const message = getSuccessMessage(method, successMessage);\n\n return Response.json(SuccessResponseStandard(message, result, status), { status });\n },\n { source: errorSource, includeStack: process.env.NODE_ENV !== 'production', logErrors: true }\n );\n }\n\n const exports: CoreNextJSRouteExports = {};\n const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n for (const method of handlerKeys) {\n const handler = handlers[method];\n if (handler) {\n exports[method] = createHandler(\n method,\n handler as CoreGenericRouteHandler<TService>\n ) as CoreNextJSRouteExports[typeof method];\n }\n }\n\n return exports;\n}\n","/**\n * Next.js Route Helpers\n *\n * Utility functions for working with Next.js API routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().default(10),\n * search: z.string().optional(),\n * });\n *\n * export async function GET(request: NextRequest) {\n * const { page, limit, search } = extractQueryParams(request, querySchema);\n * // Use typed params...\n * }\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * export async function POST(request: NextRequest) {\n * const body = await extractJsonBody(request, createUserSchema);\n * // body is typed as { name: string; email: string }\n * }\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n parse: (data: unknown) => T;\n safeParse: (\n data: unknown\n ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(request);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(request, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(request: NextRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(request: NextRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n const params: Record<string, string> = {};\n\n request.nextUrl.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n if (schema) {\n return schema.parse(params);\n }\n\n return params;\n}\n\n/**\n * Extract and parse JSON body from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If body parsing or validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = await extractJsonBody(request);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * role: z.enum(['admin', 'user']).default('user'),\n * });\n *\n * const body = await extractJsonBody(request, schema);\n * // body: { name: string; email: string; role: 'admin' | 'user' }\n * ```\n */\nexport async function extractJsonBody<T>(\n request: NextRequest,\n schema: ZodLikeSchema<T>\n): Promise<T>;\nexport async function extractJsonBody(request: NextRequest): Promise<unknown>;\nexport async function extractJsonBody<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): Promise<T | unknown> {\n const body = await request.json();\n\n if (schema) {\n return schema.parse(body);\n }\n\n return body;\n}\n\n/**\n * Safely extract and parse JSON body from a Next.js request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = await safeExtractJsonBody(request, schema);\n * if (!body) {\n * return Response.json({ error: 'Invalid request body' }, { status: 400 });\n * }\n * ```\n */\nexport async function safeExtractJsonBody<T>(\n request: NextRequest,\n schema: ZodLikeSchema<T>\n): Promise<T | null>;\nexport async function safeExtractJsonBody(request: NextRequest): Promise<unknown | null>;\nexport async function safeExtractJsonBody<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): Promise<T | unknown | null> {\n try {\n const body = await request.json();\n\n if (schema) {\n const result = schema.safeParse(body);\n if (result.success) {\n return result.data;\n }\n return null;\n }\n\n return body;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract route parameters from Next.js context.\n * Handles the async params pattern in Next.js App Router.\n *\n * @param context - Next.js route context with async params\n * @returns Resolved params object\n *\n * @example\n * ```typescript\n * // app/api/users/[id]/route.ts\n * export async function GET(request: NextRequest, context: { params: Promise<{ id: string }> }) {\n * const { id } = await extractRouteParams(context);\n * // id: string\n * }\n * ```\n */\nexport async function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n context: { params: Promise<T> } | { params: T } | undefined\n): Promise<T> {\n if (!context) {\n return {} as T;\n }\n\n if (context.params instanceof Promise) {\n return context.params;\n }\n\n return context.params;\n}\n\n/**\n * Extract headers from a Next.js request as a plain object.\n *\n * @param request - Next.js request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(request);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(request: NextRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return headers;\n}\n\n/**\n * Extract a specific header value from a Next.js request.\n *\n * @param request - Next.js request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(request, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n * return Response.json({ error: 'Unauthorized' }, { status: 401 });\n * }\n * ```\n */\nexport function extractHeader(request: NextRequest, name: string): string | undefined {\n return request.headers.get(name) ?? undefined;\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param request - Next.js request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(request);\n * if (!token) {\n * return Response.json({ error: 'No token provided' }, { status: 401 });\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(request: NextRequest): string | null {\n const auth = request.headers.get('authorization');\n\n if (!auth?.startsWith('Bearer ')) {\n return null;\n }\n\n return auth.slice(BEARER_PREFIX_LENGTH);\n}\n","/**\n * Express Framework Utilities\n *\n * Factory functions for creating Express route handlers with minimal boilerplate.\n * Types are available from '@plyaz/types/core'.\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n * import type { CoreExpressRouteConfig } from '@plyaz/types/core';\n *\n * const routes = createExpressRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service) => service.getAll(),\n * POST: async (service, { body }) => service.create(body),\n * },\n * });\n *\n * app.use('/api/users', routes.handler);\n * ```\n */\n\nexport { createExpressRoute } from './route-factory';\n\n// Request helpers\nexport {\n extractQueryParams,\n extractJsonBody,\n safeExtractJsonBody,\n extractRouteParams,\n extractHeaders,\n extractHeader,\n extractBearerToken,\n} from './helpers';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - CoreExpressRequest, CoreExpressResponse, CoreExpressNextFunction\n// - CoreExpressRouteContext, CoreExpressRouteHandler\n// - CoreExpressRouteConfig, CoreExpressMiddleware, CoreExpressRouteExports\n","/**\n * ============================================================================\n * EXPRESS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Express route handlers with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n *\n * const userRoutes = createExpressRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service, ctx) => service.getAll(),\n * POST: async (service, ctx) => service.create(ctx.body),\n * },\n * });\n *\n * app.use('/api/users', userRoutes.handler);\n * // OR mount individual handlers\n * app.get('/api/users', userRoutes.GET);\n * app.post('/api/users', userRoutes.POST);\n * ```\n *\n * @example With typed body and params\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * const userRoutes = createExpressRoute<\n * UserService,\n * { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id),\n * POST: async (service, { body }) => service.create(body),\n * },\n * });\n * ```\n */\n\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n HandlersTypeMap,\n CoreInjectedServices,\n CoreExpressRequest,\n CoreExpressResponse,\n CoreExpressNextFunction,\n CoreExpressRouteContext,\n CoreExpressRouteConfig,\n CoreExpressMiddleware,\n CoreExpressRouteExports,\n} from '@plyaz/types/core';\n\nimport { ServiceRegistry } from '../../init';\nimport { Core } from '../../init/CoreInitializer';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Express request\n */\nfunction parseQueryParams(req: CoreExpressRequest): Record<string, string> {\n const query: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n query[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n // Take first value for array query params\n query[key] = String(value[0]);\n }\n }\n return query;\n}\n\n/**\n * Parse headers from Express request\n */\nfunction parseHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n headers[key] = value[0];\n }\n }\n return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n switch (method.toUpperCase()) {\n case 'POST':\n return HTTP_STATUS.CREATED;\n case 'DELETE':\n return HTTP_STATUS.OK;\n default:\n return HTTP_STATUS.OK;\n }\n}\n\n/**\n * Get injected Core services\n */\nfunction getInjectedServices(): CoreInjectedServices {\n return {\n db: Core.db,\n cache: Core.cache,\n storage: Core.storage,\n notifications: Core.notifications,\n api: Core.api,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic handler type for internal use\n */\ntype GenericExpressHandler<TService> = (\n service: TService,\n ctx: CoreExpressRouteContext\n) => Promise<unknown>;\n\n/**\n * Create a service getter function\n */\nfunction createServiceGetter<TService>(\n service: string | (() => Promise<TService>),\n getCore?: () => Promise<unknown>\n): () => Promise<TService> {\n return async () => {\n if (getCore) await getCore();\n if (typeof service === 'function') return service();\n return ServiceRegistry.get(service) as TService;\n };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n db: undefined,\n cache: undefined,\n storage: undefined,\n notifications: undefined,\n api: undefined,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Express route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with handler middleware and individual method handlers\n */\nexport function createExpressRoute<\n TService,\n THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreExpressRouteConfig<TService, THandlerTypes>): CoreExpressRouteExports {\n const {\n service,\n handlers,\n getCore,\n successMessage,\n errorSource = 'api',\n injectServices = true,\n } = config;\n\n const getService = createServiceGetter(service, getCore);\n\n function createHandler(\n method: string,\n handler: GenericExpressHandler<TService>\n ): CoreExpressMiddleware {\n return async (\n req: CoreExpressRequest,\n res: CoreExpressResponse,\n next: CoreExpressNextFunction\n ): Promise<void> => {\n try {\n const svc = await getService();\n const query = parseQueryParams(req);\n const headers = parseHeaders(req);\n const services = injectServices ? getInjectedServices() : emptyServices;\n\n const ctx: CoreExpressRouteContext = {\n params: req.params,\n query,\n headers,\n method: req.method,\n request: req,\n body: req.body,\n req,\n res,\n services,\n };\n\n const result = await handler(svc, ctx);\n const status = getStatusForMethod(method);\n const message = getSuccessMessage(method, successMessage);\n\n res.status(status).json(SuccessResponseStandard(message, result, status));\n } catch (error) {\n next(error);\n }\n };\n }\n\n const combinedHandler: CoreExpressMiddleware = async (req, res, next): Promise<void> => {\n const method = req.method.toUpperCase();\n const handler = handlers[method as keyof typeof handlers];\n\n if (!handler) {\n res.status(HTTP_STATUS.METHOD_NOT_ALLOWED).json({\n success: false,\n error: {\n code: 'METHOD_NOT_ALLOWED',\n message: `Method ${method} not allowed`,\n source: errorSource,\n },\n });\n return;\n }\n\n await createHandler(method, handler as GenericExpressHandler<TService>)(req, res, next);\n };\n\n const exports: CoreExpressRouteExports = { handler: combinedHandler };\n const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n for (const method of handlerKeys) {\n const handler = handlers[method];\n if (handler) {\n exports[method] = createHandler(method, handler as GenericExpressHandler<TService>);\n }\n }\n\n return exports;\n}\n","/**\n * Express Route Helpers\n *\n * Utility functions for working with Express routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().default(10),\n * search: z.string().optional(),\n * });\n *\n * app.get('/users', (req, res) => {\n * const { page, limit, search } = extractQueryParams(req, querySchema);\n * // Use typed params...\n * });\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * app.post('/users', (req, res) => {\n * const body = extractJsonBody(req, createUserSchema);\n * // body is typed as { name: string; email: string }\n * });\n * ```\n */\n\nimport type { CoreExpressRequest } from '@plyaz/types/core';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n parse: (data: unknown) => T;\n safeParse: (\n data: unknown\n ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from an Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(req);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(req, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(req: CoreExpressRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n params[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n params[key] = String(value[0]);\n }\n }\n\n if (schema) {\n return schema.parse(params);\n }\n\n return params;\n}\n\n/**\n * Extract and parse JSON body from an Express request.\n * NOTE: Requires body-parser middleware to be configured.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = extractJsonBody(req);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * const body = extractJsonBody(req, schema);\n * // body: { name: string; email: string }\n * ```\n */\nexport function extractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractJsonBody(req: CoreExpressRequest): unknown;\nexport function extractJsonBody<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | unknown {\n const body = req.body;\n\n if (schema) {\n return schema.parse(body);\n }\n\n return body;\n}\n\n/**\n * Safely extract and parse JSON body from an Express request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = safeExtractJsonBody(req, schema);\n * if (!body) {\n * res.status(400).json({ error: 'Invalid request body' });\n * return;\n * }\n * ```\n */\nexport function safeExtractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T | null;\nexport function safeExtractJsonBody(req: CoreExpressRequest): unknown | null;\nexport function safeExtractJsonBody<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | unknown | null {\n try {\n const body = req.body;\n\n if (schema) {\n const result = schema.safeParse(body);\n if (result.success) {\n return result.data;\n }\n return null;\n }\n\n return body;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract route parameters from Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Params object\n *\n * @example\n * ```typescript\n * // app/api/users/:id\n * app.get('/users/:id', (req, res) => {\n * const { id } = extractRouteParams(req);\n * // id: string\n * });\n * ```\n */\nexport function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T {\n if (schema) {\n return schema.parse(req.params);\n }\n return req.params as T;\n}\n\n/**\n * Extract headers from an Express request as a plain object.\n *\n * @param req - Express request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(req);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n headers[key] = value[0];\n }\n }\n\n return headers;\n}\n\n/**\n * Extract a specific header value from an Express request.\n *\n * @param req - Express request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(req, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n * res.status(401).json({ error: 'Unauthorized' });\n * return;\n * }\n * ```\n */\nexport function extractHeader(req: CoreExpressRequest, name: string): string | undefined {\n return req.get(name);\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param req - Express request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(req);\n * if (!token) {\n * res.status(401).json({ error: 'No token provided' });\n * return;\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(req: CoreExpressRequest): string | null {\n const auth = req.get('authorization');\n\n if (!auth?.startsWith('Bearer ')) {\n return null;\n }\n\n return auth.slice(BEARER_PREFIX_LENGTH);\n}\n"]}
1
+ {"version":3,"sources":["../../src/frameworks/base/index.ts","../../src/frameworks/base/route-handler.ts","../../src/frameworks/nextjs/index.ts","../../src/frameworks/nextjs/config.ts","../../src/utils/common/id.ts","../../src/events/CoreEventManager.ts","../../src/services/ApiClientService.ts","../../src/base/observability/BaseAdapter.ts","../../src/base/observability/LoggerAdapter.ts","../../src/base/observability/ObservabilityService.ts","../../src/config/dependencies.ts","../../src/init/ServiceRegistry.ts","../../src/events/streaming/StreamConnectionManager.ts","../../src/events/streaming/StreamBroadcaster.ts","../../src/events/streaming/auth/BaseAuthAdapter.ts","../../src/events/streaming/auth/adapters/AnonymousAuthAdapter.ts","../../src/events/streaming/transports/BaseTransportAdapter.ts","../../src/events/streaming/transports/adapters/SSETransportAdapter.ts","../../src/events/streaming/frameworks/BaseFrameworkAdapter.ts","../../src/events/streaming/frameworks/NextJSFrameworkAdapter.ts","../../src/events/streaming/frameworks/ExpressFrameworkAdapter.ts","../../src/events/streaming/frameworks/NestJSFrameworkAdapter.ts","../../src/events/streaming/StreamServer.ts","../../src/events/streaming/StreamRegistry.ts","../../src/events/streaming/base/BaseStreamEndpoint.ts","../../src/events/streaming/channels/BaseChannelController.ts","../../src/domain/files/streaming/FilesChannelController.ts","../../src/domain/files/streaming/FilesStreamEndpoint.ts","../../src/events/streaming/endpoints/system/SystemChannelController.ts","../../src/events/streaming/endpoints/system/SystemStreamEndpoint.ts","../../src/utils/runtime.ts","../../src/init/CoreInitializer.ts","../../src/frameworks/nextjs/route-factory.ts","../../src/frameworks/nextjs/helpers.ts","../../src/frameworks/express/index.ts","../../src/frameworks/express/route-factory.ts","../../src/frameworks/express/helpers.ts"],"names":["DEFAULT_SUCCESS_MESSAGES","EventEmitter","PRODUCTION_CONFIG","STAGING_CONFIG","DEVELOPMENT_CONFIG","setDefaultApiClient","ApiPackageError","PACKAGE_STATUS_CODES","API_ERROR_CODES","OPERATIONS","generateRequestId","ERROR_CODES","ERROR_CATEGORY","HTTP_STATUS","CORE_EVENTS","mergeConfigs","createApiClient","PackageLogger","logger","errors","CorePackageError","OBSERVABILITY_METRICS","BACKEND_RUNTIMES","UNIVERSAL_RUNTIMES","FRONTEND_RUNTIMES","TIME_CONSTANTS","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","StreamPackageError","STREAM_ERROR_CODES","STREAMING_DEFAULTS","CoreLogger","FILES_STREAM_CHANNEL_PREFIX","FILES_STREAM_BROADCAST_CHANNEL","STORAGE_ERROR_CODES","SYSTEM_STREAM_CHANNEL","STORE_KEYS","clearEventEmitter","BaseError","ServerErrorMiddleware","createStandaloneFeatureFlagStore","initializeErrorSystem","setEventEmitter","initializeGlobalErrorHandler","SuccessResponseStandard","exports","extractBearerToken","extractHeader","extractHeaders","extractJsonBody","extractQueryParams","extractRouteParams","safeExtractJsonBody","parseQueryParams","parseHeaders","getStatusForMethod","getInjectedServices","createServiceGetter","emptyServices","BEARER_PREFIX_LENGTH"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Framework Utilities\n *\n * Framework-agnostic interfaces and utilities for route handling.\n */\n\nexport { getSuccessMessage } from './route-handler';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - RouteContext, RouteHandler, RouteHandlerConfig\n// - MethodHandlerTypes, HandlersTypeMap, HttpMethod\n// - DEFAULT_SUCCESS_MESSAGES\n","/**\n * ============================================================================\n * FRAMEWORK-AGNOSTIC ROUTE HANDLER UTILITIES\n * ============================================================================\n *\n * Utility functions for route handlers.\n * Types are in @plyaz/types/core - import them directly from there.\n */\n\nimport { DEFAULT_SUCCESS_MESSAGES } from '@plyaz/types/core';\n\n/**\n * Get the default success message for an HTTP method\n */\nexport function getSuccessMessage(\n method: string,\n customMessage?: string | ((m: string) => string)\n): string {\n if (typeof customMessage === 'function') {\n return customMessage(method);\n }\n return customMessage ?? DEFAULT_SUCCESS_MESSAGES[method] ?? 'Operation successful';\n}\n","/**\n * Next.js Framework Utilities\n *\n * Helpers and utilities for integrating Plyaz with Next.js applications.\n *\n * @example Config helper\n * ```typescript\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * // In next.config.ts\n * export default withPlyazNextConfig({\n * experimental: { serverActions: { bodySizeLimit: '100mb' } },\n * });\n * ```\n *\n * @example Route factory\n * ```typescript\n * import { createNextApiRoute } from '@plyaz/core/frameworks/nextjs';\n *\n * // In app/api/users/[id]/route.ts\n * export const { GET, PATCH, DELETE } = createNextApiRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id),\n * PATCH: async (service, { params, body }) => service.update(params.id, body),\n * DELETE: async (service, { params }) => service.delete(params.id),\n * },\n * });\n * ```\n */\n\n// Config helpers\nexport {\n withPlyazNextConfig,\n plyazServerExternalPackages,\n plyazWebpackClientFallbacks,\n plyazWebpackClientAliases,\n} from './config';\n\n// Route factory\nexport { createNextApiRoute } from './route-factory';\n\n// Request helpers\nexport {\n extractQueryParams,\n extractJsonBody,\n safeExtractJsonBody,\n extractRouteParams,\n extractHeaders,\n extractHeader,\n extractBearerToken,\n} from './helpers';\n","/**\n * ============================================================================\n * NEXT.JS CONFIG HELPERS\n * ============================================================================\n *\n * Helpers for configuring Next.js projects using Plyaz packages.\n * These handle common webpack fallbacks, server external packages, and other\n * configurations needed when using @plyaz/core and related packages.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n * experimental: {\n * serverActions: { bodySizeLimit: '100mb' },\n * },\n * });\n * ```\n */\n\nimport type { NextConfig } from 'next';\nimport type { CorePlyazNextConfigOptions } from '@plyaz/types/core';\n\n/**\n * Packages that should be externalized from the server bundle.\n * These are packages with native dependencies or server-only code.\n */\nexport const plyazServerExternalPackages = [\n // Plyaz packages with native/server dependencies\n '@plyaz/core',\n '@plyaz/storage',\n '@plyaz/notifications',\n '@plyaz/db',\n\n // NestJS (included in @plyaz/core backend)\n '@nestjs/common',\n '@nestjs/core',\n '@nestjs/platform-express',\n 'reflect-metadata',\n\n // Native/binary packages\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'puppeteer-core',\n 'sharp',\n\n // File handling\n 'file-type',\n 'load-esm',\n\n // Redis\n 'ioredis',\n] as const;\n\n/**\n * Webpack fallbacks for client-side bundling.\n * These stub out Node.js modules that might leak into the frontend bundle.\n */\nexport const plyazWebpackClientFallbacks = {\n dns: false,\n net: false,\n tls: false,\n fs: false,\n child_process: false,\n async_hooks: false,\n perf_hooks: false,\n} as const;\n\n/**\n * Packages to alias to false for client-side bundling.\n * These are backend-only packages that should never be in the client bundle.\n */\nexport const plyazWebpackClientAliases = {\n ioredis: false,\n} as const;\n\n/**\n * Wraps a Next.js config with Plyaz-specific settings.\n *\n * This function adds:\n * - Server external packages for @plyaz/* and native modules\n * - Webpack client fallbacks for Node.js modules\n * - Webpack client aliases for backend-only packages\n *\n * @param config - Your Next.js configuration\n * @param options - Optional Plyaz-specific options\n * @returns The wrapped Next.js configuration\n *\n * @example\n * ```typescript\n * // Basic usage\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n * experimental: {\n * serverActions: { bodySizeLimit: '100mb' },\n * },\n * });\n *\n * // With next-intl or other plugins\n * import createNextIntlPlugin from 'next-intl/plugin';\n *\n * const withNextIntl = createNextIntlPlugin();\n * export default withNextIntl(withPlyazNextConfig({ ... }));\n *\n * // With custom options\n * export default withPlyazNextConfig(\n * { ... },\n * {\n * additionalExternalPackages: ['my-native-package'],\n * additionalClientFallbacks: { http: false },\n * }\n * );\n * ```\n */\n// eslint-disable-next-line complexity\nexport function withPlyazNextConfig(\n config: NextConfig,\n options: CorePlyazNextConfigOptions = {}\n): NextConfig {\n const {\n additionalExternalPackages = [],\n additionalClientFallbacks = {},\n additionalClientAliases = {},\n disableDefaultExternalPackages = false,\n disableDefaultClientFallbacks = false,\n } = options;\n\n // Build server external packages list\n const serverExternalPackages = [\n ...(config.serverExternalPackages ?? []),\n ...(disableDefaultExternalPackages ? [] : plyazServerExternalPackages),\n ...additionalExternalPackages,\n ];\n\n // Build client fallbacks\n const clientFallbacks = {\n ...(disableDefaultClientFallbacks ? {} : plyazWebpackClientFallbacks),\n ...additionalClientFallbacks,\n };\n\n // Build client aliases\n const clientAliases = {\n ...plyazWebpackClientAliases,\n ...additionalClientAliases,\n };\n\n return {\n ...config,\n serverExternalPackages,\n webpack: (webpackConfig, context) => {\n // Apply client-side fallbacks and aliases\n if (!context.isServer) {\n webpackConfig.resolve = webpackConfig.resolve ?? {};\n webpackConfig.resolve.fallback = {\n ...webpackConfig.resolve.fallback,\n ...clientFallbacks,\n };\n webpackConfig.resolve.alias = {\n ...webpackConfig.resolve.alias,\n ...clientAliases,\n };\n }\n\n // Call user's webpack config if provided\n return config.webpack?.(webpackConfig, context) ?? webpackConfig;\n },\n };\n}\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * UUID v4 regex pattern.\n * Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check if a string is a valid UUID v4.\n *\n * @param value - The string to check\n * @returns true if the string is a valid UUID\n *\n * @example\n * ```typescript\n * isValidUUID('a1b2c3d4-e5f6-4890-abcd-ef1234567890'); // true\n * isValidUUID('not-a-uuid'); // false\n * isValidUUID('bulk-upload-123456'); // false\n * ```\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n if (!value) return false;\n return UUID_REGEX.test(value);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\n isValidUUID,\n} as const;\n","/**\n * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * error: new Error('Failed'),\n * duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n * userId: '123',\n * method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n private emitter = new EventEmitter();\n private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n constructor() {\n // Increase max listeners for large apps\n this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n }\n\n /**\n * Emit an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param data - Event payload (type-safe when using CORE_EVENTS)\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n *\n * // Custom event\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean {\n const [scope] = eventType.split(':');\n const event: CoreEvent<TData, string> = {\n type: eventType,\n scope: scope ?? 'system',\n timestamp: Date.now(),\n correlationId: this.getCorrelationId(),\n data: data as TData,\n };\n\n // Emit to specific listeners\n this.emitter.emit(eventType, event);\n\n // Emit to wildcard listeners\n this.emitter.emit('*', event);\n\n return true;\n }\n\n /**\n * Subscribe to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler (type-safe when using CORE_EVENTS)\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom event\n * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n * console.log(event.data.custom);\n * });\n * ```\n */\n on<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe once to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n once<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n handler(event);\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n\n this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions\n .get(eventType)!\n .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe to all events in a scope\n *\n * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n * // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n * console.log(`Auth event: ${event.type}`, event.data);\n * });\n * ```\n */\n onScope<TScope extends string = string, TData = unknown>(\n scope: TScope,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n if (event.scope === scope) {\n handler(event);\n }\n };\n return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Remove a specific handler from an event\n *\n * @param eventType - Event type\n * @param handler - Handler to remove\n */\n off<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): void {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Dispose all subscriptions\n */\n dispose(): void {\n this.subscriptions.forEach((handlers, eventType) => {\n handlers.forEach(handler => this.emitter.off(eventType, handler));\n });\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n\n /**\n * Generate correlation ID for event tracing\n */\n private getCorrelationId(): string {\n return generateCorrelationId();\n }\n}\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * WHY THIS IS NEEDED:\n * In Next.js (and similar frameworks with module isolation), different parts of the application\n * can have separate module instances. For example:\n * - API routes may run in isolated module contexts\n * - Hot Module Replacement (HMR) during development creates new module instances\n * - Server Components vs API routes may have different module caches\n *\n * This causes a critical issue: if CoreEventManager is instantiated as a simple module-level\n * singleton (`export const X = new XClass()`), each isolated context gets its OWN instance.\n * Events emitted in one context (e.g., API route) won't reach listeners in another context\n * (e.g., streaming endpoints).\n *\n * THE SOLUTION:\n * Using `globalThis` with `Symbol.for()` ensures a TRUE singleton across all module boundaries:\n * - `globalThis` is the global object in any JavaScript environment (Node.js, browsers, workers)\n * - `Symbol.for('key')` returns the SAME symbol from the global symbol registry, even across\n * different module instances\n * - This combination guarantees ONE instance per process, regardless of how many times the\n * module is loaded\n *\n * WORKS WITH:\n * - Next.js (API routes, server components, middleware)\n * - Express/NestJS/Fastify (single process, but safe for hot reload)\n * - Bun/Deno (same globalThis semantics)\n *\n * DOES NOT HELP WITH:\n * - Truly isolated serverless functions (each invocation = new process)\n * - Multi-process clusters (need Redis pub/sub or similar for cross-process events)\n */\nconst GLOBAL_KEY = Symbol.for('plyaz.CoreEventManager');\n\nfunction getCoreEventManager(): CoreEventManagerClass {\n const globalAny = globalThis as unknown as { [key: symbol]: CoreEventManagerClass };\n\n if (!globalAny[GLOBAL_KEY]) {\n globalAny[GLOBAL_KEY] = new CoreEventManagerClass();\n }\n\n return globalAny[GLOBAL_KEY];\n}\n\nexport const CoreEventManager = getCoreEventManager();\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api/frontend';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api/frontend';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport {\n API_ERROR_CODES,\n PACKAGE_STATUS_CODES,\n OPERATIONS,\n ERROR_CODES,\n ERROR_CATEGORY,\n HTTP_STATUS,\n CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG as Partial<ApiConfig>;\n case 'staging':\n return STAGING_CONFIG as Partial<ApiConfig>;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\n }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n * // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n // Allow empty string '' for same-origin requests (e.g., Next.js API routes on same host)\n // Only require baseURL when it's undefined or null\n if (mergedConfig.baseURL === undefined || mergedConfig.baseURL === null) {\n errors.push('baseURL is required in API configuration (apiConfig parameter)');\n }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED when encryption is enabled in production. ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in production. ' +\n 'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n );\n }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (!mergedConfig.networkAware?.enabled) {\n warnings.push(\n '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n 'Enable it for better user experience on varying network conditions.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in production. ' +\n 'Enable it for production monitoring and alerting.'\n );\n }\n\n if (\n mergedConfig.retry &&\n mergedConfig.retry.attempts !== undefined &&\n mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n ) {\n warnings.push(\n `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n 'Consider increasing to 3-5 for better reliability in production.'\n );\n }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED in staging (aligned with production). ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in staging. ' +\n 'Staging should mirror production for accurate testing.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in staging. ' +\n 'Enable it to test monitoring before production deployment.'\n );\n }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n warnings.push(\n '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n 'Encryption will be skipped in development (this is normal).'\n );\n }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `CoreApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: CoreApiEnvironmentConfig,\n envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n const mapped: Partial<ApiConfig> = {};\n\n // Add API key to headers if provided\n if (envConfig.apiKey) {\n // Extract existing static headers if headers is an object with static property\n const existingStatic =\n envDefaults.headers &&\n typeof envDefaults.headers === 'object' &&\n 'static' in envDefaults.headers &&\n typeof envDefaults.headers.static === 'object'\n ? envDefaults.headers.static\n : {};\n\n mapped.headers = {\n static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n };\n }\n\n // Note: rateLimit from envConfig is not mapped to ApiConfig\n // Rate limiting is typically handled at the server/API gateway level\n // If needed in the future, it should be added to ApiConfig interface first\n\n return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n * { date: '2025-10-16' },\n * { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n envConfig: CoreApiEnvironmentConfig\n): void {\n const shouldSetAsDefault = envConfig.setAsDefault !== false;\n if (shouldSetAsDefault) {\n setDefaultApiClient(client);\n }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n envConfig: CoreApiEnvironmentConfig,\n mergedConfig: ApiClientOptions\n): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required base URL\n validateBaseURL(mergedConfig, errors);\n\n // Environment-specific validation\n if (envConfig.env === 'production') {\n validateProductionEncryption(mergedConfig, errors, warnings);\n validateProductionPerformance(mergedConfig, warnings);\n } else if (envConfig.env === 'staging') {\n validateStagingEncryption(mergedConfig, errors, warnings);\n } else if (envConfig.env === 'development') {\n validateDevelopmentEncryption(mergedConfig, warnings);\n }\n\n // Log warnings (intentional console usage for config validation)\n if (warnings.length > 0) {\n globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n }\n\n // Throw if there are errors\n if (errors.length > 0) {\n throw new ApiPackageError(\n 'service.validation.failed',\n PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n {\n context: {\n operation: OPERATIONS.VALIDATION,\n // Ensure error details conform to ErrorDetail shape (include errorCode)\n errors: errors.map(err => ({\n field: 'config',\n message: err,\n errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n })),\n i18n: {\n errors: errors.join('; '),\n warnings: warnings.join('; '),\n },\n },\n }\n );\n }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n * baseURL: process.env.API_URL!,\n * encryption: {\n * key: {\n * id: 'prod-key-v1',\n * key: process.env.ENCRYPTION_KEY!,\n * algorithm: 'AES-GCM'\n * }\n * },\n * clientEvents: {\n * onRequestStart: (event) => apiStore.trackRequest(event),\n * },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple API client instances with different configurations across API routes.\n */\ninterface ApiClientServiceState {\n instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null;\n isInitializing: boolean;\n initPromise: Promise<void> | null;\n}\n\nconst API_CLIENT_SERVICE_KEY = Symbol.for('plyaz.ApiClientService');\n\nfunction getApiClientServiceState(): ApiClientServiceState {\n const globalAny = globalThis as unknown as { [key: symbol]: ApiClientServiceState };\n if (!globalAny[API_CLIENT_SERVICE_KEY]) {\n globalAny[API_CLIENT_SERVICE_KEY] = {\n instance: null,\n isInitializing: false,\n initPromise: null,\n };\n }\n return globalAny[API_CLIENT_SERVICE_KEY];\n}\n\nexport class ApiClientService {\n // State accessors using globalThis\n private static get instance(): ApiClientWithEvents<ClientEventManager, EndpointsList> | null {\n return getApiClientServiceState().instance;\n }\n private static set instance(\n value: ApiClientWithEvents<ClientEventManager, EndpointsList> | null\n ) {\n getApiClientServiceState().instance = value;\n }\n private static get isInitializing(): boolean {\n return getApiClientServiceState().isInitializing;\n }\n private static set isInitializing(value: boolean) {\n getApiClientServiceState().isInitializing = value;\n }\n private static get initPromise(): Promise<void> | null {\n return getApiClientServiceState().initPromise;\n }\n private static set initPromise(value: Promise<void> | null) {\n getApiClientServiceState().initPromise = value;\n }\n\n /**\n * Build the core error handler for API clients.\n * This handler emits errors to CoreEventManager for global error handling.\n *\n * Handles:\n * - Single errors (network, timeout)\n * - Array of errors from API responses (validation, business logic)\n * - Serialization to unified SerializedError format\n * - Event emission to CORE_EVENTS.SYSTEM.ERROR and CORE_EVENTS.API.REQUEST_ERROR\n *\n * @returns Error handler function compatible with ApiClientOptions.onError\n */\n\n static buildCoreErrorHandler(): (\n error: ResponseError<unknown, unknown, unknown, unknown>\n ) => Promise<void> {\n // eslint-disable-next-line complexity\n return async (error: ResponseError<unknown, unknown, unknown, unknown>): Promise<void> => {\n const requestId = generateRequestId();\n const method = error.config?.method ?? 'UNKNOWN';\n const url = error.config?.url ?? 'unknown';\n\n // CRITICAL: Emit error event to Core\n // Core will handle updating the appropriate store based on runtime context:\n // - Backend: In-memory store (ServerErrorMiddleware)\n // - Frontend: Zustand store (useRootStore)\n try {\n // API returns ErrorResponse (array of error details)\n const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n // If no error details from API, create a fallback error\n if (errorDetails.length === 0) {\n const serializedError = {\n id: requestId,\n code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n },\n };\n\n // Emit single error to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n } else {\n // Convert ErrorResponse (API error details array) to SerializedError[]\n const serializedErrors = errorDetails.map(\n (detail: Record<string, unknown>, index: number) => ({\n id: `${requestId}-${index}`,\n code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: (detail.message as string) ?? error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n field: detail.field as string | undefined,\n valueGiven: detail.valueGiven,\n allowedValues: detail.allowedValues,\n constraints: detail.constraints,\n },\n })\n );\n\n // Emit array of errors to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n }\n } catch (e) {\n // If event emission fails, log but don't break the error flow\n console.error('[ApiClientService] Failed to emit error event:', e);\n }\n\n // Also emit API-specific error event for logging, monitoring, etc.\n ApiClientService.emitApiError(error, {\n method,\n url,\n requestId,\n status: error.status,\n duration: 0,\n });\n };\n }\n\n /**\n * Initialize the API client with environment config and API options\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n * @returns Promise that resolves to the initialized client\n */\n static async init(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n // If already initialized, return existing instance\n if (this.instance) {\n globalThis.console.warn(\n '[ApiClientService] Client already initialized. Returning existing instance.'\n );\n return this.instance;\n }\n\n // If currently initializing, wait for that to complete\n if (this.isInitializing && this.initPromise) {\n await this.initPromise;\n return this.instance!;\n }\n\n // Start initialization\n this.isInitializing = true;\n this.initPromise = this.createClient(envConfig, apiConfig);\n\n try {\n await this.initPromise;\n return this.instance!;\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n * Merges environment-specific defaults with API configuration\n *\n * Merge Priority (lowest to highest):\n * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n * 2. Environment metadata (envConfig - apiKey)\n * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n */\n // eslint-disable-next-line complexity\n private static async createClient(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<void> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n ) as ApiClientOptions;\n\n // Step 5: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 6: Create the client instance with merged configuration\n this.instance = await createApiClient(mergedOptions);\n\n // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n applyDefaultClientSetting(this.instance, envConfig);\n } catch (error) {\n throw new ApiPackageError(\n 'service.initialization.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Get the initialized client instance\n *\n * @throws {ApiPackageError} If client not initialized\n */\n static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n if (!this.instance) {\n throw new ApiPackageError(\n 'service.not_initialized',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n context: {\n operation: OPERATIONS.INITIALIZATION,\n i18n: {\n hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n },\n },\n }\n );\n }\n return this.instance;\n }\n\n /**\n * Check if client is initialized\n */\n static isInitialized(): boolean {\n return this.instance !== null;\n }\n\n /**\n * Reinitialize with new config and options\n */\n static async reinitialize(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n this.dispose();\n return this.init(envConfig, apiConfig);\n }\n\n /**\n * Dispose of the client instance\n */\n static dispose(): void {\n if (this.instance && 'dispose' in this.instance) {\n this.instance.dispose?.();\n }\n this.instance = null;\n this.isInitializing = false;\n this.initPromise = null;\n }\n\n /**\n * Emits an API error event via CoreEventManager.\n * Called when API operations fail to integrate with global error handling.\n *\n * **CRITICAL**: This event emission triggers automatic error state updates.\n * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n * 1. Capture all API errors automatically\n * 2. Update global error state for UI display\n * 3. Ensure individual domain stores remain error-free (only domain data)\n *\n * This is the unified error hook that:\n * - On frontend: Emits event that global error store subscribes to\n * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n *\n * @param error - The error that occurred\n * @param options - Additional context for the error\n * @param options.method - HTTP method (GET, POST, etc.)\n * @param options.url - Request URL\n * @param options.requestId - Unique request identifier\n * @param options.status - HTTP status code (if available)\n * @param options.duration - Request duration in ms\n * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n *\n * @example\n * ```typescript\n * // Global error store setup (in @plyaz/store)\n * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n * errorStore.setError({\n * message: payload.error.message,\n * status: payload.status,\n * url: payload.url,\n * requestId: payload.requestId,\n * });\n * });\n *\n * // Frontend usage - emit to store\n * ApiClientService.emitApiError(error, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * duration: 500,\n * });\n *\n * // Backend usage - emit and rethrow\n * ApiClientService.emitApiError(error, {\n * method: 'POST',\n * url: '/api/orders',\n * requestId: '456',\n * duration: 1200,\n * rethrow: true,\n * });\n * ```\n */\n static emitApiError(\n error: unknown,\n options: {\n method: string;\n url: string;\n requestId: string;\n status?: number;\n duration: number;\n rethrow?: boolean;\n }\n ): void {\n const payload: CoreApiRequestErrorPayload = {\n method: options.method,\n url: options.url,\n requestId: options.requestId,\n status: options.status,\n error,\n duration: options.duration,\n };\n\n CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n // Optionally rethrow for backend error propagation\n if (options.rethrow && error instanceof Error) {\n throw error;\n }\n }\n\n /**\n * Create a dedicated API client instance (NOT the singleton)\n *\n * Use this when you need an isolated client with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n * @returns Promise that resolves to a new dedicated client instance\n *\n * @example\n * ```typescript\n * // Create a dedicated client for feature flags service\n * const flagsClient = await ApiClientService.createInstance(\n * { env: 'production' },\n * {\n * baseURL: 'https://flags.example.com',\n * timeout: 5000,\n * }\n * );\n *\n * // This client is independent from ApiClientService.getClient()\n * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n * ```\n */\n // eslint-disable-next-line complexity\n static async createInstance(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Step 4: Merge user onError with core error handler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n // Step 5: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const mergedOptions = mergeConfigs(envDefaults, envMetadataMapped, {\n ...(apiConfig ?? {}),\n onError: combinedOnError,\n }) as ApiClientOptions;\n\n // Step 6: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 7: Create a NEW client instance (not stored as singleton)\n const dedicatedClient = await createApiClient(mergedOptions);\n\n // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n // that should not become the default client for @plyaz/api services\n\n return dedicatedClient;\n } catch (error) {\n throw new ApiPackageError(\n 'service.instance_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Create a standalone API client with Core error handling.\n *\n * This is a simpler alternative to `createInstance()` that doesn't require\n * environment config. Use this when you just need the error handling without\n * environment-specific defaults (production validation, etc.).\n *\n * **Use cases:**\n * - Domain services that need their own API client\n * - Testing with isolated API clients\n * - Simple client creation without environment setup\n *\n * @param apiConfig - API configuration (baseURL, timeout, etc.)\n * @returns Promise that resolves to a client with Core error handling\n *\n * @example\n * ```typescript\n * // In BaseDomainService or any service\n * const client = await ApiClientService.createStandaloneClient({\n * baseURL: '/api/examples',\n * timeout: 10000,\n * });\n *\n * // Errors are automatically emitted to CoreEventManager\n * const response = await client.get('/items');\n * ```\n */\n static async createStandaloneClient(\n apiConfig: ApiClientOptions\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Get the core error handler (handles single + array errors, emits to Core)\n const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n // Merge user onError with core error handler\n const userOnError = apiConfig.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n // Create client with combined error handler\n const client = await createApiClient({\n ...apiConfig,\n onError: combinedOnError,\n });\n\n return client;\n } catch (error) {\n throw new ApiPackageError(\n 'service.standalone_client_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createInstance(envConfig, apiConfig);\n\nexport const createStandaloneApiClient = (\n apiConfig: ApiClientOptions\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createStandaloneClient(apiConfig);\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n ObservabilityProvider,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n abstract readonly provider: ObservabilityProvider;\n abstract readonly name: string;\n\n protected _isInitialized = false;\n protected _config: ObservabilityAdapterConfig | null = null;\n protected readonly logger: PackageLogger;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityAdapter',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get config(): ObservabilityAdapterConfig | null {\n return this._config;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn(`${this.name} already initialized`);\n return;\n }\n\n this._config = config;\n\n if (config.enabled === false) {\n this.logger.info(`${this.name} disabled by configuration`);\n return;\n }\n\n await this.doInitialize(config);\n this._isInitialized = true;\n this.logger.info(`${this.name} initialized`, {\n provider: this.provider,\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n\n async shutdown(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n\n await this.flush();\n await this.doShutdown();\n this._isInitialized = false;\n this.logger.info(`${this.name} shut down`);\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this._isInitialized) {\n return false;\n }\n return this.doHealthCheck();\n }\n\n // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n protected abstract doShutdown(): Promise<void>;\n protected abstract doHealthCheck(): Promise<boolean>;\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const metricWithDefaults = this.applyDefaultTags(metric);\n await this.doRecordMetric(metricWithDefaults);\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.recordMetric({\n type: 'counter',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'gauge',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'histogram',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n if (!this._isInitialized || this._config?.enabled === false) {\n return this.createNoopSpan(options);\n }\n\n // Apply sampling\n if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n if (Math.random() > this._config.samplingRate) {\n return this.createNoopSpan(options);\n }\n }\n\n return this.doStartSpan(options);\n }\n\n getActiveSpan(): Span | null {\n if (!this._isInitialized) {\n return null;\n }\n return this.doGetActiveSpan();\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const span = this.startSpan(options);\n try {\n const result = await fn(span);\n span.setStatus('ok');\n return result;\n } catch (error) {\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n protected abstract doStartSpan(options: SpanOptions): Span;\n protected abstract doGetActiveSpan(): Span | null;\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const entryWithDefaults = {\n ...entry,\n timestamp: entry.timestamp ?? Date.now(),\n service: entry.service ?? this._config?.serviceName,\n };\n\n await this.doLog(entryWithDefaults);\n }\n\n protected abstract doLog(entry: LogEntry): Promise<void>;\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const eventWithDefaults = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n tags: { ...this._config?.defaultTags, ...event.tags },\n };\n\n await this.doSendEvent(eventWithDefaults);\n }\n\n protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n // ─── Flush ─────────────────────────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n await this.doFlush();\n }\n\n protected abstract doFlush(): Promise<void>;\n\n // ─── Helpers ───────────────────────────────────────────────────────────────\n\n /**\n * Apply default tags to a metric\n */\n protected applyDefaultTags(metric: Metric): Metric {\n if (!this._config?.defaultTags) {\n return metric;\n }\n\n return {\n ...metric,\n tags: {\n ...this._config.defaultTags,\n ...metric.tags,\n },\n };\n }\n\n /**\n * Create a no-op span (for disabled/sampled-out traces)\n */\n // eslint-disable-next-line no-unused-vars\n protected createNoopSpan(_options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n\n return {\n context,\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n readonly provider = 'noop' as const;\n readonly name = 'NoopAdapter';\n\n protected async doInitialize(): Promise<void> {}\n protected async doShutdown(): Promise<void> {}\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n protected async doRecordMetric(): Promise<void> {}\n protected doStartSpan(options: SpanOptions): Span {\n return this.createNoopSpan(options);\n }\n protected doGetActiveSpan(): Span | null {\n return null;\n }\n protected async doLog(): Promise<void> {}\n protected async doSendEvent(): Promise<void> {}\n protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n SpanAttributes,\n SpanEvent,\n SpanStatus,\n ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n readonly provider = 'console' as const;\n readonly name = 'LoggerAdapter';\n\n private observabilityLogger!: PackageLogger;\n private logMetrics = true;\n private logSpans = true;\n private logEvents = true;\n\n protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n const consoleConfig = config as ConsoleAdapterConfig;\n\n // Create dedicated logger for observability output\n this.observabilityLogger = new PackageLogger({\n packageName: 'observability',\n service: config.serviceName ?? 'LoggerAdapter',\n environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n minLevel: consoleConfig.logLevel ?? 'debug',\n });\n\n // All logging enabled by default\n this.logMetrics = true;\n this.logSpans = true;\n this.logEvents = true;\n }\n\n protected async doShutdown(): Promise<void> {\n // Logger doesn't need explicit shutdown\n }\n\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n\n protected async doRecordMetric(metric: Metric): Promise<void> {\n if (!this.logMetrics) return;\n\n this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n metricType: metric.type,\n metricName: metric.name,\n value: 'value' in metric ? metric.value : undefined,\n unit: metric.unit,\n tags: metric.tags,\n });\n }\n\n protected doStartSpan(options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: options.parentContext?.spanId,\n };\n\n const startTime = options.startTime ?? Date.now();\n\n if (this.logSpans) {\n this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n parentSpanId: context.parentSpanId,\n kind: options.kind,\n attributes: options.attributes,\n });\n }\n\n const events: SpanEvent[] = [];\n let attributes: SpanAttributes = { ...options.attributes };\n let status: SpanStatus = 'unset';\n let statusMessage: string | undefined;\n\n const logSpans = this.logSpans;\n const logger = this.observabilityLogger;\n\n return {\n context,\n setAttribute: (key, value) => {\n attributes[key] = value;\n },\n setAttributes: attrs => {\n attributes = { ...attributes, ...attrs };\n },\n addEvent: event => {\n events.push(event);\n if (logSpans) {\n logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n eventAttributes: event.attributes,\n });\n }\n },\n setStatus: (s, message) => {\n status = s;\n statusMessage = message;\n },\n end: endTime => {\n const duration = (endTime ?? Date.now()) - startTime;\n if (logSpans) {\n const logMethod = status === 'error' ? 'warn' : 'debug';\n logger[logMethod](`[SPAN END] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n durationMs: duration,\n status,\n statusMessage,\n attributes,\n eventCount: events.length,\n });\n }\n },\n recordException: error => {\n if (logSpans) {\n logger.error(`[SPAN ERROR] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n error: error.message,\n stack: error.stack,\n });\n }\n },\n };\n }\n\n protected doGetActiveSpan(): Span | null {\n return null; // Logger adapter doesn't track active spans\n }\n\n protected async doLog(entry: LogEntry): Promise<void> {\n const meta = {\n service: entry.service,\n traceId: entry.traceId,\n spanId: entry.spanId,\n ...entry.context,\n };\n\n // Map observability log levels to logger methods\n switch (entry.level) {\n case 'debug':\n this.observabilityLogger.debug(entry.message, meta);\n break;\n case 'info':\n this.observabilityLogger.info(entry.message, meta);\n break;\n case 'warn':\n this.observabilityLogger.warn(entry.message, meta);\n break;\n case 'error':\n this.observabilityLogger.error(entry.message, meta);\n break;\n case 'fatal':\n this.observabilityLogger.fatal(entry.message, meta);\n break;\n }\n }\n\n protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this.logEvents) return;\n\n this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n eventName: event.name,\n properties: event.properties,\n tags: event.tags,\n });\n }\n\n protected async doFlush(): Promise<void> {\n // Logger handles its own buffering/flushing\n }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n OperationContext,\n MonitoringOperationResult,\n AdapterWithPriority,\n AdapterEntry,\n ObservabilityServiceConfig,\n ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n * mode: 'parallel',\n * adapters: [datadogAdapter], // Logger added automatically\n * serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n readonly provider = 'custom' as const;\n readonly name = 'ObservabilityService';\n\n private _isInitialized = false;\n private _config: ObservabilityServiceConfig | null = null;\n private readonly logger: PackageLogger;\n private readonly adapterEntries: AdapterEntry[] = [];\n private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n private readonly noopAdapter = new NoopAdapter();\n private loggerAdapter: LoggerAdapter | null = null;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityService',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Check if service has at least one working adapter\n */\n get isReady(): boolean {\n return this.adapterEntries.some(e => e.adapter.isInitialized);\n }\n\n /**\n * Get all adapters (for compatibility)\n */\n private get adapters(): ObservabilityAdapter[] {\n return this.adapterEntries.map(e => e.adapter);\n }\n\n /**\n * Get initialized adapter entries\n */\n private get initializedEntries(): AdapterEntry[] {\n return this.adapterEntries.filter(e => e.adapter.isInitialized);\n }\n\n /**\n * Get primary (non-failover) initialized adapters\n */\n private get primaryEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => !e.failover);\n }\n\n /**\n * Get failover initialized adapters\n */\n private get failoverEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => e.failover);\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /**\n * Check if input is an adapter with priority config\n */\n private isAdapterWithPriority(\n input: ObservabilityAdapter | AdapterWithPriority\n ): input is AdapterWithPriority {\n return (\n 'adapter' in input &&\n typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n );\n }\n\n /**\n * Normalize adapter input to adapter with priority and failover config\n */\n private normalizeAdapter(\n input: ObservabilityAdapter | AdapterWithPriority,\n defaultPriority: number\n ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n if (this.isAdapterWithPriority(input)) {\n return {\n adapter: input.adapter,\n priority: input.priority ?? defaultPriority,\n failover: input.failover ?? false,\n };\n }\n return { adapter: input, priority: defaultPriority, failover: false };\n }\n\n /**\n * Initialize the observability service.\n * Logger adapter is always added by default unless explicitly disabled.\n * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n */\n async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn('ObservabilityService already initialized');\n return;\n }\n\n this._config = config;\n this.mode = config.mode ?? 'parallel';\n\n // Collect adapters with priorities\n const entries: AdapterEntry[] = [];\n\n // Add provided adapters\n if (config.adapter) {\n entries.push(this.normalizeAdapter(config.adapter, 0));\n }\n if (config.adapters) {\n config.adapters.forEach((a, index) => {\n // Default priority decreases with array position for stable sorting\n entries.push(this.normalizeAdapter(a, -index));\n });\n }\n\n // Always add logger adapter by default (for console output)\n // Unless there's already a console/logger adapter\n const hasLoggerAdapter = entries.some(\n e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n );\n if (!hasLoggerAdapter) {\n this.loggerAdapter = new LoggerAdapter();\n await this.loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: config.environment,\n defaultTags: config.defaultTags,\n });\n // Logger is a failover by default with lowest priority\n entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n }\n\n // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n entries.sort((a, b) => {\n // Primary adapters come before failover\n if (a.failover !== b.failover) {\n return a.failover ? 1 : -1;\n }\n // Within same category, sort by priority (higher first)\n return b.priority - a.priority;\n });\n\n // Store sorted entries\n this.adapterEntries.push(...entries);\n\n this._isInitialized = true;\n\n this.logger.debug('ObservabilityService initialized', {\n mode: this.mode,\n adapterCount: this.adapterEntries.length,\n primaryCount: this.primaryEntries.length,\n failoverCount: this.failoverEntries.length,\n adapters: this.adapterEntries.map(e => ({\n name: e.adapter.name,\n provider: e.adapter.provider,\n priority: e.priority,\n failover: e.failover,\n initialized: e.adapter.isInitialized,\n })),\n });\n }\n\n async shutdown(): Promise<void> {\n await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n this._isInitialized = false;\n this.logger.info('ObservabilityService shut down');\n }\n\n async isHealthy(): Promise<boolean> {\n if (this.adapters.length === 0) {\n return false;\n }\n\n const results = await Promise.all(\n this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n );\n\n // For parallel mode, all must be healthy; for priority/single, at least one\n return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n }\n\n async flush(): Promise<void> {\n await this.executeOnAdapters('flush', adapter => adapter.flush());\n }\n\n // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n private get config(): ObservabilityServiceConfig {\n return this._config ?? {};\n }\n\n private async executeOnAdapters<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>\n ): Promise<void> {\n const entries = this.initializedEntries;\n if (entries.length === 0) {\n return;\n }\n\n const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n switch (this.mode) {\n case 'parallel':\n await this.executeParallelWithFailover(operation, fn, timeout);\n break;\n case 'priority':\n await this.executePriorityWithFailover(operation, fn, timeout);\n break;\n case 'single':\n default:\n await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n break;\n }\n }\n\n private async executeSingle<T>(\n operation: string,\n adapter: ObservabilityAdapter,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n try {\n await this.withTimeout(fn(adapter), timeout);\n } catch (error) {\n this.logger.error(`${operation} failed on ${adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Execute on primary adapters in parallel.\n * If all primary adapters fail, execute on failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executeParallelWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Execute on primary adapters\n if (primary.length > 0) {\n const results = await Promise.allSettled(\n primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n )\n .filter(Boolean);\n\n const allFailed = errors.length === primary.length;\n\n if (errors.length > 0 && !allFailed) {\n this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n }\n\n // If all primary adapters failed, use failover\n if (allFailed && failover.length > 0) {\n this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n return;\n }\n\n if (this.config.failOnAnyError && errors.length > 0) {\n throw new CorePackageError(\n `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n } else if (failover.length > 0) {\n // No primary adapters, use failover directly\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n }\n }\n\n private async executeParallel<T>(\n operation: string,\n adapters: ObservabilityAdapter[],\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const results = await Promise.allSettled(\n adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n )\n .filter(Boolean);\n\n if (errors.length > 0) {\n this.logger.warn(`${operation} failed on some adapters`, { errors });\n }\n }\n\n /**\n * Execute on primary adapters in priority order.\n * If all primary adapters fail, try failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executePriorityWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Try primary adapters first\n for (const entry of primary) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success - stop trying\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Error';\n const shouldFallback =\n !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n if (shouldFallback) {\n this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n throw error;\n }\n }\n\n // All primary failed, try failover adapters\n for (const entry of failover) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success\n } catch (error) {\n this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n // Continue to next failover adapter\n }\n }\n\n this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n }\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.executeOnAdapters('incrementCounter', adapter =>\n adapter.incrementCounter(name, value, tags)\n );\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('recordHistogram', adapter =>\n adapter.recordHistogram(name, value, tags)\n );\n }\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n // For tracing, use first initialized adapter\n const entry = this.initializedEntries[0];\n return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const entry = this.initializedEntries[0];\n if (!entry) {\n return fn(this.noopAdapter.startSpan(options));\n }\n return entry.adapter.withSpan(options, fn);\n }\n\n getActiveSpan(): Span | null {\n const entry = this.initializedEntries[0];\n return entry?.adapter.getActiveSpan() ?? null;\n }\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n await this.executeOnAdapters('log', adapter => adapter.log(entry));\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n }\n\n // ─── Service Operation Tracking ────────────────────────────────────────────\n\n /**\n * Track a service operation with automatic metrics and tracing.\n *\n * @example\n * ```typescript\n * const { result, metrics } = await observability.trackOperation(\n * {\n * serviceName: 'UserService',\n * operation: 'create',\n * entityType: 'user',\n * startTime: Date.now(),\n * },\n * async () => {\n * return await this.repository.create(userData);\n * }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async trackOperation<T>(\n context: OperationContext,\n operation: () => Promise<T>\n ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n const startTime = context.startTime ?? Date.now();\n\n // Start span\n const span = this.startSpan({\n name: `${context.serviceName}.${context.operation}`,\n attributes: {\n 'service.name': context.serviceName,\n 'operation.name': context.operation,\n ...(context.entityType && { 'entity.type': context.entityType }),\n ...(context.entityId && { 'entity.id': context.entityId }),\n ...context.attributes,\n },\n parentContext: context.parentContext,\n });\n\n // Increment operation counter\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n service: context.serviceName,\n operation: context.operation,\n ...(context.entityType && { entity_type: context.entityType }),\n });\n\n try {\n const result = await operation();\n const duration = Date.now() - startTime;\n\n span.setStatus('ok');\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'success',\n });\n\n return {\n result,\n metrics: { success: true, duration, data: result },\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n service: context.serviceName,\n operation: context.operation,\n error_type: error instanceof Error ? error.name : 'UnknownError',\n });\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter],\n * serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n * mode: 'priority',\n * adapters: [datadogAdapter, grafanaAdapter],\n * serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n const service = new ObservabilityService();\n await service.initialize(config);\n return service;\n}\n","/**\n * Core Dependencies Configuration\n *\n * Similar to @plyaz/api's setGlobalConfig pattern.\n * Backend services are registered here by entry points, not imported directly.\n *\n * IMPORTANT: This file must NOT import from backend service files (DbService, CacheService, etc.)\n * as that would cause the bundler to include backend dependencies in the frontend bundle.\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { setCoreDependencies } from './config/dependencies';\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * StorageService,\n * NotificationService,\n * });\n *\n * // entry-frontend.ts\n * // Don't call setCoreDependencies - no backend deps loaded\n * ```\n */\n\nimport type {\n CoreDbServiceStatic,\n CoreCacheServiceStatic,\n CoreStorageServiceStatic,\n CoreNotificationServiceStatic,\n CoreServerErrorMiddlewareStatic,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dependencies Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CoreDependencies {\n DbService?: CoreDbServiceStatic;\n CacheService?: CoreCacheServiceStatic;\n StorageService?: CoreStorageServiceStatic;\n NotificationService?: CoreNotificationServiceStatic;\n ServerErrorMiddleware?: CoreServerErrorMiddlewareStatic;\n}\n\n// Global dependencies container\nlet _dependencies: CoreDependencies = {};\n\n/**\n * Set core dependencies (called by entry points)\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * });\n * ```\n */\nexport function setCoreDependencies(deps: CoreDependencies): void {\n _dependencies = { ..._dependencies, ...deps };\n}\n\n/**\n * Get core dependencies\n */\nexport function getCoreDependencies(): CoreDependencies {\n return _dependencies;\n}\n\n/**\n * Check if a dependency is available\n */\nexport function hasCoreDependency(key: keyof CoreDependencies): boolean {\n return _dependencies[key] !== undefined;\n}\n\n/**\n * Get a specific dependency\n */\nexport function getCoreDependency<K extends keyof CoreDependencies>(\n key: K\n): CoreDependencies[K] | undefined {\n return _dependencies[key];\n}\n\n/**\n * Clear all dependencies (useful for testing)\n */\nexport function clearCoreDependencies(): void {\n _dependencies = {};\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n * ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES, UNIVERSAL_RUNTIMES } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreDomainServiceInstance,\n CoreServiceCreateOptions,\n CoreServiceEntry,\n CoreServiceInitConfig,\n CoreServiceRegistryConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreRuntimeEnvironment,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheManagerInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { createObservabilityService } from '../base/observability';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { getCoreDependency } from '../config/dependencies';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n entry: CoreServiceEntry;\n initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n entry: CoreServiceEntry;\n isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Global Singleton Pattern for Static Class State\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like services being registered in\n * one module context but not accessible from another (e.g., API routes).\n */\n\ninterface ServiceRegistryState {\n services: Map<string, CoreDomainServiceInstance>;\n pending: Map<string, PendingService>;\n metadata: Map<string, ServiceMetadata>;\n environment: 'production' | 'staging' | 'development' | 'test';\n runtime: CoreRuntimeEnvironment;\n apiClientOptions: ApiClientOptions | null;\n dbConfig: Partial<CoreDbServiceConfig> | null;\n cacheConfig: CoreCacheConfig | null;\n observabilityConfig: CoreObservabilityConfig | null;\n observabilityInstance: ObservabilityAdapter | null;\n storageConfig: CoreStorageConfig | null;\n notificationsConfig: CoreNotificationConfig | null;\n storeRegistry: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null;\n initPromises: Map<string, Promise<CoreDomainServiceInstance>>;\n}\n\nconst SERVICE_REGISTRY_KEY = Symbol.for('plyaz.ServiceRegistry');\n\nfunction getServiceRegistryState(): ServiceRegistryState {\n const globalAny = globalThis as unknown as { [key: symbol]: ServiceRegistryState };\n if (!globalAny[SERVICE_REGISTRY_KEY]) {\n globalAny[SERVICE_REGISTRY_KEY] = {\n services: new Map(),\n pending: new Map(),\n metadata: new Map(),\n environment: 'development',\n runtime: 'node',\n apiClientOptions: null,\n dbConfig: null,\n cacheConfig: null,\n observabilityConfig: null,\n observabilityInstance: null,\n storageConfig: null,\n notificationsConfig: null,\n storeRegistry: null,\n initPromises: new Map(),\n };\n }\n return globalAny[SERVICE_REGISTRY_KEY];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n private static readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'ServiceRegistry',\n });\n\n // State accessors using globalThis\n private static get _services(): Map<string, CoreDomainServiceInstance> {\n return getServiceRegistryState().services;\n }\n private static get _pending(): Map<string, PendingService> {\n return getServiceRegistryState().pending;\n }\n private static get _metadata(): Map<string, ServiceMetadata> {\n return getServiceRegistryState().metadata;\n }\n private static get _environment(): 'production' | 'staging' | 'development' | 'test' {\n return getServiceRegistryState().environment;\n }\n private static set _environment(value: 'production' | 'staging' | 'development' | 'test') {\n getServiceRegistryState().environment = value;\n }\n private static get _runtime(): CoreRuntimeEnvironment {\n return getServiceRegistryState().runtime;\n }\n private static set _runtime(value: CoreRuntimeEnvironment) {\n getServiceRegistryState().runtime = value;\n }\n private static get _apiClientOptions(): ApiClientOptions | null {\n return getServiceRegistryState().apiClientOptions;\n }\n private static set _apiClientOptions(value: ApiClientOptions | null) {\n getServiceRegistryState().apiClientOptions = value;\n }\n private static get _dbConfig(): Partial<CoreDbServiceConfig> | null {\n return getServiceRegistryState().dbConfig;\n }\n private static set _dbConfig(value: Partial<CoreDbServiceConfig> | null) {\n getServiceRegistryState().dbConfig = value;\n }\n private static get _cacheConfig(): CoreCacheConfig | null {\n return getServiceRegistryState().cacheConfig;\n }\n private static set _cacheConfig(value: CoreCacheConfig | null) {\n getServiceRegistryState().cacheConfig = value;\n }\n private static get _observabilityConfig(): CoreObservabilityConfig | null {\n return getServiceRegistryState().observabilityConfig;\n }\n private static set _observabilityConfig(value: CoreObservabilityConfig | null) {\n getServiceRegistryState().observabilityConfig = value;\n }\n private static get _observabilityInstance(): ObservabilityAdapter | null {\n return getServiceRegistryState().observabilityInstance;\n }\n private static set _observabilityInstance(value: ObservabilityAdapter | null) {\n getServiceRegistryState().observabilityInstance = value;\n }\n private static get _storageConfig(): CoreStorageConfig | null {\n return getServiceRegistryState().storageConfig;\n }\n private static set _storageConfig(value: CoreStorageConfig | null) {\n getServiceRegistryState().storageConfig = value;\n }\n private static get _notificationsConfig(): CoreNotificationConfig | null {\n return getServiceRegistryState().notificationsConfig;\n }\n private static set _notificationsConfig(value: CoreNotificationConfig | null) {\n getServiceRegistryState().notificationsConfig = value;\n }\n private static get _storeRegistry(): {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null {\n return getServiceRegistryState().storeRegistry;\n }\n private static set _storeRegistry(\n value: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null\n ) {\n getServiceRegistryState().storeRegistry = value;\n }\n private static get _initPromises(): Map<string, Promise<CoreDomainServiceInstance>> {\n return getServiceRegistryState().initPromises;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the service registry with the provided configuration.\n *\n * @param config - Registry configuration with services to initialize\n *\n * @example\n * ```typescript\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n * ],\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n ServiceRegistry._environment = config.environment ?? 'development';\n ServiceRegistry._runtime = config.runtime ?? 'node';\n ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n ServiceRegistry._dbConfig = config.db ?? null;\n ServiceRegistry._cacheConfig = config.cache ?? null;\n ServiceRegistry._observabilityConfig = config.observability ?? null;\n ServiceRegistry._storageConfig = config.storage ?? null;\n ServiceRegistry._notificationsConfig = config.notifications ?? null;\n ServiceRegistry._storeRegistry = config.stores ?? null;\n\n const immediatePromises: Promise<void>[] = [];\n\n for (const entry of config.services) {\n const serviceKey = entry.service.serviceKey;\n const initWhen = entry.config.initWhen ?? 'immediate';\n const enabled = entry.config.enabled !== false;\n const isSingleton = entry.config.singleton !== false; // Default: true\n\n // Store metadata for all services (even disabled)\n ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n // Skip disabled services\n if (!enabled) {\n ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n continue;\n }\n\n // Handle initialization timing\n if (initWhen === 'immediate' && isSingleton) {\n // Only auto-initialize singletons\n immediatePromises.push(\n ServiceRegistry.initializeService(entry).then(() => {\n ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n })\n );\n } else if (isSingleton) {\n // Store for lazy/conditional initialization\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n } else {\n // Non-singleton: just store metadata, create on demand via create()\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered (non-singleton, use create())`\n );\n }\n }\n\n // Wait for all immediate initializations\n await Promise.all(immediatePromises);\n\n const initializedKeys = [...ServiceRegistry._services.keys()];\n const pendingKeys = [...ServiceRegistry._pending.keys()];\n const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n\n ServiceRegistry.logger.info('Service registry initialized', {\n initialized: initializedKeys,\n pending: pendingKeys,\n nonSingleton: nonSingletonKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a singleton service instance by key (synchronous).\n * Throws if the service is not initialized or is non-singleton.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws CorePackageError if service not found, not initialized, or non-singleton\n *\n * @example\n * ```typescript\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n return service as T;\n }\n\n // Check if non-singleton (must use create())\n const metadata = ServiceRegistry._metadata.get(key);\n if (metadata && !metadata.isSingleton) {\n throw new CorePackageError(\n `Service '${key}' is configured as non-singleton. ` +\n `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n throw new CorePackageError(\n `Service '${key}' is configured for lazy initialization. ` +\n `Use await ServiceRegistry.getAsync('${key}') instead.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Create a new instance of a service.\n * Use this for non-singleton services or when you need a fresh instance.\n *\n * Note: The caller is responsible for disposing the returned instance.\n *\n * @param key - Service key\n * @param configOverrides - Optional config overrides for this instance\n * @returns Promise resolving to a new service instance\n *\n * @example\n * ```typescript\n * // Non-singleton service - always creates new instance\n * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n * instance1 !== instance2; // true\n *\n * // With config overrides\n * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n * apiClient: { baseURL: 'https://custom-api.com' },\n * });\n *\n * // Don't forget to dispose when done!\n * instance1.dispose();\n * instance2.dispose();\n * ```\n */\n static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string,\n configOverrides?: Partial<CoreServiceInitConfig>\n ): Promise<T> {\n const metadata = ServiceRegistry._metadata.get(key);\n if (!metadata) {\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Merge config with overrides\n const mergedEntry: CoreServiceEntry = {\n service: metadata.entry.service,\n config: { ...metadata.entry.config, ...configOverrides },\n };\n\n // Create new instance (don't store in registry)\n return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n }\n\n /**\n * Get a service instance by key with async initialization if needed.\n * Use this for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n *\n * @example\n * ```typescript\n * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n * const entities = await example.getAll();\n * ```\n */\n static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n // Return immediately if already initialized\n const existing = ServiceRegistry._services.get(key);\n if (existing) {\n return existing as T;\n }\n\n // Check for in-progress initialization\n const inProgress = ServiceRegistry._initPromises.get(key);\n if (inProgress) {\n return (await inProgress) as T;\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n // Handle conditional initialization\n if (typeof pending.initWhen === 'function') {\n const shouldInit = await pending.initWhen();\n if (!shouldInit) {\n throw new CorePackageError(\n `Service '${key}' initialization condition returned false`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // Initialize and return\n const service = await ServiceRegistry.initializeService(pending.entry);\n ServiceRegistry._pending.delete(key);\n return service as T;\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Check if a service is registered (either initialized or pending).\n *\n * @param key - Service key\n */\n static has(key: string): boolean {\n return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n }\n\n /**\n * Check if a service is initialized and ready.\n *\n * @param key - Service key\n */\n static isInitialized(key: string): boolean {\n return ServiceRegistry._services.has(key);\n }\n\n /**\n * Get all initialized service keys.\n */\n static getInitializedKeys(): string[] {\n return [...ServiceRegistry._services.keys()];\n }\n\n /**\n * Get all pending (lazy) service keys.\n */\n static getPendingKeys(): string[] {\n return [...ServiceRegistry._pending.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Service Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Build API client options and instance for service */\n // eslint-disable-next-line complexity\n private static async buildApiClientOptions(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n const dedicatedApiClient = config.dedicatedApiClient;\n const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const options: ApiClientOptions | undefined = isDedicated\n ? typeof dedicatedApiClient === 'object'\n ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n : (ServiceRegistry._apiClientOptions ?? undefined)\n : (ServiceRegistry._apiClientOptions ?? undefined);\n\n if (!options) {\n return undefined;\n }\n\n // Get or create API client instance\n let apiInstance: unknown;\n if (isDedicated && options) {\n // Create dedicated API client instance for this service\n try {\n // Use the global environment from initialization\n const envConfig = {\n env: ServiceRegistry._environment,\n setAsDefault: false, // Dedicated instances should not become default\n };\n apiInstance = await ApiClientService.createInstance(envConfig, options);\n ServiceRegistry.logger.debug(\n `Created dedicated API client instance for service '${serviceKey}'`,\n {\n environment: ServiceRegistry._environment,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated API client for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared API client\n try {\n apiInstance = ApiClientService.getClient();\n } catch {\n ServiceRegistry.logger.debug(\n `Global API client not initialized, service '${serviceKey}' will not have API`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n options,\n instance: apiInstance,\n };\n }\n\n /** Build DB config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildDbConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: Partial<CoreDbServiceConfig>;\n instance?: CoreDbServiceInstance;\n }\n | undefined\n > {\n const dedicatedDb = config.dedicatedDb;\n const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: DB should only be injected for backend services (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have database access.`\n );\n return undefined; // Skip DB injection for non-backend runtimes\n }\n\n const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n ? typeof dedicatedDb === 'object'\n ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n : (ServiceRegistry._dbConfig ?? undefined)\n : (ServiceRegistry._dbConfig ?? undefined);\n\n if (!dbConfig) {\n return undefined;\n }\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n ServiceRegistry.logger.debug(\n `DbService not registered, service '${serviceKey}' will not have DB`\n );\n return undefined;\n }\n\n // Get or create DB instance\n let dbInstance: CoreDbServiceInstance | undefined;\n if (isDedicated && dbConfig) {\n // Create dedicated database instance for this service\n try {\n dbInstance = await DbService.createInstance?.(dbConfig as CoreDbServiceConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated database instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated database instance for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared database\n try {\n dbInstance = DbService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global DB not initialized, service '${serviceKey}' will not have DB`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: dbConfig,\n instance: dbInstance,\n };\n }\n\n /** Build cache config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildCacheConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreCacheConfig; instance?: CoreCacheManagerInstance }\n | undefined\n > {\n const dedicatedCache = config.dedicatedCache;\n const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const cacheConfig: CoreCacheConfig | undefined = isDedicated\n ? typeof dedicatedCache === 'object'\n ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n : (ServiceRegistry._cacheConfig ?? undefined)\n : (ServiceRegistry._cacheConfig ?? undefined);\n\n if (!cacheConfig) {\n return undefined;\n }\n\n // Runtime validation: Cache on frontend is not supported (CacheManager uses ioredis which requires Node.js)\n const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if (isFrontendRuntime) {\n ServiceRegistry.logger.debug(\n `Service '${serviceKey}' skipping cache (frontend runtime - use Zustand store + react-query instead)`\n );\n return undefined;\n }\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n ServiceRegistry.logger.debug(\n `CacheService not registered, service '${serviceKey}' will not have cache`\n );\n return undefined;\n }\n\n // Backend-only: Get cache manager instance from CacheService\n let cacheInstance: CoreCacheManagerInstance | undefined;\n try {\n cacheInstance = CacheService.getInstance().getCacheManager();\n if (isDedicated) {\n ServiceRegistry.logger.debug(\n `Using shared cache for service '${serviceKey}' (dedicated cache not implemented via DI)`,\n { strategy: cacheConfig.strategy }\n );\n }\n } catch {\n ServiceRegistry.logger.debug(\n `Global cache not initialized, service '${serviceKey}' will not have cache`\n );\n }\n\n return {\n dedicated: isDedicated,\n config: cacheConfig,\n instance: cacheInstance,\n };\n }\n\n /** Build observability config and instance for service */\n // eslint-disable-next-line complexity\n private static buildObservabilityConfig(\n config: CoreServiceInitConfig,\n // eslint-disable-next-line no-unused-vars\n _entry: CoreServiceEntry\n ):\n | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n | undefined {\n const dedicatedObservability = config.dedicatedObservability;\n const isDedicated =\n dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n ? typeof dedicatedObservability === 'object'\n ? ({\n ...ServiceRegistry._observabilityConfig,\n ...dedicatedObservability,\n } as CoreObservabilityConfig)\n : (ServiceRegistry._observabilityConfig ?? undefined)\n : (ServiceRegistry._observabilityConfig ?? undefined);\n\n if (!observabilityConfig) {\n return undefined;\n }\n\n // Instance will be set async if dedicated\n return {\n dedicated: isDedicated,\n config: observabilityConfig,\n instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n };\n }\n\n /** Build storage config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildStorageConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreStorageConfig; instance?: CoreStorageServiceInstance }\n | undefined\n > {\n const dedicatedStorage = config.dedicatedStorage;\n const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Storage is backend-only (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have storage access.`\n );\n return undefined;\n }\n\n const storageConfig: CoreStorageConfig | undefined = isDedicated\n ? typeof dedicatedStorage === 'object'\n ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n : (ServiceRegistry._storageConfig ?? undefined)\n : (ServiceRegistry._storageConfig ?? undefined);\n\n if (!storageConfig) {\n return undefined;\n }\n\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n ServiceRegistry.logger.debug(\n `StorageService not registered, service '${serviceKey}' will not have storage`\n );\n return undefined;\n }\n\n // Get or create storage instance\n let storageInstance: CoreStorageServiceInstance | undefined;\n if (isDedicated && storageConfig) {\n try {\n storageInstance = await StorageService.createInstance?.(storageConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated storage instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated storage instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n storageInstance = StorageService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global storage not initialized, service '${serviceKey}' will not have storage`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: storageConfig,\n instance: storageInstance,\n };\n }\n\n /** Build notifications config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildNotificationsConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: CoreNotificationConfig;\n instance?: CoreNotificationServiceInstance;\n }\n | undefined\n > {\n const dedicatedNotifications = config.dedicatedNotifications;\n const isDedicated =\n dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Notifications is backend-only (including universal runtimes in backend context)\n const isBackendRuntime =\n BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n `This service will not have notifications access.`\n );\n return undefined;\n }\n\n const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n ? typeof dedicatedNotifications === 'object'\n ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n : (ServiceRegistry._notificationsConfig ?? undefined)\n : (ServiceRegistry._notificationsConfig ?? undefined);\n\n if (!notificationsConfig) {\n return undefined;\n }\n\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n ServiceRegistry.logger.debug(\n `NotificationService not registered, service '${serviceKey}' will not have notifications`\n );\n return undefined;\n }\n\n // Get or create notifications instance\n let notificationsInstance: CoreNotificationServiceInstance | undefined;\n if (isDedicated && notificationsConfig) {\n try {\n notificationsInstance = await NotificationService.createInstance?.(notificationsConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated notifications instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n notificationsInstance = NotificationService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: notificationsConfig,\n instance: notificationsInstance,\n };\n }\n\n /**\n * Create a dedicated ObservabilityService instance for a service.\n * Uses the same adapter pattern as global observability but with service-specific config.\n */\n private static async createDedicatedObservability(\n serviceKey: string,\n config: CoreObservabilityConfig\n ): Promise<ObservabilityAdapter | undefined> {\n // Skip if explicitly disabled\n if (config.enabled === false) {\n return undefined;\n }\n\n try {\n // createObservabilityService auto-adds LoggerAdapter as failover\n const dedicatedService = await createObservabilityService({\n mode: config.mode ?? 'parallel',\n serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n environment: config.environment,\n adapters: config.adapters,\n });\n\n ServiceRegistry.logger.debug(\n `Created dedicated ObservabilityService for service '${serviceKey}'`\n );\n\n return dedicatedService;\n } catch (err) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n { error: err instanceof Error ? err.message : String(err) }\n );\n return ServiceRegistry._observabilityInstance ?? undefined;\n }\n }\n\n /**\n * Set the global observability adapter instance.\n * Called by Core.initialize() after creating the adapter.\n */\n static setObservabilityInstance(instance: ObservabilityAdapter): void {\n ServiceRegistry._observabilityInstance = instance;\n ServiceRegistry.logger.debug('Global observability instance set');\n }\n\n /**\n * Get the global observability adapter instance.\n */\n static getObservabilityInstance(): ObservabilityAdapter | null {\n return ServiceRegistry._observabilityInstance;\n }\n\n /**\n * Initialize a single service from an entry.\n * Uses the service class's static create() method.\n * Merges per-service config with global config.\n */\n private static async initializeService(\n entry: CoreServiceEntry,\n storeSingleton = true\n ): Promise<CoreDomainServiceInstance> {\n const { service: ServiceClass, config } = entry;\n const serviceKey = ServiceClass.serviceKey;\n const isSingleton = config.singleton !== false;\n\n // For singletons, check for concurrent initialization\n if (storeSingleton && isSingleton) {\n const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n if (existingPromise) return existingPromise;\n }\n\n const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.set(serviceKey, initPromise);\n }\n\n return initPromise;\n }\n\n /** Build stores for service injection */\n // eslint-disable-next-line complexity\n private static buildStoresForService(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Partial<RootStoreSlice> | undefined {\n const allKeys = new Set<keyof RootStoreSlice>();\n\n // Add primary store - check config first, then service's static primaryStoreKey\n if (config.store) {\n allKeys.add(config.store);\n } else if (\n 'primaryStoreKey' in entry.service &&\n typeof entry.service.primaryStoreKey === 'string'\n ) {\n // Auto-resolve from service class's static primaryStoreKey property\n allKeys.add(entry.service.primaryStoreKey as keyof RootStoreSlice);\n ServiceRegistry.logger.debug(\n `Auto-resolved store key '${entry.service.primaryStoreKey}' from service class`\n );\n }\n\n // Add read stores\n if (config.readStores) {\n config.readStores.forEach(key => allKeys.add(key));\n }\n\n if (allKeys.size === 0) {\n return undefined;\n }\n\n if (!ServiceRegistry._storeRegistry) {\n ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n return undefined;\n }\n\n const stores: Partial<RootStoreSlice> = {};\n for (const key of allKeys) {\n const store = ServiceRegistry._storeRegistry.getStore(key);\n if (store) {\n (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n } else {\n ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n }\n }\n\n return Object.keys(stores).length > 0 ? stores : undefined;\n }\n\n /** Perform the actual service initialization */\n // eslint-disable-next-line complexity\n private static async doInitializeService(\n entry: CoreServiceEntry,\n options: { isSingleton: boolean; storeSingleton: boolean }\n ): Promise<CoreDomainServiceInstance> {\n const { service: serviceClass, config } = entry;\n const serviceKey = serviceClass.serviceKey;\n const { isSingleton, storeSingleton } = options;\n\n try {\n ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n // Build dependencies (async operations) with runtime validation\n const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n const db = await ServiceRegistry.buildDbConfig(config, entry);\n const cache = await ServiceRegistry.buildCacheConfig(config, entry);\n const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n const stores = ServiceRegistry.buildStoresForService(config, entry);\n\n // Create dedicated observability instance if requested\n let observabilityInstance = observability?.instance;\n if (observability?.dedicated && observability.config) {\n observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n serviceKey,\n observability.config\n );\n }\n\n const createOptions: CoreServiceCreateOptions = {\n apiClient,\n db,\n cache,\n observability: observability\n ? { ...observability, instance: observabilityInstance }\n : undefined,\n storage,\n notifications,\n injected: {\n ...(stores ? { stores } : {}),\n cache: cache?.instance,\n db: db?.instance,\n api: apiClient?.instance,\n observability: observabilityInstance,\n storage: storage?.instance,\n notifications: notifications?.instance,\n },\n isSingleton,\n };\n\n ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n apiClientDedicated: createOptions.apiClient?.dedicated,\n dbDedicated: createOptions.db?.dedicated,\n observabilityDedicated: createOptions.observability?.dedicated,\n storageDedicated: createOptions.storage?.dedicated,\n notificationsDedicated: createOptions.notifications?.dedicated,\n injected: {\n hasCache: !!createOptions.injected?.cache,\n hasDb: !!createOptions.injected?.db,\n hasApi: !!createOptions.injected?.api,\n hasObservability: !!createOptions.injected?.observability,\n hasStorage: !!createOptions.injected?.storage,\n hasNotifications: !!createOptions.injected?.notifications,\n hasStores: !!createOptions.injected?.stores,\n },\n });\n\n const instance = await serviceClass.create(config, createOptions);\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._services.set(serviceKey, instance);\n ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n } else {\n ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n }\n\n return instance;\n } catch (error) {\n ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.delete(serviceKey);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disposal\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose a specific service by key.\n *\n * @param key - Service key to dispose\n */\n static dispose(key: string): void {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n service.dispose();\n ServiceRegistry._services.delete(key);\n ServiceRegistry.logger.info(`Service disposed: ${key}`);\n }\n ServiceRegistry._pending.delete(key);\n }\n\n /**\n * Dispose all services and clear the registry.\n */\n static disposeAll(): void {\n // Dispose all initialized services\n for (const [key, service] of ServiceRegistry._services) {\n try {\n service.dispose();\n ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n } catch (error) {\n ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Clear all state\n ServiceRegistry._services.clear();\n ServiceRegistry._pending.clear();\n ServiceRegistry._metadata.clear();\n ServiceRegistry._initPromises.clear();\n ServiceRegistry._apiClientOptions = null;\n ServiceRegistry._dbConfig = null;\n ServiceRegistry._cacheConfig = null;\n ServiceRegistry._observabilityConfig = null;\n ServiceRegistry._observabilityInstance = null;\n ServiceRegistry._storageConfig = null;\n ServiceRegistry._notificationsConfig = null;\n\n ServiceRegistry.logger.info('Service registry disposed');\n }\n\n /**\n * Check if a service is configured as singleton.\n *\n * @param key - Service key\n * @returns true if singleton (default), false if non-singleton\n */\n static isSingleton(key: string): boolean {\n const metadata = ServiceRegistry._metadata.get(key);\n return metadata?.isSingleton ?? true;\n }\n\n /**\n * Get all non-singleton service keys.\n * These services must be created via `create()` method.\n */\n static getNonSingletonKeys(): string[] {\n return [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Dynamic Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a new service dynamically after initialization.\n *\n * @param entry - Service entry to register\n * @param initNow - Whether to initialize immediately (default: true)\n *\n * @example\n * ```typescript\n * // Register and initialize immediately\n * await ServiceRegistry.register({\n * service: NewDomainService,\n * config: { enabled: true },\n * });\n *\n * // Register for lazy initialization\n * ServiceRegistry.register({\n * service: LazyService,\n * config: { enabled: true, initWhen: 'lazy' },\n * }, false);\n * ```\n */\n static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n const serviceKey = entry.service.serviceKey;\n\n // Check if already registered\n if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n return;\n }\n\n const initWhen = entry.config.initWhen ?? 'immediate';\n\n if (initNow && initWhen === 'immediate') {\n await ServiceRegistry.initializeService(entry);\n } else {\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n }\n }\n\n /**\n * Unregister a service (dispose if initialized).\n *\n * @param key - Service key to unregister\n */\n static unregister(key: string): void {\n ServiceRegistry.dispose(key);\n }\n}\n","/**\n * Stream Connection Manager\n *\n * Manages active streaming connections and channel subscriptions.\n * Provides connection lifecycle and subscription management.\n */\n\nimport type {\n StreamChannel,\n StreamConnection,\n StreamConnectionInfo,\n StreamManagerStats,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Default configuration\n */\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamConnectionManager - Manages streaming connections\n *\n * Features:\n * - Connection lifecycle management\n * - Channel-based subscriptions\n * - Activity tracking for stale connection cleanup\n * - Statistics and debugging info\n *\n * @example\n * ```ts\n * const manager = new StreamConnectionManager();\n *\n * // Add connection\n * manager.addConnection({\n * id: 'conn-1',\n * transport: 'sse',\n * channels: new Set(),\n * createdAt: new Date(),\n * lastActivity: new Date(),\n * });\n *\n * // Subscribe to channel\n * manager.subscribe('conn-1', 'upload:abc123');\n *\n * // Get connections for broadcasting\n * const connections = manager.getConnectionsByChannel('upload:abc123');\n * ```\n */\nexport class StreamConnectionManager {\n /** Active connections by ID */\n private connections = new Map<string, StreamConnection>();\n\n /** Channel → connection IDs mapping for efficient broadcasting */\n private channelSubscriptions = new Map<string, Set<string>>();\n\n /**\n * Add a new connection\n *\n * @param connection - Connection to add\n */\n addConnection(connection: StreamConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n /**\n * Remove a connection and its subscriptions\n *\n * @param connectionId - Connection to remove\n */\n removeConnection(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Remove from all channel subscriptions\n for (const channel of connection.channels) {\n this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n // Clean up empty channel sets\n if (this.channelSubscriptions.get(channel)?.size === 0) {\n this.channelSubscriptions.delete(channel);\n }\n }\n\n // Remove connection\n this.connections.delete(connectionId);\n }\n\n /**\n * Get a connection by ID\n *\n * @param connectionId - Connection ID\n */\n getConnection(connectionId: string): StreamConnection | undefined {\n return this.connections.get(connectionId);\n }\n\n /**\n * Check if connection exists\n *\n * @param connectionId - Connection ID\n */\n hasConnection(connectionId: string): boolean {\n return this.connections.has(connectionId);\n }\n\n /**\n * Subscribe connection to a channel\n *\n * @param connectionId - Connection to subscribe\n * @param channel - Channel to subscribe to\n */\n subscribe(connectionId: string, channel: StreamChannel): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Add to connection's channels\n connection.channels.add(channel);\n\n // Add to channel subscriptions index\n if (!this.channelSubscriptions.has(channel)) {\n this.channelSubscriptions.set(channel, new Set());\n }\n this.channelSubscriptions.get(channel)!.add(connectionId);\n\n // Update activity\n connection.lastActivity = new Date();\n }\n\n /**\n * Unsubscribe connection from a channel\n *\n * @param connectionId - Connection to unsubscribe\n * @param channel - Channel to unsubscribe from\n */\n unsubscribe(connectionId: string, channel: StreamChannel): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Remove from connection's channels\n connection.channels.delete(channel);\n\n // Remove from channel subscriptions index\n this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n // Clean up empty channel sets\n if (this.channelSubscriptions.get(channel)?.size === 0) {\n this.channelSubscriptions.delete(channel);\n }\n\n // Update activity\n connection.lastActivity = new Date();\n }\n\n /**\n * Get all connections subscribed to a channel\n *\n * @param channel - Channel to query\n */\n getConnectionsByChannel(channel: StreamChannel): StreamConnection[] {\n const connectionIds = this.channelSubscriptions.get(channel);\n if (!connectionIds) return [];\n\n return Array.from(connectionIds)\n .map(id => this.connections.get(id))\n .filter((conn): conn is StreamConnection => conn !== undefined);\n }\n\n /**\n * Get all channels a connection is subscribed to\n *\n * @param connectionId - Connection ID\n */\n getChannelsByConnection(connectionId: string): StreamChannel[] {\n const connection = this.connections.get(connectionId);\n if (!connection) return [];\n\n return Array.from(connection.channels) as StreamChannel[];\n }\n\n /**\n * Update connection's last activity timestamp\n *\n * @param connectionId - Connection ID\n */\n updateActivity(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (connection) {\n connection.lastActivity = new Date();\n }\n }\n\n /**\n * Clean up stale connections\n *\n * @param maxAge - Maximum age in milliseconds (default: 5 minutes)\n * @returns Removed connection IDs\n */\n cleanupStale(maxAge: number = DEFAULT_MAX_STALE_AGE): string[] {\n const now = Date.now();\n const removed: string[] = [];\n\n for (const [id, connection] of this.connections) {\n const age = now - connection.lastActivity.getTime();\n if (age > maxAge) {\n this.removeConnection(id);\n removed.push(id);\n }\n }\n\n return removed;\n }\n\n /**\n * Get all connection IDs\n */\n getConnectionIds(): string[] {\n return Array.from(this.connections.keys());\n }\n\n /**\n * Get all connections\n */\n getAllConnections(): StreamConnection[] {\n return Array.from(this.connections.values());\n }\n\n /**\n * Get all active channels\n */\n getActiveChannels(): StreamChannel[] {\n return Array.from(this.channelSubscriptions.keys()) as StreamChannel[];\n }\n\n /**\n * Get connection info (serializable)\n *\n * @param connectionId - Connection ID\n */\n getConnectionInfo(connectionId: string): StreamConnectionInfo | undefined {\n const connection = this.connections.get(connectionId);\n if (!connection) return undefined;\n\n return {\n id: connection.id,\n userId: connection.userId,\n transport: connection.transport,\n channels: Array.from(connection.channels),\n createdAt: connection.createdAt.toISOString(),\n lastActivity: connection.lastActivity.toISOString(),\n metadata: connection.metadata,\n };\n }\n\n /**\n * Get manager statistics\n */\n getStats(): StreamManagerStats {\n const connectionsByTransport: Record<StreamTransportType, number> = {\n sse: 0,\n websocket: 0,\n };\n\n for (const connection of this.connections.values()) {\n connectionsByTransport[connection.transport]++;\n }\n\n return {\n totalConnections: this.connections.size,\n connectionsByTransport,\n totalSubscriptions: Array.from(this.channelSubscriptions.values()).reduce(\n (sum, set) => sum + set.size,\n 0\n ),\n activeChannels: this.channelSubscriptions.size,\n };\n }\n\n /**\n * Clear all connections (for shutdown)\n */\n clear(): void {\n this.connections.clear();\n this.channelSubscriptions.clear();\n }\n}\n","/**\n * Stream Broadcaster\n *\n * Core infrastructure for streaming to clients.\n * Orchestrates auth, transport, and connection management.\n *\n * Note: Event subscriptions are handled by ChannelControllers,\n * not directly by StreamBroadcaster.\n */\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { StreamConnectionManager } from './StreamConnectionManager';\nimport type {\n StreamAuthResult,\n StreamBroadcasterConfig,\n StreamChannel,\n StreamConnection,\n StreamManagerStats,\n StreamMessage,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { StreamPackageError } from '@plyaz/errors';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CLEANUP_INTERVAL = TIME_CONSTANTS.MINUTE; // 1 minute\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamBroadcaster - Core streaming infrastructure\n *\n * Features:\n * - Manages connections via StreamConnectionManager\n * - Routes messages through transport adapters (SSE, WebSocket)\n * - Handles auth via adapter\n * - Automatic stale connection cleanup\n * - Channel-based message broadcasting\n *\n * Note: Event subscriptions are handled by endpoint controllers\n * registered via StreamRegistry (e.g., FilesChannelController).\n *\n * @example\n * ```ts\n * const broadcaster = new StreamBroadcaster(\n * new AnonymousAuthAdapter(),\n * [new SSETransportAdapter()]\n * );\n *\n * broadcaster.initialize();\n *\n * // Register with StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster,\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n *\n * // In API route\n * const authResult = await broadcaster.authenticate(request);\n * const response = await broadcaster.createConnection('conn-1', 'sse', request);\n * broadcaster.subscribe('conn-1', 'upload:abc123', authResult);\n * return response;\n * ```\n */\nexport class StreamBroadcaster {\n private readonly connectionManager: StreamConnectionManager;\n private readonly authAdapter: BaseAuthAdapter;\n private readonly transports: Map<StreamTransportType, BaseTransportAdapter>;\n private readonly maxStaleAge: number;\n\n private unsubscribers: (() => void)[] = [];\n private cleanupTimer?: ReturnType<typeof setInterval>;\n private initialized = false;\n\n constructor(\n authAdapter: BaseAuthAdapter,\n transports: BaseTransportAdapter[],\n config?: StreamBroadcasterConfig\n ) {\n this.connectionManager = new StreamConnectionManager();\n this.authAdapter = authAdapter;\n this.transports = new Map(transports.map(t => [t.type, t]));\n this.maxStaleAge = config?.maxStaleAge ?? DEFAULT_MAX_STALE_AGE;\n }\n\n /**\n * Initialize cleanup timer\n * Call once on startup\n *\n * Note: Event subscriptions are now handled by endpoint controllers\n * registered via StreamRegistry (e.g., FilesChannelController, SystemChannelController).\n */\n initialize(): void {\n if (this.initialized) return;\n\n // Start cleanup timer for stale connections\n this.cleanupTimer = setInterval(() => {\n this.cleanupStaleConnections();\n }, DEFAULT_CLEANUP_INTERVAL);\n\n this.initialized = true;\n }\n\n /**\n * Authenticate a connection request\n *\n * @param request - HTTP request\n * @returns Authentication result\n */\n async authenticate(request: Request): Promise<StreamAuthResult> {\n return this.authAdapter.authenticate(request);\n }\n\n /**\n * Check if user can subscribe to a channel\n *\n * @param authResult - Authentication result\n * @param channel - Channel to subscribe\n */\n canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n return this.authAdapter.canSubscribe(authResult.userId, channel, authResult.scopes);\n }\n\n /**\n * Create a new streaming connection\n *\n * @param connectionId - Unique connection ID\n * @param transportType - Transport to use (sse or websocket)\n * @param request - HTTP request\n * @param authResult - Optional auth result (if already authenticated)\n * @returns Response (for SSE) or void (for WebSocket)\n */\n async createConnection(\n connectionId: string,\n transportType: StreamTransportType,\n request: Request,\n authResult?: StreamAuthResult\n ): Promise<Response | void> {\n const transport = this.transports.get(transportType);\n if (!transport) {\n throw new StreamPackageError(\n `Transport not available: ${transportType}`,\n STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n { context: { transport: transportType } }\n );\n }\n\n // Create connection in transport\n const response = await transport.createConnection(connectionId, request);\n\n // Track connection\n const connection: StreamConnection = {\n id: connectionId,\n userId: authResult?.userId,\n transport: transportType,\n channels: new Set(),\n createdAt: new Date(),\n lastActivity: new Date(),\n metadata: authResult?.metadata,\n };\n this.connectionManager.addConnection(connection);\n\n return response;\n }\n\n /**\n * Subscribe connection to a channel\n *\n * @param connectionId - Connection ID\n * @param channel - Channel to subscribe\n * @param authResult - Auth result for permission check\n * @returns Whether subscription succeeded\n */\n subscribe(connectionId: string, channel: StreamChannel, authResult?: StreamAuthResult): boolean {\n // Check permission if auth result provided\n if (authResult && !this.canSubscribe(authResult, channel)) {\n return false;\n }\n\n this.connectionManager.subscribe(connectionId, channel);\n return true;\n }\n\n /**\n * Unsubscribe connection from a channel\n *\n * @param connectionId - Connection ID\n * @param channel - Channel to unsubscribe\n */\n unsubscribe(connectionId: string, channel: StreamChannel): void {\n this.connectionManager.unsubscribe(connectionId, channel);\n }\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n async closeConnection(connectionId: string): Promise<void> {\n const connection = this.connectionManager.getConnection(connectionId);\n if (!connection) return;\n\n // Close in transport\n const transport = this.transports.get(connection.transport);\n if (transport) {\n await transport.close(connectionId);\n }\n\n // Remove from manager\n this.connectionManager.removeConnection(connectionId);\n }\n\n /**\n * Broadcast message to all connections on a channel\n *\n * @param channel - Channel to broadcast to\n * @param message - Message to send\n */\n broadcastToChannel(channel: StreamChannel, message: StreamMessage): void {\n const connections = this.connectionManager.getConnectionsByChannel(channel);\n\n for (const conn of connections) {\n const transport = this.transports.get(conn.transport);\n if (transport) {\n transport.send(conn.id, { ...message, channel }).catch(() => {\n // Connection likely dead, will be cleaned up\n });\n }\n }\n }\n\n /**\n * Send message to a specific connection\n *\n * @param connectionId - Connection ID\n * @param message - Message to send\n */\n async sendToConnection(connectionId: string, message: StreamMessage): Promise<void> {\n const connection = this.connectionManager.getConnection(connectionId);\n if (!connection) return;\n\n const transport = this.transports.get(connection.transport);\n if (transport) {\n await transport.send(connectionId, message);\n }\n }\n\n /**\n * Broadcast to all connections (system-wide)\n *\n * @param message - Message to send\n */\n broadcastToAll(message: StreamMessage): void {\n for (const connection of this.connectionManager.getAllConnections()) {\n const transport = this.transports.get(connection.transport);\n if (transport) {\n transport.send(connection.id, message).catch(() => {\n // Connection likely dead\n });\n }\n }\n }\n\n /**\n * Get manager statistics\n */\n getStats(): StreamManagerStats {\n return this.connectionManager.getStats();\n }\n\n /**\n * Dispose broadcaster (for shutdown)\n */\n dispose(): void {\n // Stop event subscriptions\n this.unsubscribers.forEach(unsub => unsub());\n this.unsubscribers = [];\n\n // Stop cleanup timer\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n // Close all connections\n for (const [, transport] of this.transports) {\n if ('closeAll' in transport && typeof transport.closeAll === 'function') {\n void (transport as { closeAll: () => Promise<void> }).closeAll();\n }\n }\n\n // Clear connection manager\n this.connectionManager.clear();\n\n this.initialized = false;\n }\n\n /**\n * Clean up stale connections\n */\n private cleanupStaleConnections(): void {\n const removed = this.connectionManager.cleanupStale(this.maxStaleAge);\n\n // Also close in transports\n for (const connectionId of removed) {\n for (const [, transport] of this.transports) {\n if (transport.isAlive(connectionId)) {\n transport.close(connectionId).catch(() => {\n // Already closed\n });\n }\n }\n }\n }\n}\n","/**\n * Base Auth Adapter\n *\n * Abstract base class for stream authentication adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type { StreamAuthAdapterConfig, StreamAuthResult, StreamChannel } from '@plyaz/types/core';\n\n/**\n * BaseAuthAdapter - Abstract base class for all stream auth adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for authentication and authorization\n *\n * Subclasses must implement:\n * - authenticate() - Validate connection request\n * - canSubscribe() - Check channel subscription permissions\n *\n * @example\n * ```ts\n * class MyAuthAdapter extends BaseAuthAdapter {\n * async authenticate(request: Request): Promise<StreamAuthResult> {\n * // Custom authentication logic\n * }\n *\n * canSubscribe(userId, channel, scopes): boolean {\n * // Custom authorization logic\n * }\n * }\n * ```\n */\nexport abstract class BaseAuthAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Whether this adapter is enabled */\n readonly enabled: boolean;\n\n constructor(config: StreamAuthAdapterConfig) {\n this.name = config.name;\n this.enabled = config.enabled ?? true;\n }\n\n /**\n * Authenticate a connection request\n *\n * @param request - HTTP request or WebSocket upgrade request\n * @returns Authentication result with user info if authenticated\n */\n abstract authenticate(request: Request): Promise<StreamAuthResult>;\n\n /**\n * Check if user can subscribe to a channel\n *\n * @param userId - User ID (undefined for anonymous connections)\n * @param channel - Channel to subscribe to\n * @param scopes - User's allowed scopes from authentication\n * @returns Whether subscription is allowed\n */\n abstract canSubscribe(\n userId: string | undefined,\n channel: StreamChannel,\n scopes?: string[]\n ): boolean;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): { name: string; enabled: boolean } {\n return {\n name: this.name,\n enabled: this.enabled,\n };\n }\n}\n","/**\n * Anonymous Auth Adapter\n *\n * No-op authentication adapter for local/development use.\n * Allows all connections and channel subscriptions.\n */\n\nimport type { StreamAuthResult, StreamChannel } from '@plyaz/types/core';\nimport { BaseAuthAdapter } from '../BaseAuthAdapter';\n\n/**\n * AnonymousAuthAdapter - Allows all connections without authentication\n *\n * Use cases:\n * - Local development\n * - Internal services without auth requirements\n * - Testing environments\n *\n * @example\n * ```ts\n * const authAdapter = new AnonymousAuthAdapter();\n *\n * // Always returns authenticated: true\n * const result = await authAdapter.authenticate(request);\n * console.log(result.authenticated); // true\n *\n * // Always allows subscription\n * const canSub = authAdapter.canSubscribe(undefined, 'uploads');\n * console.log(canSub); // true\n * ```\n */\nexport class AnonymousAuthAdapter extends BaseAuthAdapter {\n constructor() {\n super({ name: 'anonymous' });\n }\n\n /**\n * Authenticate request (always succeeds)\n *\n * @returns Always returns { authenticated: true }\n */\n async authenticate(): Promise<StreamAuthResult> {\n return { authenticated: true };\n }\n\n /**\n * Check subscription permission (always allowed)\n *\n * @returns Always returns true\n */\n // eslint-disable-next-line no-unused-vars\n canSubscribe(_userId: string | undefined, _channel: StreamChannel, _scopes?: string[]): boolean {\n return true;\n }\n}\n","/**\n * Base Transport Adapter\n *\n * Abstract base class for stream transport adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type {\n StreamMessage,\n StreamTransportAdapterConfig,\n StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\n\n/**\n * BaseTransportAdapter - Abstract base class for all transport adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for connection management\n * - Message sending abstraction\n *\n * Subclasses must implement:\n * - createConnection() - Create new connection\n * - send() - Send message to connection\n * - close() - Close connection\n * - isAlive() - Check connection status\n *\n * @example\n * ```ts\n * class MyTransportAdapter extends BaseTransportAdapter {\n * async createConnection(connectionId: string, request: Request): Promise<Response> {\n * // Implementation\n * }\n * // ... other methods\n * }\n * ```\n */\nexport abstract class BaseTransportAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Transport type identifier */\n readonly type: StreamTransportType;\n\n /** Heartbeat interval in milliseconds */\n protected readonly heartbeatInterval: number;\n\n /** Maximum concurrent connections */\n protected readonly maxConnections: number;\n\n constructor(config: StreamTransportAdapterConfig & { type: StreamTransportType }) {\n this.name = config.name;\n this.type = config.type;\n this.heartbeatInterval = config.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS;\n this.maxConnections = config.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS;\n }\n\n /**\n * Create a new streaming connection\n *\n * For SSE: Returns a Response with streaming body\n * For WebSocket: Modifies socket directly, returns void\n *\n * @param connectionId - Unique connection identifier\n * @param request - HTTP request or WebSocket upgrade request\n * @returns Response for SSE, void for WebSocket\n */\n abstract createConnection(connectionId: string, request: Request): Promise<Response | void>;\n\n /**\n * Send a message to a specific connection\n *\n * @param connectionId - Connection to send to\n * @param message - Message to send\n */\n abstract send(connectionId: string, message: StreamMessage): Promise<void>;\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n abstract close(connectionId: string): Promise<void>;\n\n /**\n * Check if a connection is still alive\n *\n * @param connectionId - Connection to check\n * @returns Whether connection is alive\n */\n abstract isAlive(connectionId: string): boolean;\n\n /**\n * Get current connection count\n *\n * @returns Number of active connections\n */\n abstract getConnectionCount(): number;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): {\n name: string;\n type: StreamTransportType;\n heartbeatInterval: number;\n maxConnections: number;\n connectionCount: number;\n } {\n return {\n name: this.name,\n type: this.type,\n heartbeatInterval: this.heartbeatInterval,\n maxConnections: this.maxConnections,\n connectionCount: this.getConnectionCount(),\n };\n }\n\n /**\n * Check if adapter can accept more connections\n */\n canAcceptConnection(): boolean {\n return this.getConnectionCount() < this.maxConnections;\n }\n}\n","/**\n * SSE Transport Adapter\n *\n * Server-Sent Events transport for real-time streaming.\n * Uses Web Streams API for compatibility with Next.js/Edge runtime.\n */\n\n/* eslint-disable n/no-unsupported-features/node-builtins */\n// ReadableStream and ReadableStreamDefaultController are stable Web APIs,\n// supported in all modern browsers and Edge runtime\n\nimport type { StreamMessage, StreamTransportAdapterConfig } from '@plyaz/types/core';\nimport { BaseTransportAdapter } from '../BaseTransportAdapter';\n\n/**\n * Internal connection state\n */\ninterface SSEConnection {\n controller: ReadableStreamDefaultController;\n heartbeatTimer?: ReturnType<typeof setInterval>;\n createdAt: Date;\n}\n\n/**\n * SSETransportAdapter - Server-Sent Events transport\n *\n * Features:\n * - Web Streams API for Edge runtime compatibility\n * - Automatic heartbeat to keep connections alive\n * - Proper SSE formatting with event, id, retry, data fields\n * - Connection cleanup on disconnect\n *\n * @example\n * ```ts\n * const sseAdapter = new SSETransportAdapter({ heartbeatInterval: 15000 });\n *\n * // In API route\n * const response = await sseAdapter.createConnection(connectionId, request);\n * return response; // Returns SSE stream\n *\n * // Send message\n * await sseAdapter.send(connectionId, {\n * event: 'progress',\n * data: { percentage: 50 },\n * });\n * ```\n */\nexport class SSETransportAdapter extends BaseTransportAdapter {\n private connections = new Map<string, SSEConnection>();\n\n constructor(config?: Partial<StreamTransportAdapterConfig>) {\n super({\n name: config?.name ?? 'sse',\n type: 'sse',\n heartbeatInterval: config?.heartbeatInterval,\n maxConnections: config?.maxConnections,\n });\n }\n\n /**\n * Create a new SSE connection\n *\n * @param connectionId - Unique connection identifier\n * @returns Response with SSE stream\n */\n async createConnection(connectionId: string): Promise<Response> {\n // Check if we can accept more connections\n if (!this.canAcceptConnection()) {\n return new Response('Too many connections', { status: 503 });\n }\n\n // Create the SSE stream\n const stream = new ReadableStream({\n start: controller => {\n // Store connection\n const connection: SSEConnection = {\n controller,\n createdAt: new Date(),\n };\n this.connections.set(connectionId, connection);\n\n // Send initial connection message\n this.sendImmediate(controller, {\n event: 'connected',\n data: { connectionId, timestamp: Date.now() },\n });\n\n // Start heartbeat\n connection.heartbeatTimer = setInterval(() => {\n if (!this.isAlive(connectionId)) {\n this.cleanup(connectionId);\n return;\n }\n this.sendImmediate(controller, {\n event: 'heartbeat',\n data: { timestamp: Date.now() },\n });\n }, this.heartbeatInterval);\n },\n cancel: () => {\n this.cleanup(connectionId);\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no', // Disable nginx buffering\n },\n });\n }\n\n /**\n * Send a message to a connection\n *\n * @param connectionId - Connection to send to\n * @param message - Message to send\n */\n async send(connectionId: string, message: StreamMessage): Promise<void> {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n try {\n this.sendImmediate(connection.controller, message);\n } catch {\n // Connection likely closed, cleanup\n this.cleanup(connectionId);\n }\n }\n\n /**\n * Close a connection\n *\n * @param connectionId - Connection to close\n */\n async close(connectionId: string): Promise<void> {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n try {\n // Send close event before closing\n this.sendImmediate(connection.controller, {\n event: 'close',\n data: { reason: 'server_close' },\n });\n connection.controller.close();\n } catch {\n // Already closed\n }\n\n this.cleanup(connectionId);\n }\n\n /**\n * Check if a connection is alive\n *\n * @param connectionId - Connection to check\n */\n isAlive(connectionId: string): boolean {\n return this.connections.has(connectionId);\n }\n\n /**\n * Get current connection count\n */\n getConnectionCount(): number {\n return this.connections.size;\n }\n\n /**\n * Get all connection IDs\n */\n getConnectionIds(): string[] {\n return Array.from(this.connections.keys());\n }\n\n /**\n * Send message immediately to controller\n */\n private sendImmediate(controller: ReadableStreamDefaultController, message: StreamMessage): void {\n const formatted = this.formatSSE(message);\n controller.enqueue(new TextEncoder().encode(formatted));\n }\n\n /**\n * Format message as SSE\n *\n * SSE format:\n * ```\n * id: messageId\n * retry: retryMs\n * data: {\"event\":\"eventName\",\"channel\":\"channelName\",\"data\":{...}}\n *\n * ```\n *\n * Note: We intentionally DON'T use SSE named events (event: line) because:\n * 1. EventSource silently drops events without registered listeners\n * 2. Hardcoding all possible event names is not scalable\n * 3. Including event in JSON payload is more flexible\n *\n * The client extracts event/channel from the JSON payload in onmessage.\n */\n private formatSSE(message: StreamMessage): string {\n let output = '';\n\n if (message.id) {\n output += `id: ${message.id}\\n`;\n }\n\n if (message.retry !== undefined) {\n output += `retry: ${message.retry}\\n`;\n }\n\n // Include event and channel in the data payload for the client to extract\n const payload = {\n event: message.event,\n channel: message.channel,\n data: message.data,\n timestamp: message.timestamp ?? Date.now(),\n };\n\n output += `data: ${JSON.stringify(payload)}\\n`;\n\n // Double newline to end message\n output += '\\n';\n\n return output;\n }\n\n /**\n * Cleanup connection resources\n */\n private cleanup(connectionId: string): void {\n const connection = this.connections.get(connectionId);\n if (!connection) return;\n\n // Clear heartbeat timer\n if (connection.heartbeatTimer) {\n clearInterval(connection.heartbeatTimer);\n }\n\n // Remove from map\n this.connections.delete(connectionId);\n }\n\n /**\n * Close all connections (for shutdown)\n */\n async closeAll(): Promise<void> {\n const connectionIds = this.getConnectionIds();\n await Promise.all(connectionIds.map(id => this.close(id)));\n }\n}\n","/**\n * Base Framework Adapter\n *\n * Abstract base class for framework-specific streaming adapters.\n * Converts framework-specific request/response to Web Request/Response.\n *\n * Follows the adapter pattern used in BaseTransportAdapter and BaseAuthAdapter.\n *\n * @example\n * ```typescript\n * class MyFrameworkAdapter extends BaseFrameworkAdapter {\n * readonly framework = 'myframework' as const;\n *\n * createHandler(handleRequest, options) {\n * return (req, res) => {\n * const webRequest = this.convertRequest(req);\n * const response = await handleRequest(webRequest, options?.transport);\n * await this.handleResponse(response, req, res);\n * };\n * }\n * // ... other methods\n * }\n * ```\n */\n\nimport type {\n FrameworkType,\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n} from '@plyaz/types/core';\n\n/**\n * BaseFrameworkAdapter - Abstract base class for framework adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for request/response conversion\n * - Handler creation abstraction\n *\n * Subclasses must implement:\n * - framework - Framework identifier\n * - createHandler() - Create framework-specific handler\n * - convertRequest() - Convert framework request to Web Request\n * - handleResponse() - Handle Web Response for framework\n */\nexport abstract class BaseFrameworkAdapter {\n /** Adapter name for logging/debugging */\n readonly name: string;\n\n /** Framework type identifier */\n abstract readonly framework: FrameworkType;\n\n /** Whether adapter is enabled */\n readonly enabled: boolean;\n\n constructor(config: FrameworkAdapterConfig = {} as FrameworkAdapterConfig) {\n this.name = config.name ?? this.constructor.name;\n this.enabled = config.enabled ?? true;\n }\n\n /**\n * Create a handler function for the framework.\n *\n * The returned handler type varies by framework:\n * - Next.js: `(request: Request) => Promise<Response>`\n * - Express: `(req: Request, res: Response) => Promise<void>`\n * - NestJS: `(req: Request, res: Response) => Promise<void>`\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options (transport type, etc.)\n * @returns Framework-specific handler function\n *\n * @example\n * ```typescript\n * // Next.js\n * export const GET = adapter.createHandler(streamServer.handleRequest);\n *\n * // Express\n * app.get('/stream', adapter.createHandler(streamServer.handleRequest));\n * ```\n */\n abstract createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): unknown;\n\n /**\n * Convert framework-specific request to Web Request.\n *\n * @param frameworkRequest - Framework-specific request object\n * @returns Web Request object\n */\n abstract convertRequest(frameworkRequest: unknown): Request;\n\n /**\n * Handle Web Response and send to framework response.\n *\n * For Next.js/Edge: Returns Response directly\n * For Express/NestJS: Streams to res object\n *\n * @param response - Web Response from core handler\n * @param frameworkRequest - Original framework request\n * @param frameworkResponse - Framework response object (for Express-like frameworks)\n * @returns Response for return-based frameworks, void for stream-based\n */\n abstract handleResponse(\n response: Response,\n frameworkRequest: unknown,\n frameworkResponse?: unknown\n ): Promise<Response | void>;\n\n /**\n * Get adapter info for debugging\n */\n getAdapterInfo(): {\n name: string;\n framework: FrameworkType;\n enabled: boolean;\n } {\n return {\n name: this.name,\n framework: this.framework,\n enabled: this.enabled,\n };\n }\n}\n","/**\n * Next.js Framework Adapter\n *\n * Framework adapter for Next.js App Router (Route Handlers).\n * Next.js uses Web Request/Response natively, so this is mostly a passthrough.\n *\n * @example\n * ```typescript\n * // app/api/events/stream/route.ts\n * import { streamServer } from '@/lib/stream';\n *\n * export const GET = streamServer.getHandler('nextjs');\n * ```\n */\n\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n NextJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NextJSFrameworkAdapter - Next.js App Router adapter\n *\n * Features:\n * - Native Web Request/Response support (zero conversion overhead)\n * - Works with Next.js App Router route handlers\n * - Edge Runtime compatible\n *\n * @example\n * ```typescript\n * const adapter = new NextJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * export const GET = handler;\n * ```\n */\nexport class NextJSFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'nextjs' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'nextjs',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create Next.js route handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns Next.js route handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): NextJSHandler {\n const transport = options?.transport ?? 'sse';\n\n return (request: Request): Promise<Response> => {\n return handleRequest(request, transport);\n };\n }\n\n /**\n * Convert Next.js request to Web Request.\n * Next.js already uses Web Request, so this is a passthrough.\n *\n * @param request - Next.js Request (which is a Web Request)\n * @returns The same Request object\n */\n convertRequest(request: Request): Request {\n return request;\n }\n\n /**\n * Handle Web Response for Next.js.\n * Next.js returns Response directly, so this is a passthrough.\n *\n * @param response - Web Response from core handler\n * @returns The same Response object\n */\n async handleResponse(response: Response): Promise<Response> {\n return response;\n }\n}\n","/**\n * Express Framework Adapter\n *\n * Framework adapter for Express.js and compatible frameworks (Fastify, Koa, etc.).\n * Converts Express req/res to Web Request/Response and handles SSE streaming.\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { streamServer } from './stream';\n *\n * const app = express();\n * app.get('/events/stream', streamServer.getHandler('express'));\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n ExpressRequest,\n ExpressResponse,\n ExpressHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * ExpressFrameworkAdapter - Express/Fastify adapter\n *\n * Features:\n * - Converts Express req/res to Web Request/Response\n * - Handles SSE streaming to Express response\n * - Manages connection cleanup on client disconnect\n * - Compatible with Express, Fastify, Koa (with adapters)\n *\n * @example\n * ```typescript\n * const adapter = new ExpressFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * app.get('/stream', handler);\n * ```\n */\nexport class ExpressFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'express' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'express',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create Express route handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns Express route handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): ExpressHandler {\n const transport = options?.transport ?? 'sse';\n\n return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\n const webRequest = this.convertRequest(req);\n const response = await handleRequest(webRequest, transport);\n await this.handleResponse(response, req, res);\n };\n }\n\n /**\n * Convert Express request to Web Request.\n *\n * @param req - Express request object\n * @returns Web Request object\n */\n convertRequest(req: ExpressRequest): Request {\n const url = new URL(req.url, 'http://localhost');\n\n // Convert headers, handling array values\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value as string);\n }\n }\n }\n\n return new Request(url, {\n headers,\n method: req.method ?? 'GET',\n });\n }\n\n /**\n * Handle Web Response and stream to Express response.\n *\n * @param response - Web Response from core handler\n * @param _req - Original Express request (unused)\n * @param res - Express response object\n */\n async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n const expressRes = res as ExpressResponse;\n\n // Write SSE headers\n expressRes.writeHead(HTTP_STATUS.OK, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n\n // Stream response body\n const reader = response.body?.getReader();\n if (reader) {\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) return;\n expressRes.write(new TextDecoder().decode(value));\n return pump();\n };\n void pump();\n\n // Handle client disconnect\n expressRes.on('close', () => {\n void reader.cancel();\n });\n }\n }\n}\n","/**\n * NestJS Framework Adapter\n *\n * Framework adapter for NestJS controllers.\n * NestJS typically uses Express under the hood, so this adapter handles\n * the Express-style req/res pattern used in NestJS controllers.\n *\n * @example\n * ```typescript\n * // In a NestJS controller\n * @Controller('events')\n * export class StreamingController {\n * constructor(@Inject(STREAM_SERVER) private streamServer: StreamServer) {}\n *\n * @Get('stream')\n * async stream(@Req() req: Request, @Res() res: Response) {\n * const handler = this.streamServer.getHandler('nestjs');\n * await handler(req, res);\n * }\n * }\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n FrameworkAdapterConfig,\n FrameworkHandlerOptions,\n CoreRequestHandler,\n NestJSRequest,\n NestJSResponse,\n NestJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NestJSFrameworkAdapter - NestJS adapter\n *\n * Features:\n * - Works with NestJS Express-based controllers\n * - Handles @Req() and @Res() decorated parameters\n * - Supports both writeHead and setHeader patterns\n * - Manages SSE streaming to response\n *\n * @example\n * ```typescript\n * const adapter = new NestJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n *\n * // In controller method:\n * await handler(req, res);\n * ```\n */\nexport class NestJSFrameworkAdapter extends BaseFrameworkAdapter {\n readonly framework = 'nestjs' as const;\n\n constructor(config?: FrameworkAdapterConfig) {\n super({\n name: config?.name ?? 'nestjs',\n enabled: config?.enabled,\n });\n }\n\n /**\n * Create NestJS controller handler.\n *\n * @param handleRequest - Core request handler from StreamServer\n * @param options - Handler options\n * @returns NestJS controller handler function\n */\n createHandler(\n handleRequest: CoreRequestHandler,\n options?: FrameworkHandlerOptions\n ): NestJSHandler {\n const transport = options?.transport ?? 'sse';\n\n return async (req: NestJSRequest, res: NestJSResponse): Promise<void> => {\n const webRequest = this.convertRequest(req);\n const response = await handleRequest(webRequest, transport);\n await this.handleResponse(response, req, res);\n };\n }\n\n /**\n * Convert NestJS request to Web Request.\n *\n * @param req - NestJS request object\n * @returns Web Request object\n */\n convertRequest(req: NestJSRequest): Request {\n const url = new URL(req.url, 'http://localhost');\n\n // Convert headers, handling array values\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value as string);\n }\n }\n }\n\n return new Request(url, {\n headers,\n method: req.method ?? 'GET',\n });\n }\n\n /**\n * Handle Web Response and stream to NestJS response.\n *\n * @param response - Web Response from core handler\n * @param _req - Original NestJS request (unused)\n * @param res - NestJS response object\n */\n async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n const nestRes = res as NestJSResponse;\n\n // Set SSE headers using available method\n if (nestRes.writeHead) {\n nestRes.writeHead(HTTP_STATUS.OK, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n } else {\n // Fallback to setHeader for NestJS\n nestRes.status(HTTP_STATUS.OK);\n nestRes.setHeader('Content-Type', 'text/event-stream');\n nestRes.setHeader('Cache-Control', 'no-cache');\n nestRes.setHeader('Connection', 'keep-alive');\n // Flush headers to start streaming\n if (nestRes.flushHeaders) {\n nestRes.flushHeaders();\n }\n }\n\n // Stream response body\n const reader = response.body?.getReader();\n if (reader) {\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n if (done) return;\n nestRes.write(new TextDecoder().decode(value));\n return pump();\n };\n void pump();\n\n // Handle client disconnect\n nestRes.on('close', () => {\n void reader.cancel();\n });\n }\n }\n}\n","/**\n * Stream Server\n *\n * Framework-agnostic streaming server factory.\n * Provides easy configuration and integration with Next.js, NestJS, Express, etc.\n *\n * Uses framework adapters for handling different runtimes:\n * - NextJSFrameworkAdapter - Next.js App Router (Web Request/Response)\n * - ExpressFrameworkAdapter - Express/Fastify (req/res pattern)\n * - NestJSFrameworkAdapter - NestJS controllers\n *\n * @example\n * ```ts\n * // Create server with builder pattern\n * const streamServer = StreamServer.create()\n * .withAuth(new AnonymousAuthAdapter())\n * .withSSE({ heartbeatInterval: 15000 })\n * .build();\n *\n * // Use in Next.js\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Use in Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // Use in NestJS\n * const handler = streamServer.getHandler('nestjs');\n * await handler(req, res);\n * ```\n */\n\nimport { StreamBroadcaster } from './StreamBroadcaster';\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport { AnonymousAuthAdapter } from './auth/adapters/AnonymousAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { SSETransportAdapter } from './transports/adapters/SSETransportAdapter';\nimport type { BaseFrameworkAdapter } from './frameworks';\nimport {\n NextJSFrameworkAdapter,\n ExpressFrameworkAdapter,\n NestJSFrameworkAdapter,\n type FrameworkType,\n type FrameworkHandlerOptions,\n} from './frameworks';\nimport type {\n StreamAuthResult,\n StreamBroadcasterConfig,\n StreamChannel,\n StreamManagerStats,\n StreamTransportType,\n SSEConfig,\n WebSocketConfig,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { StreamPackageError } from '@plyaz/errors';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Stream server configuration\n */\nexport interface StreamServerConfig {\n /** Auth adapter to use */\n auth?: BaseAuthAdapter;\n /** Transport adapters to use */\n transports?: BaseTransportAdapter[];\n /** Broadcaster configuration */\n broadcaster?: StreamBroadcasterConfig;\n /** Default channels for new connections */\n defaultChannels?: StreamChannel[];\n /** Parse channels from request (default: query param 'channels') */\n parseChannels?: (request: Request) => StreamChannel[];\n /** Custom framework adapters (NextJS, Express, NestJS registered by default) */\n frameworkAdapters?: BaseFrameworkAdapter[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server Builder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Builder for StreamServer\n */\nexport class StreamServerBuilder {\n private authAdapter?: BaseAuthAdapter;\n private transports: BaseTransportAdapter[] = [];\n private broadcasterConfig?: StreamBroadcasterConfig;\n private defaultChannels: StreamChannel[] = ['uploads'];\n private channelParser?: (request: Request) => StreamChannel[];\n\n /**\n * Configure authentication\n */\n withAuth(adapter: BaseAuthAdapter): this {\n this.authAdapter = adapter;\n return this;\n }\n\n /**\n * Enable SSE transport\n */\n withSSE(config?: SSEConfig): this {\n if (config?.enabled === false) return this;\n this.transports.push(new SSETransportAdapter(config));\n return this;\n }\n\n /**\n * Enable WebSocket transport (future)\n */\n // eslint-disable-next-line no-unused-vars\n withWebSocket(_config?: WebSocketConfig): this {\n // Future: this.transports.push(new WebSocketTransportAdapter(config));\n console.warn('WebSocket transport not yet implemented');\n return this;\n }\n\n /**\n * Add custom transport\n */\n withTransport(adapter: BaseTransportAdapter): this {\n this.transports.push(adapter);\n return this;\n }\n\n /**\n * Configure broadcaster\n */\n withBroadcaster(config: StreamBroadcasterConfig): this {\n this.broadcasterConfig = config;\n return this;\n }\n\n /**\n * Set default channels for new connections\n */\n withDefaultChannels(channels: StreamChannel[]): this {\n this.defaultChannels = channels;\n return this;\n }\n\n /**\n * Custom channel parser\n */\n withChannelParser(parser: (request: Request) => StreamChannel[]): this {\n this.channelParser = parser;\n return this;\n }\n\n /**\n * Build the stream server\n */\n build(): StreamServer {\n // Default to anonymous auth if not specified\n const auth = this.authAdapter ?? new AnonymousAuthAdapter();\n\n // Default to SSE if no transports specified\n const transports = this.transports.length > 0 ? this.transports : [new SSETransportAdapter()];\n\n return new StreamServer({\n auth,\n transports,\n broadcaster: this.broadcasterConfig,\n defaultChannels: this.defaultChannels,\n parseChannels: this.channelParser,\n });\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * StreamServer - Framework-agnostic streaming server\n *\n * Features:\n * - Builder pattern for easy configuration\n * - Framework adapter pattern for easy integration\n * - Automatic connection lifecycle management\n * - Channel-based subscriptions\n *\n * @example\n * ```ts\n * const server = StreamServer.create()\n * .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n * .withSSE({ heartbeatInterval: 30000 })\n * .build();\n *\n * // Initialize on startup\n * server.initialize();\n *\n * // Get handler for your framework\n * export const GET = server.getHandler('nextjs');\n * // or\n * app.get('/stream', server.getHandler('express'));\n *\n * // Register endpoints via StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: server.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\nexport class StreamServer {\n private readonly broadcaster: StreamBroadcaster;\n private readonly config: StreamServerConfig;\n private readonly frameworkAdapters = new Map<FrameworkType, BaseFrameworkAdapter>();\n private initialized = false;\n\n constructor(config: StreamServerConfig) {\n this.config = config;\n\n // Create broadcaster\n this.broadcaster = new StreamBroadcaster(\n config.auth ?? new AnonymousAuthAdapter(),\n config.transports ?? [new SSETransportAdapter()],\n config.broadcaster\n );\n\n // Register default framework adapters\n this.registerFrameworkAdapter(new NextJSFrameworkAdapter());\n this.registerFrameworkAdapter(new ExpressFrameworkAdapter());\n this.registerFrameworkAdapter(new NestJSFrameworkAdapter());\n\n // Register custom framework adapters if provided\n if (config.frameworkAdapters) {\n for (const adapter of config.frameworkAdapters) {\n this.registerFrameworkAdapter(adapter);\n }\n }\n }\n\n /**\n * Create a new builder\n */\n static create(): StreamServerBuilder {\n return new StreamServerBuilder();\n }\n\n /**\n * Initialize the stream server\n * Call once on application startup\n */\n initialize(): void {\n if (this.initialized) return;\n this.broadcaster.initialize();\n this.initialized = true;\n }\n\n /**\n * Dispose the stream server\n * Call on application shutdown\n */\n dispose(): void {\n this.broadcaster.dispose();\n this.initialized = false;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Request Handling\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Handle a streaming request (framework-agnostic)\n *\n * @param request - HTTP request\n * @param transportType - Transport to use (default: 'sse')\n */\n async handleRequest(\n request: Request,\n transportType: StreamTransportType = 'sse'\n ): Promise<Response> {\n // Ensure initialized\n if (!this.initialized) {\n this.initialize();\n }\n\n // Parse channels from request\n const channels = this.parseChannels(request);\n\n // Authenticate\n const authResult = await this.broadcaster.authenticate(request);\n\n // Generate connection ID\n const connectionId = crypto.randomUUID();\n\n // Create connection\n const response = await this.broadcaster.createConnection(\n connectionId,\n transportType,\n request,\n authResult\n );\n\n if (!response) {\n return new Response('Failed to create connection', { status: 500 });\n }\n\n // Subscribe to channels\n for (const channel of channels) {\n if (this.broadcaster.canSubscribe(authResult, channel)) {\n this.broadcaster.subscribe(connectionId, channel, authResult);\n }\n }\n\n return response;\n }\n\n /**\n * Parse channels from request\n */\n private parseChannels(request: Request): StreamChannel[] {\n // Use custom parser if provided\n if (this.config.parseChannels) {\n return this.config.parseChannels(request);\n }\n\n // Default: parse from query param\n const { searchParams } = new URL(request.url);\n const channelsParam = searchParams.get('channels');\n\n if (!channelsParam) {\n return this.config.defaultChannels ?? ['uploads'];\n }\n\n return channelsParam.split(',').filter(Boolean) as StreamChannel[];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Framework Adapters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a framework adapter.\n *\n * Default adapters (NextJS, Express, NestJS) are registered automatically.\n * Use this to add custom adapters or override existing ones.\n *\n * @param adapter - Framework adapter to register\n *\n * @example\n * ```ts\n * // Register custom adapter\n * streamServer.registerFrameworkAdapter(new MyCustomAdapter());\n *\n * // Override default adapter\n * streamServer.registerFrameworkAdapter(new NextJSFrameworkAdapter({ name: 'custom-nextjs' }));\n * ```\n */\n registerFrameworkAdapter(adapter: BaseFrameworkAdapter): void {\n this.frameworkAdapters.set(adapter.framework, adapter);\n }\n\n /**\n * Get a framework adapter by type.\n *\n * @param framework - Framework type to get\n * @returns Framework adapter or undefined if not registered\n */\n getFrameworkAdapter<T extends BaseFrameworkAdapter>(framework: FrameworkType): T | undefined {\n return this.frameworkAdapters.get(framework) as T | undefined;\n }\n\n /**\n * Get handler for a specific framework.\n *\n * This is the primary API for integrating with frameworks.\n *\n * @param framework - Framework type ('nextjs', 'express', 'nestjs')\n * @param options - Handler options (transport type, etc.)\n * @returns Framework-specific handler function\n *\n * @example\n * ```ts\n * // Next.js App Router\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // NestJS controller\n * const handler = streamServer.getHandler('nestjs');\n * await handler(req, res);\n *\n * // With options\n * export const GET = streamServer.getHandler('nextjs', { transport: 'sse' });\n * ```\n */\n getHandler<T = unknown>(framework: FrameworkType, options?: FrameworkHandlerOptions): T {\n const adapter = this.frameworkAdapters.get(framework);\n\n if (!adapter) {\n throw new StreamPackageError(\n `Framework adapter '${framework}' not registered. Available adapters: ${Array.from(this.frameworkAdapters.keys()).join(', ')}`,\n STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND,\n { context: { framework, availableAdapters: Array.from(this.frameworkAdapters.keys()) } }\n );\n }\n\n if (!adapter.enabled) {\n throw new StreamPackageError(\n `Framework adapter '${framework}' is disabled`,\n STREAM_ERROR_CODES.ENDPOINT_DISABLED,\n { context: { framework } }\n );\n }\n\n return adapter.createHandler(\n (request, transport) => this.handleRequest(request, transport),\n options\n ) as T;\n }\n\n /**\n * Get list of registered framework adapters.\n */\n getRegisteredFrameworks(): FrameworkType[] {\n return Array.from(this.frameworkAdapters.keys());\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Direct Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the underlying broadcaster for advanced usage\n */\n getBroadcaster(): StreamBroadcaster {\n return this.broadcaster;\n }\n\n /**\n * Authenticate a request\n */\n async authenticate(request: Request): Promise<StreamAuthResult> {\n return this.broadcaster.authenticate(request);\n }\n\n /**\n * Check if user can subscribe to a channel\n */\n canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n return this.broadcaster.canSubscribe(authResult, channel);\n }\n\n /**\n * Get server statistics\n */\n getStats(): StreamManagerStats {\n return this.broadcaster.getStats();\n }\n\n /**\n * Check if server is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Stream Registry\n *\n * Auto-discovery and initialization for stream endpoints.\n * Similar to ServiceRegistry but for real-time streaming.\n *\n * @example\n * ```typescript\n * import { StreamServer, StreamRegistry } from '@plyaz/core/events/streaming';\n * import { FilesStreamEndpoint } from '@plyaz/core/domain/files/streaming';\n * import { SystemStreamEndpoint } from '@plyaz/core/events/streaming/endpoints';\n *\n * // Create stream server\n * const streamServer = StreamServer.create()\n * .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n * .withSSE({ heartbeatInterval: 15000 })\n * .build();\n *\n * // Initialize stream registry (like ServiceRegistry)\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport { StreamPackageError } from '@plyaz/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n StreamEndpointConfig,\n StreamRegistryConfig,\n StreamBroadcasterInterface,\n} from '@plyaz/types/core';\nimport type { BaseStreamEndpoint } from './base/BaseStreamEndpoint';\nimport type { BaseChannelController } from './channels/BaseChannelController';\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like stream endpoints being registered\n * in one module context but not accessible from another (e.g., API routes).\n */\ninterface StreamRegistryState {\n endpoints: Map<string, BaseStreamEndpoint>;\n controllers: Map<string, BaseChannelController>;\n broadcaster: StreamBroadcasterInterface | null;\n initialized: boolean;\n}\n\nconst STREAM_REGISTRY_KEY = Symbol.for('plyaz.StreamRegistry');\n\nfunction getStreamRegistryState(): StreamRegistryState {\n const globalAny = globalThis as unknown as { [key: symbol]: StreamRegistryState };\n if (!globalAny[STREAM_REGISTRY_KEY]) {\n globalAny[STREAM_REGISTRY_KEY] = {\n endpoints: new Map(),\n controllers: new Map(),\n broadcaster: null,\n initialized: false,\n };\n }\n return globalAny[STREAM_REGISTRY_KEY];\n}\n\n/**\n * StreamRegistry - Auto-discovery and initialization for stream endpoints\n *\n * Features:\n * - Auto-initialization of stream endpoints\n * - get() and getAsync() access patterns (like ServiceRegistry)\n * - Lifecycle management\n * - Controller registration with broadcaster\n */\nexport class StreamRegistry {\n private static readonly logger = new CoreLogger({\n service: 'StreamRegistry',\n });\n\n // State accessors using globalThis\n private static get _endpoints(): Map<string, BaseStreamEndpoint> {\n return getStreamRegistryState().endpoints;\n }\n private static get _controllers(): Map<string, BaseChannelController> {\n return getStreamRegistryState().controllers;\n }\n private static get _broadcaster(): StreamBroadcasterInterface | null {\n return getStreamRegistryState().broadcaster;\n }\n private static set _broadcaster(value: StreamBroadcasterInterface | null) {\n getStreamRegistryState().broadcaster = value;\n }\n private static get _initialized(): boolean {\n return getStreamRegistryState().initialized;\n }\n private static set _initialized(value: boolean) {\n getStreamRegistryState().initialized = value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the stream registry with endpoints.\n *\n * @param config - Registry configuration\n * @throws StreamPackageError if already initialized or endpoint fails\n *\n * @example\n * ```typescript\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n static async initialize(config: StreamRegistryConfig): Promise<void> {\n if (StreamRegistry._initialized) {\n StreamRegistry.logger.warn('StreamRegistry already initialized');\n return;\n }\n\n StreamRegistry._broadcaster = config.broadcaster;\n\n for (const entry of config.endpoints) {\n const endpointKey = entry.endpoint.endpointKey;\n const enabled = entry.config.enabled !== false;\n\n if (!enabled) {\n StreamRegistry.logger.debug(`Endpoint ${endpointKey} is disabled, skipping`);\n continue;\n }\n\n try {\n // Create endpoint configuration\n const endpointConfig: StreamEndpointConfig = {\n endpointKey,\n name: entry.config.name ?? endpointKey,\n channels: entry.config.channels ?? [],\n enabled: entry.config.enabled,\n supportedRuntimes: entry.config.supportedRuntimes,\n };\n\n // Create endpoint instance via static create()\n const instance = (await entry.endpoint.create(endpointConfig, {\n broadcaster: config.broadcaster,\n })) as BaseStreamEndpoint;\n\n // Initialize the endpoint\n instance.initialize();\n\n // Get the channel controller\n const controller = instance.getChannelController();\n\n // Register controller with broadcaster (if it supports this)\n if ('registerController' in config.broadcaster) {\n (\n config.broadcaster as { registerController: (c: BaseChannelController) => void }\n ).registerController(controller);\n }\n\n // Store endpoint and controller\n StreamRegistry._endpoints.set(endpointKey, instance);\n StreamRegistry._controllers.set(controller.scope, controller);\n\n StreamRegistry.logger.info(`Endpoint initialized: ${endpointKey}`, {\n scope: controller.scope,\n patterns: controller.getPatterns(),\n });\n } catch (error) {\n StreamRegistry.logger.error(`Failed to initialize endpoint: ${endpointKey}`, { error });\n throw error;\n }\n }\n\n StreamRegistry._initialized = true;\n StreamRegistry.logger.info('StreamRegistry initialized', {\n endpoints: [...StreamRegistry._endpoints.keys()],\n controllers: [...StreamRegistry._controllers.keys()],\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Endpoint Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get an endpoint by key (synchronous).\n *\n * @param key - Endpoint key\n * @returns Endpoint instance\n * @throws StreamPackageError if endpoint not found\n *\n * @example\n * ```typescript\n * const filesEndpoint = StreamRegistry.get<FilesStreamEndpoint>('files');\n * ```\n */\n static get<T extends BaseStreamEndpoint>(key: string): T {\n const endpoint = StreamRegistry._endpoints.get(key);\n if (!endpoint) {\n throw new StreamPackageError(\n `Stream endpoint '${key}' not found. Register it in StreamRegistry.initialize()`,\n STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND\n );\n }\n return endpoint as T;\n }\n\n /**\n * Get an endpoint by key (async for lazy initialization if needed).\n *\n * @param key - Endpoint key\n * @returns Promise resolving to endpoint instance\n */\n static async getAsync<T extends BaseStreamEndpoint>(key: string): Promise<T> {\n return StreamRegistry.get<T>(key);\n }\n\n /**\n * Check if an endpoint is registered.\n *\n * @param key - Endpoint key\n * @returns true if endpoint is registered\n */\n static has(key: string): boolean {\n return StreamRegistry._endpoints.has(key);\n }\n\n /**\n * Get all registered endpoint keys.\n *\n * @returns Array of endpoint keys\n */\n static getRegisteredKeys(): string[] {\n return [...StreamRegistry._endpoints.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Controller Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a controller by scope.\n *\n * @param scope - Controller scope\n * @returns Controller instance or undefined\n */\n static getController(scope: string): BaseChannelController | undefined {\n return StreamRegistry._controllers.get(scope);\n }\n\n /**\n * Get controller for a channel.\n *\n * @param channel - Channel name\n * @returns Controller that handles the channel, or undefined\n */\n static getControllerForChannel(channel: string): BaseChannelController | undefined {\n for (const controller of StreamRegistry._controllers.values()) {\n if (controller.handlesChannel(channel)) {\n return controller;\n }\n }\n return undefined;\n }\n\n /**\n * Get all registered controller scopes.\n *\n * @returns Array of controller scopes\n */\n static getRegisteredScopes(): string[] {\n return [...StreamRegistry._controllers.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Broadcaster Access\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the broadcaster instance.\n *\n * @returns Broadcaster instance\n * @throws StreamPackageError if not initialized\n */\n static getBroadcaster(): StreamBroadcasterInterface {\n if (!StreamRegistry._broadcaster) {\n throw new StreamPackageError(\n 'StreamRegistry not initialized. Call StreamRegistry.initialize() first.',\n STREAM_ERROR_CODES.INITIALIZATION_FAILED\n );\n }\n return StreamRegistry._broadcaster;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Status\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if registry is initialized.\n *\n * @returns true if initialized\n */\n static isInitialized(): boolean {\n return StreamRegistry._initialized;\n }\n\n /**\n * Get registry statistics.\n *\n * @returns Statistics object\n */\n static getStats(): {\n initialized: boolean;\n endpointCount: number;\n controllerCount: number;\n endpoints: string[];\n controllers: string[];\n } {\n return {\n initialized: StreamRegistry._initialized,\n endpointCount: StreamRegistry._endpoints.size,\n controllerCount: StreamRegistry._controllers.size,\n endpoints: StreamRegistry.getRegisteredKeys(),\n controllers: StreamRegistry.getRegisteredScopes(),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose all endpoints and reset registry.\n */\n static dispose(): void {\n StreamRegistry.logger.info('Disposing StreamRegistry');\n\n // Dispose all endpoints\n StreamRegistry._endpoints.forEach((endpoint, key) => {\n try {\n endpoint.dispose();\n StreamRegistry.logger.debug(`Disposed endpoint: ${key}`);\n } catch (error) {\n StreamRegistry.logger.error(`Error disposing endpoint: ${key}`, { error });\n }\n });\n\n // Clear all maps\n StreamRegistry._endpoints.clear();\n StreamRegistry._controllers.clear();\n StreamRegistry._broadcaster = null;\n StreamRegistry._initialized = false;\n\n StreamRegistry.logger.info('StreamRegistry disposed');\n }\n\n /**\n * Reset registry (for testing).\n */\n static reset(): void {\n StreamRegistry.dispose();\n }\n}\n","/**\n * Base Stream Endpoint\n *\n * Abstract base class for stream endpoints, following patterns from BaseBackendDomainService.\n * Each endpoint manages a set of channels and their event handlers.\n *\n * @example\n * ```typescript\n * class FilesStreamEndpoint extends BaseStreamEndpoint {\n * static readonly endpointKey = 'files';\n *\n * protected createChannelController(): BaseChannelController {\n * return new FilesChannelController();\n * }\n *\n * initialize(): void {\n * this.channelController.initialize(this.broadcaster);\n * this.logger.info('FilesStreamEndpoint initialized');\n * }\n *\n * static async create(\n * config: StreamEndpointConfig,\n * options: StreamEndpointCreateOptions\n * ): Promise<FilesStreamEndpoint> {\n * return new FilesStreamEndpoint(config, options);\n * }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n StreamEndpointConfig,\n StreamEndpointCreateOptions,\n StreamBroadcasterInterface,\n StreamResponse,\n StreamErrorEvent,\n StreamChannel,\n StreamConnection,\n StreamAuthResult,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { StreamPackageError } from '@plyaz/errors';\nimport type { BaseChannelController } from '../channels/BaseChannelController';\n\n/**\n * BaseStreamEndpoint - Abstract base for stream endpoints\n *\n * Similar to BaseBackendDomainService but for real-time streaming.\n * Provides:\n * - Static create() for initialization (like domain services)\n * - Lifecycle hooks (beforeSubscribe, afterSubscribe, etc.)\n * - Channel controller management\n * - Error handling with standard ErrorResponse format\n * - Response formatting consistent with API patterns\n */\nexport abstract class BaseStreamEndpoint {\n /**\n * Static endpoint key (like serviceKey in domain services).\n * Override in subclass.\n */\n static readonly endpointKey: string;\n\n /** Logger instance */\n protected readonly logger: CoreLogger;\n\n /** Endpoint configuration */\n protected readonly config: StreamEndpointConfig;\n\n /** Broadcaster interface */\n protected readonly broadcaster: StreamBroadcasterInterface;\n\n /** Channel controller for this endpoint */\n protected readonly channelController: BaseChannelController;\n\n /** Unsubscribe functions for cleanup */\n protected readonly unsubscribers: Array<() => void> = [];\n\n constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n this.config = config;\n this.broadcaster = options.broadcaster;\n\n this.logger = new CoreLogger({\n service: `StreamEndpoint:${config.endpointKey}`,\n });\n\n // Create channel controller for this endpoint\n this.channelController = this.createChannelController();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Abstract Methods (must implement)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create the channel controller for this endpoint.\n * Called during construction.\n */\n protected abstract createChannelController(): BaseChannelController;\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n abstract initialize(): void;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static Factory (like domain services)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create endpoint instance.\n * Override in subclass with proper typing.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n\n static async create(\n // eslint-disable-next-line no-unused-vars\n _config: StreamEndpointConfig,\n // eslint-disable-next-line no-unused-vars\n _options: StreamEndpointCreateOptions\n ): Promise<BaseStreamEndpoint> {\n throw new StreamPackageError(\n 'Subclass must implement static create()',\n STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n { context: { endpoint: this.endpointKey ?? 'unknown' } }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (optional - override in subclass)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before a connection subscribes to a channel.\n * Return false to prevent subscription.\n *\n * @param channel - Channel being subscribed to\n * @param connection - Connection subscribing\n * @param authResult - Authentication result for the connection\n * @returns true to allow subscription, false to deny\n */\n protected async beforeSubscribe?(\n channel: StreamChannel,\n connection: StreamConnection,\n authResult: StreamAuthResult\n ): Promise<boolean>;\n\n /**\n * Called after a connection subscribes to a channel.\n *\n * @param channel - Channel subscribed to\n * @param connection - Connection that subscribed\n */\n protected async afterSubscribe?(\n channel: StreamChannel,\n connection: StreamConnection\n ): Promise<void>;\n\n /**\n * Called before a connection unsubscribes from a channel.\n *\n * @param channel - Channel being unsubscribed from\n * @param connectionId - Connection ID unsubscribing\n */\n protected async beforeUnsubscribe?(channel: StreamChannel, connectionId: string): Promise<void>;\n\n /**\n * Called when a new connection is established.\n *\n * @param connection - The new connection\n */\n protected async onConnect?(connection: StreamConnection): Promise<void>;\n\n /**\n * Called when a connection is closed.\n *\n * @param connectionId - ID of the closed connection\n */\n protected async onDisconnect?(connectionId: string): Promise<void>;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Response Helpers (consistent with API patterns)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a success response.\n *\n * @param data - Response data payload\n * @param channel - Channel this response is for\n * @param message - Human-readable message (default: 'Success')\n * @returns Formatted StreamResponse\n */\n protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n return {\n success: true,\n message,\n data,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create an error response using standard ErrorResponse format.\n *\n * @param errors - Array of error details\n * @param channel - Channel this error occurred on\n * @returns Formatted StreamErrorEvent\n */\n protected createErrorResponse(\n errors: Array<{ errorCode: string; message: string; field?: string }>,\n channel: string\n ): StreamErrorEvent {\n // Convert to standard ErrorResponse format\n const errorResponse: ErrorResponse = errors.map(e => ({\n errorCode: e.errorCode,\n message: e.message,\n field: e.field,\n }));\n\n return {\n success: false,\n errors: errorResponse,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get endpoint configuration.\n */\n getConfig(): StreamEndpointConfig {\n return this.config;\n }\n\n /**\n * Get the endpoint key.\n */\n getEndpointKey(): string {\n return this.config.endpointKey;\n }\n\n /**\n * Get channel controller.\n */\n getChannelController(): BaseChannelController {\n return this.channelController;\n }\n\n /**\n * Check if endpoint handles a channel.\n *\n * @param channel - Channel to check\n * @returns true if this endpoint handles the channel\n */\n handlesChannel(channel: StreamChannel): boolean {\n return this.channelController.handlesChannel(channel);\n }\n\n /**\n * Check if endpoint is enabled.\n */\n isEnabled(): boolean {\n return this.config.enabled !== false;\n }\n\n /**\n * Check if endpoint supports the current runtime.\n *\n * @param runtime - Runtime to check\n * @returns true if supported\n */\n supportsRuntime(runtime: 'node' | 'bun' | 'deno' | 'edge'): boolean {\n if (!this.config.supportedRuntimes) return true;\n return this.config.supportedRuntimes.includes(runtime);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose endpoint and cleanup.\n */\n dispose(): void {\n this.logger.debug('Disposing endpoint', { key: this.config.endpointKey });\n\n // Call all unsubscribe functions\n this.unsubscribers.forEach(unsub => {\n try {\n unsub();\n } catch (error) {\n this.logger.error('Error during unsubscribe', { error });\n }\n });\n\n // Clear unsubscribers\n this.unsubscribers.length = 0;\n\n // Dispose channel controller\n this.channelController.dispose();\n\n this.logger.debug('Endpoint disposed', { key: this.config.endpointKey });\n }\n\n /**\n * Add an unsubscribe function to be called on dispose.\n *\n * @param unsub - Unsubscribe function\n */\n protected addUnsubscriber(unsub: () => void): void {\n this.unsubscribers.push(unsub);\n }\n}\n","/**\n * Base Channel Controller\n *\n * Abstract base class for channel event handlers.\n * Each controller manages a specific scope of channels (e.g., 'upload:', 'generate:', 'system').\n *\n * @example\n * ```typescript\n * class FilesChannelController extends BaseChannelController {\n * constructor() {\n * super({\n * scope: 'files',\n * patterns: ['upload:', 'uploads', 'generate:'],\n * });\n * }\n *\n * initialize(broadcaster: StreamBroadcasterInterface): void {\n * this.unsubscribers.push(\n * CoreEventManager.on('files:upload:progress', event => {\n * broadcaster.broadcastToChannel(`upload:${event.data.fileId}`, {\n * event: 'progress',\n * data: this.createResponse(event.data, `upload:${event.data.fileId}`),\n * });\n * })\n * );\n * }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n ChannelControllerConfig,\n StreamBroadcasterInterface,\n StreamResponse,\n StreamErrorEvent,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\n\n/**\n * BaseChannelController - Abstract base for channel event handlers\n *\n * Features:\n * - Pattern matching for channels\n * - Response formatting helpers (consistent with API patterns)\n * - Subscription management with automatic cleanup\n * - Error response using standard ErrorResponse format\n */\nexport abstract class BaseChannelController {\n /** Channel scope (e.g., 'upload', 'generate', 'system') */\n readonly scope: string;\n\n /** Channel patterns this controller handles */\n readonly patterns: string[];\n\n /** Whether controller is enabled */\n readonly enabled: boolean;\n\n /** Logger instance */\n protected readonly logger: CoreLogger;\n\n /** Unsubscribe functions for cleanup */\n protected unsubscribers: Array<() => void> = [];\n\n constructor(config: ChannelControllerConfig) {\n this.scope = config.scope;\n this.patterns = config.patterns;\n this.enabled = config.enabled ?? true;\n\n this.logger = new CoreLogger({\n service: `ChannelController:${config.scope}`,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Abstract Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize event subscriptions.\n * Called when the controller is registered with the broadcaster.\n *\n * @param broadcaster - The broadcaster to send messages through\n */\n abstract initialize(broadcaster: StreamBroadcasterInterface): void;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Channel Matching\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if this controller handles a given channel.\n *\n * @param channel - Channel name to check\n * @returns true if this controller handles the channel\n */\n handlesChannel(channel: string): boolean {\n // Check exact match or scope prefix\n return this.patterns.some(\n pattern => channel === pattern || channel.startsWith(`${this.scope}:`)\n );\n }\n\n /**\n * Get all patterns this controller handles.\n */\n getPatterns(): string[] {\n return [...this.patterns];\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Response Helpers (consistent with API ReturnResponseType)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a success response.\n *\n * @param data - Response data payload\n * @param channel - Channel this response is for\n * @param message - Human-readable message (default: 'Success')\n * @returns Formatted StreamResponse\n */\n protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n return {\n success: true,\n message,\n data,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create an error response using standard ErrorResponse format.\n *\n * @param errors - Array of error details\n * @param channel - Channel this error occurred on\n * @returns Formatted StreamErrorEvent\n */\n protected createErrorResponse(\n errors: Array<{ errorCode: string; message: string; field?: string }>,\n channel: string\n ): StreamErrorEvent {\n // Convert to standard ErrorResponse format\n const errorResponse: ErrorResponse = errors.map(e => ({\n errorCode: e.errorCode,\n message: e.message,\n field: e.field,\n }));\n\n return {\n success: false,\n errors: errorResponse,\n channel,\n timestamp: Date.now(),\n correlationId: crypto.randomUUID(),\n };\n }\n\n /**\n * Create a single error response.\n *\n * @param errorCode - Error code\n * @param message - Error message\n * @param channel - Channel this error occurred on\n * @param field - Optional field that caused the error\n * @returns Formatted StreamErrorEvent\n */\n protected createSingleError(\n errorCode: string,\n message: string,\n channel: string,\n field?: string\n ): StreamErrorEvent {\n return this.createErrorResponse([{ errorCode, message, field }], channel);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose controller and cleanup subscriptions.\n */\n dispose(): void {\n this.logger.debug('Disposing controller', { scope: this.scope });\n\n // Call all unsubscribe functions\n this.unsubscribers.forEach(unsub => {\n try {\n unsub();\n } catch (error) {\n this.logger.error('Error during unsubscribe', { error });\n }\n });\n\n this.unsubscribers = [];\n this.logger.debug('Controller disposed', { scope: this.scope });\n }\n\n /**\n * Add an unsubscribe function to be called on dispose.\n *\n * @param unsub - Unsubscribe function\n */\n protected addUnsubscriber(unsub: () => void): void {\n this.unsubscribers.push(unsub);\n }\n}\n","/**\n * Files Channel Controller\n *\n * Handles file-related streaming channels: upload, download, generate.\n * Listens to CoreEventManager events and broadcasts to connected clients.\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type {\n StreamBroadcasterInterface,\n FilesUploadStreamProgress,\n FilesDownloadStreamProgress,\n FilesGenerateStreamProgress,\n CoreEvent,\n} from '@plyaz/types/core';\nimport { FILES_STREAM_CHANNEL_PREFIX, FILES_STREAM_BROADCAST_CHANNEL } from '@plyaz/types/core';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * FilesChannelController - Handles file streaming channels\n *\n * Channels:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - Broadcast channel for all uploads\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - Broadcast channel for all downloads\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - Broadcast channel for all generations\n */\nexport class FilesChannelController extends BaseChannelController {\n constructor() {\n super({\n scope: 'files',\n patterns: [\n // Upload channels\n FILES_STREAM_CHANNEL_PREFIX.UPLOAD,\n FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n // Download channels\n FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD,\n FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n // Generate channels\n FILES_STREAM_CHANNEL_PREFIX.GENERATE,\n FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS,\n ],\n });\n }\n\n /**\n * Initialize event subscriptions.\n * Listens to CoreEventManager events and broadcasts to appropriate channels.\n */\n // eslint-disable-next-line max-lines-per-function\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('[FilesChannelController] initialize() called');\n\n // Listen for upload progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:progress',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n this.logger.debug('[FilesChannelController] Received upload:progress event', {\n fileId: progress.fileId,\n percentage: progress.percentage,\n channel,\n broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n });\n\n // Broadcast to file-specific channel with prefixed event name\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:progress',\n data: this.createResponse(progress, channel, 'Upload progress'),\n });\n\n // Also broadcast to general uploads channel\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:progress',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n });\n }\n )\n );\n\n // Listen for upload completed events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:completed',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:completed',\n data: this.createResponse(progress, channel, 'Upload completed'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:completed',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n });\n }\n )\n );\n\n // Listen for upload error events\n this.addUnsubscriber(\n CoreEventManager.on<FilesUploadStreamProgress>(\n 'upload:error',\n (event: CoreEvent<FilesUploadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'upload:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n progress.error ?? 'Upload failed',\n channel\n ),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n event: 'upload:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n progress.error ?? 'Upload failed',\n FILES_STREAM_BROADCAST_CHANNEL.UPLOADS\n ),\n });\n }\n )\n );\n\n // Listen for download progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:progress',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n this.logger.debug('[FilesChannelController] Received download:progress event', {\n fileId: progress.fileId,\n percentage: progress.percentage,\n channel,\n broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n });\n\n // Broadcast to file-specific channel with prefixed event name\n broadcaster.broadcastToChannel(channel, {\n event: 'download:progress',\n data: this.createResponse(progress, channel, 'Download progress'),\n });\n\n // Also broadcast to general downloads channel\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:progress',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n });\n }\n )\n );\n\n // Listen for download completed events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:completed',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'download:completed',\n data: this.createResponse(progress, channel, 'Download completed'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:completed',\n data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n });\n }\n )\n );\n\n // Listen for download error events\n this.addUnsubscriber(\n CoreEventManager.on<FilesDownloadStreamProgress>(\n 'download:error',\n (event: CoreEvent<FilesDownloadStreamProgress>) => {\n const progress = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'download:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n progress.error ?? 'Download failed',\n channel\n ),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n event: 'download:failed',\n data: this.createSingleError(\n STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n progress.error ?? 'Download failed',\n FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS\n ),\n });\n }\n )\n );\n\n // Listen for generate progress events\n this.addUnsubscriber(\n CoreEventManager.on<FilesGenerateStreamProgress>(\n 'generate:progress',\n (event: CoreEvent<FilesGenerateStreamProgress>) => {\n const data = event.data;\n const channel = `${FILES_STREAM_CHANNEL_PREFIX.GENERATE}${data.templateId}`;\n\n broadcaster.broadcastToChannel(channel, {\n event: 'generate:progress',\n data: this.createResponse(data, channel, 'Generation progress'),\n });\n\n broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS, {\n event: 'generate:progress',\n data: this.createResponse(data, FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS),\n });\n }\n )\n );\n\n this.logger.info('FilesChannelController initialized');\n }\n\n /**\n * Override handlesChannel to match file patterns.\n */\n override handlesChannel(channel: string): boolean {\n // Check if channel starts with any of the prefixes\n return (\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.UPLOAD) ||\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD) ||\n channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.GENERATE) ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.UPLOADS ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS ||\n channel === FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS\n );\n }\n}\n","/**\n * Files Stream Endpoint\n *\n * Stream endpoint for file-related real-time events.\n * Handles upload, download, and document generation progress.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { FilesChannelController } from './FilesChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * FilesStreamEndpoint - Handles file streaming events\n *\n * Channels managed:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - All uploads broadcast\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - All downloads broadcast\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - All generations broadcast\n */\nexport class FilesStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'files';\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new FilesChannelController();\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('[FilesStreamEndpoint] initialize() called');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.debug('[FilesStreamEndpoint] initialized', {\n patterns: this.channelController.getPatterns(),\n });\n }\n\n /**\n * Static factory method for creating endpoint instances.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n static async create(\n config: StreamEndpointConfig,\n options: StreamEndpointCreateOptions\n ): Promise<FilesStreamEndpoint> {\n return new FilesStreamEndpoint(config, options);\n }\n}\n","/**\n * System Channel Controller\n *\n * Handles system-level streaming channels: heartbeat, connection lifecycle.\n */\n\nimport { BaseChannelController } from '../../channels/BaseChannelController';\nimport type { StreamBroadcasterInterface } from '@plyaz/types/core';\nimport { SYSTEM_STREAM_CHANNEL } from '@plyaz/types/core';\n\n/**\n * SystemChannelController - Handles system streaming channels\n *\n * Channels:\n * - `system` - System-level events (heartbeat, connected, disconnected)\n */\nexport class SystemChannelController extends BaseChannelController {\n /** Heartbeat interval timer */\n private heartbeatTimer?: ReturnType<typeof setInterval>;\n\n /** Heartbeat interval in milliseconds */\n private readonly heartbeatInterval: number;\n\n constructor(heartbeatInterval = 30000) {\n super({\n scope: 'system',\n patterns: [SYSTEM_STREAM_CHANNEL.SYSTEM],\n });\n this.heartbeatInterval = heartbeatInterval;\n }\n\n /**\n * Initialize event subscriptions.\n * Sets up heartbeat broadcasting.\n */\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('Initializing SystemChannelController');\n\n // Start heartbeat timer\n this.heartbeatTimer = setInterval(() => {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'heartbeat',\n data: this.createResponse(\n { timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Heartbeat'\n ),\n });\n }, this.heartbeatInterval);\n\n this.logger.info('SystemChannelController initialized', {\n heartbeatInterval: this.heartbeatInterval,\n });\n }\n\n /**\n * Override handlesChannel to match system patterns.\n */\n override handlesChannel(channel: string): boolean {\n return channel === SYSTEM_STREAM_CHANNEL.SYSTEM || channel.startsWith('system:');\n }\n\n /**\n * Override dispose to clean up heartbeat timer.\n */\n override dispose(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n }\n super.dispose();\n }\n\n /**\n * Broadcast a connection established event.\n */\n broadcastConnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'connected',\n data: this.createResponse(\n { connectionId, timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Connected'\n ),\n });\n }\n\n /**\n * Broadcast a connection closed event.\n */\n broadcastDisconnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n event: 'disconnected',\n data: this.createResponse(\n { connectionId, timestamp: Date.now() },\n SYSTEM_STREAM_CHANNEL.SYSTEM,\n 'Disconnected'\n ),\n });\n }\n}\n","/**\n * System Stream Endpoint\n *\n * Stream endpoint for system-level events like heartbeat and connection lifecycle.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../base/BaseStreamEndpoint';\nimport { SystemChannelController } from './SystemChannelController';\nimport type { BaseChannelController } from '../../channels/BaseChannelController';\nimport type {\n StreamEndpointConfig,\n StreamEndpointCreateOptions,\n StreamConnection,\n} from '@plyaz/types/core';\n\n/**\n * SystemStreamEndpoint - Handles system-level streaming events\n *\n * Channels managed:\n * - `system` - System events (heartbeat, connected, disconnected)\n */\nexport class SystemStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'system';\n\n /** Heartbeat interval in milliseconds */\n private readonly heartbeatInterval: number;\n\n constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n super(config, options);\n // Allow configuring heartbeat interval via config\n const DEFAULT_HEARTBEAT_MS = 30000;\n this.heartbeatInterval =\n (config as { heartbeatInterval?: number }).heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;\n }\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new SystemChannelController(this.heartbeatInterval);\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('Initializing SystemStreamEndpoint');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.info('SystemStreamEndpoint initialized', {\n heartbeatInterval: this.heartbeatInterval,\n });\n }\n\n /**\n * Called when a new connection is established.\n * Broadcasts a connected event.\n */\n protected override async onConnect(connection: StreamConnection): Promise<void> {\n const controller = this.channelController as SystemChannelController;\n controller.broadcastConnected(this.broadcaster, connection.id);\n }\n\n /**\n * Called when a connection is closed.\n * Broadcasts a disconnected event.\n */\n protected override async onDisconnect(connectionId: string): Promise<void> {\n const controller = this.channelController as SystemChannelController;\n controller.broadcastDisconnected(this.broadcaster, connectionId);\n }\n\n /**\n * Static factory method for creating endpoint instances.\n *\n * @param config - Endpoint configuration\n * @param options - Create options (broadcaster, auth, etc.)\n * @returns Promise resolving to endpoint instance\n */\n static async create(\n config: StreamEndpointConfig,\n options: StreamEndpointCreateOptions\n ): Promise<SystemStreamEndpoint> {\n return new SystemStreamEndpoint(config, options);\n }\n}\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Type-safe access to alternative runtime globals\nconst getGlobalProperty = (key: string): unknown => {\n return (globalThis as Record<string, unknown>)[key];\n};\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('Deno') !== 'undefined') return 'deno';\n if (typeof getGlobalProperty('Bun') !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('EdgeRuntime') !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * db: { adapter: 'drizzle' },\n * api: {\n * env: 'production',\n * baseURL: 'https://api.example.com',\n * },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * skipDb: true,\n * api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n * FeatureFlagModule.forRoot({ provider: 'database' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport { StreamRegistry, StreamServer } from '../events/streaming';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\nimport type {\n CoreRuntimeEnvironment,\n CoreRuntimeContext,\n CoreEnvVars,\n CoreAppEnvironment,\n CoreAppContext,\n CoreApiInitOptions,\n CoreServiceRuntime,\n CoreInitOptionsBase as BaseCoreInitOptions,\n CoreServicesResultBase,\n CoreServiceEntry,\n CoreDomainServiceInstance,\n CoreSystemErrorPayload,\n CoreFeatureFlagInitConfig,\n CoreErrorHandlerInitConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n StreamEndpointEntry,\n CoreDbServiceInstance,\n CoreCacheServiceInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\n// Core error handling (frontend-safe)\nimport {\n initializeGlobalErrorHandler,\n setEventEmitter,\n clearEventEmitter,\n} from '@plyaz/errors/middleware';\n// ServerErrorMiddleware is backend-only, import dynamically where needed\nimport type {\n ErrorStoreActions,\n GlobalErrorHandler,\n SerializedError,\n PackageErrorLike,\n} from '@plyaz/types/errors';\nimport { ERROR_CATEGORY } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport { generateId } from '../utils/common';\nimport { createStandaloneFeatureFlagStore, STORE_KEYS, type StoreKey } from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice, RootStoreHook } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\nimport { getCoreDependency } from '../config/dependencies';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n extends Omit<\n BaseCoreInitOptions<\n Partial<CoreDbServiceConfig>,\n CoreApiInitOptions,\n CoreStorageConfig,\n CoreNotificationConfig\n >,\n 'observability' | 'skipObservability'\n > {\n /** Observability configuration */\n observability?: CoreObservabilityConfig;\n /** Skip observability initialization */\n skipObservability?: boolean;\n /**\n * Global error handler configuration.\n * Auto-initializes by default to catch all uncaught errors.\n * Set `enabled: false` to disable if you want to use your own error handling.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * errorHandler: {\n * enabled: true,\n * logToConsole: true,\n * maxErrors: 200,\n * filter: (error) => error instanceof MyError,\n * },\n * });\n * ```\n */\n errorHandler?: CoreErrorHandlerInitConfig;\n\n /** Feature flags configuration */\n featureFlags?: CoreFeatureFlagInitConfig;\n\n /**\n * Domain services to auto-initialize (frontend pattern).\n * Uses ServiceRegistry for automatic initialization.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n * ],\n * });\n *\n * // Access via ServiceRegistry\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * ```\n */\n services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n CoreDbServiceInstance,\n typeof ApiClientService,\n CoreCacheServiceInstance,\n ObservabilityAdapter,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Function type for getting core domain services.\n * Used by entry points to inject runtime-appropriate services.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreDomainServicesFn = (isFrontend: boolean) => Promise<CoreServiceEntry[]>;\n\n/**\n * Injected function to get core domain services.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - they just don't load default services.\n */\nlet _getCoreDomainServices: GetCoreDomainServicesFn | null = null;\n\n/**\n * Set the function to get core domain services.\n * Called by entry-backend.ts to inject the backend-aware service loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreDomainServices(fn: GetCoreDomainServicesFn): void {\n _getCoreDomainServices = fn;\n}\n\n/**\n * Function type for getting core stream endpoints.\n * Used by entry points to inject backend stream endpoints.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreStreamEndpointsFn = () => Promise<StreamEndpointEntry[]>;\n\n/**\n * Injected function to get core stream endpoints.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - streaming is backend-only.\n */\nlet _getCoreStreamEndpoints: GetCoreStreamEndpointsFn | null = null;\n\n/**\n * Set the function to get core stream endpoints.\n * Called by entry-backend.ts to inject the backend stream endpoint loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreStreamEndpoints(fn: GetCoreStreamEndpointsFn): void {\n _getCoreStreamEndpoints = fn;\n}\n\nexport class Core {\n private static initialized = false;\n private static _coreServices: CoreServicesResult = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n\n /**\n * Logger for Core initialization (created lazily)\n */\n private static _logger: PackageLogger | null = null;\n\n /**\n * Logger transport config (set during initialize)\n */\n private static _loggerTransport: 'pino' | 'console' = 'pino';\n\n /**\n * Get or create the Core logger\n */\n private static get logger(): PackageLogger {\n Core._logger ??= new PackageLogger({\n packageName: 'core',\n service: 'Core',\n transport: Core._loggerTransport,\n });\n return Core._logger;\n }\n\n /**\n * Configure logger transport (call before first log)\n */\n private static configureLogger(transport?: 'pino' | 'console'): void {\n if (transport && transport !== Core._loggerTransport) {\n Core._loggerTransport = transport;\n // Reset logger so it gets recreated with new transport\n Core._logger = null;\n }\n }\n\n /**\n * Get the configured logger transport.\n * Used by services to create loggers with the same transport setting.\n */\n static get loggerTransport(): 'pino' | 'console' {\n return Core._loggerTransport;\n }\n\n /**\n * Log a message during initialization.\n * Uses PackageLogger, respects verbose flag.\n */\n private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n if (!verbose) return;\n if (data) {\n Core.logger.info(message, data);\n } else {\n Core.logger.info(message);\n }\n }\n\n /**\n * Log a debug message during initialization.\n */\n private static logDebug(\n message: string,\n verbose?: boolean,\n data?: Record<string, unknown>\n ): void {\n if (!verbose) return;\n if (data) {\n Core.logger.debug(message, data);\n } else {\n Core.logger.debug(message);\n }\n }\n\n /**\n * Observability configuration\n */\n private static _observabilityConfig: CoreObservabilityConfig = {};\n\n /**\n * Global error handler instance\n */\n private static _errorHandler: GlobalErrorHandler | null = null;\n\n /**\n * Error handler configuration\n */\n private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n /**\n * HTTP error handler/middleware based on runtime.\n * Auto-created during initialization.\n */\n private static _httpErrorHandler: unknown = null;\n\n /**\n * Event listener cleanup functions\n */\n private static _eventCleanupFns: (() => void)[] = [];\n\n /**\n * Feature flag configuration\n */\n private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n /**\n * Root store instance (contains errors, feature flags, and all other slices)\n * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n * All store access should go through Core.rootStore - no separate stores needed\n */\n private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n /**\n * Injected store hook for frontend (set via setRootStoreHook before initialize).\n * This is used instead of directly importing from @plyaz/store to prevent\n * duplicate store instances when bundlers create multiple module copies.\n */\n private static _injectedStoreHook: RootStoreHook | null = null;\n\n /**\n * Set the root store hook for frontend use.\n * Must be called before Core.initialize() when running in browser.\n * PlyazProvider calls this automatically with the store prop.\n *\n * @param store - The useRootStore hook from @plyaz/store\n */\n public static setRootStoreHook(store: RootStoreHook): void {\n Core._injectedStoreHook = store;\n }\n\n /**\n * Setup environment and context\n */\n private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n const { envPath, environment, appContext, env, verbose } = options;\n\n Core._coreServices.appContext = appContext ?? 'webapp';\n Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n const globalEnvironment: CoreAppEnvironment =\n environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n Core._coreServices.runtime = detectRuntime();\n Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n if (envPath) await loadEnvFile(envPath, verbose);\n Core._coreServices.env = { ...process.env, ...env };\n\n return globalEnvironment;\n }\n\n /**\n * Initialize a service with error handling\n */\n private static async initService<T>(\n name: string,\n init: () => Promise<T>,\n verbose?: boolean\n ): Promise<T | undefined> {\n try {\n return await init();\n } catch (error) {\n Core.logger.error(`Failed to initialize ${name}`, { error: (error as Error).message });\n if (verbose) Core.logger.error('Full error', { error });\n return undefined;\n }\n }\n\n /** Initialize error handler if enabled */\n private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n const { errorHandler: config, verbose } = options;\n if (config?.enabled === false) {\n Core.log('Global error handler disabled by configuration', verbose);\n return;\n }\n await Core.initService(\n 'error handler',\n async () => {\n await Core.initializeErrorHandler(config, verbose);\n Core.subscribeToErrorEvents(verbose);\n },\n verbose\n );\n }\n\n /** Initialize API client if not skipped */\n private static async initApiIfEnabled(\n options: CoreInitOptions,\n env: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, skipApi, verbose } = options;\n if (skipApi) return;\n\n await Core.initService(\n 'API client',\n async () => {\n await Core.initializeApi(apiConfig, env, verbose);\n Core._coreServices.api = ApiClientService;\n Core.log('API client service initialized', verbose);\n },\n verbose\n );\n Core._coreServices.api = ApiClientService;\n }\n\n /** Initialize cache service if not skipped (backend-only due to ioredis dependency) */\n private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n const { cache: cacheConfig, skipCache, verbose } = options;\n if (skipCache) {\n Core.log('Cache service skipped (skipCache: true)', verbose);\n return;\n }\n\n // Skip cache initialization if no config provided\n if (!cacheConfig) {\n Core.log('Cache service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (CacheService pulls in ioredis which requires Node.js)\n if (Core.isFrontend) {\n Core.log('Cache service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'cache',\n async () => {\n await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n const CacheService = getCoreDependency('CacheService');\n if (CacheService) {\n Core._coreServices.cache = CacheService.getInstance();\n Core.log('Cache service initialized', verbose);\n }\n },\n verbose\n );\n }\n\n /** Initialize observability if not skipped */\n private static async initObservabilityIfEnabled(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { observability: observabilityConfig, skipObservability, verbose } = options;\n if (skipObservability) {\n Core.log('Observability service skipped (skipObservability: true)', verbose);\n return;\n }\n\n // Always use ObservabilityService - it adds LoggerAdapter by default\n const config = observabilityConfig ?? { enabled: true };\n\n await Core.initService(\n 'observability',\n async () => {\n await Core.initializeObservability(config, verbose, globalEnvironment);\n Core.log('Observability service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize storage service if not skipped (backend-only) */\n private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n const { storage: storageConfig, skipStorage, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStorage) {\n Core.log('Storage service skipped (skipStorage: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!storageConfig) {\n Core.log('Storage service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (storage is backend-only)\n if (Core.isFrontend) {\n Core.log('Storage service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'storage',\n async () => {\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n Core.log('Storage service skipped (dependency not registered)', verbose);\n return;\n }\n await StorageService.initialize(storageConfig);\n Core._coreServices.storage = StorageService.getInstance();\n Core.log('Storage service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize notifications service if not skipped (backend-only) */\n private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipNotifications) {\n Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!notificationsConfig) {\n Core.log('Notifications service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (notifications is backend-only)\n if (Core.isFrontend) {\n Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'notifications',\n async () => {\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n Core.log('Notifications service skipped (dependency not registered)', verbose);\n return;\n }\n await NotificationService.initialize(notificationsConfig);\n Core._coreServices.notifications = NotificationService.getInstance();\n Core.log('Notifications service initialized', verbose);\n },\n verbose\n );\n }\n\n /**\n * StreamServer instance (created during streaming initialization)\n */\n private static _streamServer: InstanceType<typeof StreamServer> | null = null;\n\n /**\n * Get the stream server instance (if initialized)\n */\n static get streamServer(): InstanceType<typeof StreamServer> | null {\n return Core._streamServer;\n }\n\n /**\n * Initialize streaming service (SSE/WebSocket real-time events)\n *\n * Sets up StreamServer and StreamRegistry with domain endpoints.\n * Streaming is backend-only for server-sent events.\n *\n * @param options - Core init options with streaming config\n */\n private static async initStreamingIfConfigured(options: CoreInitOptions): Promise<void> {\n const { streaming: streamConfig, skipStreaming, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStreaming) {\n Core.log('Streaming service skipped (skipStreaming: true)', verbose);\n return;\n }\n\n // Skip if no config or disabled\n if (!streamConfig || streamConfig.enabled === false) {\n Core.log('Streaming service skipped (not configured or disabled)', verbose);\n return;\n }\n\n // Skip on frontend (streaming is server-side only)\n if (Core.isFrontend) {\n Core.log('Streaming service skipped (frontend runtime)', verbose);\n return;\n }\n\n await Core.initService(\n 'streaming',\n // eslint-disable-next-line complexity\n async () => {\n // Create stream server with config\n const serverConfig = streamConfig.server ?? {};\n Core._streamServer = StreamServer.create()\n .withSSE({\n heartbeatInterval:\n serverConfig.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS,\n maxConnections: serverConfig.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS,\n })\n .withDefaultChannels(\n (serverConfig.defaultChannels ?? STREAMING_DEFAULTS.DEFAULT_CHANNELS) as never\n )\n .build();\n\n // Initialize server\n Core._streamServer.initialize();\n\n // Get endpoints from config or use injected defaults\n let endpoints = streamConfig.endpoints;\n if (!endpoints && _getCoreStreamEndpoints) {\n endpoints = await _getCoreStreamEndpoints();\n }\n\n // Skip if no endpoints available\n if (!endpoints || endpoints.length === 0) {\n Core.log('Streaming: No endpoints configured, skipping StreamRegistry', verbose);\n return;\n }\n\n // Debug: Log endpoints being registered\n Core.log('Streaming endpoints to register', verbose, {\n count: endpoints.length,\n endpoints: endpoints.map(e => ({\n key: e.endpoint?.endpointKey,\n enabled: e.config?.enabled,\n name: e.config?.name,\n channels: e.config?.channels,\n })),\n });\n\n // Initialize StreamRegistry with endpoints\n await StreamRegistry.initialize({\n broadcaster: Core._streamServer.getBroadcaster(),\n endpoints,\n });\n\n Core.log('Streaming service initialized', verbose, {\n endpoints: StreamRegistry.getRegisteredKeys(),\n channels: serverConfig.defaultChannels ?? ['uploads', 'system'],\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize domain services\n *\n * Loads core domain services using the injected loader (if available),\n * then merges with any user-provided services.\n * User-provided service configs override core defaults.\n *\n * Note: Frontend entries don't inject a loader, so they only use user-provided services.\n */\n private static async initDomainServicesIfConfigured(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, services: userServices, verbose } = options;\n const runtime = Core._coreServices.runtime;\n\n // Load core services using injected loader (backend sets this, frontend doesn't)\n const coreDomainServices = _getCoreDomainServices\n ? await _getCoreDomainServices(Core.isFrontend)\n : [];\n\n // Merge core services with user-provided services\n // User services can override core service configs by using the same service class\n const coreServiceKeys = new Set(coreDomainServices.map(s => s.service.serviceKey));\n const userOverrides = (userServices ?? []).filter(s =>\n coreServiceKeys.has(s.service.serviceKey)\n );\n const additionalUserServices = (userServices ?? []).filter(\n s => !coreServiceKeys.has(s.service.serviceKey)\n );\n\n // Build merged services: core (with overrides applied) + additional user services\n const mergedServices: CoreServiceEntry[] = coreDomainServices\n .map(coreService => {\n const override = userOverrides.find(\n u => u.service.serviceKey === coreService.service.serviceKey\n );\n return override\n ? { ...coreService, config: { ...coreService.config, ...override.config } }\n : coreService;\n })\n .concat(additionalUserServices);\n\n // Skip if somehow no services\n if (mergedServices.length === 0) return;\n\n await Core.initService(\n 'domain services',\n async () => {\n Core.log('Initializing domain services via ServiceRegistry...', verbose);\n Core.logDebug('Core services', verbose, {\n services: coreDomainServices.map(s => s.service.serviceKey),\n });\n if (userServices?.length) {\n Core.logDebug('User services', verbose, {\n services: userServices.map(s => s.service.serviceKey),\n });\n }\n await ServiceRegistry.initialize({\n environment: globalEnvironment,\n runtime,\n apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n db: options.db,\n cache: options.cache,\n storage: options.storage,\n notifications: options.notifications,\n observability: options.observability,\n services: mergedServices,\n stores: {\n // Returns specific slice from namespaced root store (type-safe)\n getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n Core.getDomainStore(key),\n },\n });\n Core.log('Domain services initialized', verbose, {\n keys: ServiceRegistry.getInitializedKeys(),\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize all core services\n */\n\n static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n // Configure logger transport first (before any logs)\n Core.configureLogger(options.logger?.transport);\n\n if (Core.initialized) {\n Core.log('Already initialized, returning existing services', options.verbose);\n return Core._coreServices;\n }\n\n const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n const globalEnvironment = await Core.setupEnvironment(options);\n\n await Core.initErrorHandlerIfEnabled(options);\n\n if (!Core.shouldSkipDbService(skipDb, verbose)) {\n const db = await Core.initService(\n 'database',\n () => Core.initializeDb(dbConfig, verbose),\n verbose\n );\n Core._coreServices.db = db ?? null;\n }\n\n await Core.initApiIfEnabled(options, globalEnvironment);\n\n await Core.initCacheIfEnabled(options);\n\n await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n await Core.initStorageIfEnabled(options);\n\n await Core.initNotificationsIfEnabled(options);\n\n await Core.initStreamingIfConfigured(options);\n\n if (featureFlagsConfig?.enabled !== false) {\n await Core.initService(\n 'feature flags',\n () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n verbose\n );\n }\n\n await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n Core.initialized = true;\n Core.log('Initialization complete', verbose);\n return Core._coreServices;\n }\n\n /**\n * Get initialized domain service keys\n * Use Core.getService(key) or ServiceRegistry.get(key) to access individual services.\n *\n * @example\n * ```typescript\n * const keys = Core.serviceKeys;\n * const exampleService = Core.getService('example');\n * ```\n */\n static get serviceKeys(): string[] {\n return ServiceRegistry.getInitializedKeys();\n }\n\n /**\n * All stores - unified access to ALL slices from single root store\n * All stores (global + domain) are slices of ONE Zustand store instance.\n *\n * **Auto-generated from STORE_KEYS** - No manual registration needed!\n *\n * **Benefits:**\n * - ✅ Access without hooks (store.getState())\n * - ✅ Cross-slice subscriptions work automatically\n * - ✅ Single source of truth\n * - ✅ Automatically scales with new stores\n *\n * @example\n * const errorStore = Core.stores.error; // Global slice\n * const flagsStore = Core.stores.featureFlags; // Global slice\n * const exampleStore = Core.stores.example; // Domain slice\n */\n static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n const rootState = Core._rootStore?.getState();\n\n // Dynamically generate store accessors from STORE_KEYS\n return Object.values(STORE_KEYS).reduce(\n (acc, key) => {\n Object.defineProperty(acc, key, {\n get: () => rootState,\n enumerable: true,\n });\n return acc;\n },\n {} as Record<StoreKey, RootStoreSlice | undefined>\n );\n }\n\n /**\n * Get a specific store slice by key (for ServiceRegistry injection).\n * Returns the actual slice from the namespaced root store.\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice or undefined\n *\n * @example\n * ```typescript\n * const exampleSlice = Core.getDomainStore('example'); // ✅ Returns ExampleFrontendStoreSlice\n * const errorSlice = Core.getDomainStore('errors'); // ✅ Returns ErrorStoreSlice\n * const invalid = Core.getDomainStore('invalid'); // ❌ TypeScript error!\n * ```\n */\n static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n static getDomainStore<T = RootStoreSlice>(): T | undefined;\n static getDomainStore<K extends keyof RootStoreSlice>(\n key?: K\n ): RootStoreSlice[K] | RootStoreSlice | undefined {\n const rootState = Core._rootStore?.getState();\n if (!rootState) return undefined;\n\n // If no key provided, return entire root store\n if (!key) return rootState;\n\n // Return specific slice from namespaced store (type-safe)\n return rootState[key];\n }\n\n /**\n * Event manager for subscribing to domain events\n * @example Core.events.on('example:created', handler)\n */\n static get events(): typeof CoreEventManager {\n return CoreEventManager;\n }\n\n /**\n * Get database service instance\n * @throws Error if not initialized\n */\n static get db(): CoreDbServiceInstance {\n if (!Core._coreServices.db) {\n throw new CorePackageError(\n 'Database service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.db;\n }\n\n /**\n * Get API client service\n */\n static get api(): typeof ApiClientService {\n if (!Core._coreServices.api) {\n throw new CorePackageError(\n 'API client service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.api;\n }\n\n /**\n * Get cache service instance (backend-only)\n * @throws Error if not initialized\n */\n static get cache(): CoreCacheServiceInstance {\n if (!Core._coreServices.cache) {\n throw new CorePackageError(\n 'Cache service not initialized. Call Core.initialize() with cache config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.cache;\n }\n\n /**\n * Get observability adapter instance\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * // Record a metric\n * await Core.observability.recordMetric({\n * type: 'counter',\n * name: 'api.requests',\n * value: 1,\n * tags: { endpoint: '/users' },\n * });\n *\n * // Start a span\n * const span = Core.observability.startSpan({ name: 'processOrder' });\n * try {\n * // ... do work\n * span.setStatus('ok');\n * } catch (e) {\n * span.recordException(e);\n * span.setStatus('error');\n * } finally {\n * span.end();\n * }\n * ```\n */\n static get observability(): ObservabilityAdapter {\n if (!Core._coreServices.observability) {\n throw new CorePackageError(\n 'Observability service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.observability;\n }\n\n /**\n * Check if observability is initialized\n */\n static get isObservabilityInitialized(): boolean {\n return Core._coreServices.observability !== null;\n }\n\n /**\n * Get observability configuration\n */\n static get observabilityConfig(): CoreObservabilityConfig {\n return Core._observabilityConfig;\n }\n\n /**\n * Get storage service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const storage = Core.storage.getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * ```\n */\n static get storage(): CoreStorageServiceInstance {\n if (!Core._coreServices.storage) {\n throw new CorePackageError(\n 'Storage service not initialized. Call Core.initialize() with storage config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.storage;\n }\n\n /**\n * Check if storage is initialized\n */\n static get isStorageInitialized(): boolean {\n return Core._coreServices.storage !== null;\n }\n\n /**\n * Get notifications service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const notifications = Core.notifications.getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * ```\n */\n static get notifications(): CoreNotificationServiceInstance {\n if (!Core._coreServices.notifications) {\n throw new CorePackageError(\n 'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.notifications;\n }\n\n /**\n * Check if notifications is initialized\n */\n static get isNotificationsInitialized(): boolean {\n return Core._coreServices.notifications !== null;\n }\n\n /**\n * Get root store (contains all slices: errors, feature flags, etc.)\n * Use this to access the full store state and all slice actions globally.\n *\n * @example\n * ```typescript\n * // Access error actions\n * const state = Core.rootStore.getState();\n * state.addError({ ... });\n *\n * // Access flags\n * console.log(state.flags);\n *\n * // Subscribe to store changes\n * Core.rootStore.subscribe((state) => {\n * console.log('Errors:', state.errors);\n * console.log('Flags:', state.flags);\n * });\n * ```\n */\n static get rootStore(): StoreApi<RootStoreSlice> {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore;\n }\n\n /**\n * Get global error store actions.\n * Provides access to the error store for querying and managing errors.\n *\n * @example\n * ```typescript\n * // Get all errors\n * const allErrors = useErrorStore.getState().errors;\n *\n * // Clear all errors\n * Core.errors.clearErrors();\n *\n * // Dismiss an error\n * Core.errors.dismissError(errorId);\n * ```\n */\n static get errors(): ErrorStoreActions {\n if (!Core._errorHandler) {\n throw new CorePackageError(\n 'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._errorHandler.getStore();\n }\n\n /**\n * Get feature flags store\n * Provides synchronous access to feature flag values from the store.\n *\n * @example\n * ```typescript\n * // Check if a flag is enabled\n * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n *\n * // Get a flag value\n * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n *\n * // Refresh flags from source\n * await Core.flags.refresh();\n * ```\n */\n static get flags(): FeatureFlagStoreSlice {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n // Return the feature flag slice from root store\n // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n }\n\n /**\n * Check if error handler is initialized\n */\n static get isErrorHandlerInitialized(): boolean {\n return Core._errorHandler !== null;\n }\n\n /**\n * Get the HTTP error handler/middleware based on runtime.\n * Returns different types based on detected runtime:\n *\n * - **Express**: Error handler middleware function\n * ```typescript\n * app.use(Core.httpErrorHandler);\n * ```\n *\n * - **NestJS**: Exception filter class\n * ```typescript\n * app.useGlobalFilters(new (Core.httpErrorHandler)());\n * ```\n *\n * - **Next.js**: Object with App Router and Pages Router handlers\n * ```typescript\n * // App Router\n * export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n * // Pages Router\n * export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n * ```\n *\n * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n * ```typescript\n * Core.httpErrorHandler.handleError(error, req, res);\n * ```\n *\n * - **Browser**: null (no HTTP handler needed)\n *\n * @returns The HTTP error handler for the current runtime\n */\n static get httpErrorHandler(): unknown {\n return Core._httpErrorHandler;\n }\n\n /**\n * Check if feature flags are initialized\n */\n static get isFlagsInitialized(): boolean {\n return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n }\n\n /**\n * Get error handler configuration\n */\n static get errorConfig(): CoreErrorHandlerInitConfig {\n return Core._errorConfig;\n }\n\n /**\n * Get feature flag configuration\n */\n static get flagConfig(): CoreFeatureFlagInitConfig {\n return Core._flagConfig;\n }\n\n /**\n * Get loaded environment variables\n */\n static get env(): CoreEnvVars {\n return Core._coreServices.env;\n }\n\n /**\n * Get detected runtime environment\n */\n static get runtime(): CoreRuntimeEnvironment {\n return Core._coreServices.runtime;\n }\n\n /**\n * Get current app context\n */\n static get appContext(): CoreAppContext {\n return Core._coreServices.appContext;\n }\n\n /**\n * Check if Core is initialized\n */\n static get isInitialized(): boolean {\n return Core.initialized;\n }\n\n /**\n * Check if running on a backend runtime\n */\n static get isBackend(): boolean {\n return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Check if running on a frontend runtime\n */\n static get isFrontend(): boolean {\n return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Get runtime context (backend, frontend, or universal)\n * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n */\n static getRuntimeContext(): CoreRuntimeContext {\n if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'backend';\n }\n if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'frontend';\n }\n return 'universal';\n }\n\n /**\n * Assert that the current runtime matches the expected runtime(s)\n * Throws an error if the runtime doesn't match\n *\n * @param expected - Expected runtime(s) to check against\n * @param serviceName - Name of the service for error message\n * @throws CorePackageError if runtime doesn't match\n *\n * @example\n * ```typescript\n * // Assert backend-only\n * Core.assertRuntime('backend', 'DatabaseService');\n *\n * // Assert multiple runtimes\n * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n * ```\n */\n static assertRuntime(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n serviceName: string\n ): void {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n // Check if current context matches any of the expected runtimes\n const isAllowed = runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n // Universal context (SSR) can run both frontend and backend code\n if (currentContext === 'universal') return true;\n return false;\n });\n\n if (!isAllowed) {\n throw new CorePackageError(\n `${serviceName} cannot run in ${currentContext} runtime. ` +\n `Allowed runtimes: ${runtimes.join(', ')}. ` +\n `Current runtime: ${Core._coreServices.runtime}`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Check if a service runtime is compatible with current runtime\n * Returns true/false instead of throwing\n *\n * @param expected - Expected runtime(s) to check against\n */\n static isRuntimeCompatible(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n ): boolean {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n return runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n if (currentContext === 'universal') return true;\n return false;\n });\n }\n\n /**\n * Get a registered domain service by key.\n * Convenience method that wraps ServiceRegistry.get().\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n *\n * @example\n * ```typescript\n * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): T {\n return ServiceRegistry.get<T>(key);\n }\n\n /**\n * Get a registered domain service by key with async initialization if needed.\n * Convenience method that wraps ServiceRegistry.getAsync().\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n */\n static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n return ServiceRegistry.getAsync<T>(key);\n }\n\n /**\n * Check if a domain service is registered.\n */\n static hasService(key: string): boolean {\n return ServiceRegistry.has(key);\n }\n\n /**\n * Reset Core (useful for testing)\n */\n // eslint-disable-next-line complexity\n static async reset(): Promise<void> {\n // Close database\n if (Core._coreServices.db) {\n await Core._coreServices.db.getDatabase()?.close?.();\n }\n\n // Dispose cache\n if (Core._coreServices.cache) {\n const CacheService = getCoreDependency('CacheService');\n CacheService?.reset?.();\n }\n\n // Dispose observability\n if (Core._coreServices.observability) {\n await Core._coreServices.observability.shutdown();\n }\n Core._observabilityConfig = {};\n\n // Dispose storage\n if (Core._coreServices.storage) {\n await Core._coreServices.storage.close();\n const StorageService = getCoreDependency('StorageService');\n await StorageService?.reset?.();\n }\n\n // Dispose notifications\n if (Core._coreServices.notifications) {\n await Core._coreServices.notifications.close();\n const NotificationService = getCoreDependency('NotificationService');\n await NotificationService?.reset?.();\n }\n\n // Dispose streaming\n if (Core._streamServer) {\n Core._streamServer.dispose();\n Core._streamServer = null;\n }\n StreamRegistry.dispose();\n\n // Dispose error handler\n if (Core._errorHandler) {\n Core._errorHandler.destroy();\n Core._errorHandler = null;\n clearEventEmitter(); // Clean up global error handler's CoreEventManager integration\n BaseError.clearEventEmitter(); // Clean up BaseError auto-emit integration\n }\n Core._errorConfig = {};\n Core._httpErrorHandler = null;\n\n // Cleanup event listeners\n for (const cleanup of Core._eventCleanupFns) {\n cleanup();\n }\n Core._eventCleanupFns = [];\n\n // Dispose feature flags slice and reset files store from root store\n if (Core._rootStore) {\n const state = Core._rootStore.getState();\n if (state.featureFlags?.dispose) {\n state.featureFlags.dispose();\n }\n // Reset files store slice\n if (state.files?.reset) {\n state.files.reset();\n }\n Core._rootStore = null;\n }\n Core._flagConfig = {};\n\n // Dispose all registered services via ServiceRegistry\n ServiceRegistry.disposeAll();\n\n // Dispose event manager\n CoreEventManager.dispose();\n\n Core._coreServices = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n Core.initialized = false;\n }\n\n /**\n * Determines whether to skip DbService initialization.\n *\n * DbService is backend-only and should never be initialized on frontend runtimes.\n * This method:\n * - Returns true (skip) if skipDb was explicitly set to true\n * - Returns true (skip) if running on frontend, with a warning\n * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n *\n * @param skipDb - User-provided skipDb option\n * @param verbose - Enable verbose logging\n * @returns true if DbService should be skipped\n */\n private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n // User explicitly requested to skip\n if (skipDb === true) {\n Core.log('Database service skipped (skipDb: true)', verbose);\n return true;\n }\n\n // Check if running on frontend\n const isFrontend = Core.isFrontend;\n\n if (isFrontend) {\n // User explicitly tried to init DbService on frontend (skipDb: false)\n if (skipDb === false) {\n Core.logger.warn(\n 'DbService cannot be initialized on frontend runtime. ' +\n 'DbService is backend-only and requires Node.js. ' +\n 'Use API calls from frontend instead. Skipping database initialization.'\n );\n } else if (verbose) {\n // skipDb was undefined (default) - just log that we're skipping\n Core.log(\n 'Database service skipped (frontend runtime detected). ' +\n 'DbService is only available on backend.',\n verbose\n );\n }\n return true;\n }\n\n // Backend or universal runtime - don't skip\n return false;\n }\n\n /**\n * Initialize database service\n * Config validation is handled by DbService\n */\n private static async initializeDb(\n config?: Partial<CoreDbServiceConfig>,\n verbose?: boolean\n ): Promise<CoreDbServiceInstance> {\n Core.log(`Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`, verbose);\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n throw new CorePackageError(\n 'DbService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return DbService.initialize({\n adapter: 'drizzle',\n ...config,\n } as CoreDbServiceConfig);\n }\n\n /**\n * Initialize API client service\n * Config validation is handled by ApiClientService\n */\n private static async initializeApi(\n config?: CoreApiInitOptions,\n globalEnvironment?: CoreAppEnvironment,\n verbose?: boolean\n ): Promise<void> {\n const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n Core.log(`Initializing API client for environment: ${resolvedEnv}`, verbose);\n\n await ApiClientService.init(\n {\n env: resolvedEnv,\n setAsDefault: setAsDefault ?? true,\n },\n apiClientOptions\n );\n }\n\n /**\n * Initialize cache service (backend-only)\n * Config validation is handled by CacheService\n */\n private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n Core.log(`Initializing cache with strategy: ${config.strategy}`, verbose);\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n throw new CorePackageError(\n 'CacheService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n await CacheService.initialize(config);\n }\n\n /**\n * Initialize observability service based on config.\n * Always includes LoggerAdapter as failover for console output.\n */\n private static async initializeObservability(\n config: CoreObservabilityConfig,\n verbose?: boolean,\n environment?: CoreAppEnvironment\n ): Promise<void> {\n Core.log(`Initializing observability with provider: ${config.provider ?? 'auto'}`, verbose);\n\n // Use environment from config or passed parameter\n const env = config.environment ?? environment ?? 'development';\n Core._observabilityConfig = { ...config, environment: env };\n\n // Collect adapters with priorities\n const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n // Always add LoggerAdapter as failover for console output\n const loggerAdapter = new LoggerAdapter();\n await loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n });\n adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n // TODO: Add DatadogAdapter when configured (high priority, primary)\n // if (config.provider === 'datadog' || config.datadog) {\n // const datadogAdapter = new DatadogAdapter();\n // await datadogAdapter.initialize({\n // ...config,\n // ...config.datadog,\n // environment: env,\n // });\n // adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n // }\n\n // Create ObservabilityService with all adapters\n const observability = new ObservabilityService();\n await observability.initialize({\n mode: config.mode ?? 'parallel',\n adapters,\n enabled: config.enabled,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n samplingRate: config.samplingRate,\n flushInterval: config.flushInterval,\n adapterTimeout: config.flushInterval,\n });\n\n Core.log(\n `ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`,\n verbose\n );\n\n Core._coreServices.observability = observability;\n // Set on ServiceRegistry for injection\n ServiceRegistry.setObservabilityInstance(observability);\n }\n\n /**\n * Initialize global error handler\n */\n /** Create and initialize root store (includes error store + all other slices) */\n private static async initializeRootStore(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const isFrontend = typeof window !== 'undefined';\n\n if (isFrontend) {\n if (!Core._injectedStoreHook) {\n throw new CorePackageError(\n 'Root store hook not set. Call Core.setRootStoreHook(useRootStore) before Core.initialize(), ' +\n 'or use PlyazProvider with the store prop: <PlyazProvider store={useRootStore} ...>',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n Core.log('Using frontend root store (Zustand) - injected via setRootStoreHook', verbose);\n // Frontend: use the injected store hook's vanilla store API\n Core._rootStore = Core._injectedStoreHook as unknown as StoreApi<RootStoreSlice>;\n } else {\n Core.log('Creating backend composite store (in-memory)', verbose);\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n throw new CorePackageError(\n 'ServerErrorMiddleware not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Backend: create in-memory error store + feature flag store (NOT Zustand)\n const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n onErrorAdded: config?.onError as ((error: unknown) => void) | undefined,\n });\n\n // Create standalone feature flag store for backend\n const backendFlagStore = createStandaloneFeatureFlagStore();\n\n // Combine error + feature flag stores to match RootStoreSlice interface\n // IMPORTANT: Must use namespaced keys (errors, featureFlags) to match frontend structure\n const compositeStore = {\n errors: backendErrorStore,\n featureFlags: backendFlagStore,\n };\n\n // Wrap backend composite store to match root store interface (getState() pattern)\n Core._rootStore = {\n getState: () => compositeStore,\n subscribe: () => () => {}, // No-op for backend\n destroy: () => {\n backendErrorStore.reset();\n backendFlagStore.dispose?.();\n },\n } as unknown as StoreApi<RootStoreSlice>;\n }\n }\n\n /**\n * Serialize a PackageErrorLike to SerializedError format.\n * Used by BaseError.setEventEmitter() to convert errors for the store.\n */\n private static serializePackageError(error: PackageErrorLike): SerializedError {\n const serviceName = typeof error.context?.service === 'string' ? error.context.service : 'core';\n\n return {\n id: generateId(),\n code: (error.errorCode as SerializedError['code']) ?? ERROR_CODES.UNKNOWN_ERROR,\n message: error.message,\n status: error.statusCode,\n category: error.category ?? ERROR_CATEGORY.Server,\n timestamp: error.timestamp ?? new Date().toISOString(),\n isRetryable: error.retryable ?? false,\n source: serviceName,\n dismissed: false,\n context: {\n correlationId: error.correlationId,\n ...error.context,\n },\n };\n }\n\n /** Get error store actions from root store */\n private static getErrorStoreActions(): ErrorStoreActions {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore.getState().errors;\n }\n\n /** Build global error handler config */\n\n private static buildErrorHandlerConfig(\n config?: CoreErrorHandlerInitConfig\n ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n // Compose filter: skip BaseError instances (they auto-emit via setEventEmitter)\n // then apply user's custom filter if provided\n const baseErrorFilter = (error: unknown): boolean => {\n // Skip BaseError instances - they already emit SYSTEM.ERROR via BaseError.setEventEmitter()\n // This prevents duplicate entries in the error store for uncaught BaseErrors\n if (error instanceof BaseError) {\n return false;\n }\n // Apply user's custom filter if provided\n return config?.filter ? config.filter(error) : true;\n };\n\n return {\n source: config?.source ?? 'global',\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n filter: baseErrorFilter,\n onError: config?.onError,\n logToConsole: config?.logToConsole ?? false,\n };\n }\n\n // eslint-disable-next-line complexity\n private static async initializeErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Error handler disabled by configuration', verbose);\n return;\n }\n\n Core._errorConfig = config ?? {};\n Core.log('Initializing global error handler...', verbose);\n\n // Initialize error system (translations, catalogs)\n // This is safe to call multiple times - it checks if already initialized\n initializeErrorSystem({\n defaultLocale: Core._errorConfig.localization?.defaultLocale,\n fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n });\n\n // Initialize root store (contains error store + all slices)\n await Core.initializeRootStore(Core._errorConfig, verbose);\n\n // Wire up CoreEventManager for automatic error event emission\n // This allows errors captured by the global handler to emit events\n setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n // Wire up BaseError to auto-emit CORE_EVENTS.SYSTEM.ERROR when ANY error is created\n // This covers ALL BaseError subclasses: CorePackageError, DatabasePackageError,\n // ValidationError, ApiPackageError, StoragePackageError, NotificationPackageError, etc.\n BaseError.setEventEmitter(error => {\n const serializedError = Core.serializePackageError(error);\n const serviceName = serializedError.source ?? 'core';\n\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, {\n errors: [serializedError],\n context: serviceName,\n recoverable: error.retryable ?? false,\n } satisfies CoreSystemErrorPayload);\n });\n\n const errorStore = Core.getErrorStoreActions();\n Core._errorHandler = initializeGlobalErrorHandler(\n errorStore,\n Core.buildErrorHandlerConfig(Core._errorConfig)\n );\n\n // Subscribe to SYSTEM.ERROR events and setup store subscriptions\n Core.setupErrorEventSubscription(verbose);\n Core.setupErrorStoreSubscription(verbose);\n\n Core.log('Global error handler initialized with CoreEventManager integration', verbose);\n\n // Auto-create HTTP error handler based on runtime (unless disabled)\n if (Core._errorConfig.httpHandler !== false) {\n await Core.createHttpErrorHandler(Core._errorConfig, verbose);\n }\n }\n\n /**\n * Log serialized errors with full details.\n */\n private static logErrors(errors: SerializedError[], prefix = 'ErrorStore'): void {\n for (const err of errors) {\n Core.logger.error(`[${prefix}] ${err.code}: ${err.message}`, {\n id: err.id,\n code: err.code,\n message: err.message,\n category: err.category,\n source: err.source,\n status: err.status,\n isRetryable: err.isRetryable,\n context: err.context,\n timestamp: err.timestamp,\n });\n }\n }\n\n /**\n * Setup SYSTEM.ERROR event subscription for error store updates.\n * Backend: Also logs errors with full details.\n * Frontend: Only updates store (logging handled by store subscription).\n */\n private static setupErrorEventSubscription(verbose?: boolean): void {\n const isBackend = BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n\n const errorEventCleanup = CoreEventManager.on(\n CORE_EVENTS.SYSTEM.ERROR,\n (event: CoreEvent<CoreSystemErrorPayload>) => {\n if (!Core._rootStore) return;\n\n try {\n const { errors } = event.data;\n if (!errors || errors.length === 0) return;\n\n Core._rootStore.getState().errors.addErrors(errors);\n if (isBackend) Core.logErrors(errors);\n Core.log(`Added ${errors.length} error(s) to store`, verbose);\n } catch (e) {\n Core.logger.error('Failed to handle error event', { error: e });\n }\n }\n );\n\n Core._eventCleanupFns.push(errorEventCleanup);\n }\n\n /**\n * Setup error store subscription for frontend logging.\n * Logs new errors when they're added to the store.\n * Only active for non-backend runtimes (browser, nextjs, nuxt, edge).\n */\n private static setupErrorStoreSubscription(verbose?: boolean): void {\n const isFrontend = !BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n if (!isFrontend || !Core._rootStore) return;\n\n let prevErrorCount = 0;\n const storeUnsubscribe = Core._rootStore.subscribe(state => {\n const currentCount = state.errors.errorCount;\n if (currentCount <= prevErrorCount) {\n prevErrorCount = currentCount;\n return;\n }\n const newErrors = state.errors.errors.slice(0, currentCount - prevErrorCount);\n Core.logErrors(newErrors, 'ErrorStore:FE');\n prevErrorCount = currentCount;\n });\n\n Core._eventCleanupFns.push(storeUnsubscribe);\n Core.log('Error store subscription initialized for frontend', verbose);\n }\n\n /**\n * Create HTTP error handler based on detected runtime.\n * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n */\n // eslint-disable-next-line complexity\n private static async createHttpErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const runtime = Core._coreServices.runtime;\n const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n // Skip for browser runtime (no HTTP error handler needed)\n if (runtime === 'browser') {\n Core._httpErrorHandler = null;\n Core.log('Skipping HTTP handler for browser runtime', verbose);\n return;\n }\n\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n Core.log('Skipping HTTP handler (ServerErrorMiddleware not registered)', verbose);\n return;\n }\n\n // Build common config for all HTTP handlers\n const httpConfig = {\n source: runtime,\n includeStack: config?.includeStack ?? !isProduction,\n logErrors: config?.logger ?? config?.logToConsole ?? true,\n errorHandler: Core._errorHandler ?? undefined,\n };\n\n switch (runtime) {\n case 'express':\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log('Created Express error handler middleware', verbose);\n break;\n\n case 'nestjs':\n Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n Core.log('Created NestJS exception filter', verbose);\n break;\n\n case 'nextjs':\n // For Next.js, provide both App Router and Pages Router handlers\n Core._httpErrorHandler = {\n /** For App Router: export const GET = withErrorHandler(handler) */\n withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n ServerErrorMiddleware.withErrorHandler(\n handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n { ...httpConfig, ...overrideConfig }\n ),\n /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n createNextApiErrorHandler: (overrideConfig = {}) =>\n ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n };\n Core.log('Created Next.js error handlers', verbose);\n break;\n\n case 'node':\n case 'bun':\n case 'deno':\n // Generic Node.js handler\n Core._httpErrorHandler = {\n /** Handle error: handleNodeError(error, req, res) */\n handleError: (error: unknown, req: unknown, res: unknown) =>\n ServerErrorMiddleware.handleNodeError(\n error,\n req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n httpConfig\n ),\n /** Create middleware for use with native http */\n createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n };\n Core.log(`Created ${runtime} error handler`, verbose);\n break;\n\n default:\n // For unknown runtimes, provide generic handler\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log(`Created generic HTTP error handler for ${runtime}`, verbose);\n }\n }\n\n /**\n * Subscribe to CoreEventManager error events\n * Forwards entity, API, validation, database, and auth errors to the global error handler.\n *\n * NOTE: SYSTEM.ERROR is NOT subscribed here - it's handled in initializeErrorHandler()\n * via the BaseError.setEventEmitter() + addErrors() pattern to avoid duplicate subscriptions.\n *\n * For non-BaseError errors, domain-specific events (ENTITY.ERROR, API.REQUEST_ERROR, etc.)\n * are captured here. BaseError instances are skipped (they already auto-emit via SYSTEM.ERROR).\n *\n * Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n * DbService is backend-only (skipDb: true on frontend).\n */\n private static subscribeToErrorEvents(verbose?: boolean): void {\n if (!Core._errorHandler) {\n return;\n }\n\n Core.log('Subscribing to error events...', verbose);\n\n // NOTE: SYSTEM.ERROR subscription is in initializeErrorHandler() to avoid duplicates.\n // All BaseError instances auto-emit to SYSTEM.ERROR via BaseError.setEventEmitter(),\n // and that handler adds errors directly via addErrors().\n\n // Helper: subscribe to error event, skip BaseError (already auto-emits via SYSTEM.ERROR)\n const subscribeError = (event: string, source: string): (() => void) => {\n return CoreEventManager.on(event, (e: CoreEvent<{ error?: unknown }>) => {\n if (Core._errorHandler && e.data?.error && !(e.data.error instanceof BaseError)) {\n Core._errorHandler.captureError(e.data.error, source);\n }\n });\n };\n\n // Universal error subscriptions (frontend + backend)\n Core._eventCleanupFns.push(\n subscribeError(CORE_EVENTS.ENTITY.ERROR, 'entity'),\n subscribeError(CORE_EVENTS.API.REQUEST_ERROR, 'api'),\n subscribeError(CORE_EVENTS.VALIDATION.FAILED, 'validation'),\n subscribeError(CORE_EVENTS.AUTH.UNAUTHORIZED, 'auth'),\n subscribeError(CORE_EVENTS.AUTH.SESSION_EXPIRED, 'auth')\n );\n\n // Backend-only error subscriptions\n if (Core.isRuntimeCompatible('backend')) {\n Core._eventCleanupFns.push(\n subscribeError(CORE_EVENTS.DATABASE.ERROR, 'database'),\n subscribeError(CORE_EVENTS.STORAGE.ERROR, 'storage'),\n subscribeError(CORE_EVENTS.NOTIFICATION.ERROR, 'notification'),\n subscribeError(CORE_EVENTS.CACHE.ERROR, 'cache')\n );\n Core.log(\n 'Subscribed to backend error events (database, storage, notification, cache)',\n verbose\n );\n }\n\n const eventTypes = ['entity', 'api', 'validation', 'auth'];\n if (Core.isRuntimeCompatible('backend'))\n eventTypes.push('database', 'storage', 'notification', 'cache');\n Core.log(`Subscribed to domain error events: ${eventTypes.join(', ')}`, verbose);\n }\n\n /** Handle fetch flags error and return empty flags */\n private static handleFetchFlagsError(\n error: unknown,\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Record<string, FeatureFlagValue> {\n if (verbose) Core.logger.error('Failed to fetch feature flags', { error });\n\n // If already a package error, use as-is; otherwise wrap it\n const packageError =\n error instanceof BaseError\n ? (error as CorePackageError)\n : new CorePackageError(\n error instanceof Error ? error.message : String(error),\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n config?.onError?.(packageError);\n return {};\n }\n\n /** Create fetch flags function */\n private static createFetchFlagsFn(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): () => Promise<Record<string, FeatureFlagValue>> {\n // eslint-disable-next-line complexity\n return async () => {\n // Only fetch from API when provider is explicitly 'api'\n // All other providers (memory, undefined) use local defaults\n if (config?.provider !== 'api') {\n Core.log(\n `Feature flags using ${config?.provider ?? 'default'} provider (no API fetch)`,\n verbose\n );\n return config?.defaults ?? {};\n }\n\n try {\n const client = ApiClientService.getClient();\n const endpoint = config?.apiEndpoint ?? '/feature-flags';\n const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to fetch feature flags',\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n );\n }\n\n return response.data?.flags ?? {};\n } catch (error) {\n return Core.handleFetchFlagsError(error, config, verbose);\n }\n };\n }\n\n /**\n * Initialize feature flags slice within root store\n */\n\n // eslint-disable-next-line complexity\n private static async initializeFeatureFlags(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Feature flags disabled by configuration', verbose);\n return;\n }\n\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initializeErrorHandler() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n Core._flagConfig = config ?? {};\n const isApiProvider = config?.provider === 'api';\n Core.log(\n `Initializing feature flags from root store (provider: ${config?.provider ?? 'default'})...`,\n verbose\n );\n\n // Initialize the feature flag slice within the root store\n const state = Core._rootStore.getState();\n await state.featureFlags.initialize({\n defaults: Core._flagConfig.defaults,\n // Only enable polling for API provider\n polling: isApiProvider ? Core._flagConfig.polling : undefined,\n fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n onFlagChange: Core._flagConfig.onFlagChange,\n onError: Core._flagConfig.onError,\n });\n\n Core.log('Feature flags initialized', verbose);\n }\n}\n\n// Export for convenience (excluding server-only services - use backend entry for those)\n// Note: CacheService and DEFAULT_ENCRYPTION_FIELDS are only exported from entry-backend.ts\nexport { ApiClientService };\n","/**\n * ============================================================================\n * NEXT.JS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Next.js App Router API routes with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * export const { GET, POST } = createNextApiRoute({\n * service: 'example',\n * handlers: {\n * GET: async (service, ctx) => service.getAll(),\n * POST: async (service, ctx) => service.create(ctx.body),\n * },\n * });\n * ```\n *\n * @example With full type safety\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * export const { GET, POST } = createNextApiRoute<\n * UserService,\n * { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id), // params.id is typed\n * POST: async (service, { body }) => service.create(body), // body is CreateUserBody\n * },\n * });\n * ```\n *\n * @example With injected services\n * ```typescript\n * export const { POST } = createNextApiRoute({\n * service: 'files',\n * handlers: {\n * POST: async (service, { body, services }) => {\n * // Access Core services\n * const dbRecord = await services.db?.query(...);\n * const cached = await services.cache?.get('key');\n * await services.notifications?.send(...);\n * return service.upload(body);\n * },\n * },\n * });\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n HandlersTypeMap,\n CoreInjectedServices,\n CoreNextJSRouteContext,\n CoreNextJSRouteConfig,\n CoreNextJSRouteExports,\n CoreNextRequestCompat,\n CoreNextRouteContext,\n CoreGenericRouteHandler,\n} from '@plyaz/types/core';\nimport * as ServerErrorMiddleware from '@plyaz/errors/middleware/backend';\n\nimport { ServiceRegistry, Core } from '../../init';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Next.js request\n */\nfunction parseQueryParams(request: NextRequest): Record<string, string> {\n const query: Record<string, string> = {};\n request.nextUrl.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n}\n\n/**\n * Parse headers from Next.js request\n */\nfunction parseHeaders(request: NextRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n switch (method) {\n case 'POST':\n return HTTP_STATUS.CREATED;\n case 'DELETE':\n return HTTP_STATUS.OK;\n default:\n return HTTP_STATUS.OK;\n }\n}\n\n/**\n * Get injected Core services from the initialized Core instance\n * @param coreInstance - The Core class (from getCore callback or static import)\n */\nfunction getInjectedServices(coreInstance: typeof Core): CoreInjectedServices {\n return {\n db: coreInstance.db,\n cache: coreInstance.cache,\n storage: coreInstance.storage,\n notifications: coreInstance.notifications,\n api: coreInstance.api,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service getter function that also returns the Core instance\n */\nfunction createServiceGetter<TService>(\n service: string | (() => Promise<TService>),\n getCore?: () => Promise<unknown>\n): () => Promise<{ service: TService; core: typeof Core }> {\n return async () => {\n // Use Core from getCore() if provided, otherwise use static import\n // getCore returns typeof Core but typed as unknown in the config interface\n const coreInstance = getCore ? ((await getCore()) as typeof Core) : Core;\n const svc =\n typeof service === 'function' ? await service() : (ServiceRegistry.get(service) as TService);\n return { service: svc, core: coreInstance };\n };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n db: undefined,\n cache: undefined,\n storage: undefined,\n notifications: undefined,\n api: undefined,\n};\n\n/**\n * Parse request body for mutation methods\n */\nasync function parseMutationBody(request: NextRequest, method: string): Promise<unknown> {\n if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined;\n try {\n return await request.json();\n } catch {\n return undefined;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Next.js App Router API route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD handlers\n */\nexport function createNextApiRoute<\n TService,\n THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreNextJSRouteConfig<TService, THandlerTypes>): CoreNextJSRouteExports {\n const {\n service,\n handlers,\n getCore,\n successMessage,\n errorSource = 'api',\n injectServices = true,\n } = config;\n\n const getService = createServiceGetter(service, getCore);\n\n function createHandler(\n method: string,\n handler: CoreGenericRouteHandler<TService>\n ): (request: NextRequest, context?: CoreNextRouteContext) => Promise<Response> {\n return ServerErrorMiddleware.withErrorHandler(\n async (request: NextRequest, context?: unknown): Promise<Response> => {\n const { service: svc, core: coreInstance } = await getService();\n const routeContext = context as CoreNextRouteContext | undefined;\n const params = routeContext?.params ? await routeContext.params : {};\n const query = parseQueryParams(request);\n const headers = parseHeaders(request);\n const body = await parseMutationBody(request, method);\n const services = injectServices ? getInjectedServices(coreInstance) : emptyServices;\n\n const ctx: CoreNextJSRouteContext = {\n params,\n query,\n headers,\n method,\n request: request as unknown as CoreNextRequestCompat,\n body,\n services,\n };\n\n const result = await handler(svc, ctx);\n const status = getStatusForMethod(method);\n const message = getSuccessMessage(method, successMessage);\n\n return Response.json(SuccessResponseStandard(message, result, status), { status });\n },\n { source: errorSource, includeStack: process.env.NODE_ENV !== 'production', logErrors: true }\n );\n }\n\n const exports: CoreNextJSRouteExports = {};\n const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n for (const method of handlerKeys) {\n const handler = handlers[method];\n if (handler) {\n exports[method] = createHandler(\n method,\n handler as CoreGenericRouteHandler<TService>\n ) as CoreNextJSRouteExports[typeof method];\n }\n }\n\n return exports;\n}\n","/**\n * Next.js Route Helpers\n *\n * Utility functions for working with Next.js API routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().default(10),\n * search: z.string().optional(),\n * });\n *\n * export async function GET(request: NextRequest) {\n * const { page, limit, search } = extractQueryParams(request, querySchema);\n * // Use typed params...\n * }\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * export async function POST(request: NextRequest) {\n * const body = await extractJsonBody(request, createUserSchema);\n * // body is typed as { name: string; email: string }\n * }\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n parse: (data: unknown) => T;\n safeParse: (\n data: unknown\n ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(request);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(request, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(request: NextRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(request: NextRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n const params: Record<string, string> = {};\n\n request.nextUrl.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n if (schema) {\n return schema.parse(params);\n }\n\n return params;\n}\n\n/**\n * Extract and parse JSON body from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If body parsing or validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = await extractJsonBody(request);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * role: z.enum(['admin', 'user']).default('user'),\n * });\n *\n * const body = await extractJsonBody(request, schema);\n * // body: { name: string; email: string; role: 'admin' | 'user' }\n * ```\n */\nexport async function extractJsonBody<T>(\n request: NextRequest,\n schema: ZodLikeSchema<T>\n): Promise<T>;\nexport async function extractJsonBody(request: NextRequest): Promise<unknown>;\nexport async function extractJsonBody<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): Promise<T | unknown> {\n const body = await request.json();\n\n if (schema) {\n return schema.parse(body);\n }\n\n return body;\n}\n\n/**\n * Safely extract and parse JSON body from a Next.js request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = await safeExtractJsonBody(request, schema);\n * if (!body) {\n * return Response.json({ error: 'Invalid request body' }, { status: 400 });\n * }\n * ```\n */\nexport async function safeExtractJsonBody<T>(\n request: NextRequest,\n schema: ZodLikeSchema<T>\n): Promise<T | null>;\nexport async function safeExtractJsonBody(request: NextRequest): Promise<unknown | null>;\nexport async function safeExtractJsonBody<T>(\n request: NextRequest,\n schema?: ZodLikeSchema<T>\n): Promise<T | unknown | null> {\n try {\n const body = await request.json();\n\n if (schema) {\n const result = schema.safeParse(body);\n if (result.success) {\n return result.data;\n }\n return null;\n }\n\n return body;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract route parameters from Next.js context.\n * Handles the async params pattern in Next.js App Router.\n *\n * @param context - Next.js route context with async params\n * @returns Resolved params object\n *\n * @example\n * ```typescript\n * // app/api/users/[id]/route.ts\n * export async function GET(request: NextRequest, context: { params: Promise<{ id: string }> }) {\n * const { id } = await extractRouteParams(context);\n * // id: string\n * }\n * ```\n */\nexport async function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n context: { params: Promise<T> } | { params: T } | undefined\n): Promise<T> {\n if (!context) {\n return {} as T;\n }\n\n if (context.params instanceof Promise) {\n return context.params;\n }\n\n return context.params;\n}\n\n/**\n * Extract headers from a Next.js request as a plain object.\n *\n * @param request - Next.js request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(request);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(request: NextRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return headers;\n}\n\n/**\n * Extract a specific header value from a Next.js request.\n *\n * @param request - Next.js request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(request, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n * return Response.json({ error: 'Unauthorized' }, { status: 401 });\n * }\n * ```\n */\nexport function extractHeader(request: NextRequest, name: string): string | undefined {\n return request.headers.get(name) ?? undefined;\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param request - Next.js request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(request);\n * if (!token) {\n * return Response.json({ error: 'No token provided' }, { status: 401 });\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(request: NextRequest): string | null {\n const auth = request.headers.get('authorization');\n\n if (!auth?.startsWith('Bearer ')) {\n return null;\n }\n\n return auth.slice(BEARER_PREFIX_LENGTH);\n}\n","/**\n * Express Framework Utilities\n *\n * Factory functions for creating Express route handlers with minimal boilerplate.\n * Types are available from '@plyaz/types/core'.\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n * import type { CoreExpressRouteConfig } from '@plyaz/types/core';\n *\n * const routes = createExpressRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service) => service.getAll(),\n * POST: async (service, { body }) => service.create(body),\n * },\n * });\n *\n * app.use('/api/users', routes.handler);\n * ```\n */\n\nexport { createExpressRoute } from './route-factory';\n\n// Request helpers\nexport {\n extractQueryParams,\n extractJsonBody,\n safeExtractJsonBody,\n extractRouteParams,\n extractHeaders,\n extractHeader,\n extractBearerToken,\n} from './helpers';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - CoreExpressRequest, CoreExpressResponse, CoreExpressNextFunction\n// - CoreExpressRouteContext, CoreExpressRouteHandler\n// - CoreExpressRouteConfig, CoreExpressMiddleware, CoreExpressRouteExports\n","/**\n * ============================================================================\n * EXPRESS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Express route handlers with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n *\n * const userRoutes = createExpressRoute({\n * service: 'users',\n * handlers: {\n * GET: async (service, ctx) => service.getAll(),\n * POST: async (service, ctx) => service.create(ctx.body),\n * },\n * });\n *\n * app.use('/api/users', userRoutes.handler);\n * // OR mount individual handlers\n * app.get('/api/users', userRoutes.GET);\n * app.post('/api/users', userRoutes.POST);\n * ```\n *\n * @example With typed body and params\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * const userRoutes = createExpressRoute<\n * UserService,\n * { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n * service: 'users',\n * handlers: {\n * GET: async (service, { params }) => service.getById(params.id),\n * POST: async (service, { body }) => service.create(body),\n * },\n * });\n * ```\n */\n\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n HandlersTypeMap,\n CoreInjectedServices,\n CoreExpressRequest,\n CoreExpressResponse,\n CoreExpressNextFunction,\n CoreExpressRouteContext,\n CoreExpressRouteConfig,\n CoreExpressMiddleware,\n CoreExpressRouteExports,\n} from '@plyaz/types/core';\n\nimport { ServiceRegistry } from '../../init';\nimport { Core } from '../../init/CoreInitializer';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Express request\n */\nfunction parseQueryParams(req: CoreExpressRequest): Record<string, string> {\n const query: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n query[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n // Take first value for array query params\n query[key] = String(value[0]);\n }\n }\n return query;\n}\n\n/**\n * Parse headers from Express request\n */\nfunction parseHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n headers[key] = value[0];\n }\n }\n return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n switch (method.toUpperCase()) {\n case 'POST':\n return HTTP_STATUS.CREATED;\n case 'DELETE':\n return HTTP_STATUS.OK;\n default:\n return HTTP_STATUS.OK;\n }\n}\n\n/**\n * Get injected Core services\n */\nfunction getInjectedServices(): CoreInjectedServices {\n return {\n db: Core.db,\n cache: Core.cache,\n storage: Core.storage,\n notifications: Core.notifications,\n api: Core.api,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic handler type for internal use\n */\ntype GenericExpressHandler<TService> = (\n service: TService,\n ctx: CoreExpressRouteContext\n) => Promise<unknown>;\n\n/**\n * Create a service getter function\n */\nfunction createServiceGetter<TService>(\n service: string | (() => Promise<TService>),\n getCore?: () => Promise<unknown>\n): () => Promise<TService> {\n return async () => {\n if (getCore) await getCore();\n if (typeof service === 'function') return service();\n return ServiceRegistry.get(service) as TService;\n };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n db: undefined,\n cache: undefined,\n storage: undefined,\n notifications: undefined,\n api: undefined,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Express route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with handler middleware and individual method handlers\n */\nexport function createExpressRoute<\n TService,\n THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreExpressRouteConfig<TService, THandlerTypes>): CoreExpressRouteExports {\n const {\n service,\n handlers,\n getCore,\n successMessage,\n errorSource = 'api',\n injectServices = true,\n } = config;\n\n const getService = createServiceGetter(service, getCore);\n\n function createHandler(\n method: string,\n handler: GenericExpressHandler<TService>\n ): CoreExpressMiddleware {\n return async (\n req: CoreExpressRequest,\n res: CoreExpressResponse,\n next: CoreExpressNextFunction\n ): Promise<void> => {\n try {\n const svc = await getService();\n const query = parseQueryParams(req);\n const headers = parseHeaders(req);\n const services = injectServices ? getInjectedServices() : emptyServices;\n\n const ctx: CoreExpressRouteContext = {\n params: req.params,\n query,\n headers,\n method: req.method,\n request: req,\n body: req.body,\n req,\n res,\n services,\n };\n\n const result = await handler(svc, ctx);\n const status = getStatusForMethod(method);\n const message = getSuccessMessage(method, successMessage);\n\n res.status(status).json(SuccessResponseStandard(message, result, status));\n } catch (error) {\n next(error);\n }\n };\n }\n\n const combinedHandler: CoreExpressMiddleware = async (req, res, next): Promise<void> => {\n const method = req.method.toUpperCase();\n const handler = handlers[method as keyof typeof handlers];\n\n if (!handler) {\n res.status(HTTP_STATUS.METHOD_NOT_ALLOWED).json({\n success: false,\n error: {\n code: 'METHOD_NOT_ALLOWED',\n message: `Method ${method} not allowed`,\n source: errorSource,\n },\n });\n return;\n }\n\n await createHandler(method, handler as GenericExpressHandler<TService>)(req, res, next);\n };\n\n const exports: CoreExpressRouteExports = { handler: combinedHandler };\n const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n for (const method of handlerKeys) {\n const handler = handlers[method];\n if (handler) {\n exports[method] = createHandler(method, handler as GenericExpressHandler<TService>);\n }\n }\n\n return exports;\n}\n","/**\n * Express Route Helpers\n *\n * Utility functions for working with Express routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().default(10),\n * search: z.string().optional(),\n * });\n *\n * app.get('/users', (req, res) => {\n * const { page, limit, search } = extractQueryParams(req, querySchema);\n * // Use typed params...\n * });\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * app.post('/users', (req, res) => {\n * const body = extractJsonBody(req, createUserSchema);\n * // body is typed as { name: string; email: string }\n * });\n * ```\n */\n\nimport type { CoreExpressRequest } from '@plyaz/types/core';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n parse: (data: unknown) => T;\n safeParse: (\n data: unknown\n ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from an Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(req);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * page: z.coerce.number().default(1),\n * limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(req, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(req: CoreExpressRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n params[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n params[key] = String(value[0]);\n }\n }\n\n if (schema) {\n return schema.parse(params);\n }\n\n return params;\n}\n\n/**\n * Extract and parse JSON body from an Express request.\n * NOTE: Requires body-parser middleware to be configured.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = extractJsonBody(req);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * const body = extractJsonBody(req, schema);\n * // body: { name: string; email: string }\n * ```\n */\nexport function extractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractJsonBody(req: CoreExpressRequest): unknown;\nexport function extractJsonBody<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | unknown {\n const body = req.body;\n\n if (schema) {\n return schema.parse(body);\n }\n\n return body;\n}\n\n/**\n * Safely extract and parse JSON body from an Express request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = safeExtractJsonBody(req, schema);\n * if (!body) {\n * res.status(400).json({ error: 'Invalid request body' });\n * return;\n * }\n * ```\n */\nexport function safeExtractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T | null;\nexport function safeExtractJsonBody(req: CoreExpressRequest): unknown | null;\nexport function safeExtractJsonBody<T>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T | unknown | null {\n try {\n const body = req.body;\n\n if (schema) {\n const result = schema.safeParse(body);\n if (result.success) {\n return result.data;\n }\n return null;\n }\n\n return body;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract route parameters from Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Params object\n *\n * @example\n * ```typescript\n * // app/api/users/:id\n * app.get('/users/:id', (req, res) => {\n * const { id } = extractRouteParams(req);\n * // id: string\n * });\n * ```\n */\nexport function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n req: CoreExpressRequest,\n schema?: ZodLikeSchema<T>\n): T {\n if (schema) {\n return schema.parse(req.params);\n }\n return req.params as T;\n}\n\n/**\n * Extract headers from an Express request as a plain object.\n *\n * @param req - Express request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(req);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n const headers: Record<string, string | undefined> = {};\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n headers[key] = value[0];\n }\n }\n\n return headers;\n}\n\n/**\n * Extract a specific header value from an Express request.\n *\n * @param req - Express request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(req, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n * res.status(401).json({ error: 'Unauthorized' });\n * return;\n * }\n * ```\n */\nexport function extractHeader(req: CoreExpressRequest, name: string): string | undefined {\n return req.get(name);\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param req - Express request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(req);\n * if (!token) {\n * res.status(401).json({ error: 'No token provided' });\n * return;\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(req: CoreExpressRequest): string | null {\n const auth = req.get('authorization');\n\n if (!auth?.startsWith('Bearer ')) {\n return null;\n }\n\n return auth.slice(BEARER_PREFIX_LENGTH);\n}\n"]}