@burdenoff/be-sdk 2026.825.8 → 2026.825.9
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/EventQueueFactory-J2XXPYXH.js +7 -0
- package/dist/{EventQueueFactory-ELT7NDXK.js.map → EventQueueFactory-J2XXPYXH.js.map} +1 -1
- package/dist/auth/index.js +2 -2
- package/dist/cache/index.js +3 -3
- package/dist/{chunk-AW6JUXCU.js → chunk-3UQMAUX4.js} +4 -4
- package/dist/{chunk-AW6JUXCU.js.map → chunk-3UQMAUX4.js.map} +1 -1
- package/dist/{chunk-N3YN6ZII.js → chunk-5JNHVKHG.js} +3 -3
- package/dist/{chunk-N3YN6ZII.js.map → chunk-5JNHVKHG.js.map} +1 -1
- package/dist/{chunk-7UJXIX4I.js → chunk-5NT2OEDQ.js} +3 -3
- package/dist/{chunk-7UJXIX4I.js.map → chunk-5NT2OEDQ.js.map} +1 -1
- package/dist/{chunk-OQLDXOZ3.js → chunk-6GL4SLU7.js} +3 -3
- package/dist/{chunk-OQLDXOZ3.js.map → chunk-6GL4SLU7.js.map} +1 -1
- package/dist/{chunk-L3QCRJOA.js → chunk-74Y5YD3U.js} +7 -7
- package/dist/{chunk-L3QCRJOA.js.map → chunk-74Y5YD3U.js.map} +1 -1
- package/dist/{chunk-NVVWSOY7.js → chunk-AX3UF33H.js} +3 -3
- package/dist/{chunk-NVVWSOY7.js.map → chunk-AX3UF33H.js.map} +1 -1
- package/dist/{chunk-Z3O32BW6.js → chunk-CPLFP5JK.js} +3 -3
- package/dist/{chunk-Z3O32BW6.js.map → chunk-CPLFP5JK.js.map} +1 -1
- package/dist/{chunk-XD5ZK727.js → chunk-DS3YMJ4X.js} +3 -3
- package/dist/{chunk-XD5ZK727.js.map → chunk-DS3YMJ4X.js.map} +1 -1
- package/dist/{chunk-2HANKZZM.js → chunk-ELU7VL3E.js} +3 -3
- package/dist/{chunk-2HANKZZM.js.map → chunk-ELU7VL3E.js.map} +1 -1
- package/dist/{chunk-KESVEZB2.js → chunk-FA5ROGTS.js} +3 -3
- package/dist/{chunk-KESVEZB2.js.map → chunk-FA5ROGTS.js.map} +1 -1
- package/dist/{chunk-WFVLQELZ.js → chunk-FYH5IAPR.js} +6 -6
- package/dist/{chunk-WFVLQELZ.js.map → chunk-FYH5IAPR.js.map} +1 -1
- package/dist/{chunk-RXMOV3YE.js → chunk-GJWQK3IU.js} +3 -3
- package/dist/{chunk-RXMOV3YE.js.map → chunk-GJWQK3IU.js.map} +1 -1
- package/dist/{chunk-TORD32GS.js → chunk-INAZ3PKF.js} +3 -3
- package/dist/{chunk-TORD32GS.js.map → chunk-INAZ3PKF.js.map} +1 -1
- package/dist/{chunk-UJG32VIP.js → chunk-IUJSIXMM.js} +3 -3
- package/dist/{chunk-UJG32VIP.js.map → chunk-IUJSIXMM.js.map} +1 -1
- package/dist/{chunk-VI4VSNTI.js → chunk-KJOSPVB2.js} +3 -3
- package/dist/{chunk-VI4VSNTI.js.map → chunk-KJOSPVB2.js.map} +1 -1
- package/dist/{chunk-UM32ZA3G.js → chunk-KMNSVLDS.js} +5 -5
- package/dist/{chunk-UM32ZA3G.js.map → chunk-KMNSVLDS.js.map} +1 -1
- package/dist/{chunk-VBXPFYZ5.js → chunk-KO2ZXZ7W.js} +3 -3
- package/dist/{chunk-VBXPFYZ5.js.map → chunk-KO2ZXZ7W.js.map} +1 -1
- package/dist/{chunk-VDYBUTFI.js → chunk-KW55Q6TA.js} +5 -5
- package/dist/{chunk-VDYBUTFI.js.map → chunk-KW55Q6TA.js.map} +1 -1
- package/dist/{chunk-OCYZEBOL.js → chunk-L5TDUAFN.js} +3 -3
- package/dist/{chunk-OCYZEBOL.js.map → chunk-L5TDUAFN.js.map} +1 -1
- package/dist/{chunk-S7LWYERE.js → chunk-LKCBI6B2.js} +3 -3
- package/dist/{chunk-S7LWYERE.js.map → chunk-LKCBI6B2.js.map} +1 -1
- package/dist/{chunk-LGTQ26Z2.js → chunk-MEA4BQNA.js} +3 -3
- package/dist/{chunk-LGTQ26Z2.js.map → chunk-MEA4BQNA.js.map} +1 -1
- package/dist/{chunk-QLVKMWFA.js → chunk-MWPYA2HD.js} +3 -3
- package/dist/{chunk-QLVKMWFA.js.map → chunk-MWPYA2HD.js.map} +1 -1
- package/dist/{chunk-XWVP4MC6.js → chunk-MZCBEJ67.js} +3 -3
- package/dist/{chunk-XWVP4MC6.js.map → chunk-MZCBEJ67.js.map} +1 -1
- package/dist/{chunk-URDYOM2L.js → chunk-QJN4K7LD.js} +4 -4
- package/dist/{chunk-URDYOM2L.js.map → chunk-QJN4K7LD.js.map} +1 -1
- package/dist/{chunk-CBZNP6RF.js → chunk-RU266375.js} +48 -7
- package/dist/chunk-RU266375.js.map +1 -0
- package/dist/{chunk-A6DGEZJ4.js → chunk-UD5PPGVU.js} +3 -3
- package/dist/{chunk-A6DGEZJ4.js.map → chunk-UD5PPGVU.js.map} +1 -1
- package/dist/{chunk-JNJSSBKO.js → chunk-UFXHLQ2T.js} +5 -5
- package/dist/{chunk-JNJSSBKO.js.map → chunk-UFXHLQ2T.js.map} +1 -1
- package/dist/{chunk-F5SGJ6VS.js → chunk-UNASM5VJ.js} +3 -3
- package/dist/{chunk-F5SGJ6VS.js.map → chunk-UNASM5VJ.js.map} +1 -1
- package/dist/{chunk-5LXDPGDH.js → chunk-VAT66FJA.js} +3 -3
- package/dist/{chunk-5LXDPGDH.js.map → chunk-VAT66FJA.js.map} +1 -1
- package/dist/{chunk-WROR2NMB.js → chunk-XCQN6GH7.js} +5 -5
- package/dist/{chunk-WROR2NMB.js.map → chunk-XCQN6GH7.js.map} +1 -1
- package/dist/{chunk-4X5WL6I3.js → chunk-XYWLCNJH.js} +5 -5
- package/dist/{chunk-4X5WL6I3.js.map → chunk-XYWLCNJH.js.map} +1 -1
- package/dist/{chunk-MX4AHK3E.js → chunk-YAQ7GNAC.js} +6 -6
- package/dist/{chunk-MX4AHK3E.js.map → chunk-YAQ7GNAC.js.map} +1 -1
- package/dist/{chunk-RNR45JQH.js → chunk-YK7C5DU6.js} +3 -3
- package/dist/{chunk-RNR45JQH.js.map → chunk-YK7C5DU6.js.map} +1 -1
- package/dist/{chunk-IC7YDBGE.js → chunk-YNDJQRI3.js} +3 -3
- package/dist/{chunk-IC7YDBGE.js.map → chunk-YNDJQRI3.js.map} +1 -1
- package/dist/{chunk-WCJIZR5Q.js → chunk-Z5BURBFZ.js} +3 -3
- package/dist/{chunk-WCJIZR5Q.js.map → chunk-Z5BURBFZ.js.map} +1 -1
- package/dist/client/internal-client.js +2 -2
- package/dist/database/index.js +2 -2
- package/dist/event-queue/index.js +6 -6
- package/dist/export/index.js +5 -5
- package/dist/feature-flags/index.js +2 -2
- package/dist/gateway/index.js +4 -4
- package/dist/gateway/security/index.js +2 -2
- package/dist/graph/index.js +8 -8
- package/dist/graphql/index.js +4 -4
- package/dist/graphql/services/index.js +2 -2
- package/dist/i18n/index.js +2 -2
- package/dist/{index-BtpoFSLa.d.ts → index-BLWIKXin.d.ts} +1 -1
- package/dist/{index-C0qWSC_Q.d.ts → index-hWpL68Vx.d.ts} +4 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +44 -44
- package/dist/init/index.js +6 -6
- package/dist/instrumentation/index.d.ts +2 -2
- package/dist/instrumentation/index.js +2 -2
- package/dist/layer/index.js +2 -2
- package/dist/lifecycle/index.js +2 -2
- package/dist/logger/index.d.ts +1 -1
- package/dist/logger/index.js +1 -1
- package/dist/middleware/index.js +2 -2
- package/dist/notifications/index.js +2 -2
- package/dist/observability/index.js +2 -2
- package/dist/pino-logger-GJ2CYLD5.js +5 -0
- package/dist/{pino-logger-XF275Y5C.js.map → pino-logger-GJ2CYLD5.js.map} +1 -1
- package/dist/platform/index.js +2 -2
- package/dist/prisma/index.js +8 -8
- package/dist/rbac/index.js +2 -2
- package/dist/resource-caps/index.js +2 -2
- package/dist/server/index.js +6 -6
- package/dist/sharding/index.js +1 -1
- package/dist/sharing/index.js +2 -2
- package/dist/telemetry/index.d.ts +3 -3
- package/dist/telemetry/index.js +5 -5
- package/dist/temporal/index.js +2 -2
- package/dist/tracker/index.js +4 -4
- package/dist/workspace-guard-7PEZT3ZJ.js +5 -0
- package/dist/{workspace-guard-4BUG4ZP2.js.map → workspace-guard-7PEZT3ZJ.js.map} +1 -1
- package/package.json +1 -1
- package/dist/EventQueueFactory-ELT7NDXK.js +0 -7
- package/dist/chunk-CBZNP6RF.js.map +0 -1
- package/dist/pino-logger-XF275Y5C.js +0 -5
- package/dist/workspace-guard-4BUG4ZP2.js +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-queue/implementations/memory/MemoryEventQueue.ts","../src/event-queue/graph-emitter.ts"],"names":["MemoryEventBus","handlers","Map","emit","event","data","eventHandlers","get","forEach","handler","Promise","resolve","pattern","matchesPattern","on","has","set","Set","add","off","delete","endsWith","prefix","slice","startsWith","clear","MemoryEventQueue","queue","processing","maxRetries","retryDelay","options","publishEntityEvent","eventType","entity","context","subject","productName","type","split","logger","debug","entityId","id","entityType","enqueue","metadata","Date","now","randomUUID","timestamp","retries","push","processQueue","registerHandler","length","shift","ackEvent","correlationId","toISOString","ack","nak","term","isRedelivered","getDeliveryAttempt","setTimeout","publish","close","MemoryEventPublisher","_connected","publishCount","connect","info","disconnect","isConnected","ensureStream","Error","messageId","publishBatch","events","messageIds","publishWithAck","healthCheck","status","connected","latencyMs","getStatistics","messagesPublished","messagesConsumed","messagesPending","messagesFailed","getQueue","MemoryEventConsumer","bus","_subscriptions","consumeCount","subIdCounter","streamName","consumerName","stream","consumer","sub","values","unsubscribe","ensureConsumer","subscribe","subId","messagesReceived","messagesProcessed","lastActivity","active","subscription","isActive","getStats","subscriptionId","subscribeMultiple","subjects","subscriptions","pull","unsubscribeAll","getSubscriptions","Array","from","processDLQ","_handler","getBus","createMemoryPublisher","createMemoryConsumer","createGraphEventEmitter","uuidv4","crypto","GraphEventEmitterImpl","publisher","connecting","graphRedisUrl","process","env","EventQueueFactory","createPublisher","QueueType","REDIS_STREAMS","url","name","src","ensureConnected","then","rbac","eventId","action","hasRbac","streamSubjects","productSource","organizationId","actorId","workspaceId","result","isHealthy","healthy","message","error","_graphEventEmitter","getGraphEventEmitter","resetGraphEventEmitter"],"mappings":"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","file":"chunk-URDYOM2L.js","sourcesContent":["/**\n * In-Memory Event Queue Implementation\n *\n * A simple in-memory event bus and queue for development/testing environments\n * or when NATS is not available. Implements the same interfaces as the NATS\n * implementation for seamless swapping.\n *\n * @module event-queue/memory\n * @category Events\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { EventHandler, AcknowledgeableEvent, EventMetadata } from '../../types/events.js';\nimport type { EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void>;\n}\n\n/**\n * Simple event bus for in-memory pub/sub\n */\nexport class MemoryEventBus {\n private handlers: Map<string, Set<EventHandler<unknown>>> = new Map();\n\n /**\n * Emit an event to all handlers\n */\n emit<T>(event: string, data: T): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n\n // Also emit to wildcard handlers\n for (const [pattern, handlers] of this.handlers) {\n if (this.matchesPattern(event, pattern)) {\n handlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n }\n }\n\n /**\n * Register a handler for an event\n */\n on<T>(event: string, handler: EventHandler<T>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n /**\n * Remove a handler for an event\n */\n off<T>(event: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n /**\n * Check if pattern matches event (supports wildcards)\n */\n private matchesPattern(event: string, pattern: string): boolean {\n if (pattern === event) return false; // Already handled exact match\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n if (pattern.endsWith('.>')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n return false;\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Queued event structure\n */\ninterface QueuedEvent<T = unknown> {\n id: string;\n subject: string;\n data: T;\n metadata: Record<string, unknown>;\n timestamp: Date;\n retries: number;\n maxRetries: number;\n}\n\n/**\n * In-memory event queue with retry support\n */\nexport class MemoryEventQueue implements GraphEventEmitter {\n private queue: QueuedEvent[] = [];\n private processing = false;\n private handlers: Map<string, EventHandler<unknown>> = new Map();\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(options?: { maxRetries?: number; retryDelay?: number }) {\n this.maxRetries = options?.maxRetries ?? 3;\n this.retryDelay = options?.retryDelay ?? 1000;\n }\n\n /**\n * Publish entity event (implements GraphEventEmitter)\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void> {\n const subject = `graph.${context.productName}.${entity.type}.${eventType.split('.')[1]}`;\n\n logger.debug('[MemoryEventQueue] Publishing entity event', {\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n });\n\n this.enqueue(subject, {\n eventType,\n entity,\n context,\n });\n }\n\n /**\n * Add an event to the queue\n */\n enqueue<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): string {\n const id = `evt_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const event: QueuedEvent<T> = {\n id,\n subject,\n data,\n metadata,\n timestamp: new Date(),\n retries: 0,\n maxRetries: this.maxRetries,\n };\n this.queue.push(event);\n void this.processQueue();\n return id;\n }\n\n /**\n * Register a handler for a subject\n */\n registerHandler<T>(subject: string, handler: EventHandler<T>): void {\n this.handlers.set(subject, handler as EventHandler<unknown>);\n }\n\n /**\n * Process the queue\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n\n while (this.queue.length > 0) {\n const event = this.queue.shift();\n if (!event) continue;\n\n const handler = this.handlers.get(event.subject);\n if (handler) {\n try {\n const ackEvent: AcknowledgeableEvent = {\n id: event.id,\n subject: event.subject,\n data: event.data,\n metadata: {\n correlationId: event.id,\n ...event.metadata,\n },\n timestamp: event.timestamp.toISOString(),\n ack: async () => {\n logger.debug('[MemoryEventQueue] Event acknowledged', { id: event.id });\n },\n nak: async () => {\n logger.debug('[MemoryEventQueue] Event negatively acknowledged', { id: event.id });\n if (event.retries < event.maxRetries) {\n event.retries++;\n this.queue.push(event);\n }\n },\n term: async () => {\n logger.debug('[MemoryEventQueue] Event terminated', { id: event.id });\n },\n isRedelivered: () => event.retries > 0,\n getDeliveryAttempt: () => event.retries + 1,\n };\n await handler(ackEvent);\n } catch {\n if (event.retries < event.maxRetries) {\n event.retries++;\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay));\n this.queue.push(event);\n }\n }\n }\n }\n\n this.processing = false;\n }\n\n /**\n * Get queue length\n */\n get length(): number {\n return this.queue.length;\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * Publish an event (fire-and-forget)\n */\n async publish<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): Promise<void> {\n this.enqueue(subject, data, metadata);\n logger.debug('[MemoryEventQueue] Published event', { subject });\n }\n\n /**\n * Close the event queue\n */\n async close(): Promise<void> {\n this.clear();\n this.handlers.clear();\n logger.debug('[MemoryEventQueue] Event queue closed');\n }\n}\n\n/**\n * In-memory event publisher implementation\n */\nexport class MemoryEventPublisher implements IEventPublisher {\n private queue: MemoryEventQueue;\n private _connected = false;\n private publishCount = 0;\n\n constructor() {\n this.queue = new MemoryEventQueue();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventPublisher] Connected (in-memory mode)');\n }\n\n async disconnect(): Promise<void> {\n await this.queue.close();\n this._connected = false;\n logger.info('[MemoryEventPublisher] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventPublisher] ensureStream called (no-op for in-memory)');\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }): Promise<string> {\n if (!this._connected) {\n throw new Error('Publisher not connected');\n }\n\n const messageId = this.queue.enqueue(options.subject, options.data, options.metadata);\n this.publishCount++;\n\n logger.debug('[MemoryEventPublisher] Published', {\n subject: options.subject,\n messageId,\n });\n\n return messageId;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }>\n ): Promise<string[]> {\n const messageIds: string[] = [];\n for (const event of events) {\n const id = await this.publish(event);\n messageIds.push(id);\n }\n return messageIds;\n }\n\n async publishWithAck<T = unknown, R = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n // For in-memory, just publish and return empty response\n await this.publish({\n subject: options.subject,\n data: options.data,\n metadata: options.metadata,\n });\n return {} as R;\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * In-memory event consumer implementation\n */\nexport class MemoryEventConsumer implements IEventConsumer {\n private queue: MemoryEventQueue;\n private bus: MemoryEventBus;\n private _connected = false;\n private _subscriptions: Map<string, ISubscription> = new Map();\n private consumeCount = 0;\n private subIdCounter = 0;\n\n constructor(\n private streamName: string,\n private consumerName: string\n ) {\n this.queue = new MemoryEventQueue();\n this.bus = new MemoryEventBus();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventConsumer] Connected (in-memory mode)', {\n stream: this.streamName,\n consumer: this.consumerName,\n });\n }\n\n async disconnect(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n await this.queue.close();\n this.bus.clear();\n this._connected = false;\n logger.info('[MemoryEventConsumer] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureStream called (no-op for in-memory)');\n }\n\n async ensureConsumer(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureConsumer called (no-op for in-memory)');\n }\n\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n queueGroup?: string;\n }): Promise<ISubscription> {\n if (!this._connected) {\n throw new Error('Consumer not connected');\n }\n\n const { subject, handler } = options;\n const subId = `sub_${++this.subIdCounter}`;\n let messagesReceived = 0;\n let messagesProcessed = 0;\n let messagesFailed = 0;\n let lastActivity = new Date().toISOString();\n let active = true;\n\n // Register with both queue and bus\n this.queue.registerHandler(subject, async (event) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(event as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n this.bus.on(subject, async (data) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(data as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n const subscription: ISubscription = {\n id: subId,\n subject,\n unsubscribe: async () => {\n active = false;\n this._subscriptions.delete(subId);\n logger.debug('[MemoryEventConsumer] Unsubscribed', { subject });\n },\n isActive: () => active,\n getStats: () => ({\n messagesReceived,\n messagesProcessed,\n messagesFailed,\n lastActivity,\n }),\n };\n\n this._subscriptions.set(subId, subscription);\n logger.info('[MemoryEventConsumer] Subscribed', { subject, subscriptionId: subId });\n\n return subscription;\n }\n\n async subscribeMultiple<T = unknown>(subjects: string[], handler: EventHandler<T>): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n for (const subject of subjects) {\n const sub = await this.subscribe<T>({ subject, handler });\n subscriptions.push(sub);\n }\n return subscriptions;\n }\n\n async pull<T = unknown>(): Promise<AcknowledgeableEvent<T>[]> {\n // In-memory doesn't support pull-based consumption in a meaningful way\n logger.debug('[MemoryEventConsumer] pull called (returning empty for in-memory)');\n return [];\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return Array.from(this._subscriptions.values());\n }\n\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n // No-op for in-memory (no DLQ)\n logger.debug('[MemoryEventConsumer] processDLQ called (no-op for in-memory)');\n }\n\n // eslint-disable-next-line sonarjs/no-identical-functions -- Same implementation needed for both Publisher and Consumer\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: 0,\n messagesConsumed: this.consumeCount,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying bus (for testing/debugging)\n */\n getBus(): MemoryEventBus {\n return this.bus;\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * Create an in-memory event publisher\n */\nexport function createMemoryPublisher(): IEventPublisher {\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an in-memory event consumer\n */\nexport function createMemoryConsumer(stream: string, consumer: string): IEventConsumer {\n return new MemoryEventConsumer(stream, consumer);\n}\n\n/**\n * Create a GraphEventEmitter instance (in-memory)\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new MemoryEventQueue();\n}\n","/**\n * Graph Event Emitter\n *\n * Provides a GraphEventEmitter implementation that works with the event queue system.\n * Uses Redis Streams when REDIS_URL is set, in-memory otherwise.\n *\n * @module event-queue/graph-emitter\n * @category Events\n */\nimport { logger } from '../logger/index.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport { QueueType } from './types/config.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * RBAC metadata included in entity lifecycle events.\n * When present, the RBAC consumer will create/update/delete resources accordingly.\n * When absent, only the graph consumer processes the event (strict mode).\n */\nexport interface EntityEventRbacMetadata {\n /** RBAC resource type name (e.g., 'tag', 'conversation', 'bot') */\n resourceTypeName: string;\n /** Human-readable resource name */\n name?: string;\n /** Resource identifier (defaults to entity.id if not provided) */\n identifier?: string;\n /** Parent resource identifier for hierarchy */\n parentResourceIdentifier?: string;\n /** Whether to create a resource in RBAC (default: true) */\n createResource?: boolean;\n}\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void>;\n}\n\n/**\n * Graph Event Emitter (Redis Streams-backed in production).\n *\n * Publishes graph entity events to the Redis Streams event bus for\n * processing by graph sync workers. Falls back to in-memory when\n * neither `GRAPH_REDIS_URL` nor `REDIS_URL` is set.\n *\n * `GRAPH_REDIS_URL` takes priority over `REDIS_URL` so that services\n * whose own cache Redis runs on a different db index (e.g. /14) can\n * still publish to the graph-svc's db index (e.g. /16) without\n * touching their primary Redis config.\n */\nexport class GraphEventEmitterImpl implements GraphEventEmitter {\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor() {\n const graphRedisUrl = process.env['GRAPH_REDIS_URL'] ?? process.env['REDIS_URL'];\n if (graphRedisUrl) {\n this.publisher = EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: graphRedisUrl,\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'graph-emitter',\n });\n const src = process.env['GRAPH_REDIS_URL'] ? 'GRAPH_REDIS_URL' : 'REDIS_URL';\n logger.info(`[GraphEventEmitter] Using Redis Streams publisher (${src})`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info('[GraphEventEmitter] Using in-memory publisher (GRAPH_REDIS_URL / REDIS_URL not configured)');\n }\n }\n\n /**\n * Ensure publisher is connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info('[GraphEventEmitterImpl] Publisher connected');\n });\n\n await this.connecting;\n }\n\n /**\n * Publish entity event to graph queue\n *\n * @param eventType - The lifecycle event type\n * @param entity - Entity data (id, type, data)\n * @param context - Event context (product, org, user, workspace)\n * @param rbac - Optional RBAC metadata. When present, the RBAC consumer will\n * create/update/delete resources. When absent, only graph consumer processes.\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void> {\n await this.ensureConnected();\n\n const eventId = uuidv4();\n const action = eventType.split('.')[1]; // 'created', 'updated', 'deleted'\n const subject = `graph.${context.productName}.${entity.type}.${action}`;\n\n logger.debug('[GraphEventEmitterImpl] Publishing entity event', {\n eventId,\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n hasRbac: !!rbac,\n });\n\n const streamName = process.env['GRAPH_SYNC_STREAM_NAME'] ?? 'WSPACE_GRAPH_EVENTS';\n const streamSubjects = ['graph.>'];\n\n await this.publisher.publish({\n subject,\n data: {\n eventId,\n eventType,\n productSource: context.productName,\n organizationId: context.organizationId,\n entity,\n context: {\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n },\n // Include RBAC metadata when configured (consumed by rbac-entity-consumer)\n ...(rbac && { rbac }),\n timestamp: new Date().toISOString(),\n },\n metadata: {\n eventId,\n productName: context.productName,\n organizationId: context.organizationId,\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n entityType: entity.type,\n entityId: entity.id,\n },\n options: {\n stream: streamName,\n streamSubjects,\n },\n });\n }\n\n /**\n * Disconnect the publisher\n */\n async disconnect(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info('[GraphEventEmitterImpl] Publisher disconnected');\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Singleton instance\n */\nlet _graphEventEmitter: GraphEventEmitterImpl | null = null;\n\n/**\n * Get or create the graph event emitter singleton\n *\n * @returns Graph event emitter instance\n */\nexport function getGraphEventEmitter(): GraphEventEmitter {\n if (!_graphEventEmitter) {\n _graphEventEmitter = new GraphEventEmitterImpl();\n }\n return _graphEventEmitter;\n}\n\n/**\n * Create a new graph event emitter instance (non-singleton)\n *\n * @returns New graph event emitter instance\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new GraphEventEmitterImpl();\n}\n\n/**\n * Reset the singleton (for testing)\n */\nexport async function resetGraphEventEmitter(): Promise<void> {\n if (_graphEventEmitter) {\n await _graphEventEmitter.disconnect();\n _graphEventEmitter = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/event-queue/implementations/memory/MemoryEventQueue.ts","../src/event-queue/graph-emitter.ts"],"names":["MemoryEventBus","handlers","Map","emit","event","data","eventHandlers","get","forEach","handler","Promise","resolve","pattern","matchesPattern","on","has","set","Set","add","off","delete","endsWith","prefix","slice","startsWith","clear","MemoryEventQueue","queue","processing","maxRetries","retryDelay","options","publishEntityEvent","eventType","entity","context","subject","productName","type","split","logger","debug","entityId","id","entityType","enqueue","metadata","Date","now","randomUUID","timestamp","retries","push","processQueue","registerHandler","length","shift","ackEvent","correlationId","toISOString","ack","nak","term","isRedelivered","getDeliveryAttempt","setTimeout","publish","close","MemoryEventPublisher","_connected","publishCount","connect","info","disconnect","isConnected","ensureStream","Error","messageId","publishBatch","events","messageIds","publishWithAck","healthCheck","status","connected","latencyMs","getStatistics","messagesPublished","messagesConsumed","messagesPending","messagesFailed","getQueue","MemoryEventConsumer","bus","_subscriptions","consumeCount","subIdCounter","streamName","consumerName","stream","consumer","sub","values","unsubscribe","ensureConsumer","subscribe","subId","messagesReceived","messagesProcessed","lastActivity","active","subscription","isActive","getStats","subscriptionId","subscribeMultiple","subjects","subscriptions","pull","unsubscribeAll","getSubscriptions","Array","from","processDLQ","_handler","getBus","createMemoryPublisher","createMemoryConsumer","createGraphEventEmitter","uuidv4","crypto","GraphEventEmitterImpl","publisher","connecting","graphRedisUrl","process","env","EventQueueFactory","createPublisher","QueueType","REDIS_STREAMS","url","name","src","ensureConnected","then","rbac","eventId","action","hasRbac","streamSubjects","productSource","organizationId","actorId","workspaceId","result","isHealthy","healthy","message","error","_graphEventEmitter","getGraphEventEmitter","resetGraphEventEmitter"],"mappings":"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","file":"chunk-QJN4K7LD.js","sourcesContent":["/**\n * In-Memory Event Queue Implementation\n *\n * A simple in-memory event bus and queue for development/testing environments\n * or when NATS is not available. Implements the same interfaces as the NATS\n * implementation for seamless swapping.\n *\n * @module event-queue/memory\n * @category Events\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { EventHandler, AcknowledgeableEvent, EventMetadata } from '../../types/events.js';\nimport type { EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void>;\n}\n\n/**\n * Simple event bus for in-memory pub/sub\n */\nexport class MemoryEventBus {\n private handlers: Map<string, Set<EventHandler<unknown>>> = new Map();\n\n /**\n * Emit an event to all handlers\n */\n emit<T>(event: string, data: T): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n\n // Also emit to wildcard handlers\n for (const [pattern, handlers] of this.handlers) {\n if (this.matchesPattern(event, pattern)) {\n handlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n }\n }\n\n /**\n * Register a handler for an event\n */\n on<T>(event: string, handler: EventHandler<T>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n /**\n * Remove a handler for an event\n */\n off<T>(event: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n /**\n * Check if pattern matches event (supports wildcards)\n */\n private matchesPattern(event: string, pattern: string): boolean {\n if (pattern === event) return false; // Already handled exact match\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n if (pattern.endsWith('.>')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n return false;\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Queued event structure\n */\ninterface QueuedEvent<T = unknown> {\n id: string;\n subject: string;\n data: T;\n metadata: Record<string, unknown>;\n timestamp: Date;\n retries: number;\n maxRetries: number;\n}\n\n/**\n * In-memory event queue with retry support\n */\nexport class MemoryEventQueue implements GraphEventEmitter {\n private queue: QueuedEvent[] = [];\n private processing = false;\n private handlers: Map<string, EventHandler<unknown>> = new Map();\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(options?: { maxRetries?: number; retryDelay?: number }) {\n this.maxRetries = options?.maxRetries ?? 3;\n this.retryDelay = options?.retryDelay ?? 1000;\n }\n\n /**\n * Publish entity event (implements GraphEventEmitter)\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void> {\n const subject = `graph.${context.productName}.${entity.type}.${eventType.split('.')[1]}`;\n\n logger.debug('[MemoryEventQueue] Publishing entity event', {\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n });\n\n this.enqueue(subject, {\n eventType,\n entity,\n context,\n });\n }\n\n /**\n * Add an event to the queue\n */\n enqueue<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): string {\n const id = `evt_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const event: QueuedEvent<T> = {\n id,\n subject,\n data,\n metadata,\n timestamp: new Date(),\n retries: 0,\n maxRetries: this.maxRetries,\n };\n this.queue.push(event);\n void this.processQueue();\n return id;\n }\n\n /**\n * Register a handler for a subject\n */\n registerHandler<T>(subject: string, handler: EventHandler<T>): void {\n this.handlers.set(subject, handler as EventHandler<unknown>);\n }\n\n /**\n * Process the queue\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n\n while (this.queue.length > 0) {\n const event = this.queue.shift();\n if (!event) continue;\n\n const handler = this.handlers.get(event.subject);\n if (handler) {\n try {\n const ackEvent: AcknowledgeableEvent = {\n id: event.id,\n subject: event.subject,\n data: event.data,\n metadata: {\n correlationId: event.id,\n ...event.metadata,\n },\n timestamp: event.timestamp.toISOString(),\n ack: async () => {\n logger.debug('[MemoryEventQueue] Event acknowledged', { id: event.id });\n },\n nak: async () => {\n logger.debug('[MemoryEventQueue] Event negatively acknowledged', { id: event.id });\n if (event.retries < event.maxRetries) {\n event.retries++;\n this.queue.push(event);\n }\n },\n term: async () => {\n logger.debug('[MemoryEventQueue] Event terminated', { id: event.id });\n },\n isRedelivered: () => event.retries > 0,\n getDeliveryAttempt: () => event.retries + 1,\n };\n await handler(ackEvent);\n } catch {\n if (event.retries < event.maxRetries) {\n event.retries++;\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay));\n this.queue.push(event);\n }\n }\n }\n }\n\n this.processing = false;\n }\n\n /**\n * Get queue length\n */\n get length(): number {\n return this.queue.length;\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * Publish an event (fire-and-forget)\n */\n async publish<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): Promise<void> {\n this.enqueue(subject, data, metadata);\n logger.debug('[MemoryEventQueue] Published event', { subject });\n }\n\n /**\n * Close the event queue\n */\n async close(): Promise<void> {\n this.clear();\n this.handlers.clear();\n logger.debug('[MemoryEventQueue] Event queue closed');\n }\n}\n\n/**\n * In-memory event publisher implementation\n */\nexport class MemoryEventPublisher implements IEventPublisher {\n private queue: MemoryEventQueue;\n private _connected = false;\n private publishCount = 0;\n\n constructor() {\n this.queue = new MemoryEventQueue();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventPublisher] Connected (in-memory mode)');\n }\n\n async disconnect(): Promise<void> {\n await this.queue.close();\n this._connected = false;\n logger.info('[MemoryEventPublisher] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventPublisher] ensureStream called (no-op for in-memory)');\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }): Promise<string> {\n if (!this._connected) {\n throw new Error('Publisher not connected');\n }\n\n const messageId = this.queue.enqueue(options.subject, options.data, options.metadata);\n this.publishCount++;\n\n logger.debug('[MemoryEventPublisher] Published', {\n subject: options.subject,\n messageId,\n });\n\n return messageId;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }>\n ): Promise<string[]> {\n const messageIds: string[] = [];\n for (const event of events) {\n const id = await this.publish(event);\n messageIds.push(id);\n }\n return messageIds;\n }\n\n async publishWithAck<T = unknown, R = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n // For in-memory, just publish and return empty response\n await this.publish({\n subject: options.subject,\n data: options.data,\n metadata: options.metadata,\n });\n return {} as R;\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * In-memory event consumer implementation\n */\nexport class MemoryEventConsumer implements IEventConsumer {\n private queue: MemoryEventQueue;\n private bus: MemoryEventBus;\n private _connected = false;\n private _subscriptions: Map<string, ISubscription> = new Map();\n private consumeCount = 0;\n private subIdCounter = 0;\n\n constructor(\n private streamName: string,\n private consumerName: string\n ) {\n this.queue = new MemoryEventQueue();\n this.bus = new MemoryEventBus();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventConsumer] Connected (in-memory mode)', {\n stream: this.streamName,\n consumer: this.consumerName,\n });\n }\n\n async disconnect(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n await this.queue.close();\n this.bus.clear();\n this._connected = false;\n logger.info('[MemoryEventConsumer] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureStream called (no-op for in-memory)');\n }\n\n async ensureConsumer(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureConsumer called (no-op for in-memory)');\n }\n\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n queueGroup?: string;\n }): Promise<ISubscription> {\n if (!this._connected) {\n throw new Error('Consumer not connected');\n }\n\n const { subject, handler } = options;\n const subId = `sub_${++this.subIdCounter}`;\n let messagesReceived = 0;\n let messagesProcessed = 0;\n let messagesFailed = 0;\n let lastActivity = new Date().toISOString();\n let active = true;\n\n // Register with both queue and bus\n this.queue.registerHandler(subject, async (event) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(event as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n this.bus.on(subject, async (data) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(data as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n const subscription: ISubscription = {\n id: subId,\n subject,\n unsubscribe: async () => {\n active = false;\n this._subscriptions.delete(subId);\n logger.debug('[MemoryEventConsumer] Unsubscribed', { subject });\n },\n isActive: () => active,\n getStats: () => ({\n messagesReceived,\n messagesProcessed,\n messagesFailed,\n lastActivity,\n }),\n };\n\n this._subscriptions.set(subId, subscription);\n logger.info('[MemoryEventConsumer] Subscribed', { subject, subscriptionId: subId });\n\n return subscription;\n }\n\n async subscribeMultiple<T = unknown>(subjects: string[], handler: EventHandler<T>): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n for (const subject of subjects) {\n const sub = await this.subscribe<T>({ subject, handler });\n subscriptions.push(sub);\n }\n return subscriptions;\n }\n\n async pull<T = unknown>(): Promise<AcknowledgeableEvent<T>[]> {\n // In-memory doesn't support pull-based consumption in a meaningful way\n logger.debug('[MemoryEventConsumer] pull called (returning empty for in-memory)');\n return [];\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return Array.from(this._subscriptions.values());\n }\n\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n // No-op for in-memory (no DLQ)\n logger.debug('[MemoryEventConsumer] processDLQ called (no-op for in-memory)');\n }\n\n // eslint-disable-next-line sonarjs/no-identical-functions -- Same implementation needed for both Publisher and Consumer\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: 0,\n messagesConsumed: this.consumeCount,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying bus (for testing/debugging)\n */\n getBus(): MemoryEventBus {\n return this.bus;\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * Create an in-memory event publisher\n */\nexport function createMemoryPublisher(): IEventPublisher {\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an in-memory event consumer\n */\nexport function createMemoryConsumer(stream: string, consumer: string): IEventConsumer {\n return new MemoryEventConsumer(stream, consumer);\n}\n\n/**\n * Create a GraphEventEmitter instance (in-memory)\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new MemoryEventQueue();\n}\n","/**\n * Graph Event Emitter\n *\n * Provides a GraphEventEmitter implementation that works with the event queue system.\n * Uses Redis Streams when REDIS_URL is set, in-memory otherwise.\n *\n * @module event-queue/graph-emitter\n * @category Events\n */\nimport { logger } from '../logger/index.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport { QueueType } from './types/config.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * RBAC metadata included in entity lifecycle events.\n * When present, the RBAC consumer will create/update/delete resources accordingly.\n * When absent, only the graph consumer processes the event (strict mode).\n */\nexport interface EntityEventRbacMetadata {\n /** RBAC resource type name (e.g., 'tag', 'conversation', 'bot') */\n resourceTypeName: string;\n /** Human-readable resource name */\n name?: string;\n /** Resource identifier (defaults to entity.id if not provided) */\n identifier?: string;\n /** Parent resource identifier for hierarchy */\n parentResourceIdentifier?: string;\n /** Whether to create a resource in RBAC (default: true) */\n createResource?: boolean;\n}\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void>;\n}\n\n/**\n * Graph Event Emitter (Redis Streams-backed in production).\n *\n * Publishes graph entity events to the Redis Streams event bus for\n * processing by graph sync workers. Falls back to in-memory when\n * neither `GRAPH_REDIS_URL` nor `REDIS_URL` is set.\n *\n * `GRAPH_REDIS_URL` takes priority over `REDIS_URL` so that services\n * whose own cache Redis runs on a different db index (e.g. /14) can\n * still publish to the graph-svc's db index (e.g. /16) without\n * touching their primary Redis config.\n */\nexport class GraphEventEmitterImpl implements GraphEventEmitter {\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor() {\n const graphRedisUrl = process.env['GRAPH_REDIS_URL'] ?? process.env['REDIS_URL'];\n if (graphRedisUrl) {\n this.publisher = EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: graphRedisUrl,\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'graph-emitter',\n });\n const src = process.env['GRAPH_REDIS_URL'] ? 'GRAPH_REDIS_URL' : 'REDIS_URL';\n logger.info(`[GraphEventEmitter] Using Redis Streams publisher (${src})`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info('[GraphEventEmitter] Using in-memory publisher (GRAPH_REDIS_URL / REDIS_URL not configured)');\n }\n }\n\n /**\n * Ensure publisher is connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info('[GraphEventEmitterImpl] Publisher connected');\n });\n\n await this.connecting;\n }\n\n /**\n * Publish entity event to graph queue\n *\n * @param eventType - The lifecycle event type\n * @param entity - Entity data (id, type, data)\n * @param context - Event context (product, org, user, workspace)\n * @param rbac - Optional RBAC metadata. When present, the RBAC consumer will\n * create/update/delete resources. When absent, only graph consumer processes.\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void> {\n await this.ensureConnected();\n\n const eventId = uuidv4();\n const action = eventType.split('.')[1]; // 'created', 'updated', 'deleted'\n const subject = `graph.${context.productName}.${entity.type}.${action}`;\n\n logger.debug('[GraphEventEmitterImpl] Publishing entity event', {\n eventId,\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n hasRbac: !!rbac,\n });\n\n const streamName = process.env['GRAPH_SYNC_STREAM_NAME'] ?? 'WSPACE_GRAPH_EVENTS';\n const streamSubjects = ['graph.>'];\n\n await this.publisher.publish({\n subject,\n data: {\n eventId,\n eventType,\n productSource: context.productName,\n organizationId: context.organizationId,\n entity,\n context: {\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n },\n // Include RBAC metadata when configured (consumed by rbac-entity-consumer)\n ...(rbac && { rbac }),\n timestamp: new Date().toISOString(),\n },\n metadata: {\n eventId,\n productName: context.productName,\n organizationId: context.organizationId,\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n entityType: entity.type,\n entityId: entity.id,\n },\n options: {\n stream: streamName,\n streamSubjects,\n },\n });\n }\n\n /**\n * Disconnect the publisher\n */\n async disconnect(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info('[GraphEventEmitterImpl] Publisher disconnected');\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Singleton instance\n */\nlet _graphEventEmitter: GraphEventEmitterImpl | null = null;\n\n/**\n * Get or create the graph event emitter singleton\n *\n * @returns Graph event emitter instance\n */\nexport function getGraphEventEmitter(): GraphEventEmitter {\n if (!_graphEventEmitter) {\n _graphEventEmitter = new GraphEventEmitterImpl();\n }\n return _graphEventEmitter;\n}\n\n/**\n * Create a new graph event emitter instance (non-singleton)\n *\n * @returns New graph event emitter instance\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new GraphEventEmitterImpl();\n}\n\n/**\n * Reset the singleton (for testing)\n */\nexport async function resetGraphEventEmitter(): Promise<void> {\n if (_graphEventEmitter) {\n await _graphEventEmitter.disconnect();\n _graphEventEmitter = null;\n }\n}\n"]}
|
|
@@ -9,10 +9,47 @@ __export(logger_exports, {
|
|
|
9
9
|
log: () => log,
|
|
10
10
|
logger: () => logger,
|
|
11
11
|
redactSensitiveFields: () => redactSensitiveFields,
|
|
12
|
+
redactSensitiveString: () => redactSensitiveString,
|
|
12
13
|
warn: () => warn
|
|
13
14
|
});
|
|
14
15
|
var REDACTED_VALUE = "[REDACTED]";
|
|
15
16
|
var SENSITIVE_KEY_PATTERN = /(token|password|secret|authorization|api[-_]?key|client[-_]?secret|cookie|session)/i;
|
|
17
|
+
var SENSITIVE_QUERY_PARAMETER_PATTERN = /([?&](?:token|password|secret|authorization|api[-_]?key|client[-_]?secret|cookie|session)=[^&#\s]*)/gi;
|
|
18
|
+
function redactUrlUserInfo(value) {
|
|
19
|
+
let result = value;
|
|
20
|
+
let searchFrom = 0;
|
|
21
|
+
while (searchFrom < result.length) {
|
|
22
|
+
const schemeEnd = result.indexOf("://", searchFrom);
|
|
23
|
+
if (schemeEnd < 1) break;
|
|
24
|
+
const authorityStart = schemeEnd + 3;
|
|
25
|
+
const authorityTerminators = [
|
|
26
|
+
"/",
|
|
27
|
+
"?",
|
|
28
|
+
"#",
|
|
29
|
+
" ",
|
|
30
|
+
"\n",
|
|
31
|
+
"\r",
|
|
32
|
+
" "
|
|
33
|
+
].map((character) => result.indexOf(character, authorityStart)).filter((index) => index >= 0);
|
|
34
|
+
const authorityEnd = authorityTerminators.length > 0 ? Math.min(...authorityTerminators) : result.length;
|
|
35
|
+
const userInfoEnd = result.indexOf("@", authorityStart);
|
|
36
|
+
if (userInfoEnd >= authorityStart && userInfoEnd < authorityEnd) {
|
|
37
|
+
result = `${result.slice(0, authorityStart)}${REDACTED_VALUE}${result.slice(userInfoEnd)}`;
|
|
38
|
+
searchFrom = authorityStart + REDACTED_VALUE.length + 1;
|
|
39
|
+
} else {
|
|
40
|
+
searchFrom = authorityEnd + 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
__name(redactUrlUserInfo, "redactUrlUserInfo");
|
|
46
|
+
function redactSensitiveString(value) {
|
|
47
|
+
return redactUrlUserInfo(value).replace(SENSITIVE_QUERY_PARAMETER_PATTERN, (parameter) => {
|
|
48
|
+
const separatorIndex = parameter.indexOf("=");
|
|
49
|
+
return `${parameter.slice(0, separatorIndex + 1)}${REDACTED_VALUE}`;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
__name(redactSensitiveString, "redactSensitiveString");
|
|
16
53
|
function isPlainObject(value) {
|
|
17
54
|
return typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date);
|
|
18
55
|
}
|
|
@@ -24,6 +61,9 @@ function redactValue(key, value) {
|
|
|
24
61
|
if (Array.isArray(value)) {
|
|
25
62
|
return value.map((item) => redactValue(void 0, item));
|
|
26
63
|
}
|
|
64
|
+
if (typeof value === "string") {
|
|
65
|
+
return redactSensitiveString(value);
|
|
66
|
+
}
|
|
27
67
|
if (isPlainObject(value)) {
|
|
28
68
|
return Object.fromEntries(Object.entries(value).map(([entryKey, entryValue]) => [
|
|
29
69
|
entryKey,
|
|
@@ -135,22 +175,23 @@ var Logger = class _Logger {
|
|
|
135
175
|
}
|
|
136
176
|
const redactedMeta = meta ? redactSensitiveFields(meta) : void 0;
|
|
137
177
|
const redactedContext = this.context ? redactSensitiveFields(this.context) : void 0;
|
|
178
|
+
const safeMessage = redactSensitiveString(message);
|
|
138
179
|
const logEntry = {
|
|
139
180
|
level,
|
|
140
|
-
message,
|
|
181
|
+
message: safeMessage,
|
|
141
182
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
142
183
|
...redactedMeta,
|
|
143
184
|
context: redactedMeta && redactedMeta["context"] || redactedContext,
|
|
144
185
|
...error2 ? {
|
|
145
|
-
error: error2.message,
|
|
146
|
-
stack: error2.stack
|
|
186
|
+
error: redactSensitiveString(error2.message),
|
|
187
|
+
stack: error2.stack ? redactSensitiveString(error2.stack) : void 0
|
|
147
188
|
} : {}
|
|
148
189
|
};
|
|
149
190
|
if (this.enableConsole) {
|
|
150
191
|
this.logToConsole(level, logEntry);
|
|
151
192
|
}
|
|
152
193
|
if (this.transport) {
|
|
153
|
-
this.transport.log(level,
|
|
194
|
+
this.transport.log(level, safeMessage, logEntry);
|
|
154
195
|
}
|
|
155
196
|
}
|
|
156
197
|
/**
|
|
@@ -281,6 +322,6 @@ var debug = /* @__PURE__ */ __name((message, ...args) => {
|
|
|
281
322
|
});
|
|
282
323
|
}, "debug");
|
|
283
324
|
|
|
284
|
-
export { Logger, debug, error, log, logger, logger_exports, redactSensitiveFields, warn };
|
|
285
|
-
//# sourceMappingURL=chunk-
|
|
286
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
export { Logger, debug, error, log, logger, logger_exports, redactSensitiveFields, redactSensitiveString, warn };
|
|
326
|
+
//# sourceMappingURL=chunk-RU266375.js.map
|
|
327
|
+
//# sourceMappingURL=chunk-RU266375.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logger/index.ts"],"names":["REDACTED_VALUE","SENSITIVE_KEY_PATTERN","SENSITIVE_QUERY_PARAMETER_PATTERN","redactUrlUserInfo","value","result","searchFrom","length","schemeEnd","indexOf","authorityStart","authorityTerminators","map","character","filter","index","authorityEnd","Math","min","userInfoEnd","slice","redactSensitiveString","replace","parameter","separatorIndex","isPlainObject","Array","isArray","Date","redactValue","key","test","item","undefined","Object","fromEntries","entries","entryKey","entryValue","redactSensitiveFields","Logger","level","enableConsole","context","transport","config","console","setContext","getContext","debug","message","args","metadata","error","parseArgs","logInternal","info","warn","log","trace","arg","Error","assign","keys","meta","shouldLog","redactedMeta","redactedContext","safeMessage","logEntry","timestamp","toISOString","stack","logToConsole","entry","output","JSON","stringify","levels","createChild","childContext","child","module","withMetadata","close","setLevel","getLevel","setConsoleEnabled","enabled","isConsoleEnabled","addTransport","removeTransport","logger"],"mappings":"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","file":"chunk-RU266375.js","sourcesContent":["/**\n * Logger Module\n * Structured logging compatible with console statements\n * 100% drop-in replacement for console.log/warn/error\n */\n\nimport type { SDKContext } from '../types/index.js';\n\nconst REDACTED_VALUE = '[REDACTED]';\nconst SENSITIVE_KEY_PATTERN = /(token|password|secret|authorization|api[-_]?key|client[-_]?secret|cookie|session)/i;\nconst SENSITIVE_QUERY_PARAMETER_PATTERN =\n /([?&](?:token|password|secret|authorization|api[-_]?key|client[-_]?secret|cookie|session)=[^&#\\s]*)/gi;\n\nfunction redactUrlUserInfo(value: string): string {\n let result = value;\n let searchFrom = 0;\n\n while (searchFrom < result.length) {\n const schemeEnd = result.indexOf('://', searchFrom);\n if (schemeEnd < 1) break;\n\n const authorityStart = schemeEnd + 3;\n const authorityTerminators = ['/', '?', '#', ' ', '\\n', '\\r', '\\t']\n .map((character) => result.indexOf(character, authorityStart))\n .filter((index) => index >= 0);\n const authorityEnd = authorityTerminators.length > 0 ? Math.min(...authorityTerminators) : result.length;\n const userInfoEnd = result.indexOf('@', authorityStart);\n\n if (userInfoEnd >= authorityStart && userInfoEnd < authorityEnd) {\n result = `${result.slice(0, authorityStart)}${REDACTED_VALUE}${result.slice(userInfoEnd)}`;\n searchFrom = authorityStart + REDACTED_VALUE.length + 1;\n } else {\n searchFrom = authorityEnd + 1;\n }\n }\n\n return result;\n}\n\n/**\n * Remove credentials embedded in strings before they reach any logger sink.\n * This covers connection URLs stored under otherwise innocuous metadata keys\n * such as `url`, plus URL-bearing messages, errors, and stack traces.\n */\nexport function redactSensitiveString(value: string): string {\n return redactUrlUserInfo(value).replace(SENSITIVE_QUERY_PARAMETER_PATTERN, (parameter) => {\n const separatorIndex = parameter.indexOf('=');\n return `${parameter.slice(0, separatorIndex + 1)}${REDACTED_VALUE}`;\n });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction redactValue(key: string | undefined, value: unknown): unknown {\n if (key && SENSITIVE_KEY_PATTERN.test(key)) {\n return REDACTED_VALUE;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(undefined, item));\n }\n\n if (typeof value === 'string') {\n return redactSensitiveString(value);\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([entryKey, entryValue]) => [entryKey, redactValue(entryKey, entryValue)])\n );\n }\n\n return value;\n}\n\nexport function redactSensitiveFields<T>(value: T): T {\n return redactValue(undefined, value) as T;\n}\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface LogMeta {\n [key: string]: unknown;\n context?: SDKContext;\n timestamp?: string;\n correlationId?: string;\n}\n\nexport interface LoggerConfig {\n level: LogLevel;\n console: boolean;\n transport?: LoggerTransport;\n}\n\nexport interface LoggerTransport {\n log(level: string, message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Logger class with structured logging support\n */\nexport class Logger {\n private level: LogLevel;\n private enableConsole: boolean;\n private context?: SDKContext;\n private transport?: LoggerTransport;\n\n constructor(config: LoggerConfig = { level: 'info', console: true }) {\n this.level = config.level;\n this.enableConsole = config.console;\n this.transport = config.transport;\n }\n\n /**\n * Set context for all future log entries\n */\n public setContext(context: SDKContext): void {\n this.context = context;\n }\n\n /**\n * Get current context\n */\n public getContext(): SDKContext | undefined {\n return this.context;\n }\n\n /**\n * Debug level logging\n */\n public debug(message: string, ...args: unknown[]): void {\n const { metadata, error } = this.parseArgs(args);\n this.logInternal('debug', message, metadata, error);\n }\n\n /**\n * Info level logging\n */\n public info(message: string, ...args: unknown[]): void {\n const { metadata, error } = this.parseArgs(args);\n this.logInternal('info', message, metadata, error);\n }\n\n /**\n * Warning level logging\n */\n public warn(message: string, ...args: unknown[]): void {\n const { metadata, error } = this.parseArgs(args);\n this.logInternal('warn', message, metadata, error);\n }\n\n /**\n * Error level logging\n */\n public error(message: string, ...args: unknown[]): void {\n const { metadata, error } = this.parseArgs(args);\n this.logInternal('error', message, metadata, error);\n }\n\n /**\n * Generic log method (console-compatible)\n */\n public log(message: string, ...args: unknown[]): void {\n const { metadata, error } = this.parseArgs(args);\n this.logInternal('info', message, metadata, error);\n }\n\n /**\n * Trace level logging (alias for debug)\n */\n public trace(message: string, ...args: unknown[]): void {\n this.debug(message, ...args);\n }\n\n /**\n * Parse variadic arguments into metadata and error\n */\n private parseArgs(args: unknown[]): {\n metadata: Record<string, unknown>;\n error?: Error;\n } {\n const metadata: Record<string, unknown> = {};\n let error: Error | undefined;\n\n for (const arg of args) {\n if (arg instanceof Error) {\n error = arg;\n } else if (typeof arg === 'object' && arg !== null) {\n Object.assign(metadata, arg as Record<string, unknown>);\n } else if (arg !== undefined && arg !== null) {\n // Convert primitive to metadata\n metadata['data'] = arg;\n }\n }\n\n return { metadata: Object.keys(metadata).length > 0 ? metadata : {}, error };\n }\n\n /**\n * Internal log method\n */\n private logInternal(level: LogLevel, message: string, meta?: Record<string, unknown>, error?: Error): void {\n if (!this.shouldLog(level)) {\n return;\n }\n\n const redactedMeta = meta ? redactSensitiveFields(meta) : undefined;\n const redactedContext = this.context ? redactSensitiveFields(this.context) : undefined;\n\n const safeMessage = redactSensitiveString(message);\n const logEntry = {\n level,\n message: safeMessage,\n timestamp: new Date().toISOString(),\n ...redactedMeta,\n context: (redactedMeta && redactedMeta['context']) || redactedContext,\n ...(error\n ? {\n error: redactSensitiveString(error.message),\n stack: error.stack ? redactSensitiveString(error.stack) : undefined,\n }\n : {}),\n };\n\n // Console output\n if (this.enableConsole) {\n this.logToConsole(level, logEntry);\n }\n\n // Custom transport\n if (this.transport) {\n this.transport.log(level, safeMessage, logEntry);\n }\n }\n\n /**\n * Log to console with appropriate method\n */\n private logToConsole(level: LogLevel, entry: Record<string, unknown>): void {\n const output = JSON.stringify(entry, null, 2);\n\n if (level === 'error') {\n console.error(output);\n } else if (level === 'warn') {\n console.warn(output);\n } else {\n console.info(output);\n }\n }\n\n /**\n * Check if log level should be logged\n */\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n\n /**\n * Create child logger with additional context\n */\n public createChild(childContext: Partial<SDKContext>): Logger {\n const child = new Logger({\n level: this.level,\n console: this.enableConsole,\n transport: this.transport,\n });\n child.setContext({ ...this.context, ...childContext });\n return child;\n }\n\n /**\n * Create child logger (alias for createChild, accepts string context)\n */\n public child(context: string): Logger {\n return this.createChild({ module: context });\n }\n\n /**\n * Create logger with metadata context\n */\n public withMetadata(metadata: Record<string, unknown>): {\n log: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n trace: (message: string, ...args: unknown[]) => void;\n } {\n return {\n log: (message: string, ...args: unknown[]) => this.log(message, metadata, ...args),\n error: (message: string, ...args: unknown[]) => this.error(message, metadata, ...args),\n warn: (message: string, ...args: unknown[]) => this.warn(message, metadata, ...args),\n info: (message: string, ...args: unknown[]) => this.info(message, metadata, ...args),\n debug: (message: string, ...args: unknown[]) => this.debug(message, metadata, ...args),\n trace: (message: string, ...args: unknown[]) => this.trace(message, metadata, ...args),\n };\n }\n\n /**\n * Close logger and cleanup resources\n */\n public async close(): Promise<void> {\n // Close custom transport if it has a close method\n if (this.transport && 'close' in this.transport && typeof this.transport.close === 'function') {\n await (this.transport.close as () => Promise<void>)();\n }\n }\n\n /**\n * Change log level\n */\n public setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Get current log level\n */\n public getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Enable or disable console output\n */\n public setConsoleEnabled(enabled: boolean): void {\n this.enableConsole = enabled;\n }\n\n /**\n * Check if console output is enabled\n */\n public isConsoleEnabled(): boolean {\n return this.enableConsole;\n }\n\n /**\n * Add a custom transport\n */\n public addTransport(transport: LoggerTransport): void {\n this.transport = transport;\n }\n\n /**\n * Remove custom transport\n */\n public removeTransport(): void {\n this.transport = undefined;\n }\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new Logger();\n\n/**\n * Console-compatible wrapper functions\n */\nexport const log = (message: string, ...args: unknown[]): void => {\n logger.info(message, { args });\n};\n\nexport const warn = (message: string, ...args: unknown[]): void => {\n logger.warn(message, { args });\n};\n\nexport const error = (message: string, ...args: unknown[]): void => {\n logger.error(message, { args });\n};\n\nexport const debug = (message: string, ...args: unknown[]): void => {\n logger.debug(message, { args });\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ValidationError } from './chunk-QGBXVNRM.js';
|
|
2
|
-
import { logger } from './chunk-
|
|
2
|
+
import { logger } from './chunk-RU266375.js';
|
|
3
3
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
4
4
|
|
|
5
5
|
// src/database/connections/clickhouse.ts
|
|
@@ -505,5 +505,5 @@ var DatabaseModule = class {
|
|
|
505
505
|
};
|
|
506
506
|
|
|
507
507
|
export { DatabaseModule, closeClickHouseConnection, createTable, executeQuery, getClickHouseClient, getClickHouseStats, insertData, testClickHouseConnection };
|
|
508
|
-
//# sourceMappingURL=chunk-
|
|
509
|
-
//# sourceMappingURL=chunk-
|
|
508
|
+
//# sourceMappingURL=chunk-UD5PPGVU.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-UD5PPGVU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-A6DGEZJ4.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to Apache AGE — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-UD5PPGVU.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to Apache AGE — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RedisStreamsConnection, isWildcard, streamKey, boundaryOf, dlqKey, registryKey, delayQueueKey, delayLockKey, dedupKey, replyKey, matchSubject } from './chunk-
|
|
2
|
-
import { registerDisposable, unregisterDisposable } from './chunk-
|
|
3
|
-
import { logger } from './chunk-
|
|
1
|
+
import { RedisStreamsConnection, isWildcard, streamKey, boundaryOf, dlqKey, registryKey, delayQueueKey, delayLockKey, dedupKey, replyKey, matchSubject } from './chunk-LKCBI6B2.js';
|
|
2
|
+
import { registerDisposable, unregisterDisposable } from './chunk-KO2ZXZ7W.js';
|
|
3
|
+
import { logger } from './chunk-RU266375.js';
|
|
4
4
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
5
5
|
import { randomUUID } from 'crypto';
|
|
6
6
|
import { hostname } from 'os';
|
|
@@ -983,5 +983,5 @@ var EventQueueFactory = class _EventQueueFactory {
|
|
|
983
983
|
};
|
|
984
984
|
|
|
985
985
|
export { EventQueueFactory, QueueType, RedisStreamsEventConsumer, RedisStreamsEventPublisher, resolveQueueType };
|
|
986
|
-
//# sourceMappingURL=chunk-
|
|
987
|
-
//# sourceMappingURL=chunk-
|
|
986
|
+
//# sourceMappingURL=chunk-UFXHLQ2T.js.map
|
|
987
|
+
//# sourceMappingURL=chunk-UFXHLQ2T.js.map
|