@burdenoff/be-sdk 2026.513.3 → 2026.513.5

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.
Files changed (48) hide show
  1. package/dist/EventQueueFactory-FNE7H66N.js +8 -0
  2. package/dist/{EventQueueFactory-TWDDFMQY.js.map → EventQueueFactory-FNE7H66N.js.map} +1 -1
  3. package/dist/{chunk-QKJR4L7B.js → chunk-COSUYUCB.js} +3 -149
  4. package/dist/chunk-COSUYUCB.js.map +1 -0
  5. package/dist/{chunk-Y4TPKRZB.js → chunk-DR5AQJT6.js} +3 -3
  6. package/dist/{chunk-Y4TPKRZB.js.map → chunk-DR5AQJT6.js.map} +1 -1
  7. package/dist/{chunk-EMSON3UD.js → chunk-KSO6QQVD.js} +10 -952
  8. package/dist/chunk-KSO6QQVD.js.map +1 -0
  9. package/dist/{chunk-L72RC2EI.js → chunk-LRL6GKXI.js} +3 -3
  10. package/dist/{chunk-L72RC2EI.js.map → chunk-LRL6GKXI.js.map} +1 -1
  11. package/dist/{chunk-MI72VKNQ.js → chunk-NUZZRJNN.js} +5 -171
  12. package/dist/chunk-NUZZRJNN.js.map +1 -0
  13. package/dist/{chunk-Q6HJARHV.js → chunk-S52PJKSW.js} +3 -3
  14. package/dist/{chunk-Q6HJARHV.js.map → chunk-S52PJKSW.js.map} +1 -1
  15. package/dist/{chunk-OMKFTTAN.js → chunk-SXIL2AJF.js} +5 -5
  16. package/dist/{chunk-OMKFTTAN.js.map → chunk-SXIL2AJF.js.map} +1 -1
  17. package/dist/{chunk-UVYDP6P6.js → chunk-VOFKF27Q.js} +2 -3
  18. package/dist/chunk-VOFKF27Q.js.map +1 -0
  19. package/dist/{chunk-3JBKPVWY.js → chunk-WPGSKLAG.js} +5 -24
  20. package/dist/chunk-WPGSKLAG.js.map +1 -0
  21. package/dist/config-7U7J3QXQ.js +4 -0
  22. package/dist/{config-QVYSAUMT.js.map → config-7U7J3QXQ.js.map} +1 -1
  23. package/dist/esm-K6H7EIWK.js +1450 -0
  24. package/dist/esm-K6H7EIWK.js.map +1 -0
  25. package/dist/event-queue/index.d.ts +1 -1
  26. package/dist/event-queue/index.js +5 -5
  27. package/dist/graph/index.js +6 -6
  28. package/dist/graphql/index.d.ts +1 -1
  29. package/dist/graphql/index.js +2 -2
  30. package/dist/{index-eUvoVdr7.d.ts → index-BF2uh_h9.d.ts} +2 -158
  31. package/dist/{index-CDFQRL-h.d.ts → index-HkD7NBED.d.ts} +2 -24
  32. package/dist/index.d.ts +3 -3
  33. package/dist/index.js +12 -12
  34. package/dist/init/index.js +4 -4
  35. package/dist/prisma/index.js +5 -5
  36. package/dist/server/index.js +20 -0
  37. package/dist/server/index.js.map +1 -1
  38. package/dist/telemetry/index.js.map +1 -1
  39. package/package.json +3 -14
  40. package/dist/EventQueueFactory-TWDDFMQY.js +0 -8
  41. package/dist/chunk-3JBKPVWY.js.map +0 -1
  42. package/dist/chunk-EMSON3UD.js.map +0 -1
  43. package/dist/chunk-MI72VKNQ.js.map +0 -1
  44. package/dist/chunk-QKJR4L7B.js.map +0 -1
  45. package/dist/chunk-UVYDP6P6.js.map +0 -1
  46. package/dist/config-QVYSAUMT.js +0 -4
  47. package/dist/esm-M2M7HGV4.js +0 -1356
  48. package/dist/esm-M2M7HGV4.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/be-sdk",
3
- "version": "2026.513.3",
3
+ "version": "2026.513.5",
4
4
  "description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -113,7 +113,8 @@
113
113
  "dependencies": {
114
114
  "@graphql-yoga/logger": "^2.0.1",
115
115
  "@prisma/generator-helper": "^7.2.0",
116
- "@sinclair/typebox": "^0.34.45"
116
+ "@sinclair/typebox": "^0.34.45",
117
+ "jose": "^6.1.2"
117
118
  },
118
119
  "peerDependencies": {
119
120
  "@clickhouse/client": "^1.14.0",
@@ -133,21 +134,13 @@
133
134
  "graphql-request": "^7.3.5",
134
135
  "graphql-yoga": "^5.17.0",
135
136
  "@valkey/valkey-glide": "^2.2.6",
136
- "jose": "^6.1.2",
137
137
  "jsonwebtoken": "^9.0.2",
138
138
  "nats": "^2.29.3",
139
- "ioredis": "^5.4.1",
140
139
  "pg": "^8.16.3",
141
140
  "prom-client": "^15.1.3",
142
141
  "reflect-metadata": "^0.2.2"
143
142
  },
