@burdenoff/be-sdk 2026.514.2 → 2026.516.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/index.d.ts +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-FT74HIIG.js → chunk-24VR7PF3.js} +2 -2
- package/dist/{chunk-FT74HIIG.js.map → chunk-24VR7PF3.js.map} +1 -1
- package/dist/{chunk-Q4HKXQVD.js → chunk-462GJL5K.js} +3 -3
- package/dist/{chunk-Q4HKXQVD.js.map → chunk-462GJL5K.js.map} +1 -1
- package/dist/{chunk-S74C6CEN.js → chunk-Q6N74R6S.js} +61 -68
- package/dist/chunk-Q6N74R6S.js.map +1 -0
- package/dist/{chunk-D35GTG7Y.js → chunk-SNW4BLF2.js} +3 -3
- package/dist/{chunk-D35GTG7Y.js.map → chunk-SNW4BLF2.js.map} +1 -1
- package/dist/{chunk-IX5QCHWE.js → chunk-U455UF4O.js} +3 -3
- package/dist/{chunk-IX5QCHWE.js.map → chunk-U455UF4O.js.map} +1 -1
- package/dist/export/index.js +3 -3
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/{index-C1ojTQq0.d.ts → index-B6IwtUb1.d.ts} +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -5
- package/dist/init/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-S74C6CEN.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init/index.ts","../src/event-queue/stream-manager.ts"],"names":["StreamManager","config","publisher","isConnected","autoCreateDefaultStreams","defaultRetention","defaultStorage","defaultMaxAge","defaultMaxBytes","defaultDuplicateWindow","connect","envPrefix","layer","toUpperCase","natsUrl","process","env","publisherConfig","type","url","user","natsUser","password","natsPassword","token","natsToken","creds","natsCreds","credsFile","natsCredsFile","name","maxReconnectAttempts","reconnectTimeWait","EventQueueFactory","createPublisher","logger","info","ensureDefaultStreams","disconnect","getIsConnected","defaultStreams","DEFAULT_LAYER_STREAMS","results","streamDef","result","ensureStream","subjects","description","push","streamConfig","Error","fullConfig","retention","storage","maxAge","maxBytes","duplicateWindow","maxConsumers","maxMsgs","created","existed","error","errorMessage","message","String","includes","ensureStreams","streams","stream","getDefaultStreamsForLayer","fromEnv","sdkState","isInitialized","initializeBurdenoffSDK","warn","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","prisma","initializeDatabase","valkey","initializeCache","nats","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","getSDKState","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","eventQueue","natsConfig","connectionUrl","Array","isArray","servers","join","QueueType","effectiveUser","effectivePass","NATS","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","streamManager","filter","r","length","errors"],"mappings":"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","file":"chunk-Q4HKXQVD.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { StreamManager } from '../event-queue/stream-manager.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (NATS)\n * 5. Graph Sync (NATS-based — NebulaGraph writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional)\n const nats = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publishes to NATS, never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit NATS events\n // and wspace-graph-svc owns the sole NebulaGraph connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n nats,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (NATS)\n */\nasync function initializeEventQueue(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.eventQueue?.nats) {\n logger.info('[SDK Init] Event queue not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing NATS event queue...');\n\n // Support both 'url' and 'servers' fields for flexibility\n const natsConfig = config.eventQueue.nats;\n let connectionUrl: string | undefined;\n if (natsConfig.url) {\n connectionUrl = natsConfig.url;\n } else if (Array.isArray(natsConfig.servers)) {\n connectionUrl = natsConfig.servers.join(',');\n } else {\n connectionUrl = natsConfig.servers;\n }\n\n if (!connectionUrl) {\n logger.warn('[SDK Init] NATS configuration requires either \"url\" or \"servers\" field');\n return undefined;\n }\n\n logger.info('[SDK Init] NATS event queue configuration validated', {\n url: connectionUrl,\n maxReconnectAttempts: natsConfig.maxReconnectAttempts ?? 10,\n reconnectTimeWait: natsConfig.reconnectTimeWait ?? 2000,\n });\n\n // Create and connect the event publisher\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const { QueueType } = await import('../event-queue/types/config.js');\n\n // Auth is passed as separate ConnectionOptions. The bun-bundled `nats`\n // 2.29.x client mis-parses URL-embedded credentials, so URLs must stay\n // credential-free. Synadia/NATS .creds auth takes precedence downstream\n // over user/password/token when provided.\n const effectiveUser = natsConfig.user ?? process.env['NATS_USER'];\n const effectivePass = natsConfig.password ?? process.env['NATS_PASSWORD'];\n\n const publisher = EventQueueFactory.createPublisher({\n type: QueueType.NATS,\n url: connectionUrl,\n user: effectiveUser,\n password: effectivePass,\n token: natsConfig.token,\n creds: natsConfig.creds ?? process.env['NATS_CREDS'],\n credsFile: natsConfig.credsFile ?? process.env['NATS_CREDS_FILE'],\n name: config.layer?.serviceName || config.app?.serviceName || 'sdk-publisher',\n maxReconnectAttempts: natsConfig.maxReconnectAttempts ?? -1,\n reconnectTimeWait: natsConfig.reconnectTimeWait ?? 2000,\n });\n\n await publisher.connect();\n\n logger.info('[SDK Init] NATS event publisher connected', {\n url: connectionUrl,\n serviceName: config.layer?.serviceName || config.app?.serviceName,\n });\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect NATS event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (NATS publisher side).\n *\n * Services publish entity events to NATS; the `wspace-graph-svc` consumer\n * (and only it) persists them into NebulaGraph via its Python sidecar. This\n * SDK function does no DB work — it just validates that the publisher-side\n * config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific NATS streams\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n\n logger.info('[SDK Init] Initializing layer streams...', {\n layer: config.layer.type,\n });\n\n try {\n const streamManager = new StreamManager({\n layer: config.layer.type,\n autoCreateDefaultStreams: true,\n });\n\n await streamManager.connect();\n\n const results = await streamManager.ensureDefaultStreams();\n const created = results.filter((r) => r.created).length;\n const existed = results.filter((r) => r.existed).length;\n const errors = results.filter((r) => r.error).length;\n\n logger.info('[SDK Init] Layer streams initialized', {\n layer: config.layer.type,\n created,\n existed,\n errors,\n });\n\n // Disconnect stream manager (we only needed it for setup)\n await streamManager.disconnect();\n } catch (error) {\n logger.warn('[SDK Init] Failed to initialize layer streams (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n });\n // Don't throw - stream creation failure shouldn't block SDK initialization\n }\n}\n\n// Export types\nexport type * from './types.js';\n","/**\n * NATS Stream Manager\n *\n * Provides automatic stream creation and management for layer-aware\n * NATS JetStream configuration.\n *\n * @module event-queue/stream-manager\n * @category EventQueue\n *\n * @example\n * ```typescript\n * import { StreamManager } from '@burdenoff/be-sdk/event-queue';\n *\n * const manager = new StreamManager({\n * layer: 'wspace',\n * natsUrl: 'nats://localhost:4222',\n * });\n *\n * // Ensure all default streams exist\n * await manager.ensureDefaultStreams();\n *\n * // Create custom stream\n * await manager.ensureStream({\n * name: 'CUSTOM_EVENTS',\n * subjects: ['custom.>'],\n * });\n * ```\n */\n\nimport { logger } from '../logger/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport { DEFAULT_LAYER_STREAMS } from '../types/layer.js';\nimport type { StreamConfig } from './types/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport type { PublisherConfig } from './types/config.js';\n\n/**\n * Stream manager configuration\n */\nexport interface StreamManagerConfig {\n /**\n * Layer for default stream configuration\n */\n layer: ServiceLayer;\n\n /**\n * NATS server URL\n * @default From environment or layer defaults\n */\n natsUrl?: string;\n\n /**\n * NATS username for authentication\n */\n natsUser?: string;\n\n /**\n * NATS password for authentication\n */\n natsPassword?: string;\n\n /**\n * NATS token for authentication\n */\n natsToken?: string;\n\n /**\n * NATS credentials file contents (JWT + NKEY seed)\n */\n natsCreds?: string;\n\n /**\n * Path to a NATS credentials file\n */\n natsCredsFile?: string;\n\n /**\n * Auto-create default streams on connect\n * @default true\n */\n autoCreateDefaultStreams?: boolean;\n\n /**\n * Default retention policy for streams\n * @default 'limits'\n */\n defaultRetention?: 'limits' | 'interest' | 'workqueue';\n\n /**\n * Default storage type for streams\n * @default 'file'\n */\n defaultStorage?: 'file' | 'memory';\n\n /**\n * Default max age for messages (in nanoseconds)\n * @default 86400000000000 (24 hours)\n */\n defaultMaxAge?: number;\n\n /**\n * Default max bytes per stream\n * @default -1 (unlimited)\n */\n defaultMaxBytes?: number;\n\n /**\n * Default duplicate window (in nanoseconds)\n * @default 120000000000 (2 minutes)\n */\n defaultDuplicateWindow?: number;\n}\n\n/**\n * Stream creation result\n */\nexport interface StreamCreationResult {\n name: string;\n created: boolean;\n existed: boolean;\n error?: string;\n}\n\n/**\n * Stream Manager for NATS JetStream\n */\nexport class StreamManager {\n private config: StreamManagerConfig;\n private publisher: IEventPublisher | null = null;\n private isConnected = false;\n\n constructor(config: StreamManagerConfig) {\n this.config = {\n autoCreateDefaultStreams: true,\n defaultRetention: 'limits',\n defaultStorage: 'file',\n defaultMaxAge: 86400000000000, // 24 hours in nanoseconds\n defaultMaxBytes: -1,\n defaultDuplicateWindow: 120000000000, // 2 minutes in nanoseconds\n ...config,\n };\n }\n\n /**\n * Connect to NATS and optionally create default streams\n */\n async connect(): Promise<void> {\n if (this.isConnected && this.publisher) {\n return;\n }\n\n const envPrefix = this.config.layer.toUpperCase();\n const natsUrl =\n this.config.natsUrl || process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || 'nats://localhost:4222';\n\n const publisherConfig: PublisherConfig = {\n type: 'nats',\n url: natsUrl,\n user: this.config.natsUser || process.env['NATS_USER'],\n password: this.config.natsPassword || process.env['NATS_PASSWORD'],\n token: this.config.natsToken || process.env['NATS_TOKEN'],\n creds: this.config.natsCreds || process.env['NATS_CREDS'],\n credsFile: this.config.natsCredsFile || process.env['NATS_CREDS_FILE'],\n name: `stream-manager-${this.config.layer}`,\n maxReconnectAttempts: 10,\n reconnectTimeWait: 2000,\n };\n\n this.publisher = EventQueueFactory.createPublisher(publisherConfig);\n await this.publisher.connect();\n this.isConnected = true;\n\n logger.info('[StreamManager] Connected to NATS', {\n layer: this.config.layer,\n url: natsUrl,\n });\n\n // Auto-create default streams if configured\n if (this.config.autoCreateDefaultStreams) {\n await this.ensureDefaultStreams();\n }\n }\n\n /**\n * Disconnect from NATS\n */\n async disconnect(): Promise<void> {\n if (this.publisher) {\n await this.publisher.disconnect();\n this.publisher = null;\n this.isConnected = false;\n\n logger.info('[StreamManager] Disconnected from NATS', {\n layer: this.config.layer,\n });\n }\n }\n\n /**\n * Check if connected\n */\n getIsConnected(): boolean {\n return this.isConnected && (this.publisher?.isConnected() ?? false);\n }\n\n /**\n * Ensure default streams for the layer exist\n */\n async ensureDefaultStreams(): Promise<StreamCreationResult[]> {\n const defaultStreams = DEFAULT_LAYER_STREAMS[this.config.layer];\n const results: StreamCreationResult[] = [];\n\n for (const streamDef of defaultStreams) {\n const result = await this.ensureStream({\n name: streamDef.name,\n subjects: streamDef.subjects,\n description: streamDef.description,\n });\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Ensure a stream exists with the given configuration\n */\n async ensureStream(\n streamConfig: Partial<StreamConfig> & { name: string; subjects: string[] }\n ): Promise<StreamCreationResult> {\n if (!this.publisher) {\n throw new Error('[StreamManager] Not connected to NATS');\n }\n\n const fullConfig: StreamConfig = {\n name: streamConfig.name,\n subjects: streamConfig.subjects,\n retention: streamConfig.retention || this.config.defaultRetention,\n storage: streamConfig.storage || this.config.defaultStorage,\n maxAge: streamConfig.maxAge || this.config.defaultMaxAge,\n maxBytes: streamConfig.maxBytes || this.config.defaultMaxBytes,\n duplicateWindow: streamConfig.duplicateWindow || this.config.defaultDuplicateWindow,\n maxConsumers: streamConfig.maxConsumers,\n maxMsgs: streamConfig.maxMsgs,\n description: streamConfig.description,\n };\n\n try {\n await this.publisher.ensureStream(fullConfig);\n\n logger.info('[StreamManager] Stream ensured', {\n name: fullConfig.name,\n subjects: fullConfig.subjects,\n });\n\n return {\n name: fullConfig.name,\n created: true,\n existed: false,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Check if error is because stream already exists\n if (errorMessage.includes('already exists') || errorMessage.includes('stream not found')) {\n return {\n name: fullConfig.name,\n created: false,\n existed: true,\n };\n }\n\n logger.error('[StreamManager] Failed to ensure stream', {\n name: fullConfig.name,\n error: errorMessage,\n });\n\n return {\n name: fullConfig.name,\n created: false,\n existed: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Ensure multiple streams exist\n */\n async ensureStreams(\n streams: Array<Partial<StreamConfig> & { name: string; subjects: string[] }>\n ): Promise<StreamCreationResult[]> {\n const results: StreamCreationResult[] = [];\n\n for (const stream of streams) {\n const result = await this.ensureStream(stream);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Get default streams configuration for a layer\n */\n static getDefaultStreamsForLayer(\n layer: ServiceLayer\n ): Array<{ name: string; subjects: string[]; description?: string }> {\n return DEFAULT_LAYER_STREAMS[layer];\n }\n\n /**\n * Create stream manager from environment variables\n */\n static fromEnv(): StreamManager {\n const layer = (process.env['SERVICE_LAYER'] as ServiceLayer) || 'wspace';\n\n if (layer !== 'wspace' && layer !== 'global') {\n throw new Error(`[StreamManager] Invalid SERVICE_LAYER: ${layer}. Expected 'wspace' or 'global'`);\n }\n\n return new StreamManager({\n layer,\n natsUrl: process.env['NATS_URL'],\n natsUser: process.env['NATS_USER'],\n natsPassword: process.env['NATS_PASSWORD'],\n natsToken: process.env['NATS_TOKEN'],\n natsCreds: process.env['NATS_CREDS'],\n natsCredsFile: process.env['NATS_CREDS_FILE'],\n autoCreateDefaultStreams: process.env['STREAM_MANAGER_AUTO_CREATE'] !== 'false',\n });\n }\n}\n\n/**\n * Create stream manager instance\n */\nexport function createStreamManager(config: StreamManagerConfig): StreamManager {\n return new StreamManager(config);\n}\n\n/**\n * Create stream manager from environment and connect\n */\nexport async function createAndConnectStreamManager(): Promise<StreamManager> {\n const manager = StreamManager.fromEnv();\n await manager.connect();\n return manager;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/init/index.ts","../src/event-queue/stream-manager.ts"],"names":["StreamManager","config","publisher","isConnected","autoCreateDefaultStreams","defaultRetention","defaultStorage","defaultMaxAge","defaultMaxBytes","defaultDuplicateWindow","connect","envPrefix","layer","toUpperCase","natsUrl","process","env","publisherConfig","type","url","user","natsUser","password","natsPassword","token","natsToken","creds","natsCreds","credsFile","natsCredsFile","name","maxReconnectAttempts","reconnectTimeWait","EventQueueFactory","createPublisher","logger","info","ensureDefaultStreams","disconnect","getIsConnected","defaultStreams","DEFAULT_LAYER_STREAMS","results","streamDef","result","ensureStream","subjects","description","push","streamConfig","Error","fullConfig","retention","storage","maxAge","maxBytes","duplicateWindow","maxConsumers","maxMsgs","created","existed","error","errorMessage","message","String","includes","ensureStreams","streams","stream","getDefaultStreamsForLayer","fromEnv","sdkState","isInitialized","initializeBurdenoffSDK","warn","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","prisma","initializeDatabase","valkey","initializeCache","nats","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","getSDKState","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","eventQueue","natsConfig","connectionUrl","Array","isArray","servers","join","QueueType","effectiveUser","effectivePass","NATS","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","streamManager","filter","r","length","errors"],"mappings":"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","file":"chunk-462GJL5K.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { StreamManager } from '../event-queue/stream-manager.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (NATS)\n * 5. Graph Sync (NATS-based — NebulaGraph writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional)\n const nats = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publishes to NATS, never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit NATS events\n // and wspace-graph-svc owns the sole NebulaGraph connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n nats,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (NATS)\n */\nasync function initializeEventQueue(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.eventQueue?.nats) {\n logger.info('[SDK Init] Event queue not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing NATS event queue...');\n\n // Support both 'url' and 'servers' fields for flexibility\n const natsConfig = config.eventQueue.nats;\n let connectionUrl: string | undefined;\n if (natsConfig.url) {\n connectionUrl = natsConfig.url;\n } else if (Array.isArray(natsConfig.servers)) {\n connectionUrl = natsConfig.servers.join(',');\n } else {\n connectionUrl = natsConfig.servers;\n }\n\n if (!connectionUrl) {\n logger.warn('[SDK Init] NATS configuration requires either \"url\" or \"servers\" field');\n return undefined;\n }\n\n logger.info('[SDK Init] NATS event queue configuration validated', {\n url: connectionUrl,\n maxReconnectAttempts: natsConfig.maxReconnectAttempts ?? 10,\n reconnectTimeWait: natsConfig.reconnectTimeWait ?? 2000,\n });\n\n // Create and connect the event publisher\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const { QueueType } = await import('../event-queue/types/config.js');\n\n // Auth is passed as separate ConnectionOptions. The bun-bundled `nats`\n // 2.29.x client mis-parses URL-embedded credentials, so URLs must stay\n // credential-free. Synadia/NATS .creds auth takes precedence downstream\n // over user/password/token when provided.\n const effectiveUser = natsConfig.user ?? process.env['NATS_USER'];\n const effectivePass = natsConfig.password ?? process.env['NATS_PASSWORD'];\n\n const publisher = EventQueueFactory.createPublisher({\n type: QueueType.NATS,\n url: connectionUrl,\n user: effectiveUser,\n password: effectivePass,\n token: natsConfig.token,\n creds: natsConfig.creds ?? process.env['NATS_CREDS'],\n credsFile: natsConfig.credsFile ?? process.env['NATS_CREDS_FILE'],\n name: config.layer?.serviceName || config.app?.serviceName || 'sdk-publisher',\n maxReconnectAttempts: natsConfig.maxReconnectAttempts ?? -1,\n reconnectTimeWait: natsConfig.reconnectTimeWait ?? 2000,\n });\n\n await publisher.connect();\n\n logger.info('[SDK Init] NATS event publisher connected', {\n url: connectionUrl,\n serviceName: config.layer?.serviceName || config.app?.serviceName,\n });\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect NATS event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (NATS publisher side).\n *\n * Services publish entity events to NATS; the `wspace-graph-svc` consumer\n * (and only it) persists them into NebulaGraph via its Python sidecar. This\n * SDK function does no DB work — it just validates that the publisher-side\n * config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific NATS streams\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n\n logger.info('[SDK Init] Initializing layer streams...', {\n layer: config.layer.type,\n });\n\n try {\n const streamManager = new StreamManager({\n layer: config.layer.type,\n autoCreateDefaultStreams: true,\n });\n\n await streamManager.connect();\n\n const results = await streamManager.ensureDefaultStreams();\n const created = results.filter((r) => r.created).length;\n const existed = results.filter((r) => r.existed).length;\n const errors = results.filter((r) => r.error).length;\n\n logger.info('[SDK Init] Layer streams initialized', {\n layer: config.layer.type,\n created,\n existed,\n errors,\n });\n\n // Disconnect stream manager (we only needed it for setup)\n await streamManager.disconnect();\n } catch (error) {\n logger.warn('[SDK Init] Failed to initialize layer streams (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n });\n // Don't throw - stream creation failure shouldn't block SDK initialization\n }\n}\n\n// Export types\nexport type * from './types.js';\n","/**\n * NATS Stream Manager\n *\n * Provides automatic stream creation and management for layer-aware\n * NATS JetStream configuration.\n *\n * @module event-queue/stream-manager\n * @category EventQueue\n *\n * @example\n * ```typescript\n * import { StreamManager } from '@burdenoff/be-sdk/event-queue';\n *\n * const manager = new StreamManager({\n * layer: 'wspace',\n * natsUrl: 'nats://localhost:4222',\n * });\n *\n * // Ensure all default streams exist\n * await manager.ensureDefaultStreams();\n *\n * // Create custom stream\n * await manager.ensureStream({\n * name: 'CUSTOM_EVENTS',\n * subjects: ['custom.>'],\n * });\n * ```\n */\n\nimport { logger } from '../logger/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport { DEFAULT_LAYER_STREAMS } from '../types/layer.js';\nimport type { StreamConfig } from './types/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport type { PublisherConfig } from './types/config.js';\n\n/**\n * Stream manager configuration\n */\nexport interface StreamManagerConfig {\n /**\n * Layer for default stream configuration\n */\n layer: ServiceLayer;\n\n /**\n * NATS server URL\n * @default From environment or layer defaults\n */\n natsUrl?: string;\n\n /**\n * NATS username for authentication\n */\n natsUser?: string;\n\n /**\n * NATS password for authentication\n */\n natsPassword?: string;\n\n /**\n * NATS token for authentication\n */\n natsToken?: string;\n\n /**\n * NATS credentials file contents (JWT + NKEY seed)\n */\n natsCreds?: string;\n\n /**\n * Path to a NATS credentials file\n */\n natsCredsFile?: string;\n\n /**\n * Auto-create default streams on connect\n * @default true\n */\n autoCreateDefaultStreams?: boolean;\n\n /**\n * Default retention policy for streams\n * @default 'limits'\n */\n defaultRetention?: 'limits' | 'interest' | 'workqueue';\n\n /**\n * Default storage type for streams\n * @default 'file'\n */\n defaultStorage?: 'file' | 'memory';\n\n /**\n * Default max age for messages (in nanoseconds)\n * @default 86400000000000 (24 hours)\n */\n defaultMaxAge?: number;\n\n /**\n * Default max bytes per stream\n * @default -1 (unlimited)\n */\n defaultMaxBytes?: number;\n\n /**\n * Default duplicate window (in nanoseconds)\n * @default 120000000000 (2 minutes)\n */\n defaultDuplicateWindow?: number;\n}\n\n/**\n * Stream creation result\n */\nexport interface StreamCreationResult {\n name: string;\n created: boolean;\n existed: boolean;\n error?: string;\n}\n\n/**\n * Stream Manager for NATS JetStream\n */\nexport class StreamManager {\n private config: StreamManagerConfig;\n private publisher: IEventPublisher | null = null;\n private isConnected = false;\n\n constructor(config: StreamManagerConfig) {\n this.config = {\n autoCreateDefaultStreams: true,\n defaultRetention: 'limits',\n defaultStorage: 'file',\n defaultMaxAge: 86400000000000, // 24 hours in nanoseconds\n defaultMaxBytes: -1,\n defaultDuplicateWindow: 120000000000, // 2 minutes in nanoseconds\n ...config,\n };\n }\n\n /**\n * Connect to NATS and optionally create default streams\n */\n async connect(): Promise<void> {\n if (this.isConnected && this.publisher) {\n return;\n }\n\n const envPrefix = this.config.layer.toUpperCase();\n const natsUrl =\n this.config.natsUrl || process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || 'nats://localhost:4222';\n\n const publisherConfig: PublisherConfig = {\n type: 'nats',\n url: natsUrl,\n user: this.config.natsUser || process.env['NATS_USER'],\n password: this.config.natsPassword || process.env['NATS_PASSWORD'],\n token: this.config.natsToken || process.env['NATS_TOKEN'],\n creds: this.config.natsCreds || process.env['NATS_CREDS'],\n credsFile: this.config.natsCredsFile || process.env['NATS_CREDS_FILE'],\n name: `stream-manager-${this.config.layer}`,\n maxReconnectAttempts: 10,\n reconnectTimeWait: 2000,\n };\n\n this.publisher = EventQueueFactory.createPublisher(publisherConfig);\n await this.publisher.connect();\n this.isConnected = true;\n\n logger.info('[StreamManager] Connected to NATS', {\n layer: this.config.layer,\n url: natsUrl,\n });\n\n // Auto-create default streams if configured\n if (this.config.autoCreateDefaultStreams) {\n await this.ensureDefaultStreams();\n }\n }\n\n /**\n * Disconnect from NATS\n */\n async disconnect(): Promise<void> {\n if (this.publisher) {\n await this.publisher.disconnect();\n this.publisher = null;\n this.isConnected = false;\n\n logger.info('[StreamManager] Disconnected from NATS', {\n layer: this.config.layer,\n });\n }\n }\n\n /**\n * Check if connected\n */\n getIsConnected(): boolean {\n return this.isConnected && (this.publisher?.isConnected() ?? false);\n }\n\n /**\n * Ensure default streams for the layer exist\n */\n async ensureDefaultStreams(): Promise<StreamCreationResult[]> {\n const defaultStreams = DEFAULT_LAYER_STREAMS[this.config.layer];\n const results: StreamCreationResult[] = [];\n\n for (const streamDef of defaultStreams) {\n const result = await this.ensureStream({\n name: streamDef.name,\n subjects: streamDef.subjects,\n description: streamDef.description,\n });\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Ensure a stream exists with the given configuration\n */\n async ensureStream(\n streamConfig: Partial<StreamConfig> & { name: string; subjects: string[] }\n ): Promise<StreamCreationResult> {\n if (!this.publisher) {\n throw new Error('[StreamManager] Not connected to NATS');\n }\n\n const fullConfig: StreamConfig = {\n name: streamConfig.name,\n subjects: streamConfig.subjects,\n retention: streamConfig.retention || this.config.defaultRetention,\n storage: streamConfig.storage || this.config.defaultStorage,\n maxAge: streamConfig.maxAge || this.config.defaultMaxAge,\n maxBytes: streamConfig.maxBytes || this.config.defaultMaxBytes,\n duplicateWindow: streamConfig.duplicateWindow || this.config.defaultDuplicateWindow,\n maxConsumers: streamConfig.maxConsumers,\n maxMsgs: streamConfig.maxMsgs,\n description: streamConfig.description,\n };\n\n try {\n await this.publisher.ensureStream(fullConfig);\n\n logger.info('[StreamManager] Stream ensured', {\n name: fullConfig.name,\n subjects: fullConfig.subjects,\n });\n\n return {\n name: fullConfig.name,\n created: true,\n existed: false,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Check if error is because stream already exists\n if (errorMessage.includes('already exists') || errorMessage.includes('stream not found')) {\n return {\n name: fullConfig.name,\n created: false,\n existed: true,\n };\n }\n\n logger.error('[StreamManager] Failed to ensure stream', {\n name: fullConfig.name,\n error: errorMessage,\n });\n\n return {\n name: fullConfig.name,\n created: false,\n existed: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Ensure multiple streams exist\n */\n async ensureStreams(\n streams: Array<Partial<StreamConfig> & { name: string; subjects: string[] }>\n ): Promise<StreamCreationResult[]> {\n const results: StreamCreationResult[] = [];\n\n for (const stream of streams) {\n const result = await this.ensureStream(stream);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Get default streams configuration for a layer\n */\n static getDefaultStreamsForLayer(\n layer: ServiceLayer\n ): Array<{ name: string; subjects: string[]; description?: string }> {\n return DEFAULT_LAYER_STREAMS[layer];\n }\n\n /**\n * Create stream manager from environment variables\n */\n static fromEnv(): StreamManager {\n const layer = (process.env['SERVICE_LAYER'] as ServiceLayer) || 'wspace';\n\n if (layer !== 'wspace' && layer !== 'global') {\n throw new Error(`[StreamManager] Invalid SERVICE_LAYER: ${layer}. Expected 'wspace' or 'global'`);\n }\n\n return new StreamManager({\n layer,\n natsUrl: process.env['NATS_URL'],\n natsUser: process.env['NATS_USER'],\n natsPassword: process.env['NATS_PASSWORD'],\n natsToken: process.env['NATS_TOKEN'],\n natsCreds: process.env['NATS_CREDS'],\n natsCredsFile: process.env['NATS_CREDS_FILE'],\n autoCreateDefaultStreams: process.env['STREAM_MANAGER_AUTO_CREATE'] !== 'false',\n });\n }\n}\n\n/**\n * Create stream manager instance\n */\nexport function createStreamManager(config: StreamManagerConfig): StreamManager {\n return new StreamManager(config);\n}\n\n/**\n * Create stream manager from environment and connect\n */\nexport async function createAndConnectStreamManager(): Promise<StreamManager> {\n const manager = StreamManager.fromEnv();\n await manager.connect();\n return manager;\n}\n"]}
|
|
@@ -447,6 +447,11 @@ var ValkeyGlideProvider = class {
|
|
|
447
447
|
clusterScanCursor = null;
|
|
448
448
|
clientIsCluster = false;
|
|
449
449
|
connected = false;
|
|
450
|
+
// Single in-flight connect promise so concurrent first-time `get/set` calls
|
|
451
|
+
// share one connect attempt instead of racing into N parallel `createClient`
|
|
452
|
+
// invocations. Reset to `null` after connect resolves/rejects so the next
|
|
453
|
+
// call after an explicit disconnect() (or a connect failure) can retry.
|
|
454
|
+
connectPromise = null;
|
|
450
455
|
config;
|
|
451
456
|
// Mutable: when a URL like `…/4` lands on Azure Managed Redis we fold the
|
|
452
457
|
// DB index into the namespace at connect time to preserve per-service
|
|
@@ -495,20 +500,38 @@ var ValkeyGlideProvider = class {
|
|
|
495
500
|
return keys;
|
|
496
501
|
}
|
|
497
502
|
async getKeys(pattern) {
|
|
498
|
-
|
|
499
|
-
throw new Error("Not connected");
|
|
500
|
-
}
|
|
503
|
+
const client = await this.ensureConnected();
|
|
501
504
|
if (this.clientIsCluster) {
|
|
502
505
|
return this.scanClusterKeys(pattern);
|
|
503
506
|
}
|
|
504
|
-
if (!
|
|
507
|
+
if (!client.keys) {
|
|
505
508
|
throw new Error("KEYS command is not available on this Valkey client");
|
|
506
509
|
}
|
|
507
|
-
return
|
|
510
|
+
return client.keys(pattern);
|
|
508
511
|
}
|
|
509
512
|
/**
|
|
510
513
|
* Connect to Valkey server using @valkey/valkey-glide
|
|
511
514
|
*/
|
|
515
|
+
/**
|
|
516
|
+
* Lazy-connect helper used by every public operation so callers can just do
|
|
517
|
+
* `const cache = createCache('x'); await cache.set(...)` without an explicit
|
|
518
|
+
* `await cache.connect()`. Multiple concurrent ops share the same in-flight
|
|
519
|
+
* connect promise.
|
|
520
|
+
*/
|
|
521
|
+
async ensureConnected() {
|
|
522
|
+
if (!(this.connected && this.client)) {
|
|
523
|
+
if (!this.connectPromise) {
|
|
524
|
+
this.connectPromise = this.connect().finally(() => {
|
|
525
|
+
this.connectPromise = null;
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
await this.connectPromise;
|
|
529
|
+
}
|
|
530
|
+
if (!this.client) {
|
|
531
|
+
throw new Error("Valkey client connect failed");
|
|
532
|
+
}
|
|
533
|
+
return this.client;
|
|
534
|
+
}
|
|
512
535
|
async connect() {
|
|
513
536
|
if (this.connected && this.client) {
|
|
514
537
|
return;
|
|
@@ -693,14 +716,12 @@ var ValkeyGlideProvider = class {
|
|
|
693
716
|
const totalOperations = this.stats.hits + this.stats.misses;
|
|
694
717
|
const hitRate = totalOperations > 0 ? this.stats.hits / totalOperations : 0;
|
|
695
718
|
try {
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
}
|
|
699
|
-
const info = await this.client.info("memory");
|
|
719
|
+
const client = await this.ensureConnected();
|
|
720
|
+
const info = await client.info("memory");
|
|
700
721
|
const memoryRegex = /used_memory:(\d+)/;
|
|
701
722
|
const memoryMatch = memoryRegex.exec(info);
|
|
702
723
|
const memoryUsed = memoryMatch && memoryMatch[1] ? parseInt(memoryMatch[1], 10) : void 0;
|
|
703
|
-
const keyCount = await
|
|
724
|
+
const keyCount = await client.dbsize();
|
|
704
725
|
return {
|
|
705
726
|
hits: this.stats.hits,
|
|
706
727
|
misses: this.stats.misses,
|
|
@@ -740,11 +761,9 @@ var ValkeyGlideProvider = class {
|
|
|
740
761
|
*/
|
|
741
762
|
async get(key, _options) {
|
|
742
763
|
try {
|
|
743
|
-
|
|
744
|
-
throw new Error("Not connected");
|
|
745
|
-
}
|
|
764
|
+
const client = await this.ensureConnected();
|
|
746
765
|
const cacheKey = this.buildKey(key);
|
|
747
|
-
const value = await
|
|
766
|
+
const value = await client.get(cacheKey);
|
|
748
767
|
if (value === null) {
|
|
749
768
|
this.stats.misses++;
|
|
750
769
|
if (this.enableLogging) {
|
|
@@ -773,9 +792,7 @@ var ValkeyGlideProvider = class {
|
|
|
773
792
|
*/
|
|
774
793
|
async set(key, value, options) {
|
|
775
794
|
try {
|
|
776
|
-
|
|
777
|
-
throw new Error("Not connected");
|
|
778
|
-
}
|
|
795
|
+
const client = await this.ensureConnected();
|
|
779
796
|
const cacheKey = this.buildKey(key);
|
|
780
797
|
const ttlSeconds = options?.ttl || this.defaultTTL;
|
|
781
798
|
const entry = {
|
|
@@ -784,7 +801,7 @@ var ValkeyGlideProvider = class {
|
|
|
784
801
|
ttl: ttlSeconds,
|
|
785
802
|
metadata: options?.metadata
|
|
786
803
|
};
|
|
787
|
-
await
|
|
804
|
+
await client.set(cacheKey, JSON.stringify(entry), {
|
|
788
805
|
expiry: {
|
|
789
806
|
type: "EX",
|
|
790
807
|
count: ttlSeconds
|
|
@@ -809,11 +826,9 @@ var ValkeyGlideProvider = class {
|
|
|
809
826
|
*/
|
|
810
827
|
async delete(key) {
|
|
811
828
|
try {
|
|
812
|
-
|
|
813
|
-
throw new Error("Not connected");
|
|
814
|
-
}
|
|
829
|
+
const client = await this.ensureConnected();
|
|
815
830
|
const cacheKey = this.buildKey(key);
|
|
816
|
-
const result = await
|
|
831
|
+
const result = await client.del([
|
|
817
832
|
cacheKey
|
|
818
833
|
]);
|
|
819
834
|
this.stats.deletes++;
|
|
@@ -835,11 +850,9 @@ var ValkeyGlideProvider = class {
|
|
|
835
850
|
*/
|
|
836
851
|
async has(key) {
|
|
837
852
|
try {
|
|
838
|
-
|
|
839
|
-
throw new Error("Not connected");
|
|
840
|
-
}
|
|
853
|
+
const client = await this.ensureConnected();
|
|
841
854
|
const cacheKey = this.buildKey(key);
|
|
842
|
-
const exists = await
|
|
855
|
+
const exists = await client.exists([
|
|
843
856
|
cacheKey
|
|
844
857
|
]);
|
|
845
858
|
return exists === 1;
|
|
@@ -854,11 +867,9 @@ var ValkeyGlideProvider = class {
|
|
|
854
867
|
*/
|
|
855
868
|
async ttl(key) {
|
|
856
869
|
try {
|
|
857
|
-
|
|
858
|
-
throw new Error("Not connected");
|
|
859
|
-
}
|
|
870
|
+
const client = await this.ensureConnected();
|
|
860
871
|
const cacheKey = this.buildKey(key);
|
|
861
|
-
return await
|
|
872
|
+
return await client.ttl(cacheKey);
|
|
862
873
|
} catch (error) {
|
|
863
874
|
this.stats.errors++;
|
|
864
875
|
logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting TTL:`, error);
|
|
@@ -870,11 +881,9 @@ var ValkeyGlideProvider = class {
|
|
|
870
881
|
*/
|
|
871
882
|
async expire(key, ttl) {
|
|
872
883
|
try {
|
|
873
|
-
|
|
874
|
-
throw new Error("Not connected");
|
|
875
|
-
}
|
|
884
|
+
const client = await this.ensureConnected();
|
|
876
885
|
const cacheKey = this.buildKey(key);
|
|
877
|
-
return await
|
|
886
|
+
return await client.expire(cacheKey, ttl);
|
|
878
887
|
} catch (error) {
|
|
879
888
|
this.stats.errors++;
|
|
880
889
|
logger.error(`[ValkeyGlideProvider:${this.namespace}] Error setting expiration:`, error);
|
|
@@ -890,11 +899,9 @@ var ValkeyGlideProvider = class {
|
|
|
890
899
|
return result;
|
|
891
900
|
}
|
|
892
901
|
try {
|
|
893
|
-
|
|
894
|
-
throw new Error("Not connected");
|
|
895
|
-
}
|
|
902
|
+
const client = await this.ensureConnected();
|
|
896
903
|
const cacheKeys = keys.map((key) => this.buildKey(key));
|
|
897
|
-
const values = await
|
|
904
|
+
const values = await client.mget(cacheKeys);
|
|
898
905
|
for (let i = 0; i < keys.length; i++) {
|
|
899
906
|
const key = keys[i];
|
|
900
907
|
if (!key) continue;
|
|
@@ -927,9 +934,7 @@ var ValkeyGlideProvider = class {
|
|
|
927
934
|
return true;
|
|
928
935
|
}
|
|
929
936
|
try {
|
|
930
|
-
|
|
931
|
-
throw new Error("Not connected");
|
|
932
|
-
}
|
|
937
|
+
const client = await this.ensureConnected();
|
|
933
938
|
const ttlSeconds = options?.ttl || this.defaultTTL;
|
|
934
939
|
const keyValuePairs = {};
|
|
935
940
|
for (const [key, value] of entries) {
|
|
@@ -942,9 +947,9 @@ var ValkeyGlideProvider = class {
|
|
|
942
947
|
};
|
|
943
948
|
keyValuePairs[cacheKey] = JSON.stringify(entry);
|
|
944
949
|
}
|
|
945
|
-
await
|
|
950
|
+
await client.mset(keyValuePairs);
|
|
946
951
|
for (const cacheKey of Object.keys(keyValuePairs)) {
|
|
947
|
-
await
|
|
952
|
+
await client.expire(cacheKey, ttlSeconds);
|
|
948
953
|
}
|
|
949
954
|
this.stats.sets += entries.size;
|
|
950
955
|
if (this.enableLogging) {
|
|
@@ -968,11 +973,9 @@ var ValkeyGlideProvider = class {
|
|
|
968
973
|
return 0;
|
|
969
974
|
}
|
|
970
975
|
try {
|
|
971
|
-
|
|
972
|
-
throw new Error("Not connected");
|
|
973
|
-
}
|
|
976
|
+
const client = await this.ensureConnected();
|
|
974
977
|
const cacheKeys = keys.map((key) => this.buildKey(key));
|
|
975
|
-
const result = await
|
|
978
|
+
const result = await client.del(cacheKeys);
|
|
976
979
|
this.stats.deletes += result;
|
|
977
980
|
if (this.enableLogging) {
|
|
978
981
|
logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch delete`, {
|
|
@@ -992,15 +995,13 @@ var ValkeyGlideProvider = class {
|
|
|
992
995
|
*/
|
|
993
996
|
async clearPattern(pattern) {
|
|
994
997
|
try {
|
|
995
|
-
|
|
996
|
-
throw new Error("Not connected");
|
|
997
|
-
}
|
|
998
|
+
const client = await this.ensureConnected();
|
|
998
999
|
const searchPattern = this.buildKey(pattern);
|
|
999
1000
|
const keys = await this.getKeys(searchPattern);
|
|
1000
1001
|
if (keys.length === 0) {
|
|
1001
1002
|
return 0;
|
|
1002
1003
|
}
|
|
1003
|
-
const result = await
|
|
1004
|
+
const result = await client.del(keys);
|
|
1004
1005
|
if (this.enableLogging) {
|
|
1005
1006
|
logger.debug(`[ValkeyGlideProvider:${this.namespace}] Pattern cleared`, {
|
|
1006
1007
|
pattern,
|
|
@@ -1019,9 +1020,7 @@ var ValkeyGlideProvider = class {
|
|
|
1019
1020
|
*/
|
|
1020
1021
|
async keys(options) {
|
|
1021
1022
|
try {
|
|
1022
|
-
|
|
1023
|
-
throw new Error("Not connected");
|
|
1024
|
-
}
|
|
1023
|
+
await this.ensureConnected();
|
|
1025
1024
|
const searchPattern = this.buildKey(options.pattern);
|
|
1026
1025
|
const keys = await this.getKeys(searchPattern);
|
|
1027
1026
|
const prefix = `${this.namespace}:`;
|
|
@@ -1047,13 +1046,11 @@ var ValkeyGlideProvider = class {
|
|
|
1047
1046
|
*/
|
|
1048
1047
|
async clear() {
|
|
1049
1048
|
try {
|
|
1050
|
-
|
|
1051
|
-
throw new Error("Not connected");
|
|
1052
|
-
}
|
|
1049
|
+
const client = await this.ensureConnected();
|
|
1053
1050
|
const pattern = this.buildKey("*");
|
|
1054
1051
|
const keys = await this.getKeys(pattern);
|
|
1055
1052
|
if (keys.length > 0) {
|
|
1056
|
-
await
|
|
1053
|
+
await client.del(keys);
|
|
1057
1054
|
if (this.enableLogging) {
|
|
1058
1055
|
logger.info(`[ValkeyGlideProvider:${this.namespace}] Cleared ${keys.length} keys`);
|
|
1059
1056
|
}
|
|
@@ -1070,11 +1067,9 @@ var ValkeyGlideProvider = class {
|
|
|
1070
1067
|
*/
|
|
1071
1068
|
async increment(key, amount = 1) {
|
|
1072
1069
|
try {
|
|
1073
|
-
|
|
1074
|
-
throw new Error("Not connected");
|
|
1075
|
-
}
|
|
1070
|
+
const client = await this.ensureConnected();
|
|
1076
1071
|
const cacheKey = this.buildKey(key);
|
|
1077
|
-
return await
|
|
1072
|
+
return await client.incrBy(cacheKey, amount);
|
|
1078
1073
|
} catch (error) {
|
|
1079
1074
|
this.stats.errors++;
|
|
1080
1075
|
logger.error(`[ValkeyGlideProvider:${this.namespace}] Error incrementing:`, error);
|
|
@@ -1086,11 +1081,9 @@ var ValkeyGlideProvider = class {
|
|
|
1086
1081
|
*/
|
|
1087
1082
|
async decrement(key, amount = 1) {
|
|
1088
1083
|
try {
|
|
1089
|
-
|
|
1090
|
-
throw new Error("Not connected");
|
|
1091
|
-
}
|
|
1084
|
+
const client = await this.ensureConnected();
|
|
1092
1085
|
const cacheKey = this.buildKey(key);
|
|
1093
|
-
return await
|
|
1086
|
+
return await client.decrBy(cacheKey, amount);
|
|
1094
1087
|
} catch (error) {
|
|
1095
1088
|
this.stats.errors++;
|
|
1096
1089
|
logger.error(`[ValkeyGlideProvider:${this.namespace}] Error decrementing:`, error);
|
|
@@ -1419,5 +1412,5 @@ async function closeAllCaches() {
|
|
|
1419
1412
|
__name(closeAllCaches, "closeAllCaches");
|
|
1420
1413
|
|
|
1421
1414
|
export { CacheFactory, CacheProviderType, MemoryCacheProvider, ValkeyGlideProvider, cache_exports, closeAllCaches, createCache, getCache, getValkeyClient };
|
|
1422
|
-
//# sourceMappingURL=chunk-
|
|
1423
|
-
//# sourceMappingURL=chunk-
|
|
1415
|
+
//# sourceMappingURL=chunk-Q6N74R6S.js.map
|
|
1416
|
+
//# sourceMappingURL=chunk-Q6N74R6S.js.map
|