@plyaz/core 1.22.5 → 1.22.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/notifications/notifications.controller.d.ts +2 -3
- package/dist/backend/notifications/notifications.controller.d.ts.map +1 -1
- package/dist/entry-backend.cjs +113 -247
- package/dist/entry-backend.cjs.map +1 -1
- package/dist/entry-backend.mjs +14 -143
- package/dist/entry-backend.mjs.map +1 -1
- package/dist/index.cjs +102 -224
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +4 -123
- package/dist/index.mjs.map +1 -1
- package/dist/init/nestjs/CoreModule.d.ts +2 -1
- package/dist/init/nestjs/CoreModule.d.ts.map +1 -1
- package/dist/init/nestjs/index.cjs +13 -10
- package/dist/init/nestjs/index.cjs.map +1 -1
- package/dist/init/nestjs/index.mjs +8 -7
- package/dist/init/nestjs/index.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../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/domain/notifications/streaming/NotificationsChannelController.ts","../../../src/domain/notifications/streaming/NotificationsStreamEndpoint.ts","../../../src/events/streaming/endpoints/system/SystemChannelController.ts","../../../src/events/streaming/endpoints/system/SystemStreamEndpoint.ts","../../../src/utils/runtime.ts","../../../src/init/CoreInitializer.ts","../../../src/init/nestjs/configureNestApp.ts","../../../src/services/DbService.ts","../../../src/init/nestjs/StreamingController.ts","../../../src/init/nestjs/CoreModule.ts","../../../src/init/nestjs/StreamingModule.ts","../../../src/init/nestjs/index.ts"],"names":["PackageLogger","logger","CorePackageError","ERROR_CODES","DbService","TIME_CONSTANTS","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","HTTP_STATUS","StreamPackageError","STREAM_ERROR_CODES","CoreLogger","STREAMING_DEFAULTS","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","ERROR_CATEGORY","CORE_EVENTS","document","configureNestApp"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 * Notifications Channel Controller\n *\n * Handles IN_APP notification streaming - broadcasts new notifications to users.\n * Only supports notification:created event - when a new notification is created,\n * it's broadcasted to the user's channel based on userId.\n *\n * NOTE: This controller handles IN_APP notifications only.\n * Email, SMS, and Push are handled by @plyaz/notifications package.\n *\n * Flow:\n * 1. Backend creates notification with user_id\n * 2. Backend emits notification:created via CoreEventManager\n * 3. This controller broadcasts to user:notifications:{userId}\n * 4. User's connected clients receive and display the notification\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamBroadcasterInterface, CoreEvent } from '@plyaz/types/core';\nimport {\n NOTIFICATIONS_STREAM_CHANNEL_PREFIX,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL,\n} from '@plyaz/types/core';\nimport type { NotificationCreatedStreamData } from '@plyaz/types/core';\n\n/**\n * NotificationsChannelController - Broadcasts new notifications to users\n *\n * Channel:\n * - `user:notifications:{userId}` - User subscribes to receive their notifications\n */\nexport class NotificationsChannelController extends BaseChannelController {\n constructor() {\n super({\n scope: 'notifications',\n patterns: [\n NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS,\n ],\n });\n }\n\n /**\n * Initialize event subscriptions.\n * Listens to notification:created and broadcasts to user's channel.\n */\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('[NotificationsChannelController] initialize() called');\n\n // Listen for notification:created events\n this.addUnsubscriber(\n CoreEventManager.on<NotificationCreatedStreamData>(\n 'notification:created',\n (event: CoreEvent<NotificationCreatedStreamData>) => {\n const data = event.data;\n\n // userId is REQUIRED for routing\n if (!data.userId) {\n this.logger.warn(\n '[NotificationsChannelController] notification:created missing userId',\n {\n notificationId: data.notificationId,\n }\n );\n return;\n }\n\n const userChannel = `${NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER}${data.userId}`;\n\n this.logger.debug('[NotificationsChannelController] notification:created', {\n notificationId: data.notificationId,\n userId: data.userId,\n userChannel,\n });\n\n // Broadcast to user's notifications channel\n broadcaster.broadcastToChannel(userChannel, {\n event: 'notification:created',\n data: this.createResponse(data, userChannel, 'New notification'),\n });\n\n // Also broadcast to general channel (for admin/debug)\n broadcaster.broadcastToChannel(NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS, {\n event: 'notification:created',\n data: this.createResponse(\n data,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n ),\n });\n }\n )\n );\n\n this.logger.info('NotificationsChannelController initialized (notification:created only)');\n }\n\n /**\n * Override handlesChannel to match notification patterns.\n */\n override handlesChannel(channel: string): boolean {\n return (\n channel.startsWith(NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER) ||\n channel === NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n );\n }\n}\n","/**\n * Notifications Stream Endpoint\n *\n * Stream endpoint for IN_APP notification real-time events.\n * Handles notification lifecycle events (created, read, unread, deleted).\n *\n * NOTE: This endpoint handles IN_APP notifications only (bell icon notifications).\n * Email, SMS, and Push notification delivery is handled by @plyaz/notifications package.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: NotificationsStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { NotificationsChannelController } from './NotificationsChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * NotificationsStreamEndpoint - Handles IN_APP notification streaming events\n *\n * Channels managed:\n * - `notification:{notificationId}` - Per-notification updates\n * - `user:notifications:{userId}` - All notifications for a specific user\n * - `notifications` - Broadcast channel for all notifications (current user)\n * - `notifications:unread` - Broadcast channel for unread notifications\n *\n * Events:\n * - `notification:created` - New in-app notification created\n * - `notification:read` - Notification marked as read\n * - `notification:unread` - Notification marked as unread\n * - `notification:deleted` - Notification deleted\n * - `notifications:batch` - Batch operations (e.g., mark all as read)\n */\nexport class NotificationsStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'notifications';\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new NotificationsChannelController();\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('[NotificationsStreamEndpoint] initialize() called');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.debug('[NotificationsStreamEndpoint] initialized (IN_APP notifications)', {\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<NotificationsStreamEndpoint> {\n return new NotificationsStreamEndpoint(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 /** Full init options (for configureNestApp and other runtime config) */\n private static _initOptions: CoreInitOptions = {};\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 // Store options for runtime access (e.g., configureNestApp)\n Core._initOptions = options;\n\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 initialization options (for internal use by framework adapters)\n * @internal\n */\n static get initOptions(): CoreInitOptions {\n return Core._initOptions;\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 // Reset notifications store slice\n if (state.notifications?.reset) {\n state.notifications.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 * NestJS App Configuration Helper\n *\n * Configures a NestJS application with middleware based on CoreInitOptions.\n * Call this in your main.ts after creating the app.\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n * import { AppModule } from './app.module';\n * import { buildCoreConfig } from './config';\n *\n * async function bootstrap() {\n * const app = await NestFactory.create(AppModule);\n * const options = buildCoreConfig();\n *\n * // Configure middleware, validation, security, etc.\n * await configureNestApp(app, options);\n *\n * await app.listen(3000);\n * }\n * ```\n */\n\nimport type { INestApplication, ValidationPipe as ValidationPipeType } from '@nestjs/common';\nimport type { CoreNestJsMiddlewareConfig } from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { PackageLogger } from '@plyaz/logger';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\n\n// Default configuration values\nconst DEFAULTS = {\n bodyLimit: '10mb',\n timeout: 30000,\n shutdownTimeout: 10000,\n rateLimit: {\n ttl: 60,\n limit: 100,\n },\n validation: {\n whitelist: true,\n transform: true,\n forbidNonWhitelisted: false,\n disableErrorMessages: false,\n },\n swagger: {\n path: '/api/docs',\n title: 'API Documentation',\n version: '1.0',\n },\n} as const;\n\n/**\n * Result of configuring a NestJS app\n */\nexport interface ConfigureNestAppResult {\n /** Features that were enabled */\n enabled: string[];\n /** Features that were skipped (not configured or dependencies missing) */\n skipped: string[];\n /** Any warnings during configuration */\n warnings: string[];\n}\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n *\n * This function applies:\n * - Compression middleware (if compression: true)\n * - Helmet security headers (if helmet: true)\n * - Rate limiting (if rateLimit config provided)\n * - Global validation pipe (if validation: true)\n * - Body size limits\n * - Request timeout\n * - Raw body parsing for webhooks\n * - Swagger documentation (if swagger config provided)\n * - CORS configuration\n * - Global prefix\n * - Graceful shutdown handlers\n *\n * @param app - NestJS application instance\n * @param options - Core initialization options (reads nestjs config)\n * @returns Configuration result with enabled/skipped features\n *\n * @example Basic usage\n * ```typescript\n * const app = await NestFactory.create(AppModule);\n * await configureNestApp(app, {\n * nestjs: {\n * compression: true,\n * helmet: true,\n * validation: true,\n * },\n * });\n * ```\n *\n * @example Full production config\n * ```typescript\n * await configureNestApp(app, {\n * nestjs: {\n * compression: true,\n * helmet: true,\n * rateLimit: { ttl: 60, limit: 100 },\n * validation: { whitelist: true, transform: true },\n * bodyLimit: '10mb',\n * timeout: 30000,\n * rawBody: { paths: ['/webhooks/*'] },\n * swagger: { enabled: false },\n * globalPrefix: 'api',\n * excludeFromPrefix: ['health', 'metrics'],\n * gracefulShutdown: true,\n * },\n * });\n * ```\n */\n// eslint-disable-next-line complexity, max-lines-per-function\nexport async function configureNestApp(\n app: INestApplication,\n options: CoreInitOptions\n): Promise<ConfigureNestAppResult> {\n const config = options.nestjs ?? {};\n const isProduction =\n options.environment === 'production' || process.env.NODE_ENV === 'production';\n const logger = new PackageLogger({\n packageName: 'core',\n service: 'NestJS',\n transport: Core.loggerTransport,\n });\n\n const result: ConfigureNestAppResult = {\n enabled: [],\n skipped: [],\n warnings: [],\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Compression\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.compression === true || (config.compression !== false && isProduction)) {\n try {\n const compression = await import('compression');\n app.use(compression.default());\n result.enabled.push('compression');\n logger.debug('Compression middleware enabled');\n } catch {\n result.skipped.push('compression');\n result.warnings.push('compression package not installed - run: pnpm add compression');\n }\n } else {\n result.skipped.push('compression');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Helmet Security Headers\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.helmet !== false) {\n try {\n const helmet = await import('helmet');\n const helmetOptions = typeof config.helmet === 'object' ? config.helmet : {};\n app.use(helmet.default(helmetOptions));\n result.enabled.push('helmet');\n logger.debug('Helmet security headers enabled');\n } catch {\n result.skipped.push('helmet');\n result.warnings.push('helmet package not installed - run: pnpm add helmet');\n }\n } else {\n result.skipped.push('helmet');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Rate Limiting\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.rateLimit !== false) {\n try {\n // NestJS throttler module is typically configured in the module, not middleware\n // We'll use express-rate-limit as a fallback for raw middleware approach\n const rateLimit = await import('express-rate-limit');\n const rateLimitConfig =\n typeof config.rateLimit === 'object' ? config.rateLimit : DEFAULTS.rateLimit;\n\n const limiter = rateLimit.default({\n windowMs:\n (rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl) * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n max: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n standardHeaders: true,\n legacyHeaders: false,\n skip: 'skipIf' in rateLimitConfig ? rateLimitConfig.skipIf : undefined,\n });\n\n app.use(limiter);\n result.enabled.push('rateLimit');\n logger.debug('Rate limiting enabled', {\n ttl: rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl,\n limit: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n });\n } catch {\n result.skipped.push('rateLimit');\n result.warnings.push(\n 'express-rate-limit package not installed - run: pnpm add express-rate-limit'\n );\n }\n } else {\n result.skipped.push('rateLimit');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Global Validation Pipe\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.validation !== false) {\n try {\n const { ValidationPipe } = await import('@nestjs/common');\n const validationConfig =\n typeof config.validation === 'object' ? config.validation : DEFAULTS.validation;\n\n const pipe: ValidationPipeType = new ValidationPipe({\n whitelist: validationConfig.whitelist ?? DEFAULTS.validation.whitelist,\n transform: validationConfig.transform ?? DEFAULTS.validation.transform,\n forbidNonWhitelisted:\n validationConfig.forbidNonWhitelisted ?? DEFAULTS.validation.forbidNonWhitelisted,\n disableErrorMessages:\n validationConfig.disableErrorMessages ?? DEFAULTS.validation.disableErrorMessages,\n });\n\n app.useGlobalPipes(pipe);\n result.enabled.push('validation');\n logger.debug('Global validation pipe enabled', { ...validationConfig });\n } catch {\n result.skipped.push('validation');\n result.warnings.push('Failed to create validation pipe');\n }\n } else {\n result.skipped.push('validation');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Body Parser / Size Limits\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.bodyLimit) {\n try {\n const bodyParser = await import('body-parser');\n const limit = config.bodyLimit ?? DEFAULTS.bodyLimit;\n app.use(bodyParser.json({ limit }));\n app.use(bodyParser.urlencoded({ limit, extended: true }));\n result.enabled.push('bodyLimit');\n logger.debug('Body parser configured', { limit });\n } catch {\n // body-parser is usually bundled with express, so this shouldn't fail\n result.skipped.push('bodyLimit');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Raw Body for Webhooks\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.rawBody) {\n try {\n const bodyParser = await import('body-parser');\n const rawBodyConfig = typeof config.rawBody === 'object' ? config.rawBody : {};\n const paths = rawBodyConfig.paths ?? ['/webhooks'];\n\n // Add raw body parsing middleware\n app.use(\n bodyParser.raw({\n type: 'application/json',\n verify: (req: unknown, _res: unknown, buf: Buffer) => {\n // Check if path matches\n const request = req as { rawBody?: Buffer; originalUrl?: string };\n const reqPath = request.originalUrl ?? '';\n if (paths.some((p: string) => reqPath.includes(p.replace('*', '')))) {\n request.rawBody = buf;\n }\n },\n })\n );\n\n result.enabled.push('rawBody');\n logger.debug('Raw body parsing enabled for paths', { paths });\n } catch {\n result.skipped.push('rawBody');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // CORS\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.cors !== false && config.cors !== undefined) {\n const corsConfig = typeof config.cors === 'object' ? config.cors : {};\n app.enableCors({\n origin: corsConfig.origin ?? true,\n credentials: corsConfig.credentials ?? true,\n methods: corsConfig.methods,\n allowedHeaders: corsConfig.allowedHeaders,\n });\n result.enabled.push('cors');\n logger.debug('CORS configured', corsConfig);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Global Prefix\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.globalPrefix !== false) {\n const prefix = config.globalPrefix ?? 'api';\n const exclude = config.excludeFromPrefix ?? ['health'];\n app.setGlobalPrefix(prefix, { exclude });\n result.enabled.push('globalPrefix');\n logger.debug('Global prefix set', { prefix, exclude });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Swagger Documentation\n // ─────────────────────────────────────────────────────────────────────────────\n const swaggerEnabled = isProduction\n ? (typeof config.swagger === 'object' && config.swagger.enabled === true) ||\n config.swagger === true\n : config.swagger !== false;\n\n if (swaggerEnabled) {\n try {\n const { SwaggerModule, DocumentBuilder } = await import('@nestjs/swagger');\n const swaggerConfig = typeof config.swagger === 'object' ? config.swagger : DEFAULTS.swagger;\n\n const documentBuilder = new DocumentBuilder()\n .setTitle(swaggerConfig.title ?? DEFAULTS.swagger.title)\n .setVersion(swaggerConfig.version ?? DEFAULTS.swagger.version);\n\n if ('description' in swaggerConfig && swaggerConfig.description) {\n documentBuilder.setDescription(swaggerConfig.description);\n }\n\n if ('bearerAuth' in swaggerConfig && swaggerConfig.bearerAuth) {\n documentBuilder.addBearerAuth();\n }\n\n const document = SwaggerModule.createDocument(app, documentBuilder.build());\n const path = swaggerConfig.path ?? DEFAULTS.swagger.path;\n SwaggerModule.setup(path, app, document);\n\n result.enabled.push('swagger');\n logger.debug('Swagger documentation enabled', { path });\n } catch {\n result.skipped.push('swagger');\n result.warnings.push('@nestjs/swagger package not installed - run: pnpm add @nestjs/swagger');\n }\n } else {\n result.skipped.push('swagger');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Graceful Shutdown\n // ─────────────────────────────────────────────────────────────────────────────\n /* eslint-disable n/no-process-exit -- Graceful shutdown requires process.exit */\n if (config.gracefulShutdown !== false) {\n const timeout = config.shutdownTimeout ?? DEFAULTS.shutdownTimeout;\n\n // Enable shutdown hooks\n app.enableShutdownHooks();\n\n // SIGTERM handler\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, initiating graceful shutdown...');\n const shutdownTimer = setTimeout(() => {\n logger.warn('Graceful shutdown timeout, forcing exit');\n process.exit(1);\n }, timeout);\n\n try {\n await app.close();\n clearTimeout(shutdownTimer);\n logger.info('Graceful shutdown complete');\n process.exit(0);\n } catch (err) {\n clearTimeout(shutdownTimer);\n logger.error('Error during shutdown', { error: err });\n process.exit(1);\n }\n });\n\n // SIGINT handler (Ctrl+C)\n process.on('SIGINT', async () => {\n logger.info('SIGINT received, initiating graceful shutdown...');\n const shutdownTimer = setTimeout(() => {\n logger.warn('Graceful shutdown timeout, forcing exit');\n process.exit(1);\n }, timeout);\n\n try {\n await app.close();\n clearTimeout(shutdownTimer);\n logger.info('Graceful shutdown complete');\n process.exit(0);\n } catch (err) {\n clearTimeout(shutdownTimer);\n logger.error('Error during shutdown', { error: err });\n process.exit(1);\n }\n });\n\n result.enabled.push('gracefulShutdown');\n logger.debug('Graceful shutdown handlers registered', { timeout });\n }\n /* eslint-enable n/no-process-exit */\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Request Timeout (applied via middleware)\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.timeout && config.timeout > 0) {\n try {\n const connectTimeout = await import('connect-timeout');\n app.use(connectTimeout.default(`${config.timeout}ms`));\n result.enabled.push('timeout');\n logger.debug('Request timeout configured', { timeout: config.timeout });\n } catch {\n // connect-timeout is optional\n result.skipped.push('timeout');\n }\n }\n\n // Log summary\n logger.info('NestJS app configured', {\n enabled: result.enabled,\n skipped: result.skipped.length > 0 ? result.skipped : undefined,\n warnings: result.warnings.length > 0 ? result.warnings : undefined,\n });\n\n return result;\n}\n\n/**\n * Get default NestJS middleware configuration.\n * Use this as a base and override specific options.\n *\n * @param isProduction - Whether running in production\n * @returns Default configuration\n */\nexport function getDefaultNestJsConfig(isProduction = false): CoreNestJsMiddlewareConfig {\n return {\n compression: isProduction,\n helmet: true,\n rateLimit: isProduction ? DEFAULTS.rateLimit : false,\n validation: DEFAULTS.validation,\n bodyLimit: DEFAULTS.bodyLimit,\n timeout: DEFAULTS.timeout,\n rawBody: false,\n swagger: { enabled: !isProduction, ...DEFAULTS.swagger },\n globalPrefix: 'api',\n excludeFromPrefix: ['health'],\n gracefulShutdown: true,\n shutdownTimeout: DEFAULTS.shutdownTimeout,\n };\n}\n","/**\n * DbService - Singleton Database Connection Manager\n *\n * @description Manages database connections for the entire application using a singleton pattern.\n * This service wraps @plyaz/db and provides a centralized way to initialize and access\n * the database across all domains (feature flags, users, campaigns, backoffice, etc.).\n *\n * **Architecture:**\n * - Uses `createDatabaseService()` from @plyaz/db which builds an adapter chain\n * - Supports Drizzle (direct PostgreSQL), Supabase (REST API), or raw SQL adapters\n * - Extension layers: Encryption → SoftDelete → Caching → Audit → ReadReplica\n *\n * **Adapter Configuration:**\n * - **Drizzle**: Requires `connectionString` (PostgreSQL URL)\n * - **Supabase**: Requires `supabaseUrl`, `supabaseServiceKey`, `supabaseAnonKey`\n * - **SQL**: Requires `connectionString`\n *\n * **Required Environment Variables (Drizzle with Supabase):**\n * - DATABASE_URL: PostgreSQL connection string (from Supabase Dashboard > Database > URI)\n *\n * **Required Environment Variables (Supabase REST API):**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for admin operations\n * - SUPABASE_ANON_PUBLIC_KEY: Anonymous key for public operations\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * // Core.initialize() handles loading env and passing to DbService\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'sql',\n * cache: { enabled: true, ttl: 60 },\n * },\n * });\n *\n * // Access via Core.db\n * const db = Core.db.getDatabase();\n * const result = await db.list('users', { pagination: { limit: 10, offset: 0 } });\n * ```\n *\n * @example Direct Usage (requires explicit config)\n * ```typescript\n * // Direct usage requires explicit connectionString\n * await DbService.initialize({\n * adapter: 'drizzle',\n * drizzle: {\n * connectionString: 'postgresql://user:pass@localhost:5432/db',\n * poolSize: 20,\n * },\n * });\n * ```\n *\n * @example With Extensions\n * ```typescript\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'drizzle',\n * softDelete: {\n * enabled: true,\n * field: 'deleted_at',\n * excludeTables: ['audit_logs', 'feature_flag_evaluations'],\n * },\n * cache: {\n * enabled: true,\n * provider: 'memory',\n * ttl: 300,\n * },\n * audit: {\n * enabled: true,\n * retentionDays: 90,\n * },\n * },\n * });\n * ```\n *\n * @example Using with BaseRepository\n * ```typescript\n * import { BaseRepository } from '@plyaz/db';\n * import { DbService } from '@plyaz/core';\n *\n * class UserRepository extends BaseRepository<User> {\n * constructor() {\n * super(DbService.getInstance().getDatabase(), 'users');\n * }\n * }\n * ```\n *\n * @module services\n */\n\nimport { createDatabaseService } from '@plyaz/db';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport {\n type DatabaseServiceInterface,\n type DatabaseServiceConfig,\n type DrizzleConfig,\n type SupabaseConfig,\n type SqlConfig,\n type Transaction,\n type DatabaseEvents,\n} from '@plyaz/types/db';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CORE_EVENTS, type CoreDatabaseErrorPayload } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { PackageLogger } from '@plyaz/logger';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'DbService' });\n\n/**\n * Default fields to encrypt per table\n * Contains sensitive PII and financial data that should be encrypted at rest\n *\n * @see docs/db-schemas/dbdiagram_schema.dbml for field definitions\n */\nexport const DEFAULT_ENCRYPTION_FIELDS: Record<string, string[]> = {\n // User PII\n users: ['password_hash', 'phone_number', 'date_of_birth'],\n\n // KYC sensitive data\n 'backoffice.kyc_submissions': ['tax_id', 'address_line1', 'address_line2'],\n\n // Connected accounts OAuth tokens\n connected_accounts: ['access_token_encrypted', 'refresh_token_encrypted', 'wallet_address'],\n\n // Payment payout accounts\n user_payout_accounts: ['provider_account_id', 'account_holder_name'],\n\n // Sessions\n sessions: ['token'],\n};\n\n// Re-export DbServiceConfig from @plyaz/types/core\nexport type { CoreDbServiceConfig } from '@plyaz/types/core';\n\n// Local alias for internal use\nimport type {\n CoreDbServiceConfig as DbServiceConfig,\n CoreDbServiceInstance,\n} from '@plyaz/types/core';\n\n/**\n * Default configuration for DbService\n *\n * **Adapter Selection Guide:**\n *\n * | Adapter | Connection | Auto-Register | RLS | Use Case |\n * |-------------|------------------|---------------|----------|-----------------------------------|\n * | `'sql'` | PostgreSQL URL | ✓ Yes | Bypassed | **Recommended** for backend |\n * | `'supabase'`| Supabase API | ✓ Yes | Enforced | Frontend / RLS-required scenarios |\n * | `'drizzle'` | PostgreSQL URL | ✓ Yes* | Bypassed | Type-safe ORM (with PgTable schemas) |\n *\n * *Drizzle supports dual-mode: uses PgTable schemas if registered, falls back to raw SQL otherwise.\n *\n * **Recommended:** Use `'sql'` adapter for backend services with Supabase PostgreSQL.\n * Direct PostgreSQL connection = best performance, bypasses RLS for full backend access.\n */\n// Database configuration constants\nconst DEFAULT_AUDIT_RETENTION_DAYS = 180; // GDPR/SOX compliance (6 months minimum)\nconst DEFAULT_POOL_SIZE = 10;\n\nconst DEFAULT_CONFIG: Partial<DbServiceConfig> = {\n adapter: 'sql',\n cache: {\n enabled: true,\n provider: 'memory',\n ttl: TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n },\n softDelete: {\n enabled: true,\n field: 'deleted_at',\n excludeTables: [\n 'audit_logs',\n 'audit.audit_logs',\n 'audit.feature_flag_evaluations',\n 'feature_flag_evaluations',\n 'notification_events',\n 'payments_activity',\n 'campaign_analytics',\n 'admin_actions',\n 'backoffice.admin_actions',\n ],\n },\n audit: {\n enabled: true, // Enabled by default for compliance\n retentionDays: DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: ['password_hash', 'api_key_hash', 'token_hash'],\n excludeTables: ['audit_logs', 'audit.audit_logs'], // Don't audit the audit table itself\n schema: 'audit', // Use dedicated audit schema\n usePartitionedTables: true, // Use daily partitioned tables (audit_log_yyyy_mm_dd)\n },\n // NOTE: Encryption requires key from environment or DbService.initialize()\n // Enable via: DbService.initialize({ encryption: { enabled: true, key: process.env.ENCRYPTION_KEY!, fields: DEFAULT_ENCRYPTION_FIELDS } })\n};\n\n/**\n * Complete table registry from database migrations\n * Maps logical table names to their ID columns\n *\n * @see docs/db-schemas/migrations/ for schema definitions\n * @see docs/db-schemas/dbdiagram_schema.dbml for full schema\n */\n/**\n * TABLE_REGISTRY - Custom ID Column and Schema Registry\n *\n * ONLY register tables with:\n * 1. Custom ID columns (anything other than 'id')\n * 2. Custom database schemas (anything other than 'public')\n *\n * Tables with standard 'id' column in 'public' schema do NOT need registration.\n * You can also override ID column and schema per-query using OperationConfig.\n *\n * Schema can be defined in the table key or in the config object (or both):\n * - 'schema.table': { idColumn: 'key' } ← Schema in key only\n * - 'schema.table': { idColumn: 'key', schema: 'schema' } ← Redundant but allowed\n * - 'schema.table': {} ← Empty config, schema in key\n * - 'table': { idColumn: 'key', schema: 'schema' } ← Schema in config only\n *\n * @example\n * ```typescript\n * // Using registry\n * await db.get('feature_flags', 'my-flag-key'); // Uses 'key' column from registry\n *\n * // Per-query override\n * await db.get('custom_table', 'some-key', { idColumn: 'custom_id' });\n *\n * // Schema override\n * await db.get('logs', '123', { schema: 'logging' });\n * ```\n */\nexport const TABLE_REGISTRY: Record<string, { idColumn?: string; schema?: string }> = {\n // Migration 008: Feature Flags (custom ID column 'key')\n feature_flags: { idColumn: 'key' },\n\n // Test Feature Flags (custom ID column 'key')\n test_feature_flags: { idColumn: 'key' },\n\n // Migration 010: Universal Analytics (custom ID column 'user_id')\n user_analytics_summary: { idColumn: 'user_id' },\n};\n\n/**\n * DbService - Singleton Database Connection Manager\n *\n * Provides centralized database connection management for all domains.\n * Uses @plyaz/db under the hood with configurable adapters and extensions.\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 database connection pools or inconsistent state across API routes.\n */\nconst DB_SERVICE_KEY = Symbol.for('plyaz.DbService');\n\nfunction getDbServiceInstance(): DbService | null {\n const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n return globalAny[DB_SERVICE_KEY] ?? null;\n}\n\nfunction setDbServiceInstance(instance: DbService | null): void {\n const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n globalAny[DB_SERVICE_KEY] = instance;\n}\n\nexport class DbService implements CoreDbServiceInstance {\n private databaseService: DatabaseServiceInterface | null = null;\n private namedAdapters: Map<string, DatabaseServiceInterface> = new Map();\n private config: DbServiceConfig | null = null;\n private initialized = false;\n\n private constructor() {}\n\n /**\n * Emits a database error event via CoreEventManager.\n * Called when database operations fail to integrate with global error handling.\n *\n * @param error - The error that occurred\n * @param operation - The operation that failed (e.g., 'transaction', 'query', 'healthCheck')\n * @param table - Optional table name involved in the operation\n * @param query - Optional query string that failed\n * @param recoverable - Whether the error is recoverable (default: false)\n */\n private emitDatabaseError(\n error: unknown,\n operation: string,\n options?: {\n table?: string;\n query?: string;\n recoverable?: boolean;\n }\n ): void {\n const payload: CoreDatabaseErrorPayload = {\n error,\n operation,\n table: options?.table,\n query: options?.query,\n recoverable: options?.recoverable ?? false,\n };\n CoreEventManager.emit(CORE_EVENTS.DATABASE.ERROR, payload);\n }\n\n /**\n * Creates merged event handlers that wrap user-provided handlers.\n * Adds Core-level logging and forwards to user handlers.\n *\n * Note: Unlike StorageService/NotificationService, DB events don't emit\n * to CoreEventManager by default (too verbose). User handlers can emit\n * if needed.\n *\n * @param userHandlers - User-provided event handlers from config\n * @returns Merged handlers with Core logging + user handlers\n */\n private static createMergedEventHandlers(userHandlers?: DatabaseEvents): DatabaseEvents {\n return {\n ...userHandlers,\n\n onAfterWrite: async event => {\n logger.debug('Database write completed', {\n operation: event.operation,\n table: event.table,\n duration: event.duration,\n });\n if (userHandlers?.onAfterWrite) {\n await userHandlers.onAfterWrite(event);\n }\n },\n\n onAfterRead: async event => {\n logger.debug('Database read completed', {\n table: event.table,\n duration: event.duration,\n });\n if (userHandlers?.onAfterRead) {\n await userHandlers.onAfterRead(event);\n }\n },\n };\n }\n\n /**\n * Gets the singleton instance of DbService\n *\n * @returns {DbService} The singleton instance\n */\n static getInstance(): DbService {\n let instance = getDbServiceInstance();\n if (!instance) {\n instance = new DbService();\n setDbServiceInstance(instance);\n }\n return instance;\n }\n\n /**\n * Checks if the database service has been initialized\n *\n * @returns {boolean} True if initialized\n */\n static isInitialized(): boolean {\n return getDbServiceInstance()?.initialized ?? false;\n }\n\n /**\n * Resets the database service by closing connections and clearing the singleton instance\n *\n * @description Properly closes the database connection and clears the singleton.\n * Useful for testing or when you need to reinitialize with different configuration.\n *\n * @example\n * ```typescript\n * await DbService.reset();\n * await DbService.initialize({ adapter: 'sql', ... });\n * ```\n */\n static async reset(): Promise<void> {\n const instance = getDbServiceInstance();\n if (instance) {\n try {\n await instance.databaseService?.close?.();\n } catch {\n // Ignore close errors (pool might already be closed)\n }\n setDbServiceInstance(null);\n }\n }\n\n /**\n * Initializes the database connection\n *\n * @description Sets up the database connection using the provided configuration\n * or environment variables. This method is idempotent - calling it multiple\n * times won't create additional connections.\n *\n * **Environment Variables:**\n * - `DATABASE_URL` - PostgreSQL connection string (for sql/drizzle adapters)\n * - `ENCRYPTION_KEY` - 32-byte encryption key for field encryption (optional)\n * - `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY`, `SUPABASE_ANON_PUBLIC_KEY` - For supabase adapter\n *\n * **Encryption:** If `ENCRYPTION_KEY` env is set, encryption is auto-enabled\n * using `DEFAULT_ENCRYPTION_FIELDS`. Override via config.encryption.\n *\n * @param {DbServiceConfig} [config] - Optional configuration\n * @returns {Promise<DbService>} The initialized DbService instance\n * @throws {DatabasePackageError} When configuration is invalid or connection fails\n *\n * @example\n * ```typescript\n * // Minimal - uses DATABASE_URL env, auto-enables encryption if ENCRYPTION_KEY set\n * await DbService.initialize();\n *\n * // With explicit encryption\n * await DbService.initialize({\n * adapter: 'sql',\n * encryption: {\n * enabled: true,\n * key: 'your-32-byte-encryption-key-here!!',\n * fields: DEFAULT_ENCRYPTION_FIELDS,\n * },\n * });\n *\n * // Or via Core.initialize() with env:\n * await Core.initialize({\n * env: { ENCRYPTION_KEY: '...' },\n * db: { adapter: 'sql' },\n * });\n * ```\n */\n /** Build encryption config from user config */\n private static buildEncryptionConfig(config?: DbServiceConfig): DbServiceConfig['encryption'] {\n const encryption = config?.encryption;\n if (!encryption?.key) return undefined;\n\n return {\n enabled: encryption.enabled ?? true,\n key: encryption.key,\n fields: encryption.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: encryption.algorithm ?? 'aes-256-gcm',\n };\n }\n\n /** Merge user config with defaults */\n private static mergeConfig(config?: DbServiceConfig): DbServiceConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config?.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config?.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config?.audit },\n encryption: DbService.buildEncryptionConfig(config),\n } as DbServiceConfig;\n }\n\n /** Initialize named adapters */\n private async initializeNamedAdapters(mergedConfig: DbServiceConfig): Promise<void> {\n if (!mergedConfig.adapters) return;\n\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = this.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n this.namedAdapters.set(name, namedService);\n }\n }\n\n static async initialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n\n if (instance.initialized) {\n return instance;\n }\n\n const mergedConfig = DbService.mergeConfig(config);\n instance.config = mergedConfig;\n\n const dbConfig = instance.buildDatabaseConfig(mergedConfig);\n instance.databaseService = await createDatabaseService(dbConfig);\n\n await instance.initializeNamedAdapters(mergedConfig);\n\n instance.initialized = true;\n return instance;\n }\n\n /**\n * Builds the DatabaseServiceConfig based on the adapter type\n * @private\n */\n\n /** Builds adapter-specific config based on adapter type */\n private buildAdapterConfig(\n adapter: string,\n config: DbServiceConfig\n ): DrizzleConfig | SupabaseConfig | SqlConfig {\n const builders: Record<string, () => DrizzleConfig | SupabaseConfig | SqlConfig> = {\n drizzle: () => this.buildDrizzleConfig(config),\n supabase: () => this.buildSupabaseConfig(config),\n sql: () => this.buildSqlConfig(config),\n };\n\n const builder = builders[adapter];\n if (!builder) {\n throw new DatabasePackageError(\n `Unsupported adapter type: ${adapter}`,\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n return builder();\n }\n\n /** Builds soft delete extension config */\n private buildSoftDeleteExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['softDelete'] | undefined {\n if (!config.softDelete?.enabled) return undefined;\n return {\n enabled: true,\n field: config.softDelete.field ?? 'deleted_at',\n excludeTables: config.softDelete.excludeTables,\n };\n }\n\n /** Builds cache extension config */\n private buildCacheExtension(config: DbServiceConfig): DatabaseServiceConfig['cache'] | undefined {\n if (!config.cache?.enabled) return undefined;\n return {\n enabled: true,\n ttl: config.cache.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n provider: config.cache.provider ?? 'memory',\n invalidation: config.cache.invalidation ?? 'write',\n };\n }\n\n /** Builds audit extension config */\n private buildAuditExtension(config: DbServiceConfig): DatabaseServiceConfig['audit'] | undefined {\n if (!config.audit?.enabled) return undefined;\n return {\n enabled: true,\n retentionDays: config.audit.retentionDays ?? DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: config.audit.excludeFields,\n excludeTables: config.audit.excludeTables,\n schema: config.audit.schema ?? 'audit',\n usePartitionedTables: config.audit.usePartitionedTables ?? true,\n };\n }\n\n /** Builds encryption extension config */\n private buildEncryptionExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['encryption'] | undefined {\n if (!config.encryption?.enabled || !config.encryption.key) return undefined;\n return {\n enabled: true,\n key: config.encryption.key,\n fields: config.encryption.fields ?? {},\n algorithm: config.encryption.algorithm,\n };\n }\n\n private buildDatabaseConfig(config: DbServiceConfig): DatabaseServiceConfig {\n const adapter = config.adapter ?? 'drizzle';\n\n const dbConfig: DatabaseServiceConfig = {\n adapter: adapter as DatabaseServiceConfig['adapter'],\n config: this.buildAdapterConfig(adapter, config),\n };\n\n // Apply extensions\n const softDelete = this.buildSoftDeleteExtension(config);\n const cache = this.buildCacheExtension(config);\n const audit = this.buildAuditExtension(config);\n const encryption = this.buildEncryptionExtension(config);\n\n if (softDelete) dbConfig.softDelete = softDelete;\n if (cache) dbConfig.cache = cache;\n if (audit) dbConfig.audit = audit;\n if (encryption) dbConfig.encryption = encryption;\n\n // Apply merged event handlers\n const events = DbService.createMergedEventHandlers(config.events);\n if (events) dbConfig.events = events;\n\n return dbConfig;\n }\n\n /**\n * Builds Drizzle adapter configuration\n * @private\n */\n private buildDrizzleConfig(config: DbServiceConfig): DrizzleConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.drizzle?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'Drizzle adapter requires a PostgreSQL connection string. ' +\n 'Provide `drizzle.connectionString` in config or use Core.initialize() with DATABASE_URL in env. ' +\n 'For Supabase, find this in Dashboard > Database > Connection string (URI).',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n poolSize: config.drizzle?.poolSize ?? DEFAULT_POOL_SIZE,\n ssl: config.drizzle?.ssl,\n schema: config.drizzle?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds Supabase adapter configuration\n * @private\n */\n // eslint-disable-next-line complexity\n private buildSupabaseConfig(config: DbServiceConfig): SupabaseConfig {\n // Get Supabase config (Core.initialize() passes env values)\n const supabaseUrl = config.supabase?.supabaseUrl;\n const supabaseServiceKey = config.supabase?.supabaseServiceKey;\n const supabaseAnonKey = config.supabase?.supabaseAnonKey;\n\n if (!supabaseUrl || !supabaseServiceKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseUrl and supabaseServiceKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n if (!supabaseAnonKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseAnonKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_ANON_PUBLIC_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n supabaseUrl,\n supabaseServiceKey,\n supabaseAnonKey,\n schema: config.supabase?.schema ?? 'public',\n tableIdColumns,\n };\n }\n\n /**\n * Builds SQL adapter configuration\n * @private\n */\n private buildSqlConfig(config: DbServiceConfig): SqlConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.sql?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'SQL adapter requires a connection string. ' +\n 'Provide `sql.connectionString` in config or use Core.initialize() with DATABASE_URL in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n dialect: config.sql?.dialect ?? 'postgresql',\n schema: config.sql?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds table ID column mappings from TABLE_REGISTRY\n * @private\n * @returns Record of table names to ID column names\n */\n // eslint-disable-next-line complexity\n private buildTableIdColumns(): Record<string, string> {\n const tableIdColumns: Record<string, string> = {};\n const baseNameConflicts = new Set<string>();\n const baseNameMappings = new Map<string, string>();\n\n // First pass: identify base name conflicts\n // e.g., if we have both 'public.users' and 'backoffice.users',\n // we can't map 'users' → one ID column\n for (const tableName of Object.keys(TABLE_REGISTRY)) {\n if (tableName.includes('.')) {\n const baseName = tableName.split('.').pop()!;\n if (baseNameMappings.has(baseName) || TABLE_REGISTRY[baseName]) {\n baseNameConflicts.add(baseName);\n } else {\n baseNameMappings.set(baseName, tableName);\n }\n }\n }\n\n // Second pass: build ID column mappings\n for (const [tableName, config] of Object.entries(TABLE_REGISTRY)) {\n const idColumn = config.idColumn ?? 'id';\n\n // Only include non-standard ID columns (not 'id')\n if (idColumn === 'id') continue;\n\n // Always map the full table name (with or without schema)\n tableIdColumns[tableName] = idColumn;\n\n // If the table name includes a schema (e.g., 'backoffice.flagged_content'),\n // also map the base name (e.g., 'flagged_content') for convenience\n // unless there's a conflict with another schema's table\n if (!tableName.includes('.')) continue;\n\n const baseName = tableName.split('.').pop()!;\n if (!baseNameConflicts.has(baseName)) {\n tableIdColumns[baseName] = idColumn;\n }\n }\n\n return tableIdColumns;\n }\n\n /**\n * Gets the initialized database service instance\n *\n * @param {string} [adapterName] - Optional named adapter to use instead of default\n * @returns {DatabaseServiceInterface} The database service instance\n * @throws {DatabasePackageError} When database is not initialized or named adapter not found\n */\n getDatabase(adapterName?: string): DatabaseServiceInterface {\n if (adapterName) {\n const namedAdapter = this.namedAdapters.get(adapterName);\n if (!namedAdapter) {\n throw new DatabasePackageError(\n `Named adapter '${adapterName}' not found. Available adapters: ${Array.from(this.namedAdapters.keys()).join(', ')}`,\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return namedAdapter;\n }\n\n if (!this.databaseService) {\n throw new DatabasePackageError(\n 'Database not initialized. Call DbService.initialize() first.',\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return this.databaseService;\n }\n\n /**\n * Gets a named adapter by name\n *\n * @param {string} name - The name of the adapter\n * @returns {DatabaseServiceInterface} The named adapter instance\n * @throws {DatabasePackageError} When adapter not found\n */\n getAdapter(name: string): DatabaseServiceInterface {\n return this.getDatabase(name);\n }\n\n /**\n * Lists all available named adapters\n *\n * @returns {string[]} Array of adapter names\n */\n getAvailableAdapters(): string[] {\n return ['default', ...Array.from(this.namedAdapters.keys())];\n }\n\n /**\n * Executes a database transaction with automatic rollback on failure\n *\n * @template T The return type of the transaction callback\n * @param {Function} callback - Function that receives transaction object\n * @returns {Promise<T>} The result of the transaction callback\n * @throws {DatabasePackageError} When transaction fails\n */\n async transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T> {\n const db = this.getDatabase();\n const result = await db.transaction(callback);\n\n if (!result.success) {\n const errorMessage = result.error?.message ?? 'Transaction failed';\n const error = new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.TRANSACTION_FAILED);\n // Emit database error event for global error handling\n this.emitDatabaseError(error, 'transaction', { recoverable: true });\n throw error;\n }\n\n if (result.value === undefined || result.value === null) {\n const error = new DatabasePackageError(\n 'Transaction returned no value',\n DATABASE_ERROR_CODES.INVALID_RESULT\n );\n this.emitDatabaseError(error, 'transaction', { recoverable: false });\n throw error;\n }\n\n return result.value;\n }\n\n /**\n * Sets audit context for subsequent operations\n *\n * @param context - Audit context (userId, requestId, etc.)\n */\n async setAuditContext(context: {\n userId?: string;\n requestId?: string;\n ipAddress?: string;\n userAgent?: string;\n }): Promise<void> {\n const db = this.getDatabase();\n await db.setAuditContext(context);\n }\n\n /**\n * Performs a health check on the database connection\n *\n * @returns Health check result\n */\n async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n try {\n const db = this.getDatabase();\n const result = await db.healthCheck();\n\n if (result.success && result.value) {\n return {\n isHealthy: result.value.isHealthy,\n responseTime: result.value.responseTime,\n };\n }\n\n // Health check failed - emit error event\n const errorMessage = result.error?.message ?? 'Health check failed';\n this.emitDatabaseError(\n new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.CONNECTION_ERROR),\n 'healthCheck',\n { recoverable: true }\n );\n\n return {\n isHealthy: false,\n error: errorMessage,\n };\n } catch (error) {\n // Exception during health check - emit error event\n this.emitDatabaseError(error, 'healthCheck', { recoverable: true });\n\n return {\n isHealthy: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Gets the table registry with all known tables and their ID columns\n *\n * @returns The complete table registry\n */\n static getTableRegistry(): typeof TABLE_REGISTRY {\n return TABLE_REGISTRY;\n }\n\n /**\n * Gets ID column for a specific table\n *\n * @param tableName - Name of the table\n * @returns ID column name or 'id' as default\n */\n static getTableIdColumn(tableName: string): string {\n return TABLE_REGISTRY[tableName]?.idColumn ?? 'id';\n }\n\n /**\n * Reinitializes the database connection with new config\n *\n * @param {DbServiceConfig} [config] - New configuration\n * @returns {Promise<DbService>} The reinitialized DbService instance\n */\n static async reinitialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n await instance.close();\n instance.initialized = false;\n return DbService.initialize(config);\n }\n\n /**\n * Closes the database connection and cleans up resources\n */\n async close(): Promise<void> {\n this.databaseService = null;\n this.initialized = false;\n this.config = null;\n }\n\n /**\n * Gets the current configuration\n *\n * @returns {DbServiceConfig | null} Current config or null if not initialized\n */\n getConfig(): DbServiceConfig | null {\n return this.config;\n }\n\n /**\n * Gets the current adapter type\n *\n * @returns The adapter type or null if not initialized\n */\n getAdapterType(): 'drizzle' | 'supabase' | 'sql' | null {\n return this.config?.adapter ?? null;\n }\n\n /**\n * Creates a dedicated database service instance (NOT the singleton)\n *\n * Use this when you need an isolated database connection with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param config - Database service configuration\n * @returns Promise that resolves to a new dedicated DbService instance\n *\n * @example\n * ```typescript\n * // Create a dedicated instance for analytics database\n * const analyticsDb = await DbService.createInstance({\n * adapter: 'sql',\n * sql: { connectionString: process.env.ANALYTICS_DB_URL },\n * cache: { enabled: false }, // No caching for analytics\n * });\n *\n * // This instance is independent from DbService.getInstance()\n * const data = await analyticsDb.getDatabase().list('events');\n *\n * // Clean up when done\n * await analyticsDb.close();\n * ```\n */\n // eslint-disable-next-line complexity\n static async createInstance(config: DbServiceConfig): Promise<DbService> {\n // Create a new instance (not the singleton)\n const dedicatedInstance = new DbService();\n\n // Build encryption config if key provided\n const encryptionKey = config.encryption?.key;\n const encryptionConfig = encryptionKey\n ? {\n enabled: config.encryption?.enabled ?? true,\n key: encryptionKey,\n fields: config.encryption?.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: config.encryption?.algorithm ?? ('aes-256-gcm' as const),\n }\n : undefined;\n\n const mergedConfig = {\n ...DEFAULT_CONFIG,\n ...config,\n // Deep merge extensions\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config.audit },\n // Encryption only if key is available\n encryption: encryptionConfig,\n } as DbServiceConfig;\n\n dedicatedInstance.config = mergedConfig;\n\n // Build adapter configuration based on adapter type\n const dbConfig = dedicatedInstance.buildDatabaseConfig(mergedConfig);\n\n dedicatedInstance.databaseService = await createDatabaseService(dbConfig);\n\n // Initialize named adapters if configured\n if (mergedConfig.adapters) {\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = dedicatedInstance.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n dedicatedInstance.namedAdapters.set(name, namedService);\n }\n }\n\n dedicatedInstance.initialized = true;\n\n return dedicatedInstance;\n }\n}\n\n/** Type alias for DbService instance (use for type-only imports to avoid bundling) */\nexport type DbServiceInstance = DbService;\n","/**\n * NestJS Streaming Controller\n *\n * SSE streaming controller for NestJS applications.\n * Provides the /events/stream endpoint for real-time updates.\n *\n * @example\n * ```typescript\n * // Automatically included when using StreamingModule\n * @Module({\n * imports: [StreamingModule.forRoot()],\n * })\n * export class AppModule {}\n *\n * // Or import directly for custom routing\n * @Module({\n * controllers: [StreamingController],\n * providers: [{ provide: STREAM_SERVER, useValue: streamServer }],\n * })\n * export class CustomStreamingModule {}\n * ```\n */\n\nimport { Controller, Get, Req, Res, Inject } from '@nestjs/common';\nimport type { Request, Response } from 'express';\nimport type { StreamServer } from '../../events/streaming/StreamServer';\nimport type { NestJSHandler } from '../../events/streaming/frameworks';\n\n/**\n * Injection token for StreamServer\n */\nexport const STREAM_SERVER = Symbol('STREAM_SERVER');\n\n/**\n * StreamingController - NestJS SSE endpoint controller\n *\n * Handles GET /events/stream requests using the StreamServer's NestJS adapter.\n */\n@Controller('events')\nexport class StreamingController {\n constructor(\n @Inject(STREAM_SERVER)\n private readonly streamServer: StreamServer\n ) {}\n\n /**\n * SSE streaming endpoint\n *\n * Clients connect to this endpoint to receive real-time updates.\n * Supports channel subscription via query params: ?channels=uploads,system\n *\n * @param req - NestJS/Express request\n * @param res - NestJS/Express response\n */\n @Get('stream')\n async stream(@Req() req: Request, @Res() res: Response): Promise<void> {\n const handler = this.streamServer.getHandler<NestJSHandler>('nestjs');\n await handler(req, res);\n }\n}\n","/**\n * NestJS Module for @plyaz/core\n *\n * Provides dependency injection integration for NestJS applications.\n * Supports optional streaming integration when streaming config is provided.\n *\n * @example\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/nestjs';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({\n * envPath: '.env',\n * db: { adapter: 'sql' },\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example With streaming\n * ```typescript\n * CoreModule.forRoot({\n * db: { adapter: 'sql' },\n * streaming: {\n * enabled: true,\n * server: { heartbeatInterval: 30000 },\n * },\n * })\n * ```\n *\n * @example Async configuration\n * ```typescript\n * CoreModule.forRootAsync({\n * imports: [ConfigModule],\n * useFactory: (config: ConfigService) => ({\n * db: {\n * adapter: 'sql',\n * sql: { connectionString: config.get('DATABASE_URL') },\n * },\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n\nimport type { DynamicModule, Provider, Type } from '@nestjs/common';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\nimport { DbService } from '../../services/DbService';\nimport type { CoreNestJsCoreModuleAsyncOptions } from '@plyaz/types/core';\nimport { STREAM_SERVER, StreamingController } from './StreamingController';\nimport type { StreamServer } from '../../events/streaming/StreamServer';\n\n/**\n * Injection tokens for Core services\n */\nexport const CORE_OPTIONS = Symbol('CORE_OPTIONS');\nexport const DB_SERVICE = Symbol('DB_SERVICE');\n\n/**\n * Async configuration options for CoreModule\n * Uses CoreInitOptions for type safety with Core.initialize()\n */\ntype CoreModuleAsyncOptions = CoreNestJsCoreModuleAsyncOptions;\n\n/**\n * CoreModule - NestJS DI module for @plyaz/core\n *\n * Features:\n * - Database service injection\n * - Optional streaming integration\n * - Full Core.initialize() orchestration\n */\nexport class CoreModule {\n /**\n * Register CoreModule with static configuration\n */\n static forRoot(options: CoreInitOptions = {}): DynamicModule {\n const streamingEnabled = options.streaming?.enabled === true;\n const controllers: Type[] = streamingEnabled ? [StreamingController] : [];\n // Use symbols for exports to avoid private constructor type issues\n const moduleExports: symbol[] = [DB_SERVICE, CORE_OPTIONS];\n\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useValue: options,\n },\n {\n provide: DbService,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n {\n provide: DB_SERVICE,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n ];\n\n // Add streaming provider if enabled\n if (streamingEnabled) {\n providers.push({\n provide: STREAM_SERVER,\n useFactory: async (): Promise<StreamServer | null> => {\n await Core.initialize(options);\n return Core.streamServer;\n },\n });\n moduleExports.push(STREAM_SERVER);\n }\n\n return {\n module: CoreModule,\n global: true,\n controllers,\n providers,\n exports: moduleExports,\n };\n }\n\n /**\n * Register CoreModule with async configuration\n */\n static forRootAsync(options: CoreModuleAsyncOptions): DynamicModule {\n // Note: For async, we can't know if streaming is enabled at module definition time\n // Users should use StreamingModule.forRootAsync() for async streaming config\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n },\n {\n provide: DbService,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n {\n provide: DB_SERVICE,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n // Add streaming provider for async (will be null if not configured)\n {\n provide: STREAM_SERVER,\n useFactory: async (coreOptions: CoreInitOptions): Promise<StreamServer | null> => {\n await Core.initialize(coreOptions);\n return Core.streamServer;\n },\n inject: [CORE_OPTIONS],\n },\n ];\n\n return {\n module: CoreModule,\n global: true,\n imports: options.imports ?? [],\n providers,\n exports: [DB_SERVICE, CORE_OPTIONS, STREAM_SERVER],\n };\n }\n}\n","/**\n * NestJS Streaming Module\n *\n * Provides SSE streaming integration for NestJS applications.\n * Can be used standalone or integrated with CoreModule.\n *\n * @example Standalone usage\n * ```typescript\n * import { StreamingModule } from '@plyaz/core/nestjs';\n * import { FilesStreamEndpoint, SystemStreamEndpoint } from '@plyaz/core/streaming';\n *\n * @Module({\n * imports: [\n * StreamingModule.forRoot({\n * server: { heartbeatInterval: 30000 },\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example Async configuration\n * ```typescript\n * StreamingModule.forRootAsync({\n * imports: [ConfigModule],\n * useFactory: (config: ConfigService) => ({\n * server: {\n * heartbeatInterval: config.get('STREAM_HEARTBEAT_INTERVAL'),\n * },\n * endpoints: [...],\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n\nimport type {\n DynamicModule,\n Provider,\n OnModuleDestroy,\n InjectionToken,\n OptionalFactoryDependency,\n Type,\n ForwardReference,\n} from '@nestjs/common';\nimport { StreamServer, StreamRegistry } from '../../events/streaming';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\nimport type { StreamingModuleConfig, StreamingModuleAsyncOptions } from '@plyaz/types/core';\nimport { StreamingController, STREAM_SERVER } from './StreamingController';\n\n/**\n * StreamingModule - NestJS streaming integration\n *\n * Provides:\n * - StreamServer instance with SSE transport\n * - StreamingController for /events/stream endpoint\n * - StreamRegistry initialization with endpoints\n * - Automatic cleanup on module destroy\n */\nexport class StreamingModule implements OnModuleDestroy {\n private static streamServer: StreamServer | null = null;\n\n async onModuleDestroy(): Promise<void> {\n if (StreamingModule.streamServer) {\n StreamingModule.streamServer.dispose();\n StreamingModule.streamServer = null;\n }\n StreamRegistry.dispose();\n }\n\n /**\n * Register StreamingModule with static configuration\n */\n static forRoot(config: StreamingModuleConfig = {}): DynamicModule {\n const includeController = config.includeController !== false;\n\n const providers: Provider[] = [\n {\n provide: STREAM_SERVER,\n useFactory: async (): Promise<StreamServer> => {\n return StreamingModule.initializeStreamServer(config);\n },\n },\n ];\n\n return {\n module: StreamingModule,\n global: config.isGlobal !== false,\n controllers: includeController ? [StreamingController] : [],\n providers,\n exports: [STREAM_SERVER],\n };\n }\n\n /**\n * Register StreamingModule with async configuration\n */\n static forRootAsync(options: StreamingModuleAsyncOptions): DynamicModule {\n const includeController = options.includeController !== false;\n\n const configProvider: Provider = {\n provide: 'STREAMING_MODULE_CONFIG',\n useFactory: options.useFactory,\n inject: (options.inject ?? []) as (InjectionToken | OptionalFactoryDependency)[],\n };\n\n const streamServerProvider: Provider = {\n provide: STREAM_SERVER,\n useFactory: async (config: StreamingModuleConfig): Promise<StreamServer> => {\n return StreamingModule.initializeStreamServer(config);\n },\n inject: ['STREAMING_MODULE_CONFIG'],\n };\n\n return {\n module: StreamingModule,\n global: options.isGlobal !== false,\n imports: (options.imports ?? []) as (\n | Type\n | DynamicModule\n | Promise<DynamicModule>\n | ForwardReference\n )[],\n controllers: includeController ? [StreamingController] : [],\n providers: [configProvider, streamServerProvider],\n exports: [STREAM_SERVER],\n };\n }\n\n /**\n * Initialize StreamServer with configuration\n */\n // eslint-disable-next-line complexity\n private static async initializeStreamServer(\n config: StreamingModuleConfig\n ): Promise<StreamServer> {\n // Dispose existing server if any\n if (StreamingModule.streamServer) {\n StreamingModule.streamServer.dispose();\n }\n\n // Create stream server\n const builder = StreamServer.create().withSSE({\n heartbeatInterval:\n config.server?.broadcaster?.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS,\n });\n\n // Set default channels\n const defaultChannels = config.server?.defaultChannels ?? STREAMING_DEFAULTS.DEFAULT_CHANNELS;\n builder.withDefaultChannels(defaultChannels as never[]);\n\n const streamServer = builder.build();\n streamServer.initialize();\n StreamingModule.streamServer = streamServer;\n\n // Initialize endpoints if provided\n if (config.endpoints?.length) {\n await StreamRegistry.initialize({\n broadcaster: streamServer.getBroadcaster(),\n endpoints: config.endpoints,\n });\n }\n\n return streamServer;\n }\n\n /**\n * Get the current StreamServer instance (for testing/debugging)\n */\n static getStreamServer(): StreamServer | null {\n return StreamingModule.streamServer;\n }\n}\n","/**\n * NestJS integration exports\n */\nimport type { INestApplication } from '@nestjs/common';\nimport { Core } from '../CoreInitializer';\nimport {\n configureNestApp as configureNestAppInternal,\n getDefaultNestJsConfig,\n type ConfigureNestAppResult,\n} from './configureNestApp';\n\nexport { CoreModule, CORE_OPTIONS, DB_SERVICE } from './CoreModule';\nexport { StreamingModule } from './StreamingModule';\nexport { StreamingController, STREAM_SERVER } from './StreamingController';\nexport { getDefaultNestJsConfig, type ConfigureNestAppResult };\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n * Uses the options passed to CoreModule.forRoot() automatically.\n *\n * @param app - NestJS application instance\n * @returns Configuration result with enabled/skipped features\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n *\n * const app = await NestFactory.create(AppModule);\n * const result = await configureNestApp(app);\n * console.log('Enabled:', result.enabled);\n * ```\n */\nexport async function configureNestApp(app: INestApplication): Promise<ConfigureNestAppResult> {\n return configureNestAppInternal(app, Core.initOptions);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../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/domain/notifications/streaming/NotificationsChannelController.ts","../../../src/domain/notifications/streaming/NotificationsStreamEndpoint.ts","../../../src/events/streaming/endpoints/system/SystemChannelController.ts","../../../src/events/streaming/endpoints/system/SystemStreamEndpoint.ts","../../../src/utils/runtime.ts","../../../src/init/CoreInitializer.ts","../../../src/init/nestjs/configureNestApp.ts","../../../src/services/DbService.ts","../../../src/init/nestjs/StreamingController.ts","../../../src/init/nestjs/CoreModule.ts","../../../src/init/nestjs/StreamingModule.ts","../../../src/init/nestjs/index.ts"],"names":["PackageLogger","logger","CorePackageError","ERROR_CODES","DbService","TIME_CONSTANTS","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","HTTP_STATUS","StreamPackageError","STREAM_ERROR_CODES","CoreLogger","STREAMING_DEFAULTS","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","ERROR_CATEGORY","CORE_EVENTS","document","configureNestApp"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 * Notifications Channel Controller\n *\n * Handles IN_APP notification streaming - broadcasts new notifications to users.\n * Only supports notification:created event - when a new notification is created,\n * it's broadcasted to the user's channel based on userId.\n *\n * NOTE: This controller handles IN_APP notifications only.\n * Email, SMS, and Push are handled by @plyaz/notifications package.\n *\n * Flow:\n * 1. Backend creates notification with user_id\n * 2. Backend emits notification:created via CoreEventManager\n * 3. This controller broadcasts to user:notifications:{userId}\n * 4. User's connected clients receive and display the notification\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamBroadcasterInterface, CoreEvent } from '@plyaz/types/core';\nimport {\n NOTIFICATIONS_STREAM_CHANNEL_PREFIX,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL,\n} from '@plyaz/types/core';\nimport type { NotificationCreatedStreamData } from '@plyaz/types/core';\n\n/**\n * NotificationsChannelController - Broadcasts new notifications to users\n *\n * Channel:\n * - `user:notifications:{userId}` - User subscribes to receive their notifications\n */\nexport class NotificationsChannelController extends BaseChannelController {\n constructor() {\n super({\n scope: 'notifications',\n patterns: [\n NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS,\n ],\n });\n }\n\n /**\n * Initialize event subscriptions.\n * Listens to notification:created and broadcasts to user's channel.\n */\n initialize(broadcaster: StreamBroadcasterInterface): void {\n this.logger.debug('[NotificationsChannelController] initialize() called');\n\n // Listen for notification:created events\n this.addUnsubscriber(\n CoreEventManager.on<NotificationCreatedStreamData>(\n 'notification:created',\n (event: CoreEvent<NotificationCreatedStreamData>) => {\n const data = event.data;\n\n // userId is REQUIRED for routing\n if (!data.userId) {\n this.logger.warn(\n '[NotificationsChannelController] notification:created missing userId',\n {\n notificationId: data.notificationId,\n }\n );\n return;\n }\n\n const userChannel = `${NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER}${data.userId}`;\n\n this.logger.debug('[NotificationsChannelController] notification:created', {\n notificationId: data.notificationId,\n userId: data.userId,\n userChannel,\n });\n\n // Broadcast to user's notifications channel\n broadcaster.broadcastToChannel(userChannel, {\n event: 'notification:created',\n data: this.createResponse(data, userChannel, 'New notification'),\n });\n\n // Also broadcast to general channel (for admin/debug)\n broadcaster.broadcastToChannel(NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS, {\n event: 'notification:created',\n data: this.createResponse(\n data,\n NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n ),\n });\n }\n )\n );\n\n this.logger.info('NotificationsChannelController initialized (notification:created only)');\n }\n\n /**\n * Override handlesChannel to match notification patterns.\n */\n override handlesChannel(channel: string): boolean {\n return (\n channel.startsWith(NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER) ||\n channel === NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n );\n }\n}\n","/**\n * Notifications Stream Endpoint\n *\n * Stream endpoint for IN_APP notification real-time events.\n * Handles notification lifecycle events (created, read, unread, deleted).\n *\n * NOTE: This endpoint handles IN_APP notifications only (bell icon notifications).\n * Email, SMS, and Push notification delivery is handled by @plyaz/notifications package.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n * broadcaster: streamServer.getBroadcaster(),\n * endpoints: [\n * { endpoint: NotificationsStreamEndpoint, config: { enabled: true } },\n * ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { NotificationsChannelController } from './NotificationsChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * NotificationsStreamEndpoint - Handles IN_APP notification streaming events\n *\n * Channels managed:\n * - `notification:{notificationId}` - Per-notification updates\n * - `user:notifications:{userId}` - All notifications for a specific user\n * - `notifications` - Broadcast channel for all notifications (current user)\n * - `notifications:unread` - Broadcast channel for unread notifications\n *\n * Events:\n * - `notification:created` - New in-app notification created\n * - `notification:read` - Notification marked as read\n * - `notification:unread` - Notification marked as unread\n * - `notification:deleted` - Notification deleted\n * - `notifications:batch` - Batch operations (e.g., mark all as read)\n */\nexport class NotificationsStreamEndpoint extends BaseStreamEndpoint {\n /** Static endpoint key for registry lookup */\n static readonly endpointKey = 'notifications';\n\n /**\n * Create channel controller for this endpoint.\n */\n protected createChannelController(): BaseChannelController {\n return new NotificationsChannelController();\n }\n\n /**\n * Initialize event subscriptions.\n * Called by StreamRegistry during initialization.\n */\n initialize(): void {\n this.logger.debug('[NotificationsStreamEndpoint] initialize() called');\n\n // Initialize the channel controller with broadcaster\n this.channelController.initialize(this.broadcaster);\n\n this.logger.debug('[NotificationsStreamEndpoint] initialized (IN_APP notifications)', {\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<NotificationsStreamEndpoint> {\n return new NotificationsStreamEndpoint(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 /** Full init options (for configureNestApp and other runtime config) */\n private static _initOptions: CoreInitOptions = {};\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 // Store options for runtime access (e.g., configureNestApp)\n Core._initOptions = options;\n\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 initialization options (for internal use by framework adapters)\n * @internal\n */\n static get initOptions(): CoreInitOptions {\n return Core._initOptions;\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 // Reset notifications store slice\n if (state.notifications?.reset) {\n state.notifications.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 * NestJS App Configuration Helper\n *\n * Configures a NestJS application with middleware based on CoreInitOptions.\n * Call this in your main.ts after creating the app.\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n * import { AppModule } from './app.module';\n * import { buildCoreConfig } from './config';\n *\n * async function bootstrap() {\n * const app = await NestFactory.create(AppModule);\n * const options = buildCoreConfig();\n *\n * // Configure middleware, validation, security, etc.\n * await configureNestApp(app, options);\n *\n * await app.listen(3000);\n * }\n * ```\n */\n\nimport type { INestApplication, ValidationPipe as ValidationPipeType } from '@nestjs/common';\nimport type { CoreNestJsMiddlewareConfig } from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { PackageLogger } from '@plyaz/logger';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\n\n// Default configuration values\nconst DEFAULTS = {\n bodyLimit: '10mb',\n timeout: 30000,\n shutdownTimeout: 10000,\n rateLimit: {\n ttl: 60,\n limit: 100,\n },\n validation: {\n whitelist: true,\n transform: true,\n forbidNonWhitelisted: false,\n disableErrorMessages: false,\n },\n swagger: {\n path: '/api/docs',\n title: 'API Documentation',\n version: '1.0',\n },\n} as const;\n\n/**\n * Result of configuring a NestJS app\n */\nexport interface ConfigureNestAppResult {\n /** Features that were enabled */\n enabled: string[];\n /** Features that were skipped (not configured or dependencies missing) */\n skipped: string[];\n /** Any warnings during configuration */\n warnings: string[];\n}\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n *\n * This function applies:\n * - Compression middleware (if compression: true)\n * - Helmet security headers (if helmet: true)\n * - Rate limiting (if rateLimit config provided)\n * - Global validation pipe (if validation: true)\n * - Body size limits\n * - Request timeout\n * - Raw body parsing for webhooks\n * - Swagger documentation (if swagger config provided)\n * - CORS configuration\n * - Global prefix\n * - Graceful shutdown handlers\n *\n * @param app - NestJS application instance\n * @param options - Core initialization options (reads nestjs config)\n * @returns Configuration result with enabled/skipped features\n *\n * @example Basic usage\n * ```typescript\n * const app = await NestFactory.create(AppModule);\n * await configureNestApp(app, {\n * nestjs: {\n * compression: true,\n * helmet: true,\n * validation: true,\n * },\n * });\n * ```\n *\n * @example Full production config\n * ```typescript\n * await configureNestApp(app, {\n * nestjs: {\n * compression: true,\n * helmet: true,\n * rateLimit: { ttl: 60, limit: 100 },\n * validation: { whitelist: true, transform: true },\n * bodyLimit: '10mb',\n * timeout: 30000,\n * rawBody: { paths: ['/webhooks/*'] },\n * swagger: { enabled: false },\n * globalPrefix: 'api',\n * excludeFromPrefix: ['health', 'metrics'],\n * gracefulShutdown: true,\n * },\n * });\n * ```\n */\n// eslint-disable-next-line complexity, max-lines-per-function\nexport async function configureNestApp(\n app: INestApplication,\n options: CoreInitOptions\n): Promise<ConfigureNestAppResult> {\n const config = options.nestjs ?? {};\n const isProduction =\n options.environment === 'production' || process.env.NODE_ENV === 'production';\n const logger = new PackageLogger({\n packageName: 'core',\n service: 'NestJS',\n transport: Core.loggerTransport,\n });\n\n const result: ConfigureNestAppResult = {\n enabled: [],\n skipped: [],\n warnings: [],\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Compression\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.compression === true || (config.compression !== false && isProduction)) {\n try {\n const compression = await import('compression');\n app.use(compression.default());\n result.enabled.push('compression');\n logger.debug('Compression middleware enabled');\n } catch {\n result.skipped.push('compression');\n result.warnings.push('compression package not installed - run: pnpm add compression');\n }\n } else {\n result.skipped.push('compression');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Helmet Security Headers\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.helmet !== false) {\n try {\n const helmet = await import('helmet');\n const helmetOptions = typeof config.helmet === 'object' ? config.helmet : {};\n app.use(helmet.default(helmetOptions));\n result.enabled.push('helmet');\n logger.debug('Helmet security headers enabled');\n } catch {\n result.skipped.push('helmet');\n result.warnings.push('helmet package not installed - run: pnpm add helmet');\n }\n } else {\n result.skipped.push('helmet');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Rate Limiting\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.rateLimit !== false) {\n try {\n // NestJS throttler module is typically configured in the module, not middleware\n // We'll use express-rate-limit as a fallback for raw middleware approach\n const rateLimit = await import('express-rate-limit');\n const rateLimitConfig =\n typeof config.rateLimit === 'object' ? config.rateLimit : DEFAULTS.rateLimit;\n\n const limiter = rateLimit.default({\n windowMs:\n (rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl) * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n max: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n standardHeaders: true,\n legacyHeaders: false,\n skip: 'skipIf' in rateLimitConfig ? rateLimitConfig.skipIf : undefined,\n });\n\n app.use(limiter);\n result.enabled.push('rateLimit');\n logger.debug('Rate limiting enabled', {\n ttl: rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl,\n limit: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n });\n } catch {\n result.skipped.push('rateLimit');\n result.warnings.push(\n 'express-rate-limit package not installed - run: pnpm add express-rate-limit'\n );\n }\n } else {\n result.skipped.push('rateLimit');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Global Validation Pipe\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.validation !== false) {\n try {\n const { ValidationPipe } = await import('@nestjs/common');\n const validationConfig =\n typeof config.validation === 'object' ? config.validation : DEFAULTS.validation;\n\n const pipe: ValidationPipeType = new ValidationPipe({\n whitelist: validationConfig.whitelist ?? DEFAULTS.validation.whitelist,\n transform: validationConfig.transform ?? DEFAULTS.validation.transform,\n forbidNonWhitelisted:\n validationConfig.forbidNonWhitelisted ?? DEFAULTS.validation.forbidNonWhitelisted,\n disableErrorMessages:\n validationConfig.disableErrorMessages ?? DEFAULTS.validation.disableErrorMessages,\n });\n\n app.useGlobalPipes(pipe);\n result.enabled.push('validation');\n logger.debug('Global validation pipe enabled', { ...validationConfig });\n } catch {\n result.skipped.push('validation');\n result.warnings.push('Failed to create validation pipe');\n }\n } else {\n result.skipped.push('validation');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Body Parser / Size Limits\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.bodyLimit) {\n try {\n const bodyParser = await import('body-parser');\n const limit = config.bodyLimit ?? DEFAULTS.bodyLimit;\n app.use(bodyParser.json({ limit }));\n app.use(bodyParser.urlencoded({ limit, extended: true }));\n result.enabled.push('bodyLimit');\n logger.debug('Body parser configured', { limit });\n } catch {\n // body-parser is usually bundled with express, so this shouldn't fail\n result.skipped.push('bodyLimit');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Raw Body for Webhooks\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.rawBody) {\n try {\n const bodyParser = await import('body-parser');\n const rawBodyConfig = typeof config.rawBody === 'object' ? config.rawBody : {};\n const paths = rawBodyConfig.paths ?? ['/webhooks'];\n\n // Add raw body parsing middleware\n app.use(\n bodyParser.raw({\n type: 'application/json',\n verify: (req: unknown, _res: unknown, buf: Buffer) => {\n // Check if path matches\n const request = req as { rawBody?: Buffer; originalUrl?: string };\n const reqPath = request.originalUrl ?? '';\n if (paths.some((p: string) => reqPath.includes(p.replace('*', '')))) {\n request.rawBody = buf;\n }\n },\n })\n );\n\n result.enabled.push('rawBody');\n logger.debug('Raw body parsing enabled for paths', { paths });\n } catch {\n result.skipped.push('rawBody');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // CORS\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.cors !== false && config.cors !== undefined) {\n const corsConfig = typeof config.cors === 'object' ? config.cors : {};\n app.enableCors({\n origin: corsConfig.origin ?? true,\n credentials: corsConfig.credentials ?? true,\n methods: corsConfig.methods,\n allowedHeaders: corsConfig.allowedHeaders,\n });\n result.enabled.push('cors');\n logger.debug('CORS configured', corsConfig);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Global Prefix\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.globalPrefix !== false) {\n const prefix = config.globalPrefix ?? 'api';\n const exclude = config.excludeFromPrefix ?? ['health'];\n app.setGlobalPrefix(prefix, { exclude });\n result.enabled.push('globalPrefix');\n logger.debug('Global prefix set', { prefix, exclude });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Swagger Documentation\n // ─────────────────────────────────────────────────────────────────────────────\n const swaggerEnabled = isProduction\n ? (typeof config.swagger === 'object' && config.swagger.enabled === true) ||\n config.swagger === true\n : config.swagger !== false;\n\n if (swaggerEnabled) {\n try {\n const { SwaggerModule, DocumentBuilder } = await import('@nestjs/swagger');\n const swaggerConfig = typeof config.swagger === 'object' ? config.swagger : DEFAULTS.swagger;\n\n const documentBuilder = new DocumentBuilder()\n .setTitle(swaggerConfig.title ?? DEFAULTS.swagger.title)\n .setVersion(swaggerConfig.version ?? DEFAULTS.swagger.version);\n\n if ('description' in swaggerConfig && swaggerConfig.description) {\n documentBuilder.setDescription(swaggerConfig.description);\n }\n\n if ('bearerAuth' in swaggerConfig && swaggerConfig.bearerAuth) {\n documentBuilder.addBearerAuth();\n }\n\n const document = SwaggerModule.createDocument(app, documentBuilder.build());\n const path = swaggerConfig.path ?? DEFAULTS.swagger.path;\n SwaggerModule.setup(path, app, document);\n\n result.enabled.push('swagger');\n logger.debug('Swagger documentation enabled', { path });\n } catch {\n result.skipped.push('swagger');\n result.warnings.push('@nestjs/swagger package not installed - run: pnpm add @nestjs/swagger');\n }\n } else {\n result.skipped.push('swagger');\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Graceful Shutdown\n // ─────────────────────────────────────────────────────────────────────────────\n /* eslint-disable n/no-process-exit -- Graceful shutdown requires process.exit */\n if (config.gracefulShutdown !== false) {\n const timeout = config.shutdownTimeout ?? DEFAULTS.shutdownTimeout;\n\n // Enable shutdown hooks\n app.enableShutdownHooks();\n\n // SIGTERM handler\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, initiating graceful shutdown...');\n const shutdownTimer = setTimeout(() => {\n logger.warn('Graceful shutdown timeout, forcing exit');\n process.exit(1);\n }, timeout);\n\n try {\n await app.close();\n clearTimeout(shutdownTimer);\n logger.info('Graceful shutdown complete');\n process.exit(0);\n } catch (err) {\n clearTimeout(shutdownTimer);\n logger.error('Error during shutdown', { error: err });\n process.exit(1);\n }\n });\n\n // SIGINT handler (Ctrl+C)\n process.on('SIGINT', async () => {\n logger.info('SIGINT received, initiating graceful shutdown...');\n const shutdownTimer = setTimeout(() => {\n logger.warn('Graceful shutdown timeout, forcing exit');\n process.exit(1);\n }, timeout);\n\n try {\n await app.close();\n clearTimeout(shutdownTimer);\n logger.info('Graceful shutdown complete');\n process.exit(0);\n } catch (err) {\n clearTimeout(shutdownTimer);\n logger.error('Error during shutdown', { error: err });\n process.exit(1);\n }\n });\n\n result.enabled.push('gracefulShutdown');\n logger.debug('Graceful shutdown handlers registered', { timeout });\n }\n /* eslint-enable n/no-process-exit */\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Request Timeout (applied via middleware)\n // ─────────────────────────────────────────────────────────────────────────────\n if (config.timeout && config.timeout > 0) {\n try {\n const connectTimeout = await import('connect-timeout');\n app.use(connectTimeout.default(`${config.timeout}ms`));\n result.enabled.push('timeout');\n logger.debug('Request timeout configured', { timeout: config.timeout });\n } catch {\n // connect-timeout is optional\n result.skipped.push('timeout');\n }\n }\n\n // Log summary\n logger.info('NestJS app configured', {\n enabled: result.enabled,\n skipped: result.skipped.length > 0 ? result.skipped : undefined,\n warnings: result.warnings.length > 0 ? result.warnings : undefined,\n });\n\n return result;\n}\n\n/**\n * Get default NestJS middleware configuration.\n * Use this as a base and override specific options.\n *\n * @param isProduction - Whether running in production\n * @returns Default configuration\n */\nexport function getDefaultNestJsConfig(isProduction = false): CoreNestJsMiddlewareConfig {\n return {\n compression: isProduction,\n helmet: true,\n rateLimit: isProduction ? DEFAULTS.rateLimit : false,\n validation: DEFAULTS.validation,\n bodyLimit: DEFAULTS.bodyLimit,\n timeout: DEFAULTS.timeout,\n rawBody: false,\n swagger: { enabled: !isProduction, ...DEFAULTS.swagger },\n globalPrefix: 'api',\n excludeFromPrefix: ['health'],\n gracefulShutdown: true,\n shutdownTimeout: DEFAULTS.shutdownTimeout,\n };\n}\n","/**\n * DbService - Singleton Database Connection Manager\n *\n * @description Manages database connections for the entire application using a singleton pattern.\n * This service wraps @plyaz/db and provides a centralized way to initialize and access\n * the database across all domains (feature flags, users, campaigns, backoffice, etc.).\n *\n * **Architecture:**\n * - Uses `createDatabaseService()` from @plyaz/db which builds an adapter chain\n * - Supports Drizzle (direct PostgreSQL), Supabase (REST API), or raw SQL adapters\n * - Extension layers: Encryption → SoftDelete → Caching → Audit → ReadReplica\n *\n * **Adapter Configuration:**\n * - **Drizzle**: Requires `connectionString` (PostgreSQL URL)\n * - **Supabase**: Requires `supabaseUrl`, `supabaseServiceKey`, `supabaseAnonKey`\n * - **SQL**: Requires `connectionString`\n *\n * **Required Environment Variables (Drizzle with Supabase):**\n * - DATABASE_URL: PostgreSQL connection string (from Supabase Dashboard > Database > URI)\n *\n * **Required Environment Variables (Supabase REST API):**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for admin operations\n * - SUPABASE_ANON_PUBLIC_KEY: Anonymous key for public operations\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * // Core.initialize() handles loading env and passing to DbService\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'sql',\n * cache: { enabled: true, ttl: 60 },\n * },\n * });\n *\n * // Access via Core.db\n * const db = Core.db.getDatabase();\n * const result = await db.list('users', { pagination: { limit: 10, offset: 0 } });\n * ```\n *\n * @example Direct Usage (requires explicit config)\n * ```typescript\n * // Direct usage requires explicit connectionString\n * await DbService.initialize({\n * adapter: 'drizzle',\n * drizzle: {\n * connectionString: 'postgresql://user:pass@localhost:5432/db',\n * poolSize: 20,\n * },\n * });\n * ```\n *\n * @example With Extensions\n * ```typescript\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'drizzle',\n * softDelete: {\n * enabled: true,\n * field: 'deleted_at',\n * excludeTables: ['audit_logs', 'feature_flag_evaluations'],\n * },\n * cache: {\n * enabled: true,\n * provider: 'memory',\n * ttl: 300,\n * },\n * audit: {\n * enabled: true,\n * retentionDays: 90,\n * },\n * },\n * });\n * ```\n *\n * @example Using with BaseRepository\n * ```typescript\n * import { BaseRepository } from '@plyaz/db';\n * import { DbService } from '@plyaz/core';\n *\n * class UserRepository extends BaseRepository<User> {\n * constructor() {\n * super(DbService.getInstance().getDatabase(), 'users');\n * }\n * }\n * ```\n *\n * @module services\n */\n\nimport { createDatabaseService } from '@plyaz/db';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport {\n type DatabaseServiceInterface,\n type DatabaseServiceConfig,\n type DrizzleConfig,\n type SupabaseConfig,\n type SqlConfig,\n type Transaction,\n type DatabaseEvents,\n} from '@plyaz/types/db';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CORE_EVENTS, type CoreDatabaseErrorPayload } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { PackageLogger } from '@plyaz/logger';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'DbService' });\n\n/**\n * Default fields to encrypt per table\n * Contains sensitive PII and financial data that should be encrypted at rest\n *\n * @see docs/db-schemas/dbdiagram_schema.dbml for field definitions\n */\nexport const DEFAULT_ENCRYPTION_FIELDS: Record<string, string[]> = {\n // User PII\n users: ['password_hash', 'phone_number', 'date_of_birth'],\n\n // KYC sensitive data\n 'backoffice.kyc_submissions': ['tax_id', 'address_line1', 'address_line2'],\n\n // Connected accounts OAuth tokens\n connected_accounts: ['access_token_encrypted', 'refresh_token_encrypted', 'wallet_address'],\n\n // Payment payout accounts\n user_payout_accounts: ['provider_account_id', 'account_holder_name'],\n\n // Sessions\n sessions: ['token'],\n};\n\n// Re-export DbServiceConfig from @plyaz/types/core\nexport type { CoreDbServiceConfig } from '@plyaz/types/core';\n\n// Local alias for internal use\nimport type {\n CoreDbServiceConfig as DbServiceConfig,\n CoreDbServiceInstance,\n} from '@plyaz/types/core';\n\n/**\n * Default configuration for DbService\n *\n * **Adapter Selection Guide:**\n *\n * | Adapter | Connection | Auto-Register | RLS | Use Case |\n * |-------------|------------------|---------------|----------|-----------------------------------|\n * | `'sql'` | PostgreSQL URL | ✓ Yes | Bypassed | **Recommended** for backend |\n * | `'supabase'`| Supabase API | ✓ Yes | Enforced | Frontend / RLS-required scenarios |\n * | `'drizzle'` | PostgreSQL URL | ✓ Yes* | Bypassed | Type-safe ORM (with PgTable schemas) |\n *\n * *Drizzle supports dual-mode: uses PgTable schemas if registered, falls back to raw SQL otherwise.\n *\n * **Recommended:** Use `'sql'` adapter for backend services with Supabase PostgreSQL.\n * Direct PostgreSQL connection = best performance, bypasses RLS for full backend access.\n */\n// Database configuration constants\nconst DEFAULT_AUDIT_RETENTION_DAYS = 180; // GDPR/SOX compliance (6 months minimum)\nconst DEFAULT_POOL_SIZE = 10;\n\nconst DEFAULT_CONFIG: Partial<DbServiceConfig> = {\n adapter: 'sql',\n cache: {\n enabled: true,\n provider: 'memory',\n ttl: TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n },\n softDelete: {\n enabled: true,\n field: 'deleted_at',\n excludeTables: [\n 'audit_logs',\n 'audit.audit_logs',\n 'audit.feature_flag_evaluations',\n 'feature_flag_evaluations',\n 'notification_events',\n 'payments_activity',\n 'campaign_analytics',\n 'admin_actions',\n 'backoffice.admin_actions',\n ],\n },\n audit: {\n enabled: true, // Enabled by default for compliance\n retentionDays: DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: ['password_hash', 'api_key_hash', 'token_hash'],\n excludeTables: ['audit_logs', 'audit.audit_logs'], // Don't audit the audit table itself\n schema: 'audit', // Use dedicated audit schema\n usePartitionedTables: true, // Use daily partitioned tables (audit_log_yyyy_mm_dd)\n },\n // NOTE: Encryption requires key from environment or DbService.initialize()\n // Enable via: DbService.initialize({ encryption: { enabled: true, key: process.env.ENCRYPTION_KEY!, fields: DEFAULT_ENCRYPTION_FIELDS } })\n};\n\n/**\n * Complete table registry from database migrations\n * Maps logical table names to their ID columns\n *\n * @see docs/db-schemas/migrations/ for schema definitions\n * @see docs/db-schemas/dbdiagram_schema.dbml for full schema\n */\n/**\n * TABLE_REGISTRY - Custom ID Column and Schema Registry\n *\n * ONLY register tables with:\n * 1. Custom ID columns (anything other than 'id')\n * 2. Custom database schemas (anything other than 'public')\n *\n * Tables with standard 'id' column in 'public' schema do NOT need registration.\n * You can also override ID column and schema per-query using OperationConfig.\n *\n * Schema can be defined in the table key or in the config object (or both):\n * - 'schema.table': { idColumn: 'key' } ← Schema in key only\n * - 'schema.table': { idColumn: 'key', schema: 'schema' } ← Redundant but allowed\n * - 'schema.table': {} ← Empty config, schema in key\n * - 'table': { idColumn: 'key', schema: 'schema' } ← Schema in config only\n *\n * @example\n * ```typescript\n * // Using registry\n * await db.get('feature_flags', 'my-flag-key'); // Uses 'key' column from registry\n *\n * // Per-query override\n * await db.get('custom_table', 'some-key', { idColumn: 'custom_id' });\n *\n * // Schema override\n * await db.get('logs', '123', { schema: 'logging' });\n * ```\n */\nexport const TABLE_REGISTRY: Record<string, { idColumn?: string; schema?: string }> = {\n // Migration 008: Feature Flags (custom ID column 'key')\n feature_flags: { idColumn: 'key' },\n\n // Test Feature Flags (custom ID column 'key')\n test_feature_flags: { idColumn: 'key' },\n\n // Migration 010: Universal Analytics (custom ID column 'user_id')\n user_analytics_summary: { idColumn: 'user_id' },\n};\n\n/**\n * DbService - Singleton Database Connection Manager\n *\n * Provides centralized database connection management for all domains.\n * Uses @plyaz/db under the hood with configurable adapters and extensions.\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 database connection pools or inconsistent state across API routes.\n */\nconst DB_SERVICE_KEY = Symbol.for('plyaz.DbService');\n\nfunction getDbServiceInstance(): DbService | null {\n const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n return globalAny[DB_SERVICE_KEY] ?? null;\n}\n\nfunction setDbServiceInstance(instance: DbService | null): void {\n const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n globalAny[DB_SERVICE_KEY] = instance;\n}\n\nexport class DbService implements CoreDbServiceInstance {\n private databaseService: DatabaseServiceInterface | null = null;\n private namedAdapters: Map<string, DatabaseServiceInterface> = new Map();\n private config: DbServiceConfig | null = null;\n private initialized = false;\n\n private constructor() {}\n\n /**\n * Emits a database error event via CoreEventManager.\n * Called when database operations fail to integrate with global error handling.\n *\n * @param error - The error that occurred\n * @param operation - The operation that failed (e.g., 'transaction', 'query', 'healthCheck')\n * @param table - Optional table name involved in the operation\n * @param query - Optional query string that failed\n * @param recoverable - Whether the error is recoverable (default: false)\n */\n private emitDatabaseError(\n error: unknown,\n operation: string,\n options?: {\n table?: string;\n query?: string;\n recoverable?: boolean;\n }\n ): void {\n const payload: CoreDatabaseErrorPayload = {\n error,\n operation,\n table: options?.table,\n query: options?.query,\n recoverable: options?.recoverable ?? false,\n };\n CoreEventManager.emit(CORE_EVENTS.DATABASE.ERROR, payload);\n }\n\n /**\n * Creates merged event handlers that wrap user-provided handlers.\n * Adds Core-level logging and forwards to user handlers.\n *\n * Note: Unlike StorageService/NotificationService, DB events don't emit\n * to CoreEventManager by default (too verbose). User handlers can emit\n * if needed.\n *\n * @param userHandlers - User-provided event handlers from config\n * @returns Merged handlers with Core logging + user handlers\n */\n private static createMergedEventHandlers(userHandlers?: DatabaseEvents): DatabaseEvents {\n return {\n ...userHandlers,\n\n onAfterWrite: async event => {\n logger.debug('Database write completed', {\n operation: event.operation,\n table: event.table,\n duration: event.duration,\n });\n if (userHandlers?.onAfterWrite) {\n await userHandlers.onAfterWrite(event);\n }\n },\n\n onAfterRead: async event => {\n logger.debug('Database read completed', {\n table: event.table,\n duration: event.duration,\n });\n if (userHandlers?.onAfterRead) {\n await userHandlers.onAfterRead(event);\n }\n },\n };\n }\n\n /**\n * Gets the singleton instance of DbService\n *\n * @returns {DbService} The singleton instance\n */\n static getInstance(): DbService {\n let instance = getDbServiceInstance();\n if (!instance) {\n instance = new DbService();\n setDbServiceInstance(instance);\n }\n return instance;\n }\n\n /**\n * Checks if the database service has been initialized\n *\n * @returns {boolean} True if initialized\n */\n static isInitialized(): boolean {\n return getDbServiceInstance()?.initialized ?? false;\n }\n\n /**\n * Resets the database service by closing connections and clearing the singleton instance\n *\n * @description Properly closes the database connection and clears the singleton.\n * Useful for testing or when you need to reinitialize with different configuration.\n *\n * @example\n * ```typescript\n * await DbService.reset();\n * await DbService.initialize({ adapter: 'sql', ... });\n * ```\n */\n static async reset(): Promise<void> {\n const instance = getDbServiceInstance();\n if (instance) {\n try {\n await instance.databaseService?.close?.();\n } catch {\n // Ignore close errors (pool might already be closed)\n }\n setDbServiceInstance(null);\n }\n }\n\n /**\n * Initializes the database connection\n *\n * @description Sets up the database connection using the provided configuration\n * or environment variables. This method is idempotent - calling it multiple\n * times won't create additional connections.\n *\n * **Environment Variables:**\n * - `DATABASE_URL` - PostgreSQL connection string (for sql/drizzle adapters)\n * - `ENCRYPTION_KEY` - 32-byte encryption key for field encryption (optional)\n * - `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY`, `SUPABASE_ANON_PUBLIC_KEY` - For supabase adapter\n *\n * **Encryption:** If `ENCRYPTION_KEY` env is set, encryption is auto-enabled\n * using `DEFAULT_ENCRYPTION_FIELDS`. Override via config.encryption.\n *\n * @param {DbServiceConfig} [config] - Optional configuration\n * @returns {Promise<DbService>} The initialized DbService instance\n * @throws {DatabasePackageError} When configuration is invalid or connection fails\n *\n * @example\n * ```typescript\n * // Minimal - uses DATABASE_URL env, auto-enables encryption if ENCRYPTION_KEY set\n * await DbService.initialize();\n *\n * // With explicit encryption\n * await DbService.initialize({\n * adapter: 'sql',\n * encryption: {\n * enabled: true,\n * key: 'your-32-byte-encryption-key-here!!',\n * fields: DEFAULT_ENCRYPTION_FIELDS,\n * },\n * });\n *\n * // Or via Core.initialize() with env:\n * await Core.initialize({\n * env: { ENCRYPTION_KEY: '...' },\n * db: { adapter: 'sql' },\n * });\n * ```\n */\n /** Build encryption config from user config */\n private static buildEncryptionConfig(config?: DbServiceConfig): DbServiceConfig['encryption'] {\n const encryption = config?.encryption;\n if (!encryption?.key) return undefined;\n\n return {\n enabled: encryption.enabled ?? true,\n key: encryption.key,\n fields: encryption.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: encryption.algorithm ?? 'aes-256-gcm',\n };\n }\n\n /** Merge user config with defaults */\n private static mergeConfig(config?: DbServiceConfig): DbServiceConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config?.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config?.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config?.audit },\n encryption: DbService.buildEncryptionConfig(config),\n } as DbServiceConfig;\n }\n\n /** Initialize named adapters */\n private async initializeNamedAdapters(mergedConfig: DbServiceConfig): Promise<void> {\n if (!mergedConfig.adapters) return;\n\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = this.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n this.namedAdapters.set(name, namedService);\n }\n }\n\n static async initialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n\n if (instance.initialized) {\n return instance;\n }\n\n const mergedConfig = DbService.mergeConfig(config);\n instance.config = mergedConfig;\n\n const dbConfig = instance.buildDatabaseConfig(mergedConfig);\n instance.databaseService = await createDatabaseService(dbConfig);\n\n await instance.initializeNamedAdapters(mergedConfig);\n\n instance.initialized = true;\n return instance;\n }\n\n /**\n * Builds the DatabaseServiceConfig based on the adapter type\n * @private\n */\n\n /** Builds adapter-specific config based on adapter type */\n private buildAdapterConfig(\n adapter: string,\n config: DbServiceConfig\n ): DrizzleConfig | SupabaseConfig | SqlConfig {\n const builders: Record<string, () => DrizzleConfig | SupabaseConfig | SqlConfig> = {\n drizzle: () => this.buildDrizzleConfig(config),\n supabase: () => this.buildSupabaseConfig(config),\n sql: () => this.buildSqlConfig(config),\n };\n\n const builder = builders[adapter];\n if (!builder) {\n throw new DatabasePackageError(\n `Unsupported adapter type: ${adapter}`,\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n return builder();\n }\n\n /** Builds soft delete extension config */\n private buildSoftDeleteExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['softDelete'] | undefined {\n if (!config.softDelete?.enabled) return undefined;\n return {\n enabled: true,\n field: config.softDelete.field ?? 'deleted_at',\n excludeTables: config.softDelete.excludeTables,\n };\n }\n\n /** Builds cache extension config */\n private buildCacheExtension(config: DbServiceConfig): DatabaseServiceConfig['cache'] | undefined {\n if (!config.cache?.enabled) return undefined;\n return {\n enabled: true,\n ttl: config.cache.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n provider: config.cache.provider ?? 'memory',\n invalidation: config.cache.invalidation ?? 'write',\n };\n }\n\n /** Builds audit extension config */\n private buildAuditExtension(config: DbServiceConfig): DatabaseServiceConfig['audit'] | undefined {\n if (!config.audit?.enabled) return undefined;\n return {\n enabled: true,\n retentionDays: config.audit.retentionDays ?? DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: config.audit.excludeFields,\n excludeTables: config.audit.excludeTables,\n schema: config.audit.schema ?? 'audit',\n usePartitionedTables: config.audit.usePartitionedTables ?? true,\n };\n }\n\n /** Builds encryption extension config */\n private buildEncryptionExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['encryption'] | undefined {\n if (!config.encryption?.enabled || !config.encryption.key) return undefined;\n return {\n enabled: true,\n key: config.encryption.key,\n fields: config.encryption.fields ?? {},\n algorithm: config.encryption.algorithm,\n };\n }\n\n private buildDatabaseConfig(config: DbServiceConfig): DatabaseServiceConfig {\n const adapter = config.adapter ?? 'drizzle';\n\n const dbConfig: DatabaseServiceConfig = {\n adapter: adapter as DatabaseServiceConfig['adapter'],\n config: this.buildAdapterConfig(adapter, config),\n };\n\n // Apply extensions\n const softDelete = this.buildSoftDeleteExtension(config);\n const cache = this.buildCacheExtension(config);\n const audit = this.buildAuditExtension(config);\n const encryption = this.buildEncryptionExtension(config);\n\n if (softDelete) dbConfig.softDelete = softDelete;\n if (cache) dbConfig.cache = cache;\n if (audit) dbConfig.audit = audit;\n if (encryption) dbConfig.encryption = encryption;\n\n // Apply merged event handlers\n const events = DbService.createMergedEventHandlers(config.events);\n if (events) dbConfig.events = events;\n\n return dbConfig;\n }\n\n /**\n * Builds Drizzle adapter configuration\n * @private\n */\n private buildDrizzleConfig(config: DbServiceConfig): DrizzleConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.drizzle?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'Drizzle adapter requires a PostgreSQL connection string. ' +\n 'Provide `drizzle.connectionString` in config or use Core.initialize() with DATABASE_URL in env. ' +\n 'For Supabase, find this in Dashboard > Database > Connection string (URI).',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n poolSize: config.drizzle?.poolSize ?? DEFAULT_POOL_SIZE,\n ssl: config.drizzle?.ssl,\n schema: config.drizzle?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds Supabase adapter configuration\n * @private\n */\n // eslint-disable-next-line complexity\n private buildSupabaseConfig(config: DbServiceConfig): SupabaseConfig {\n // Get Supabase config (Core.initialize() passes env values)\n const supabaseUrl = config.supabase?.supabaseUrl;\n const supabaseServiceKey = config.supabase?.supabaseServiceKey;\n const supabaseAnonKey = config.supabase?.supabaseAnonKey;\n\n if (!supabaseUrl || !supabaseServiceKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseUrl and supabaseServiceKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n if (!supabaseAnonKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseAnonKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_ANON_PUBLIC_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n supabaseUrl,\n supabaseServiceKey,\n supabaseAnonKey,\n schema: config.supabase?.schema ?? 'public',\n tableIdColumns,\n };\n }\n\n /**\n * Builds SQL adapter configuration\n * @private\n */\n private buildSqlConfig(config: DbServiceConfig): SqlConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.sql?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'SQL adapter requires a connection string. ' +\n 'Provide `sql.connectionString` in config or use Core.initialize() with DATABASE_URL in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n dialect: config.sql?.dialect ?? 'postgresql',\n schema: config.sql?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds table ID column mappings from TABLE_REGISTRY\n * @private\n * @returns Record of table names to ID column names\n */\n // eslint-disable-next-line complexity\n private buildTableIdColumns(): Record<string, string> {\n const tableIdColumns: Record<string, string> = {};\n const baseNameConflicts = new Set<string>();\n const baseNameMappings = new Map<string, string>();\n\n // First pass: identify base name conflicts\n // e.g., if we have both 'public.users' and 'backoffice.users',\n // we can't map 'users' → one ID column\n for (const tableName of Object.keys(TABLE_REGISTRY)) {\n if (tableName.includes('.')) {\n const baseName = tableName.split('.').pop()!;\n if (baseNameMappings.has(baseName) || TABLE_REGISTRY[baseName]) {\n baseNameConflicts.add(baseName);\n } else {\n baseNameMappings.set(baseName, tableName);\n }\n }\n }\n\n // Second pass: build ID column mappings\n for (const [tableName, config] of Object.entries(TABLE_REGISTRY)) {\n const idColumn = config.idColumn ?? 'id';\n\n // Only include non-standard ID columns (not 'id')\n if (idColumn === 'id') continue;\n\n // Always map the full table name (with or without schema)\n tableIdColumns[tableName] = idColumn;\n\n // If the table name includes a schema (e.g., 'backoffice.flagged_content'),\n // also map the base name (e.g., 'flagged_content') for convenience\n // unless there's a conflict with another schema's table\n if (!tableName.includes('.')) continue;\n\n const baseName = tableName.split('.').pop()!;\n if (!baseNameConflicts.has(baseName)) {\n tableIdColumns[baseName] = idColumn;\n }\n }\n\n return tableIdColumns;\n }\n\n /**\n * Gets the initialized database service instance\n *\n * @param {string} [adapterName] - Optional named adapter to use instead of default\n * @returns {DatabaseServiceInterface} The database service instance\n * @throws {DatabasePackageError} When database is not initialized or named adapter not found\n */\n getDatabase(adapterName?: string): DatabaseServiceInterface {\n if (adapterName) {\n const namedAdapter = this.namedAdapters.get(adapterName);\n if (!namedAdapter) {\n throw new DatabasePackageError(\n `Named adapter '${adapterName}' not found. Available adapters: ${Array.from(this.namedAdapters.keys()).join(', ')}`,\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return namedAdapter;\n }\n\n if (!this.databaseService) {\n throw new DatabasePackageError(\n 'Database not initialized. Call DbService.initialize() first.',\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return this.databaseService;\n }\n\n /**\n * Gets a named adapter by name\n *\n * @param {string} name - The name of the adapter\n * @returns {DatabaseServiceInterface} The named adapter instance\n * @throws {DatabasePackageError} When adapter not found\n */\n getAdapter(name: string): DatabaseServiceInterface {\n return this.getDatabase(name);\n }\n\n /**\n * Lists all available named adapters\n *\n * @returns {string[]} Array of adapter names\n */\n getAvailableAdapters(): string[] {\n return ['default', ...Array.from(this.namedAdapters.keys())];\n }\n\n /**\n * Executes a database transaction with automatic rollback on failure\n *\n * @template T The return type of the transaction callback\n * @param {Function} callback - Function that receives transaction object\n * @returns {Promise<T>} The result of the transaction callback\n * @throws {DatabasePackageError} When transaction fails\n */\n async transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T> {\n const db = this.getDatabase();\n const result = await db.transaction(callback);\n\n if (!result.success) {\n const errorMessage = result.error?.message ?? 'Transaction failed';\n const error = new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.TRANSACTION_FAILED);\n // Emit database error event for global error handling\n this.emitDatabaseError(error, 'transaction', { recoverable: true });\n throw error;\n }\n\n if (result.value === undefined || result.value === null) {\n const error = new DatabasePackageError(\n 'Transaction returned no value',\n DATABASE_ERROR_CODES.INVALID_RESULT\n );\n this.emitDatabaseError(error, 'transaction', { recoverable: false });\n throw error;\n }\n\n return result.value;\n }\n\n /**\n * Sets audit context for subsequent operations\n *\n * @param context - Audit context (userId, requestId, etc.)\n */\n async setAuditContext(context: {\n userId?: string;\n requestId?: string;\n ipAddress?: string;\n userAgent?: string;\n }): Promise<void> {\n const db = this.getDatabase();\n await db.setAuditContext(context);\n }\n\n /**\n * Performs a health check on the database connection\n *\n * @returns Health check result\n */\n async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n try {\n const db = this.getDatabase();\n const result = await db.healthCheck();\n\n if (result.success && result.value) {\n return {\n isHealthy: result.value.isHealthy,\n responseTime: result.value.responseTime,\n };\n }\n\n // Health check failed - emit error event\n const errorMessage = result.error?.message ?? 'Health check failed';\n this.emitDatabaseError(\n new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.CONNECTION_ERROR),\n 'healthCheck',\n { recoverable: true }\n );\n\n return {\n isHealthy: false,\n error: errorMessage,\n };\n } catch (error) {\n // Exception during health check - emit error event\n this.emitDatabaseError(error, 'healthCheck', { recoverable: true });\n\n return {\n isHealthy: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Gets the table registry with all known tables and their ID columns\n *\n * @returns The complete table registry\n */\n static getTableRegistry(): typeof TABLE_REGISTRY {\n return TABLE_REGISTRY;\n }\n\n /**\n * Gets ID column for a specific table\n *\n * @param tableName - Name of the table\n * @returns ID column name or 'id' as default\n */\n static getTableIdColumn(tableName: string): string {\n return TABLE_REGISTRY[tableName]?.idColumn ?? 'id';\n }\n\n /**\n * Reinitializes the database connection with new config\n *\n * @param {DbServiceConfig} [config] - New configuration\n * @returns {Promise<DbService>} The reinitialized DbService instance\n */\n static async reinitialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n await instance.close();\n instance.initialized = false;\n return DbService.initialize(config);\n }\n\n /**\n * Closes the database connection and cleans up resources\n */\n async close(): Promise<void> {\n this.databaseService = null;\n this.initialized = false;\n this.config = null;\n }\n\n /**\n * Gets the current configuration\n *\n * @returns {DbServiceConfig | null} Current config or null if not initialized\n */\n getConfig(): DbServiceConfig | null {\n return this.config;\n }\n\n /**\n * Gets the current adapter type\n *\n * @returns The adapter type or null if not initialized\n */\n getAdapterType(): 'drizzle' | 'supabase' | 'sql' | null {\n return this.config?.adapter ?? null;\n }\n\n /**\n * Creates a dedicated database service instance (NOT the singleton)\n *\n * Use this when you need an isolated database connection with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param config - Database service configuration\n * @returns Promise that resolves to a new dedicated DbService instance\n *\n * @example\n * ```typescript\n * // Create a dedicated instance for analytics database\n * const analyticsDb = await DbService.createInstance({\n * adapter: 'sql',\n * sql: { connectionString: process.env.ANALYTICS_DB_URL },\n * cache: { enabled: false }, // No caching for analytics\n * });\n *\n * // This instance is independent from DbService.getInstance()\n * const data = await analyticsDb.getDatabase().list('events');\n *\n * // Clean up when done\n * await analyticsDb.close();\n * ```\n */\n // eslint-disable-next-line complexity\n static async createInstance(config: DbServiceConfig): Promise<DbService> {\n // Create a new instance (not the singleton)\n const dedicatedInstance = new DbService();\n\n // Build encryption config if key provided\n const encryptionKey = config.encryption?.key;\n const encryptionConfig = encryptionKey\n ? {\n enabled: config.encryption?.enabled ?? true,\n key: encryptionKey,\n fields: config.encryption?.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: config.encryption?.algorithm ?? ('aes-256-gcm' as const),\n }\n : undefined;\n\n const mergedConfig = {\n ...DEFAULT_CONFIG,\n ...config,\n // Deep merge extensions\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config.audit },\n // Encryption only if key is available\n encryption: encryptionConfig,\n } as DbServiceConfig;\n\n dedicatedInstance.config = mergedConfig;\n\n // Build adapter configuration based on adapter type\n const dbConfig = dedicatedInstance.buildDatabaseConfig(mergedConfig);\n\n dedicatedInstance.databaseService = await createDatabaseService(dbConfig);\n\n // Initialize named adapters if configured\n if (mergedConfig.adapters) {\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = dedicatedInstance.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n dedicatedInstance.namedAdapters.set(name, namedService);\n }\n }\n\n dedicatedInstance.initialized = true;\n\n return dedicatedInstance;\n }\n}\n\n/** Type alias for DbService instance (use for type-only imports to avoid bundling) */\nexport type DbServiceInstance = DbService;\n","/**\n * NestJS Streaming Controller\n *\n * SSE streaming controller for NestJS applications.\n * Provides the /events/stream endpoint for real-time updates.\n *\n * @example\n * ```typescript\n * // Automatically included when using StreamingModule\n * @Module({\n * imports: [StreamingModule.forRoot()],\n * })\n * export class AppModule {}\n *\n * // Or import directly for custom routing\n * @Module({\n * controllers: [StreamingController],\n * providers: [{ provide: STREAM_SERVER, useValue: streamServer }],\n * })\n * export class CustomStreamingModule {}\n * ```\n */\n\nimport { Controller, Get, Req, Res, Inject } from '@nestjs/common';\nimport type { Request, Response } from 'express';\nimport type { StreamServer } from '../../events/streaming/StreamServer';\nimport type { NestJSHandler } from '../../events/streaming/frameworks';\n\n/**\n * Injection token for StreamServer\n */\nexport const STREAM_SERVER = Symbol('STREAM_SERVER');\n\n/**\n * StreamingController - NestJS SSE endpoint controller\n *\n * Handles GET /events/stream requests using the StreamServer's NestJS adapter.\n */\n@Controller('events')\nexport class StreamingController {\n constructor(\n @Inject(STREAM_SERVER)\n private readonly streamServer: StreamServer\n ) {}\n\n /**\n * SSE streaming endpoint\n *\n * Clients connect to this endpoint to receive real-time updates.\n * Supports channel subscription via query params: ?channels=uploads,system\n *\n * @param req - NestJS/Express request\n * @param res - NestJS/Express response\n */\n @Get('stream')\n async stream(@Req() req: Request, @Res() res: Response): Promise<void> {\n const handler = this.streamServer.getHandler<NestJSHandler>('nestjs');\n await handler(req, res);\n }\n}\n","/**\n * NestJS Module for @plyaz/core\n *\n * Provides dependency injection integration for NestJS applications.\n * Supports optional streaming integration when streaming config is provided.\n *\n * @example\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/nestjs';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({\n * envPath: '.env',\n * db: { adapter: 'sql' },\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example With streaming\n * ```typescript\n * CoreModule.forRoot({\n * db: { adapter: 'sql' },\n * streaming: {\n * enabled: true,\n * server: { heartbeatInterval: 30000 },\n * },\n * })\n * ```\n *\n * @example Async configuration\n * ```typescript\n * CoreModule.forRootAsync({\n * imports: [ConfigModule],\n * useFactory: (config: ConfigService) => ({\n * db: {\n * adapter: 'sql',\n * sql: { connectionString: config.get('DATABASE_URL') },\n * },\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n\nimport { Global, type DynamicModule, type Provider, type Type } from '@nestjs/common';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\nimport { DbService } from '../../services/DbService';\nimport type { CoreNestJsCoreModuleAsyncOptions } from '@plyaz/types/core';\nimport { STREAM_SERVER, StreamingController } from './StreamingController';\nimport type { StreamServer } from '../../events/streaming/StreamServer';\n\n/**\n * Injection tokens for Core services\n */\nexport const CORE_OPTIONS = Symbol('CORE_OPTIONS');\nexport const DB_SERVICE = Symbol('DB_SERVICE');\n\n/**\n * Async configuration options for CoreModule\n * Uses CoreInitOptions for type safety with Core.initialize()\n */\ntype CoreModuleAsyncOptions = CoreNestJsCoreModuleAsyncOptions;\n\n/**\n * CoreModule - NestJS DI module for @plyaz/core\n *\n * Features:\n * - Database service injection\n * - Optional streaming integration\n * - Full Core.initialize() orchestration\n * - Global module - providers available throughout the app\n */\n@Global()\nexport class CoreModule {\n /**\n * Register CoreModule with static configuration\n */\n static forRoot(options: CoreInitOptions = {}): DynamicModule {\n const streamingEnabled = options.streaming?.enabled === true;\n const controllers: Type[] = streamingEnabled ? [StreamingController] : [];\n // Use symbols for exports to avoid private constructor type issues\n const moduleExports: symbol[] = [DB_SERVICE, CORE_OPTIONS];\n\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useValue: options,\n },\n {\n provide: DbService,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n {\n provide: DB_SERVICE,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n ];\n\n // Add streaming provider if enabled\n if (streamingEnabled) {\n providers.push({\n provide: STREAM_SERVER,\n useFactory: async (): Promise<StreamServer | null> => {\n await Core.initialize(options);\n return Core.streamServer;\n },\n });\n moduleExports.push(STREAM_SERVER);\n }\n\n return {\n module: CoreModule,\n global: true,\n controllers,\n providers,\n exports: moduleExports,\n };\n }\n\n /**\n * Register CoreModule with async configuration\n */\n static forRootAsync(options: CoreModuleAsyncOptions): DynamicModule {\n // Note: For async, we can't know if streaming is enabled at module definition time\n // Users should use StreamingModule.forRootAsync() for async streaming config\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n },\n {\n provide: DbService,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n {\n provide: DB_SERVICE,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n // Add streaming provider for async (will be null if not configured)\n {\n provide: STREAM_SERVER,\n useFactory: async (coreOptions: CoreInitOptions): Promise<StreamServer | null> => {\n await Core.initialize(coreOptions);\n return Core.streamServer;\n },\n inject: [CORE_OPTIONS],\n },\n ];\n\n return {\n module: CoreModule,\n global: true,\n imports: options.imports ?? [],\n providers,\n exports: [DB_SERVICE, CORE_OPTIONS, STREAM_SERVER],\n };\n }\n}\n","/**\n * NestJS Streaming Module\n *\n * Provides SSE streaming integration for NestJS applications.\n * Can be used standalone or integrated with CoreModule.\n *\n * @example Standalone usage\n * ```typescript\n * import { StreamingModule } from '@plyaz/core/nestjs';\n * import { FilesStreamEndpoint, SystemStreamEndpoint } from '@plyaz/core/streaming';\n *\n * @Module({\n * imports: [\n * StreamingModule.forRoot({\n * server: { heartbeatInterval: 30000 },\n * endpoints: [\n * { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n * { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example Async configuration\n * ```typescript\n * StreamingModule.forRootAsync({\n * imports: [ConfigModule],\n * useFactory: (config: ConfigService) => ({\n * server: {\n * heartbeatInterval: config.get('STREAM_HEARTBEAT_INTERVAL'),\n * },\n * endpoints: [...],\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n\nimport type {\n DynamicModule,\n Provider,\n OnModuleDestroy,\n InjectionToken,\n OptionalFactoryDependency,\n Type,\n ForwardReference,\n} from '@nestjs/common';\nimport { StreamServer, StreamRegistry } from '../../events/streaming';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\nimport type { StreamingModuleConfig, StreamingModuleAsyncOptions } from '@plyaz/types/core';\nimport { StreamingController, STREAM_SERVER } from './StreamingController';\n\n/**\n * StreamingModule - NestJS streaming integration\n *\n * Provides:\n * - StreamServer instance with SSE transport\n * - StreamingController for /events/stream endpoint\n * - StreamRegistry initialization with endpoints\n * - Automatic cleanup on module destroy\n */\nexport class StreamingModule implements OnModuleDestroy {\n private static streamServer: StreamServer | null = null;\n\n async onModuleDestroy(): Promise<void> {\n if (StreamingModule.streamServer) {\n StreamingModule.streamServer.dispose();\n StreamingModule.streamServer = null;\n }\n StreamRegistry.dispose();\n }\n\n /**\n * Register StreamingModule with static configuration\n */\n static forRoot(config: StreamingModuleConfig = {}): DynamicModule {\n const includeController = config.includeController !== false;\n\n const providers: Provider[] = [\n {\n provide: STREAM_SERVER,\n useFactory: async (): Promise<StreamServer> => {\n return StreamingModule.initializeStreamServer(config);\n },\n },\n ];\n\n return {\n module: StreamingModule,\n global: config.isGlobal !== false,\n controllers: includeController ? [StreamingController] : [],\n providers,\n exports: [STREAM_SERVER],\n };\n }\n\n /**\n * Register StreamingModule with async configuration\n */\n static forRootAsync(options: StreamingModuleAsyncOptions): DynamicModule {\n const includeController = options.includeController !== false;\n\n const configProvider: Provider = {\n provide: 'STREAMING_MODULE_CONFIG',\n useFactory: options.useFactory,\n inject: (options.inject ?? []) as (InjectionToken | OptionalFactoryDependency)[],\n };\n\n const streamServerProvider: Provider = {\n provide: STREAM_SERVER,\n useFactory: async (config: StreamingModuleConfig): Promise<StreamServer> => {\n return StreamingModule.initializeStreamServer(config);\n },\n inject: ['STREAMING_MODULE_CONFIG'],\n };\n\n return {\n module: StreamingModule,\n global: options.isGlobal !== false,\n imports: (options.imports ?? []) as (\n | Type\n | DynamicModule\n | Promise<DynamicModule>\n | ForwardReference\n )[],\n controllers: includeController ? [StreamingController] : [],\n providers: [configProvider, streamServerProvider],\n exports: [STREAM_SERVER],\n };\n }\n\n /**\n * Initialize StreamServer with configuration\n */\n // eslint-disable-next-line complexity\n private static async initializeStreamServer(\n config: StreamingModuleConfig\n ): Promise<StreamServer> {\n // Dispose existing server if any\n if (StreamingModule.streamServer) {\n StreamingModule.streamServer.dispose();\n }\n\n // Create stream server\n const builder = StreamServer.create().withSSE({\n heartbeatInterval:\n config.server?.broadcaster?.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS,\n });\n\n // Set default channels\n const defaultChannels = config.server?.defaultChannels ?? STREAMING_DEFAULTS.DEFAULT_CHANNELS;\n builder.withDefaultChannels(defaultChannels as never[]);\n\n const streamServer = builder.build();\n streamServer.initialize();\n StreamingModule.streamServer = streamServer;\n\n // Initialize endpoints if provided\n if (config.endpoints?.length) {\n await StreamRegistry.initialize({\n broadcaster: streamServer.getBroadcaster(),\n endpoints: config.endpoints,\n });\n }\n\n return streamServer;\n }\n\n /**\n * Get the current StreamServer instance (for testing/debugging)\n */\n static getStreamServer(): StreamServer | null {\n return StreamingModule.streamServer;\n }\n}\n","/**\n * NestJS integration exports\n */\nimport type { INestApplication } from '@nestjs/common';\nimport { Core } from '../CoreInitializer';\nimport {\n configureNestApp as configureNestAppInternal,\n getDefaultNestJsConfig,\n type ConfigureNestAppResult,\n} from './configureNestApp';\n\nexport { CoreModule, CORE_OPTIONS, DB_SERVICE } from './CoreModule';\nexport { StreamingModule } from './StreamingModule';\nexport { StreamingController, STREAM_SERVER } from './StreamingController';\nexport { getDefaultNestJsConfig, type ConfigureNestAppResult };\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n * Uses the options passed to CoreModule.forRoot() automatically.\n *\n * @param app - NestJS application instance\n * @returns Configuration result with enabled/skipped features\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n *\n * const app = await NestFactory.create(AppModule);\n * const result = await configureNestApp(app);\n * console.log('Enabled:', result.enabled);\n * ```\n */\nexport async function configureNestApp(app: INestApplication): Promise<ConfigureNestAppResult> {\n return configureNestAppInternal(app, Core.initOptions);\n}\n"]}
|