144
143
  "peerDependenciesMeta": {
145
- "ioredis": {
146
- "optional": true
147
- },
148
- "nats": {
149
- "optional": true
150
- },
151
144
  "@clickhouse/client": {
152
145
  "optional": true
153
146
  },
@@ -166,9 +159,6 @@
166
159
  "@prisma/adapter-pg": {
167
160
  "optional": true
168
161
  },
169
- "jose": {
170
- "optional": true
171
- },
172
162
  "jsonwebtoken": {
173
163
  "optional": true
174
164
  },
@@ -223,7 +213,6 @@
223
213
  "jose": "^6.1.3",
224
214
  "jsonwebtoken": "^9.0.3",
225
215
  "lefthook": "^2.1.1",
226
- "ioredis": "^5.4.1",
227
216
  "nats": "^2.29.3",
228
217
  "pg": "^8.16.3",
229
218
  "prettier": "^3.7.4",
@@ -1,8 +0,0 @@
1
- export { EventQueueFactory } from './chunk-EMSON3UD.js';
2
- import './chunk-UVYDP6P6.js';
3
- import './chunk-QKJR4L7B.js';
4
- import './chunk-NGMEI42S.js';
5
- import './chunk-CBZNP6RF.js';
6
- import './chunk-XE4OXN2W.js';
7
- //# sourceMappingURL=EventQueueFactory-TWDDFMQY.js.map
8
- //# sourceMappingURL=EventQueueFactory-TWDDFMQY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","natsServers","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","isRedisStreamsSelected","raw","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-3JBKPVWY.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n NATSConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export NATS implementations (in case direct access is needed)\nexport { NatsEventPublisher } from './implementations/nats/NatsEventPublisher.js';\nexport { NatsEventConsumer } from './implementations/nats/NatsEventConsumer.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export NATS-based Graph Event Emitter (recommended for production)\nexport {\n NatsGraphEventEmitter,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\nfunction isRedisStreamsSelected(): boolean {\n const raw = (process.env['EVENT_QUEUE_TYPE'] ?? process.env['QUEUE_TYPE'] ?? '').toLowerCase();\n if (raw === 'redis-streams' || raw === 'redis' || raw === 'streams') return true;\n if (raw === 'nats') return false;\n // Auto-select redis-streams when REDIS_URL is set and NATS is not.\n return !!process.env['REDIS_URL'] && !process.env['NATS_URL'] && !process.env['NATS_SERVERS'];\n}\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `EVENT_QUEUE_TYPE=redis-streams` → Redis Streams\n * - `EVENT_QUEUE_TYPE=nats` → NATS\n * - `REDIS_URL` set & no `NATS_URL` → Redis Streams\n * - `NATS_URL`/`NATS_SERVERS` set → NATS\n * - none of the above → in-memory (dev/test fallback)\n */\nexport function createPublisher(): IEventPublisher {\n if (isRedisStreamsSelected() && process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n const natsServers = process.env['NATS_SERVERS'] || process.env['NATS_URL'];\n if (!natsServers) {\n return new MemoryEventPublisher();\n }\n if (!process.env['NATS_SERVERS'] && process.env['NATS_URL']) {\n process.env['NATS_SERVERS'] = process.env['NATS_URL'];\n }\n return EventQueueFactory.createPublisherFromEnv();\n}\n\n/**\n * Create an event consumer from environment configuration.\n * See `createPublisher` for backend-resolution semantics.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (isRedisStreamsSelected() && process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n const natsServers = process.env['NATS_SERVERS'] || process.env['NATS_URL'];\n if (!natsServers) {\n return new MemoryEventConsumer(stream, consumer);\n }\n if (!process.env['NATS_SERVERS'] && process.env['NATS_URL']) {\n process.env['NATS_SERVERS'] = process.env['NATS_URL'];\n }\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n const natsServers = process.env['NATS_SERVERS'] || process.env['NATS_URL'];\n if (natsServers) {\n // Ensure NATS_SERVERS is set for downstream factory\n if (!process.env['NATS_SERVERS'] && process.env['NATS_URL']) {\n process.env['NATS_SERVERS'] = process.env['NATS_URL'];\n }\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using NATS publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (NATS_SERVERS not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\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(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] 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 * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to NATS JetStream queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/event-queue/implementations/nats/trace-context.ts","../src/event-queue/implementations/nats/NatsEventConsumer.ts","../src/event-queue/implementations/nats/NatsEventPublisher.ts","../src/event-queue/implementations/redis-streams/keyspace.ts","../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventPublisher.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","setter","set","carrier","key","value","getter","get","keys","Object","injectW3CTraceContext","hdrs","api","propagation","inject","context","active","entries","err","error","Error","message","String","extractW3CTraceContext","undefined","extract","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_STREAM_MAX_BYTES","NatsSubscription","stats","messagesReceived","messagesProcessed","messagesFailed","lastActivity","Date","toISOString","id","stopFn","unsubscribe","isActive","getStats","incrementReceived","incrementProcessed","incrementFailed","NatsEventConsumer","connectionManager","subscriptions","Map","config","baseConfig","type","url","user","password","token","creds","credsFile","maxReconnectAttempts","reconnectTimeWait","connectionTimeout","name","NatsConnectionManager","connect","disconnect","unsubscribeAll","isConnected","healthCheck","status","timestamp","connected","details","activeSubscriptions","size","getStatistics","totalReceived","totalProcessed","totalFailed","subscription","values","messagesPublished","messagesConsumed","activeConsumers","activePublishers","queueSize","ensureStream","jsm","getJetStreamManager","streams","info","stream","streamConfig","subjects","retention","mapRetentionPolicy","storage","mapStorageType","max_consumers","maxConsumers","max_msgs","maxMsgs","max_bytes","maxBytes","max_age","maxAge","duplicate_window","duplicateWindow","add","ensureConsumer","consumers","consumer","durable_name","filter_subject","filterSubject","ack_policy","mapAckPolicy","ackPolicy","deliver_policy","mapDeliverPolicy","deliverPolicy","max_deliver","maxDeliver","ack_wait","ackWait","max_ack_pending","maxAckPending","includes","deriveStreamSubjects","firstSegment","split","replace","subscribe","options","js","getJetStream","streamName","consumerName","streamSubjects","errorMessage","find","requestedStream","subscriptionId","now","crypto","randomUUID","substring","stopRequested","consumeMessages","maxConcurrent","catch","subscribeMultiple","push","pull","messages","fetch","max_messages","batch","expires","timeout","events","msg","event","wrapMessage","unsubscribePromises","Array","from","map","all","clear","getSubscriptions","processDLQ","_handler","warn","listSubjects","consume","headers","nak","eventMessage","JSON","parse","data","toString","sequence","seq","ack","delay","term","isRedelivered","redelivered","getDeliveryAttempt","deliveryCount","policy","toLowerCase","RetentionPolicy","Limits","Interest","Workqueue","StorageType","Memory","File","AckPolicy","None","All","Explicit","DeliverPolicy","New","Last","LastPerSubject","NatsEventPublisher","publishCount","lastPublishTime","list","next","streamCount","length","deriveStreamName","toUpperCase","publish","messageId","generateMessageId","metadata","source","correlationId","generateCorrelationId","userId","workspaceId","priority","defaultPriority","publishOpts","msgID","enableDeduplication","ttl","stringify","publishBatch","results","publishWithAck","nc","getNatsConnection","response","request","DEFAULT_PREFIX","REGISTRY_PREFIX","DELAYQ_PREFIX","DELAYQ_LOCK_PREFIX","DLQ_PREFIX","DEDUP_PREFIX","REPLY_PREFIX","subjectToKey","streamKey","opts","prefix","registryKey","boundary","boundaryOf","first","delayQueueKey","delayLockKey","dlqKey","dedupKey","msgId","replyKey","matchSubject","pattern","pParts","sParts","last","i","isWildcard","TRACE_KEYS","injectTraceFields","c","k","v","extractTraceContext","fields","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","receivedCount","processedCount","failedCount","unsubscribeFn","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","connection","subscriptionLoops","Set","keyPrefix","group","ackWaitMs","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","RedisStreamsConnection","process","env","hostname","pid","Math","max","round","t","setInterval","sweepPending","unref","drainDelayQueues","clearInterval","t0","pong","ping","latencyMs","_config","sub","filter","s","startId","resolveStartId","wildcard","handlerFn","ensureGroup","spawnLoop","refresh","client","getClient","smembers","has","out","raw","xreadgroup","rawFields","parsed","parseEntry","toAcknowledgeable","dlqGroup","dlq","xgroup","res","evt","_stream","seen","members","m","loop","makeBlockingClient","setTimeout","val","acked","xack","xdel","score","payload","zadd","flat","xadd","claimed","xautoclaim","pending","xpending","isArray","lockKey","got","due","zrangebyscore","member","indexOf","slice","zrem","del","RedisStreamsEventPublisher","maxLen","dedupTtl","parseInt","dedupTtlSeconds","publishInternal","enableDedup","ok","tenantId","sadd","e","reply","replyTo","timeoutMs","xrange","payloadIdx","sendReply","expire","resolveQueueType","QueueType","REDIS_STREAMS","NATS","EventQueueFactory","createPublisher","createConsumer","createPublisherFromEnv","defaultTTL","createConsumerFromEnv","createPublisherForLayer","layer","serviceName","envPrefix","defaults","DEFAULT_LAYER_RESOURCES","natsUrl","createConsumerForLayer"],"mappings":"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","file":"chunk-EMSON3UD.js","sourcesContent":["/**\n * W3C trace context injection/extraction for NATS headers.\n *\n * Uses `@opentelemetry/api` when available to read/write `traceparent`,\n * `tracestate`, and `baggage` headers. When the API module isn't installed\n * (optional peer dep), these helpers are no-ops so NATS continues to work.\n */\nimport { logger } from '../../../logger/index.js';\nimport type { MsgHdrs } from 'nats';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) {\n return otelApiPromise;\n }\n otelApiPromise = (async () => {\n try {\n // Dynamic import so services without OTel installed still work.\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[trace-context] @opentelemetry/api not available; NATS traces disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst setter = {\n set(carrier: Record<string, string>, key: string, value: string): void {\n carrier[key] = value;\n },\n};\n\nconst getter = {\n get(carrier: Record<string, string>, key: string): string | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n};\n\n/**\n * Inject the active W3C trace context into the given NATS headers.\n * Adds `traceparent`, `tracestate`, and `baggage` when present in the\n * active context.\n */\nexport async function injectW3CTraceContext(hdrs: MsgHdrs): Promise<void> {\n const api = await loadOtelApi();\n if (!api) return;\n try {\n const carrier: Record<string, string> = {};\n api.propagation.inject(api.context.active(), carrier, setter);\n for (const [key, value] of Object.entries(carrier)) {\n if (value) hdrs.set(key, value);\n }\n } catch (err) {\n logger.debug('[trace-context] injection failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Extract a W3C trace context from the given NATS headers and return the\n * resulting OTel context. Callers wrap their handler in `context.with(...)`\n * to stitch parent spans.\n */\nexport async function extractW3CTraceContext(hdrs: MsgHdrs | undefined): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api || !hdrs) return undefined;\n try {\n const carrier: Record<string, string> = {};\n for (const key of ['traceparent', 'tracestate', 'baggage']) {\n const value = hdrs.get(key);\n if (value) carrier[key] = value;\n }\n return api.propagation.extract(api.context.active(), carrier, getter);\n } catch (err) {\n logger.debug('[trace-context] extraction failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n return undefined;\n }\n}\n\n/**\n * Wrap a NATS consumer handler in a CONSUMER-kind span rooted at the\n * extracted W3C context. If OTel isn't available, the handler runs\n * directly. Errors are recorded on the span and re-thrown so ack/nak\n * semantics are preserved by the caller.\n */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n hdrs: MsgHdrs | undefined,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractW3CTraceContext(hdrs);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/nats');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `nats.consume ${subject}`,\n { kind: 5, attributes: { 'messaging.system': 'nats', 'messaging.destination.name': subject } },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch (err) {\n logger.debug('[trace-context] consumer span failed to start; running without span', {\n error: err instanceof Error ? err.message : String(err),\n });\n return handler();\n }\n}\n","/**\n * NATS Event Consumer Implementation\n * Implements IEventConsumer interface for NATS JetStream\n */\nimport { logger } from '../../../logger/index.js';\nimport { runWithConsumerSpan } from './trace-context.js';\nimport {\n AckPolicy,\n type Consumer,\n DeliverPolicy,\n type JsMsg,\n type StreamConfig as NatsStreamConfig,\n RetentionPolicy,\n StorageType,\n} from 'nats';\n\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type {\n AcknowledgeableEvent,\n ConsumerConfig,\n EventHandler,\n EventMessage,\n EventQueueHealthCheckResult,\n QueueStatistics,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/index.js';\nimport { NatsConnectionManager } from './NatsConnection.js';\n\nconst DEFAULT_STREAM_MAX_BYTES = 10 * 1024 * 1024;\n\n/**\n * NATS Subscription Implementation\n */\nclass NatsSubscription implements ISubscription {\n private active: boolean = true;\n private stats = {\n messagesReceived: 0,\n messagesProcessed: 0,\n messagesFailed: 0,\n lastActivity: new Date().toISOString(),\n };\n\n constructor(\n public readonly id: string,\n public readonly subject: string,\n private stopFn: () => void\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) {\n return Promise.resolve();\n }\n this.active = false;\n this.stopFn();\n return Promise.resolve();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.stats.messagesReceived,\n messagesProcessed: this.stats.messagesProcessed,\n messagesFailed: this.stats.messagesFailed,\n lastActivity: this.stats.lastActivity,\n };\n }\n\n incrementReceived(): void {\n this.stats.messagesReceived++;\n this.stats.lastActivity = new Date().toISOString();\n }\n\n incrementProcessed(): void {\n this.stats.messagesProcessed++;\n this.stats.lastActivity = new Date().toISOString();\n }\n\n incrementFailed(): void {\n this.stats.messagesFailed++;\n this.stats.lastActivity = new Date().toISOString();\n }\n}\n\n/**\n * NATS implementation of IEventConsumer\n */\nexport class NatsEventConsumer implements IEventConsumer {\n private connectionManager: NatsConnectionManager;\n private subscriptions: Map<string, NatsSubscription> = new Map();\n\n constructor(private config: ConsumerConfig) {\n // Create base config for connection manager\n const baseConfig = {\n type: config.type || 'nats',\n url: config.url || 'nats://localhost:4222',\n user: config.user,\n password: config.password,\n token: config.token,\n creds: config.creds,\n credsFile: config.credsFile,\n maxReconnectAttempts: config.maxReconnectAttempts,\n reconnectTimeWait: config.reconnectTimeWait,\n connectionTimeout: config.connectionTimeout,\n name: config.name,\n };\n this.connectionManager = new NatsConnectionManager(baseConfig);\n }\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n await this.connectionManager.connect();\n }\n\n /**\n * Disconnect from NATS server\n */\n async disconnect(): Promise<void> {\n await this.unsubscribeAll();\n await this.connectionManager.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n await Promise.resolve();\n const isConnected = this.isConnected();\n\n return {\n status: isConnected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: isConnected,\n details: {\n type: 'nats',\n url: this.config.url,\n activeSubscriptions: this.subscriptions.size,\n },\n };\n }\n\n /**\n * Get queue statistics\n */\n async getStatistics(): Promise<QueueStatistics> {\n await Promise.resolve();\n let totalReceived = 0;\n let totalProcessed = 0;\n let totalFailed = 0;\n let lastActivity: string | null = null;\n\n for (const subscription of this.subscriptions.values()) {\n const stats = subscription.getStats();\n totalReceived += stats.messagesReceived;\n totalProcessed += stats.messagesProcessed;\n totalFailed += stats.messagesFailed;\n\n if (stats.lastActivity && (!lastActivity || stats.lastActivity > lastActivity)) {\n lastActivity = stats.lastActivity;\n }\n }\n\n return {\n messagesPublished: 0, // Consumer doesn't track publishing\n messagesConsumed: totalProcessed,\n messagesFailed: totalFailed,\n activeConsumers: this.subscriptions.size,\n activePublishers: 0,\n queueSize: 0,\n lastActivity: lastActivity,\n details: {\n totalReceived,\n type: 'nats',\n },\n };\n }\n\n /**\n * Ensure a stream exists\n */\n async ensureStream(config: StreamConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n // Check if stream exists\n try {\n await jsm.streams.info(config.name);\n logger.debug('[NatsEventConsumer] Stream already exists', {\n stream: config.name,\n });\n return;\n } catch {\n // Stream doesn't exist, create it\n }\n\n const streamConfig: Partial<NatsStreamConfig> = {\n name: config.name,\n subjects: config.subjects,\n retention: this.mapRetentionPolicy(config.retention),\n storage: this.mapStorageType(config.storage),\n max_consumers: config.maxConsumers,\n max_msgs: config.maxMsgs,\n max_bytes: config.maxBytes ?? DEFAULT_STREAM_MAX_BYTES,\n max_age: config.maxAge,\n duplicate_window: config.duplicateWindow,\n };\n\n await jsm.streams.add(streamConfig);\n\n logger.info('[NatsEventConsumer] Stream created successfully', {\n stream: config.name,\n subjects: config.subjects,\n });\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to ensure stream', {\n stream: config.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Ensure a consumer exists\n */\n async ensureConsumer(config: ConsumerConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n await jsm.consumers.add(config.stream, {\n name: config.consumer,\n durable_name: config.consumer,\n filter_subject: config.filterSubject,\n ack_policy: this.mapAckPolicy(config.ackPolicy),\n deliver_policy: this.mapDeliverPolicy(config.deliverPolicy),\n max_deliver: config.maxDeliver || 3,\n ack_wait: config.ackWait || 30_000_000_000, // 30 seconds in nanoseconds\n max_ack_pending: config.maxAckPending || 100,\n });\n\n logger.info('[NatsEventConsumer] Consumer created successfully', {\n stream: config.stream,\n consumer: config.consumer,\n });\n } catch (error) {\n if (error instanceof Error && error.message?.includes('already exists')) {\n logger.debug('[NatsEventConsumer] Consumer already exists', {\n stream: config.stream,\n consumer: config.consumer,\n });\n } else {\n logger.error('[NatsEventConsumer] Failed to ensure consumer', {\n stream: config.stream,\n consumer: config.consumer,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n }\n\n /**\n * Derive stream subject pattern from subscription subject\n * Examples:\n * - \"channel.conversation.message\" → [\"channel.>\"]\n * - \"wspace.tags.created\" → [\"wspace.>\"]\n * - \"global.auth.login\" → [\"global.>\"]\n */\n private deriveStreamSubjects(subject: string): string[] {\n // Extract the first segment and create a wildcard pattern\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return [`${firstSegment}.>`];\n }\n // Fallback to the subject itself with a wildcard\n return [`${subject.replace(/\\.[^.]+$/, '.>')}`];\n }\n\n /**\n * Subscribe to a subject\n */\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n const js = this.connectionManager.getJetStream();\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n let streamName = options.options?.stream || this.config.stream;\n const consumerName =\n options.options?.consumer || `${this.config.consumer}-${options.subject.replace(/\\./g, '-')}`;\n\n // Auto-create stream if it doesn't exist\n // Derive subjects from the subscription subject pattern\n const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);\n try {\n await this.ensureStream({\n name: streamName,\n subjects: streamSubjects,\n retention: options.options?.retention || 'limits',\n storage: options.options?.storage || 'file',\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('subjects overlap')) {\n throw error;\n }\n\n streamName = await jsm.streams.find(options.subject);\n logger.info('[NatsEventConsumer] Using existing stream for overlapping subject', {\n requestedStream: options.options?.stream || this.config.stream,\n stream: streamName,\n subject: options.subject,\n });\n }\n\n // Ensure consumer exists\n await this.ensureConsumer({\n type: this.config.type,\n url: this.config.url,\n consumer: consumerName,\n stream: streamName,\n filterSubject: options.subject,\n ackPolicy: options.options?.ackPolicy,\n deliverPolicy: options.options?.deliverPolicy,\n maxDeliver: options.options?.maxDeliver || this.config.maxDeliver,\n ackWait: options.options?.ackWait || this.config.ackWait,\n maxAckPending: options.options?.maxAckPending,\n });\n\n // Get consumer\n const consumer = await js.consumers.get(streamName, consumerName);\n\n const subscriptionId = `sub_${Date.now()}_${crypto.randomUUID().substring(0, 7)}`;\n let stopRequested = false;\n\n // Create subscription\n const stopFn = (): void => {\n stopRequested = true;\n };\n\n const subscription = new NatsSubscription(subscriptionId, options.subject, stopFn);\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Start consuming messages\n this.consumeMessages(\n consumer,\n subscription,\n options.handler,\n options.options?.maxConcurrent || this.config.maxConcurrent || 1,\n () => stopRequested\n ).catch((error) => {\n logger.error('[NatsEventConsumer] Error in message consumption loop', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n });\n\n logger.info('[NatsEventConsumer] Subscription created', {\n subscriptionId,\n subject: options.subject,\n });\n\n return subscription;\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to subscribe', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Subscribe to multiple subjects\n */\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n\n for (const subject of subjects) {\n const subscription = await this.subscribe({\n subject,\n handler,\n options,\n });\n subscriptions.push(subscription);\n }\n\n return subscriptions;\n }\n\n /**\n * Pull messages manually\n */\n async pull<T = unknown>(options: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n const js = this.connectionManager.getJetStream();\n\n try {\n const consumer = await js.consumers.get(this.config.stream, this.config.consumer);\n\n const messages = await consumer.fetch({\n max_messages: options.batch || 10,\n expires: options.timeout || 30000,\n });\n\n const events: AcknowledgeableEvent<T>[] = [];\n\n for await (const msg of messages) {\n const event = this.wrapMessage<T>(msg);\n events.push(event);\n }\n\n return events;\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to pull messages', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Unsubscribe from all active subscriptions\n */\n async unsubscribeAll(): Promise<void> {\n const unsubscribePromises = Array.from(this.subscriptions.values()).map(async (subscription) =>\n subscription.unsubscribe()\n );\n\n await Promise.all(unsubscribePromises);\n\n this.subscriptions.clear();\n\n logger.info('[NatsEventConsumer] All subscriptions unsubscribed');\n }\n\n /**\n * Get all active subscriptions\n */\n getSubscriptions(): ISubscription[] {\n return Array.from(this.subscriptions.values());\n }\n\n /**\n * Process pending messages in dead letter queue\n */\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n await Promise.resolve();\n // Would need to implement DLQ stream pattern\n logger.warn('[NatsEventConsumer] DLQ processing not yet implemented');\n }\n\n /**\n * List subjects for the configured stream\n */\n async listSubjects(streamName?: string): Promise<string[]> {\n const jsm = this.connectionManager.getJetStreamManager();\n const info = await jsm.streams.info(streamName || this.config.stream);\n return info.config.subjects || [];\n }\n\n /**\n * Consume messages from consumer\n */\n private async consumeMessages<T>(\n consumer: Consumer,\n subscription: NatsSubscription,\n handler: EventHandler<T>,\n maxConcurrent: number,\n stopRequested: () => boolean\n ): Promise<void> {\n try {\n const messages = await consumer.consume({\n max_messages: maxConcurrent,\n expires: 30000, // 30 seconds\n });\n\n for await (const msg of messages) {\n if (stopRequested()) {\n break;\n }\n\n subscription.incrementReceived();\n\n try {\n const event = this.wrapMessage<T>(msg);\n // Wrap in a CONSUMER-kind span rooted at the producer's trace\n // context (if present in headers). No-op when OTel isn't installed.\n await runWithConsumerSpan(msg.subject, msg.headers, async () => handler(event));\n subscription.incrementProcessed();\n } catch (error) {\n subscription.incrementFailed();\n logger.error('[NatsEventConsumer] Error processing message', {\n subject: msg.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n // Don't ack - let it retry\n msg.nak();\n }\n }\n } catch (error) {\n logger.error('[NatsEventConsumer] Error consuming messages', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Wrap NATS message in AcknowledgeableEvent\n */\n private wrapMessage<T>(msg: JsMsg): AcknowledgeableEvent<T> {\n const eventMessage: EventMessage<T> = JSON.parse(msg.data.toString());\n\n return {\n ...eventMessage,\n sequence: msg.seq,\n ack: async (): Promise<void> => {\n await Promise.resolve();\n msg.ack();\n },\n nak: async (delay?: number): Promise<void> => {\n await Promise.resolve();\n if (delay) {\n msg.nak(delay);\n } else {\n msg.nak();\n }\n },\n term: async (): Promise<void> => {\n await Promise.resolve();\n msg.term();\n },\n isRedelivered: (): boolean => {\n return msg.redelivered;\n },\n getDeliveryAttempt: (): number => {\n return msg.info.deliveryCount;\n },\n };\n }\n\n /**\n * Map retention policy string to NATS enum\n */\n private mapRetentionPolicy(policy?: string): RetentionPolicy {\n switch (policy?.toLowerCase()) {\n case 'limits':\n return RetentionPolicy.Limits;\n case 'interest':\n return RetentionPolicy.Interest;\n case 'workqueue':\n default:\n return RetentionPolicy.Workqueue;\n }\n }\n\n /**\n * Map storage type string to NATS enum\n */\n private mapStorageType(storage?: string): StorageType {\n switch (storage?.toLowerCase()) {\n case 'memory':\n return StorageType.Memory;\n case 'file':\n default:\n return StorageType.File;\n }\n }\n\n /**\n * Map ack policy string to NATS enum\n */\n private mapAckPolicy(policy?: string): AckPolicy {\n switch (policy?.toLowerCase()) {\n case 'none':\n return AckPolicy.None;\n case 'all':\n return AckPolicy.All;\n case 'explicit':\n default:\n return AckPolicy.Explicit;\n }\n }\n\n /**\n * Map deliver policy string to NATS enum\n */\n private mapDeliverPolicy(policy?: string): DeliverPolicy {\n switch (policy?.toLowerCase()) {\n case 'new':\n return DeliverPolicy.New;\n case 'last':\n return DeliverPolicy.Last;\n case 'lastpersubject':\n return DeliverPolicy.LastPerSubject;\n case 'all':\n default:\n return DeliverPolicy.All;\n }\n }\n}\n","/**\n * NATS Event Publisher Implementation\n * Implements IEventPublisher interface for NATS JetStream\n */\nimport { logger } from '../../../logger/index.js';\nimport { injectW3CTraceContext } from './trace-context.js';\nimport { type StreamConfig as NatsStreamConfig, RetentionPolicy, StorageType, headers } from 'nats';\n\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig } from '../../types/config.js';\nimport type {\n EventMessage,\n EventMetadata,\n EventQueueHealthCheckResult,\n QueueStatistics,\n StreamConfig,\n} from '../../types/index.js';\nimport { NatsConnectionManager } from './NatsConnection.js';\n\nconst DEFAULT_STREAM_MAX_BYTES = 10 * 1024 * 1024;\n\n/**\n * NATS implementation of IEventPublisher\n */\nexport class NatsEventPublisher implements IEventPublisher {\n private connectionManager: NatsConnectionManager;\n private publishCount: number = 0;\n private lastPublishTime: Date | null = null;\n\n constructor(private config: PublisherConfig) {\n this.connectionManager = new NatsConnectionManager(config);\n }\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n await this.connectionManager.connect();\n }\n\n /**\n * Disconnect from NATS server\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n await Promise.resolve();\n const isConnected = this.isConnected();\n\n return {\n status: isConnected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n details: {\n connected: isConnected,\n type: 'nats',\n url: this.config.url,\n },\n };\n }\n\n /**\n * Get queue statistics\n */\n async getStatistics(): Promise<QueueStatistics> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n const streams = await jsm.streams.list().next();\n const streamCount = streams.length;\n\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0, // Publisher doesn't track consumption\n messagesFailed: 0,\n activeConsumers: 0,\n activePublishers: 1,\n queueSize: 0, // Would need to sum all stream messages\n lastActivity: this.lastPublishTime?.toISOString() || null,\n details: {\n streamCount,\n type: 'nats',\n },\n };\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to get statistics', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Ensure a stream exists\n */\n async ensureStream(config: StreamConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n // Check if stream exists\n try {\n await jsm.streams.info(config.name);\n logger.debug('[NatsEventPublisher] Stream already exists', {\n stream: config.name,\n });\n return;\n } catch {\n // Stream doesn't exist, create it\n }\n\n const streamConfig: Partial<NatsStreamConfig> = {\n name: config.name,\n subjects: config.subjects,\n retention: this.mapRetentionPolicy(config.retention),\n storage: this.mapStorageType(config.storage),\n max_consumers: config.maxConsumers,\n max_msgs: config.maxMsgs,\n max_bytes: config.maxBytes ?? DEFAULT_STREAM_MAX_BYTES,\n max_age: config.maxAge,\n duplicate_window: config.duplicateWindow,\n };\n\n await jsm.streams.add(streamConfig);\n\n logger.info('[NatsEventPublisher] Stream created successfully', {\n stream: config.name,\n subjects: config.subjects,\n });\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to ensure stream', {\n stream: config.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Derive stream subject pattern from subscription subject\n * Examples:\n * - \"channel.conversation.message\" → [\"channel.>\"]\n * - \"wspace.tags.created\" → [\"wspace.>\"]\n * - \"global.auth.login\" → [\"global.>\"]\n */\n private deriveStreamSubjects(subject: string): string[] {\n // Extract the first segment and create a wildcard pattern\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return [`${firstSegment}.>`];\n }\n // Fallback to the subject itself with a wildcard\n return [`${subject.replace(/\\.[^.]+$/, '.>')}`];\n }\n\n /**\n * Derive stream name from subject\n * Examples:\n * - \"channel.conversation.message\" → \"CHANNEL_EVENTS\"\n * - \"wspace.tags.created\" → \"WSPACE_EVENTS\"\n * - \"global.auth.login\" → \"GLOBAL_EVENTS\"\n */\n private deriveStreamName(subject: string): string {\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return `${firstSegment.toUpperCase()}_EVENTS`;\n }\n return 'EVENTS';\n }\n\n /**\n * Publish an event to a subject\n */\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n const js = this.connectionManager.getJetStream();\n\n try {\n // Auto-create stream if it doesn't exist\n const streamName = options.options?.stream || this.deriveStreamName(options.subject);\n const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);\n await this.ensureStream({\n name: streamName,\n subjects: streamSubjects,\n retention: options.options?.retention || 'limits',\n storage: options.options?.storage || 'file',\n });\n\n // Create event message\n const message: EventMessage<T> = {\n id: options.options?.messageId || this.generateMessageId(),\n subject: options.subject,\n data: options.data,\n metadata: {\n source: options.metadata?.source || 'workspaces-backend',\n correlationId: options.metadata?.correlationId || this.generateCorrelationId(),\n userId: options.metadata?.userId,\n workspaceId: options.metadata?.workspaceId,\n priority: options.options?.priority || this.config.defaultPriority || 'normal',\n ...options.metadata,\n },\n timestamp: new Date().toISOString(),\n };\n\n // Create headers\n const hdrs = headers();\n hdrs.set('message-id', message.id);\n hdrs.set('correlation-id', message.metadata.correlationId);\n\n if (message.metadata.source) {\n hdrs.set('source', message.metadata.source);\n }\n if (message.metadata['priority'] && typeof message.metadata['priority'] === 'string') {\n hdrs.set('priority', message.metadata['priority']);\n }\n if (message.metadata.userId) {\n hdrs.set('user-id', message.metadata.userId);\n }\n if (message.metadata.workspaceId) {\n hdrs.set('workspace-id', message.metadata.workspaceId);\n }\n\n // Inject W3C trace context so the consumer can link its span to the\n // producer's trace. Dynamic import keeps @opentelemetry/api optional.\n await injectW3CTraceContext(hdrs);\n\n // Publish options\n const publishOpts: {\n msgID?: string;\n headers: ReturnType<typeof headers>;\n } = {\n msgID: this.config.enableDeduplication ? message.id : undefined,\n headers: hdrs,\n };\n\n // Handle TTL\n if (options.options?.ttl) {\n // NATS doesn't have per-message TTL, would need stream-level configuration\n logger.warn('[NatsEventPublisher] Per-message TTL not supported in NATS', {\n subject: options.subject,\n ttl: options.options.ttl,\n });\n }\n\n // Handle delay\n if (options.options?.delay) {\n // NATS doesn't have native delay, would need to implement with separate delayed stream\n logger.warn('[NatsEventPublisher] Message delay not supported in NATS', {\n subject: options.subject,\n delay: options.options.delay,\n });\n }\n\n // Publish message\n const ack = await js.publish(options.subject, JSON.stringify(message), publishOpts);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n\n logger.debug('[NatsEventPublisher] Event published', {\n subject: options.subject,\n messageId: message.id,\n sequence: ack.seq,\n });\n\n return ack.seq;\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to publish event', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Publish multiple events in a batch\n */\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const results: Array<number | string> = [];\n\n for (const event of events) {\n const seq = await this.publish(event);\n results.push(seq);\n }\n\n return results;\n }\n\n /**\n * Publish an event and wait for acknowledgment\n * Note: This is not natively supported by NATS JetStream\n * Would require implementing request-reply pattern\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 const nc = this.connectionManager.getNatsConnection();\n\n try {\n const message: EventMessage<T> = {\n id: this.generateMessageId(),\n subject: options.subject,\n data: options.data,\n metadata: {\n source: options.metadata?.source || 'workspaces-backend',\n correlationId: options.metadata?.correlationId || this.generateCorrelationId(),\n userId: options.metadata?.userId,\n workspaceId: options.metadata?.workspaceId,\n ...options.metadata,\n },\n timestamp: new Date().toISOString(),\n };\n\n const response = await nc.request(options.subject, JSON.stringify(message), {\n timeout: options.timeout || 30000,\n });\n\n const result = JSON.parse(response.data.toString()) as R;\n\n logger.debug('[NatsEventPublisher] Event published with ack', {\n subject: options.subject,\n messageId: message.id,\n });\n\n return result;\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to publish event with ack', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Map retention policy string to NATS enum\n */\n private mapRetentionPolicy(policy?: string): RetentionPolicy {\n switch (policy?.toLowerCase()) {\n case 'limits':\n return RetentionPolicy.Limits;\n case 'interest':\n return RetentionPolicy.Interest;\n case 'workqueue':\n default:\n return RetentionPolicy.Workqueue;\n }\n }\n\n /**\n * Map storage type string to NATS enum\n */\n private mapStorageType(storage?: string): StorageType {\n switch (storage?.toLowerCase()) {\n case 'memory':\n return StorageType.Memory;\n case 'file':\n default:\n return StorageType.File;\n }\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;\n }\n\n /**\n * Generate correlation ID\n */\n private generateCorrelationId(): string {\n return `corr_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;\n }\n}\n","/**\n * Redis Streams key namespace helpers.\n *\n * All keys are prefixed with `boff:` because DB 0 of Azure Managed Redis is\n * shared with the be-sdk cache provider.\n */\n\nexport interface KeyspaceOptions {\n /** Top-level prefix for event streams. Defaults to `boff:events`. */\n prefix?: string;\n}\n\nconst DEFAULT_PREFIX = 'boff:events';\nconst REGISTRY_PREFIX = 'boff:registry:subjects';\nconst DELAYQ_PREFIX = 'boff:delayq';\nconst DELAYQ_LOCK_PREFIX = 'boff:lock:delayq';\nconst DLQ_PREFIX = 'boff:dlq';\nconst DEDUP_PREFIX = 'boff:dedup';\nconst REPLY_PREFIX = 'boff:replies';\n\n/** Convert a NATS-style subject to a Redis key segment (`.` → `:`). */\nexport function subjectToKey(subject: string): string {\n return subject.replace(/\\./g, ':');\n}\n\n/** Build the stream key for a given subject. */\nexport function streamKey(subject: string, opts: KeyspaceOptions = {}): string {\n const prefix = opts.prefix ?? DEFAULT_PREFIX;\n return `${prefix}:${subjectToKey(subject)}`;\n}\n\n/** Stream key from a NATS-style wildcard prefix (e.g. `wspace`). */\nexport function registryKey(boundary: string): string {\n return `${REGISTRY_PREFIX}:${boundary}`;\n}\n\n/** Extract the leading boundary (`x` in `x.y.z`). */\nexport function boundaryOf(subject: string): string {\n const first = subject.split('.')[0];\n return first ?? subject;\n}\n\n/** Sorted-set key for delayed-NAK re-delivery, scoped per stream. */\nexport function delayQueueKey(stream: string): string {\n return `${DELAYQ_PREFIX}:${stream}`;\n}\n\n/** Lock key the delay-queue worker uses to serialise across replicas. */\nexport function delayLockKey(stream: string): string {\n return `${DELAYQ_LOCK_PREFIX}:${stream}`;\n}\n\n/** Per-stream dead-letter queue. */\nexport function dlqKey(stream: string): string {\n return `${DLQ_PREFIX}:${stream}`;\n}\n\n/** Per-message dedup marker key. */\nexport function dedupKey(stream: string, msgId: string): string {\n return `${DEDUP_PREFIX}:${stream}:${msgId}`;\n}\n\n/** Reply-stream key for request/response emulation. */\nexport function replyKey(correlationId: string): string {\n return `${REPLY_PREFIX}:${correlationId}`;\n}\n\n/**\n * Resolve a NATS-style subject pattern to a concrete list of stream keys, using\n * a registry of known subjects.\n *\n * Patterns supported:\n * - `x.y.z` — exact subject, returns single stream\n * - `x.>` — all subjects starting with `x.`\n * - `x.*` — all subjects with exactly one more segment after `x.`\n * - `x.*.z` — single-segment wildcard at position\n */\nexport function matchSubject(pattern: string, subject: string): boolean {\n if (pattern === subject) return true;\n const pParts = pattern.split('.');\n const sParts = subject.split('.');\n const last = pParts[pParts.length - 1];\n if (last === '>') {\n if (sParts.length < pParts.length) return false;\n for (let i = 0; i < pParts.length - 1; i++) {\n if (pParts[i] !== sParts[i]) return false;\n }\n return true;\n }\n if (pParts.length !== sParts.length) return false;\n for (let i = 0; i < pParts.length; i++) {\n if (pParts[i] !== '*' && pParts[i] !== sParts[i]) return false;\n }\n return true;\n}\n\n/** True if subject pattern contains a wildcard token. */\nexport function isWildcard(pattern: string): boolean {\n return pattern.includes('*') || pattern.includes('>');\n}\n","/**\n * W3C trace context propagation for Redis Streams entries.\n *\n * Stream entries carry trace context as ordinary fields (`traceparent`,\n * `tracestate`, `baggage`). When `@opentelemetry/api` isn't installed at the\n * consumer, these helpers degrade to no-ops.\n */\nimport { logger } from '../../../logger/index.js';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) return otelApiPromise;\n otelApiPromise = (async () => {\n try {\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[redis-streams/trace-context] @opentelemetry/api not available; tracing disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst TRACE_KEYS = ['traceparent', 'tracestate', 'baggage'] as const;\n\n/** Inject the active OTel context into a plain record of stream fields. */\nexport async function injectTraceFields(): Promise<Record<string, string>> {\n const api = await loadOtelApi();\n if (!api) return {};\n const carrier: Record<string, string> = {};\n try {\n api.propagation.inject(\n api.context.active(),\n carrier,\n {\n set(c, k, v) {\n c[k] = v;\n },\n }\n );\n } catch (err) {\n logger.debug('[redis-streams/trace-context] inject failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return carrier;\n}\n\n/** Extract OTel context from stream-entry fields. */\nexport async function extractTraceContext(fields: Record<string, string>): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api) return undefined;\n const carrier: Record<string, string> = {};\n for (const key of TRACE_KEYS) {\n const value = fields[key];\n if (value) carrier[key] = value;\n }\n try {\n return api.propagation.extract(api.context.active(), carrier, {\n get(c, k) {\n return c[k];\n },\n keys(c) {\n return Object.keys(c);\n },\n });\n } catch {\n return undefined;\n }\n}\n\n/** Wrap a consumer handler in a CONSUMER-kind span rooted at the carried trace. */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n fields: Record<string, string>,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractTraceContext(fields);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/redis-streams');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `redis-streams.consume ${subject}`,\n {\n kind: 5,\n attributes: { 'messaging.system': 'redis', 'messaging.destination.name': subject },\n },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch {\n return handler();\n }\n}\n","/**\n * Redis Streams implementation of IEventConsumer.\n *\n * One ioredis client per active subscription handles `XREADGROUP BLOCK` in a\n * background loop, with periodic XAUTOCLAIM reclaiming abandoned pending\n * entries and a small ZSET-based delay queue draining NAK'd messages back\n * into the stream when their delay expires.\n */\nimport { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { logger } from '../../../logger/index.js';\nimport type {\n IEventConsumer,\n ISubscription,\n} from '../../interfaces/IEventConsumer.js';\nimport type {\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from '../../types/config.js';\nimport type {\n AcknowledgeableEvent,\n EventHandler,\n EventMetadata,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n delayLockKey,\n delayQueueKey,\n dlqKey,\n isWildcard,\n matchSubject,\n registryKey,\n streamKey,\n} from './keyspace.js';\nimport { runWithConsumerSpan } from './trace-context.js';\n\ninterface ParsedEntry<T = unknown> {\n id: string;\n stream: string;\n subject: string;\n data: T;\n metadata: EventMetadata;\n timestamp: string;\n fields: Record<string, string>;\n deliveryCount: number;\n}\n\nconst DEFAULT_BLOCK_MS = 5000;\nconst DEFAULT_BATCH = 10;\nconst REGISTRY_REFRESH_MS = 10_000;\nconst DEFAULT_ACK_WAIT_MS = 30_000;\nconst DEFAULT_MAX_DELIVER = 3;\nconst SWEEP_INTERVAL_MS = 15_000;\nconst DELAYQ_INTERVAL_MS = 1_000;\n\nclass RedisStreamsSubscription implements ISubscription {\n readonly id = randomUUID();\n private active = true;\n private receivedCount = 0;\n private processedCount = 0;\n private failedCount = 0;\n private lastActivity = new Date().toISOString();\n\n constructor(\n readonly subject: string,\n private readonly unsubscribeFn: () => Promise<void>\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) return;\n this.active = false;\n await this.unsubscribeFn();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.receivedCount,\n messagesProcessed: this.processedCount,\n messagesFailed: this.failedCount,\n lastActivity: this.lastActivity,\n };\n }\n\n recordReceived(): void {\n this.receivedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordProcessed(): void {\n this.processedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordFailed(): void {\n this.failedCount++;\n this.lastActivity = new Date().toISOString();\n }\n}\n\nexport interface RedisStreamsConsumerConfig extends ConsumerConfig {\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventConsumer implements IEventConsumer {\n private readonly connection: RedisStreamsConnection;\n private subscriptions: RedisStreamsSubscription[] = [];\n private readonly subscriptionLoops: Set<() => Promise<void>> = new Set();\n private readonly keyPrefix: string;\n private readonly consumerName: string;\n private readonly group: string;\n private readonly maxDeliver: number;\n private readonly ackWaitMs: number;\n private readonly maxConcurrent: number;\n private consumedCount = 0;\n private failedCount = 0;\n private lastActivity: Date | null = null;\n private stopped = false;\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private delayqTimer: ReturnType<typeof setInterval> | null = null;\n private knownStreams: Map<string, string> = new Map(); // streamKey -> subject\n\n constructor(config: RedisStreamsConsumerConfig) {\n this.connection = new RedisStreamsConnection({\n type: 'redis-streams',\n url: config.url ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n user: config.user,\n password: config.password,\n name: config.name,\n connectionTimeout: config.connectionTimeout,\n });\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.group = config.consumer || config.name || 'default-consumer';\n this.consumerName = `${this.group}:${hostname()}:${process.pid}`;\n this.maxDeliver = config.maxDeliver ?? DEFAULT_MAX_DELIVER;\n this.ackWaitMs = config.ackWait\n ? Math.max(1000, Math.round(config.ackWait / 1_000_000))\n : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n if (!this.sweepTimer) {\n const t = setInterval(() => {\n void this.sweepPending().catch((err) => {\n logger.debug('[RedisStreamsEventConsumer] sweep error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, SWEEP_INTERVAL_MS);\n t.unref?.();\n this.sweepTimer = t;\n }\n if (!this.delayqTimer) {\n const t = setInterval(() => {\n void this.drainDelayQueues().catch(() => undefined);\n }, DELAYQ_INTERVAL_MS);\n t.unref?.();\n this.delayqTimer = t;\n }\n }\n\n async disconnect(): Promise<void> {\n this.stopped = true;\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n if (this.delayqTimer) clearInterval(this.delayqTimer);\n await this.unsubscribeAll();\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: {\n type: 'redis-streams',\n subscriptions: this.subscriptions.length,\n },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return Promise.resolve({\n messagesConsumed: this.consumedCount,\n messagesFailed: this.failedCount,\n messagesPublished: 0,\n activeConsumers: this.subscriptions.length,\n lastActivity: this.lastActivity?.toISOString() ?? null,\n details: { type: 'redis-streams', group: this.group },\n });\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async ensureConsumer(_config: ConsumerConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async subscribe<T = unknown>(opts: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n await this.connect();\n const sub = new RedisStreamsSubscription(opts.subject, async () => {\n this.subscriptions = this.subscriptions.filter((s) => s !== sub);\n });\n this.subscriptions.push(sub);\n\n const startId = this.resolveStartId(opts.options?.deliverPolicy);\n const wildcard = isWildcard(opts.subject);\n const handlerFn = opts.handler as EventHandler<unknown>;\n\n if (!wildcard) {\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n this.spawnLoop(sub, stream, opts.subject, handlerFn);\n } else {\n const boundary = boundaryOf(opts.subject);\n const refresh = async (): Promise<void> => {\n const client = this.connection.getClient();\n const subjects = await client.smembers(registryKey(boundary));\n for (const s of subjects) {\n if (!matchSubject(opts.subject, s)) continue;\n const stream = streamKey(s, { prefix: this.keyPrefix });\n if (this.knownStreams.has(stream)) continue;\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, s);\n this.spawnLoop(sub, stream, s, handlerFn);\n }\n };\n await refresh();\n const t = setInterval(() => {\n if (this.stopped || !sub.isActive()) {\n clearInterval(t);\n return;\n }\n void refresh().catch(() => undefined);\n }, REGISTRY_REFRESH_MS);\n t.unref?.();\n }\n\n return sub;\n }\n\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const out: ISubscription[] = [];\n for (const subject of subjects) {\n out.push(await this.subscribe({ subject, handler, options }));\n }\n return out;\n }\n\n async pull<T = unknown>(opts: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n await this.connect();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, '$');\n const client = this.connection.getClient();\n const raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n opts.batch ?? DEFAULT_BATCH,\n 'BLOCK',\n opts.timeout ?? DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!raw) return [];\n const out: AcknowledgeableEvent<T>[] = [];\n for (const [streamName, entries] of raw) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(streamName, id, rawFields);\n out.push(this.toAcknowledgeable(streamName, id, parsed));\n }\n }\n return out;\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of [...this.subscriptions]) {\n await sub.unsubscribe();\n }\n this.subscriptions = [];\n this.subscriptionLoops.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return [...this.subscriptions];\n }\n\n async processDLQ<T = unknown>(handler: EventHandler<T>): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const dlqGroup = `${this.group}-dlq`;\n for (const [stream] of this.knownStreams) {\n const dlq = dlqKey(stream);\n try {\n await client.xgroup('CREATE', dlq, dlqGroup, '0', 'MKSTREAM');\n } catch {\n /* already exists */\n }\n const res = (await client.xreadgroup(\n 'GROUP',\n dlqGroup,\n this.consumerName,\n 'COUNT',\n 50,\n 'BLOCK',\n 100,\n 'STREAMS',\n dlq,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!res) continue;\n for (const [, entries] of res) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(dlq, id, rawFields);\n const evt = this.toAcknowledgeable<T>(dlq, id, parsed, dlqGroup);\n try {\n await handler(evt);\n } catch (err) {\n logger.error('[RedisStreamsEventConsumer] DLQ handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n }\n }\n\n async listSubjects(_stream?: string): Promise<string[]> {\n await this.connect();\n const client = this.connection.getClient();\n const seen = new Set<string>();\n for (const subject of this.knownStreams.values()) {\n const members = await client.smembers(registryKey(boundaryOf(subject)));\n for (const m of members) seen.add(m);\n }\n return [...seen];\n }\n\n // ---- internals ----\n\n private resolveStartId(policy: SubscriptionOptions['deliverPolicy'] | undefined): string {\n switch (policy) {\n case 'all':\n return '0';\n case 'new':\n return '$';\n case 'last':\n return '$';\n default:\n return '$';\n }\n }\n\n private async ensureGroup(stream: string, startId: string): Promise<void> {\n const client = this.connection.getClient();\n try {\n await client.xgroup('CREATE', stream, this.group, startId, 'MKSTREAM');\n logger.debug('[RedisStreamsEventConsumer] group created', {\n stream,\n group: this.group,\n startId,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('BUSYGROUP')) {\n throw err;\n }\n }\n }\n\n private spawnLoop(\n sub: RedisStreamsSubscription,\n stream: string,\n subject: string,\n handler: EventHandler<unknown>\n ): void {\n const loop = async (): Promise<void> => {\n const client = await this.connection.makeBlockingClient();\n try {\n while (!this.stopped && sub.isActive()) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n this.maxConcurrent,\n 'BLOCK',\n DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) {\n await this.ensureGroup(stream, '$');\n continue;\n }\n logger.warn('[RedisStreamsEventConsumer] read error', { stream, error: msg });\n await new Promise((res) => setTimeout(res, 1000));\n continue;\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n sub.recordReceived();\n this.consumedCount++;\n this.lastActivity = new Date();\n const parsed = this.parseEntry(stream, id, rawFields);\n const evt = this.toAcknowledgeable(stream, id, parsed);\n try {\n await runWithConsumerSpan(subject, parsed.fields, () => handler(evt));\n sub.recordProcessed();\n } catch (err) {\n sub.recordFailed();\n this.failedCount++;\n logger.error('[RedisStreamsEventConsumer] handler error', {\n subject,\n id,\n error: err instanceof Error ? err.message : String(err),\n });\n // Auto-nak on uncaught throw (re-deliver after ackWait).\n try {\n await evt.nak();\n } catch {\n /* ignore */\n }\n }\n }\n }\n }\n } finally {\n try {\n client.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventConsumer] loop crashed', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n private parseEntry<T>(stream: string, id: string, rawFields: string[]): ParsedEntry<T> {\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const key = rawFields[i];\n const val = rawFields[i + 1];\n if (key === undefined || val === undefined) continue;\n fields[key] = val;\n }\n let data: T;\n try {\n data = JSON.parse(fields['payload'] ?? 'null') as T;\n } catch {\n data = fields['payload'] as unknown as T;\n }\n let metadata: EventMetadata;\n try {\n metadata = JSON.parse(fields['metadata'] ?? '{}') as EventMetadata;\n } catch {\n metadata = { correlationId: fields['correlation-id'] ?? '' };\n }\n if (!metadata.correlationId) metadata.correlationId = fields['correlation-id'] ?? '';\n return {\n id,\n stream,\n subject: fields['subject'] ?? '',\n data,\n metadata,\n timestamp: fields['timestamp'] ?? new Date().toISOString(),\n fields,\n deliveryCount: 1,\n };\n }\n\n private toAcknowledgeable<T>(\n stream: string,\n id: string,\n parsed: ParsedEntry<T>,\n group: string = this.group\n ): AcknowledgeableEvent<T> {\n const connection = this.connection;\n let acked = false;\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n async ack(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n async nak(delay = 0): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n if (delay > 0) {\n // Park in delay queue; worker will re-XADD and ACK original.\n const score = Date.now() + delay;\n const payload = JSON.stringify(parsed.fields);\n await client.zadd(delayQueueKey(stream), score, `${id}|${payload}`);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n }\n // delay=0: do nothing — XAUTOCLAIM will reclaim after ackWait.\n },\n async term(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n const dlq = dlqKey(stream);\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n await client.xadd(dlq, 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private async sweepPending(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n try {\n const claimed = (await client.xautoclaim(\n stream,\n this.group,\n this.consumerName,\n this.ackWaitMs,\n '0',\n 'COUNT',\n 50\n )) as [string, Array<[string, string[]]>, string[]] | null;\n if (!claimed) continue;\n const entries = claimed[1] ?? [];\n for (const [id, rawFields] of entries) {\n const pending = (await client.xpending(\n stream,\n this.group,\n 'IDLE',\n 0,\n '-',\n '+',\n 1,\n this.consumerName\n )) as Array<[string, string, number, number]>;\n const deliveryCount = Array.isArray(pending) && pending[0] ? pending[0][3] : 1;\n if (deliveryCount > this.maxDeliver) {\n const flat: string[] = [];\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n flat.push(rawFields[i]!, rawFields[i + 1]!);\n }\n flat.push('dlq-reason', 'max-deliver-exceeded');\n flat.push('dlq-deliveries', String(deliveryCount));\n await client.xadd(dlqKey(stream), 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, this.group, id);\n await client.xdel(stream, id).catch(() => undefined);\n logger.warn('[RedisStreamsEventConsumer] message moved to DLQ', {\n stream,\n id,\n deliveryCount,\n });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) continue;\n logger.debug('[RedisStreamsEventConsumer] sweep iteration error', { stream, error: msg });\n }\n }\n }\n\n private async drainDelayQueues(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n const lockKey = delayLockKey(stream);\n const got = await client.set(lockKey, this.consumerName, 'NX', 'EX', 30).catch(() => null);\n if (got !== 'OK') continue;\n try {\n const due = await client.zrangebyscore(\n delayQueueKey(stream),\n 0,\n Date.now(),\n 'LIMIT',\n 0,\n 50\n );\n for (const member of due) {\n const split = member.indexOf('|');\n if (split < 0) continue;\n const payload = member.slice(split + 1);\n let fields: Record<string, string> = {};\n try {\n fields = JSON.parse(payload) as Record<string, string>;\n } catch {\n continue;\n }\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) flat.push(k, v);\n await client.xadd(stream, 'MAXLEN', '~', 100_000, '*', ...flat);\n await client.zrem(delayQueueKey(stream), member);\n }\n } finally {\n await client.del(lockKey).catch(() => undefined);\n }\n }\n }\n}\n\nexport type { IoRedis };\n","/**\n * Redis Streams implementation of IEventPublisher.\n *\n * Each subject is its own stream (`boff:events:<subject-with-colons>`); MAXLEN\n * trimming keeps each stream bounded; dedup is enforced by `SET NX EX` on a\n * per-message-id key before XADD.\n */\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type { EventMetadata, StreamConfig } from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n dedupKey,\n registryKey,\n replyKey,\n streamKey,\n} from './keyspace.js';\nimport { injectTraceFields } from './trace-context.js';\n\nexport interface RedisStreamsPublisherConfig extends PublisherConfig {\n /** Approximate MAXLEN trim threshold per stream. Default 100_000. */\n maxLen?: number;\n /** Dedup TTL window in seconds. Default 120. */\n dedupTtlSeconds?: number;\n /** Key namespace override. Default `boff:events`. */\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventPublisher implements IEventPublisher {\n private connection: RedisStreamsConnection;\n private publishCount = 0;\n private lastPublishTime: Date | null = null;\n private readonly maxLen: number;\n private readonly dedupTtl: number;\n private readonly keyPrefix: string;\n\n constructor(private config: RedisStreamsPublisherConfig) {\n this.connection = new RedisStreamsConnection(config);\n this.maxLen = config.maxLen ?? parseInt(process.env['REDIS_STREAMS_MAXLEN'] ?? '100000', 10);\n this.dedupTtl = config.dedupTtlSeconds ?? parseInt(process.env['REDIS_STREAMS_DEDUP_TTL'] ?? '120', 10);\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: { type: 'redis-streams', url: this.config.url },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesFailed: 0,\n activePublishers: 1,\n activeConsumers: 0,\n lastActivity: this.lastPublishTime?.toISOString() ?? null,\n details: { type: 'redis-streams' },\n };\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n // Streams are created lazily by XADD; no-op here.\n return Promise.resolve();\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n return this.publishInternal(options);\n }\n\n private async publishInternal<T>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<string> {\n await this.connect();\n const client = this.connection.getClient();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup =\n this.config.enableDeduplication === true || opts.options?.messageId !== undefined;\n\n if (enableDedup) {\n const ok = await client.set(dedupKey(stream, msgId), '1', 'NX', 'EX', this.dedupTtl);\n if (ok !== 'OK') {\n logger.debug('[RedisStreamsEventPublisher] dedup hit; skipping publish', {\n subject: opts.subject,\n msgId,\n });\n return msgId;\n }\n }\n\n const trace = await injectTraceFields();\n const fields: Record<string, string> = {\n 'msg-id': msgId,\n subject: opts.subject,\n 'correlation-id': correlationId,\n timestamp: new Date().toISOString(),\n priority: opts.options?.priority ?? this.config.defaultPriority ?? 'normal',\n source: opts.metadata?.source ?? this.config.name ?? 'unknown',\n payload: JSON.stringify(opts.data ?? null),\n metadata: JSON.stringify(opts.metadata ?? {}),\n ...trace,\n };\n if (opts.metadata?.userId) fields['user-id'] = String(opts.metadata.userId);\n if (opts.metadata?.workspaceId) fields['workspace-id'] = String(opts.metadata.workspaceId);\n if (opts.metadata?.tenantId) fields['tenant-id'] = String(opts.metadata.tenantId);\n\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n flat.push(k, v);\n }\n\n const id = await client.xadd(stream, 'MAXLEN', '~', this.maxLen, '*', ...flat);\n\n // Async fire-and-forget registry update\n void client.sadd(registryKey(boundaryOf(opts.subject)), opts.subject).catch(() => undefined);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n logger.debug('[RedisStreamsEventPublisher] published', {\n subject: opts.subject,\n stream,\n id,\n });\n return id;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const out: string[] = [];\n for (const e of events) {\n out.push(await this.publishInternal(e));\n }\n return out;\n }\n\n /**\n * Emulated request/response: writer XADDs onto its own subject, then\n * blocks on a one-shot reply stream keyed by correlationId.\n */\n async publishWithAck<T = unknown, R = unknown>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n await this.connect();\n const client = this.connection.getClient();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const reply = replyKey(correlationId);\n await this.publishInternal({\n subject: opts.subject,\n data: opts.data,\n metadata: { ...opts.metadata, correlationId, replyTo: reply },\n });\n\n const timeoutMs = opts.timeout ?? 5000;\n const t0 = Date.now();\n while (Date.now() - t0 < timeoutMs) {\n const entries = (await client.xrange(reply, '-', '+')) as Array<[string, string[]]>;\n if (Array.isArray(entries) && entries.length > 0) {\n const last = entries[entries.length - 1];\n if (!last) break;\n const rawFields = last[1];\n const payloadIdx = rawFields.indexOf('payload');\n const payload = payloadIdx >= 0 ? rawFields[payloadIdx + 1] : '{}';\n await client.del(reply);\n return JSON.parse(payload ?? '{}') as R;\n }\n await new Promise((res) => setTimeout(res, 50));\n }\n await client.del(reply).catch(() => undefined);\n throw new Error(`[RedisStreamsEventPublisher] publishWithAck timed out for subject=${opts.subject}`);\n }\n\n /** Internal helper used by the consumer's reply path. */\n async sendReply(correlationId: string, data: unknown): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const key = replyKey(correlationId);\n await client.xadd(key, '*', 'payload', JSON.stringify(data ?? null));\n await client.expire(key, 60);\n }\n}\n\nexport type { IoRedis };\n","/**\n * Event Queue Factory\n * Creates appropriate event queue instances based on configuration\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\nimport { DEFAULT_LAYER_RESOURCES } from '../../types/layer.js';\n\nimport { NatsEventConsumer } from '../implementations/nats/NatsEventConsumer.js';\nimport { NatsEventPublisher } from '../implementations/nats/NatsEventPublisher.js';\nimport { RedisStreamsEventConsumer } from '../implementations/redis-streams/RedisStreamsEventConsumer.js';\nimport { RedisStreamsEventPublisher } from '../implementations/redis-streams/RedisStreamsEventPublisher.js';\nimport type { IEventConsumer } from '../interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from '../interfaces/IEventPublisher.js';\nimport { type ConsumerConfig, type PublisherConfig, QueueType } from '../types/config.js';\n\nfunction resolveQueueType(): QueueType {\n const raw = (process.env['EVENT_QUEUE_TYPE'] ?? process.env['QUEUE_TYPE'] ?? '').toLowerCase();\n if (raw === 'redis-streams' || raw === 'redis' || raw === 'streams') return QueueType.REDIS_STREAMS;\n if (raw === 'nats') return QueueType.NATS;\n // Default: if REDIS_URL is set and NATS is not, prefer redis-streams.\n if (!process.env['NATS_URL'] && !process.env['NATS_SERVERS'] && process.env['REDIS_URL']) {\n return QueueType.REDIS_STREAMS;\n }\n return QueueType.NATS;\n}\n\n/**\n * Factory for creating event queue instances\n */\nexport class EventQueueFactory {\n /**\n * Create an event publisher based on configuration\n */\n static createPublisher(config: PublisherConfig): IEventPublisher {\n logger.info('[EventQueueFactory] Creating event publisher', {\n type: config.type,\n url: config.url,\n });\n\n if (config.type === QueueType.NATS) {\n return new NatsEventPublisher(config);\n }\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n // Future implementations can be added here\n // if (config.type === QueueType.RABBITMQ) {\n // return new RabbitMQEventPublisher(config);\n // }\n // if (config.type === QueueType.KAFKA) {\n // return new KafkaEventPublisher(config);\n // }\n // if (config.type === QueueType.SQS) {\n // return new SQSEventPublisher(config);\n // }\n\n throw new Error(`Unsupported queue type: ${config.type}`);\n }\n\n /**\n * Create an event consumer based on configuration\n */\n static createConsumer(config: ConsumerConfig): IEventConsumer {\n logger.info('[EventQueueFactory] Creating event consumer', {\n type: config.type,\n url: config.url,\n stream: config.stream,\n consumer: config.consumer,\n });\n\n if (config.type === QueueType.NATS) {\n return new NatsEventConsumer(config);\n }\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n // Future implementations can be added here\n // if (config.type === QueueType.RABBITMQ) {\n // return new RabbitMQEventConsumer(config);\n // }\n // if (config.type === QueueType.KAFKA) {\n // return new KafkaEventConsumer(config);\n // }\n // if (config.type === QueueType.SQS) {\n // return new SQSEventConsumer(config);\n // }\n\n throw new Error(`Unsupported queue type: ${config.type}`);\n }\n\n /**\n * Create a publisher from environment variables\n */\n static createPublisherFromEnv(): IEventPublisher {\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createPublisher({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'be-sdk-publisher',\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n const config: PublisherConfig = {\n type,\n url: process.env['NATS_URL'] || 'nats://localhost:4222',\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: process.env['QUEUE_CLIENT_NAME'] || 'workspaces-backend-publisher',\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n defaultTTL: process.env['QUEUE_DEFAULT_TTL'] ? parseInt(process.env['QUEUE_DEFAULT_TTL'], 10) : undefined,\n };\n\n return EventQueueFactory.createPublisher(config);\n }\n\n /**\n * Create a consumer from environment variables\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createConsumer({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? consumer,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT']\n ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10)\n : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n const config: ConsumerConfig = {\n type,\n url: process.env['NATS_URL'] || 'nats://localhost:4222',\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: process.env['QUEUE_CLIENT_NAME'] || 'workspaces-workers-consumer',\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000 // Convert seconds to nanoseconds\n : 30_000_000_000,\n };\n\n return EventQueueFactory.createConsumer(config);\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @returns Publisher configured for the layer\n *\n * @example\n * ```typescript\n * const publisher = EventQueueFactory.createPublisherForLayer('wspace', 'wspace-tags-svc');\n * await publisher.connect();\n * await publisher.publish({ subject: 'wspace.tags.created', data: { id: '123' } });\n * ```\n */\n static createPublisherForLayer(layer: ServiceLayer, serviceName: string): IEventPublisher {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createPublisher({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n });\n }\n\n const config: PublisherConfig = {\n type,\n url: process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || defaults.natsUrl,\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: serviceName,\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n defaultTTL: process.env['QUEUE_DEFAULT_TTL'] ? parseInt(process.env['QUEUE_DEFAULT_TTL'], 10) : undefined,\n };\n\n logger.info('[EventQueueFactory] Creating layer publisher', {\n layer,\n serviceName,\n url: config.url,\n });\n\n return EventQueueFactory.createPublisher(config);\n }\n\n /**\n * Create a consumer for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param stream - NATS stream name\n * @param consumer - Consumer name\n * @returns Consumer configured for the layer\n *\n * @example\n * ```typescript\n * const consumer = EventQueueFactory.createConsumerForLayer(\n * 'wspace', 'wspace-tags-svc', 'WSPACE_EVENTS', 'tags-consumer'\n * );\n * await consumer.connect();\n * await consumer.consume(async (msg) => { console.log(msg); });\n * ```\n */\n static createConsumerForLayer(\n layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createConsumer({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n\n const config: ConsumerConfig = {\n type,\n url: process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || defaults.natsUrl,\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: serviceName,\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n };\n\n logger.info('[EventQueueFactory] Creating layer consumer', {\n layer,\n serviceName,\n stream,\n consumer,\n url: config.url,\n });\n\n return EventQueueFactory.createConsumer(config);\n }\n}\n"]}