@burdenoff/be-sdk 2026.518.3 → 2026.521.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EventQueueFactory-PVXBZCT5.js +6 -0
- package/dist/{EventQueueFactory-6UJ3UIP4.js.map → EventQueueFactory-PVXBZCT5.js.map} +1 -1
- package/dist/auth/index.js +2 -2
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-EZOXXSD4.js → chunk-2BG75H2K.js} +4 -4
- package/dist/{chunk-EZOXXSD4.js.map → chunk-2BG75H2K.js.map} +1 -1
- package/dist/{chunk-UNPJMENC.js → chunk-7NUQXGA7.js} +3 -3
- package/dist/{chunk-UNPJMENC.js.map → chunk-7NUQXGA7.js.map} +1 -1
- package/dist/{chunk-KTPFSXZF.js → chunk-ACYGOENW.js} +2 -2
- package/dist/{chunk-KTPFSXZF.js.map → chunk-ACYGOENW.js.map} +1 -1
- package/dist/{chunk-MOCUBSTW.js → chunk-B7I4TABG.js} +2 -2
- package/dist/{chunk-MOCUBSTW.js.map → chunk-B7I4TABG.js.map} +1 -1
- package/dist/{chunk-O2MEBPDT.js → chunk-BNJFEOGH.js} +2 -2
- package/dist/chunk-BNJFEOGH.js.map +1 -0
- package/dist/{chunk-S5S6OBS6.js → chunk-BRYRHBAC.js} +3 -3
- package/dist/{chunk-S5S6OBS6.js.map → chunk-BRYRHBAC.js.map} +1 -1
- package/dist/{chunk-UBXFIIAW.js → chunk-BTQREMD4.js} +2 -2
- package/dist/{chunk-UBXFIIAW.js.map → chunk-BTQREMD4.js.map} +1 -1
- package/dist/{chunk-3F4SLVRL.js → chunk-DMPS4Y53.js} +3 -3
- package/dist/{chunk-3F4SLVRL.js.map → chunk-DMPS4Y53.js.map} +1 -1
- package/dist/{chunk-SNEOLWXT.js → chunk-E5USZ2MR.js} +2 -2
- package/dist/{chunk-SNEOLWXT.js.map → chunk-E5USZ2MR.js.map} +1 -1
- package/dist/{chunk-TM5RQ6P2.js → chunk-KGCISIBX.js} +22 -4
- package/dist/chunk-KGCISIBX.js.map +1 -0
- package/dist/{chunk-OJDXWHRJ.js → chunk-LD7ETTWG.js} +8 -7
- package/dist/chunk-LD7ETTWG.js.map +1 -0
- package/dist/{chunk-MVHOP4IG.js → chunk-MHNA7IS7.js} +2 -2
- package/dist/{chunk-MVHOP4IG.js.map → chunk-MHNA7IS7.js.map} +1 -1
- package/dist/{chunk-V2VEENJ2.js → chunk-PDSV3TFO.js} +3 -3
- package/dist/chunk-PDSV3TFO.js.map +1 -0
- package/dist/{chunk-5FJZI7VX.js → chunk-PPIDJP2W.js} +3 -3
- package/dist/chunk-PPIDJP2W.js.map +1 -0
- package/dist/{chunk-SO57HNXV.js → chunk-QRWTLPW5.js} +13 -7
- package/dist/chunk-QRWTLPW5.js.map +1 -0
- package/dist/{chunk-VLEOOG2L.js → chunk-SVONGBQR.js} +3 -3
- package/dist/{chunk-VLEOOG2L.js.map → chunk-SVONGBQR.js.map} +1 -1
- package/dist/{chunk-BESBOSX2.js → chunk-TGTJ653K.js} +4 -4
- package/dist/chunk-TGTJ653K.js.map +1 -0
- package/dist/{chunk-WCBKW3CL.js → chunk-X4GSV6NV.js} +5 -5
- package/dist/{chunk-WCBKW3CL.js.map → chunk-X4GSV6NV.js.map} +1 -1
- package/dist/{chunk-RRFNSBDZ.js → chunk-X4NELQLV.js} +3 -3
- package/dist/chunk-X4NELQLV.js.map +1 -0
- package/dist/event-queue/index.js +4 -4
- package/dist/export/index.js +3 -3
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +1 -1
- package/dist/graph/index.js +5 -5
- package/dist/graphql/index.js +2 -2
- package/dist/{index-CygU_fXS.d.ts → index-Cz9_vPi7.d.ts} +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +22 -22
- package/dist/index.js.map +1 -1
- package/dist/init/index.js +3 -3
- package/dist/instrumentation/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/pino-logger-NVZXQPWO.js +5 -0
- package/dist/{pino-logger-RYLGXPHZ.js.map → pino-logger-NVZXQPWO.js.map} +1 -1
- package/dist/prisma/index.js +4 -4
- package/dist/rbac/index.js +1 -1
- package/dist/{sdk-THO3IWEE.js → sdk-UWFH5PY7.js} +2 -2
- package/dist/{sdk-THO3IWEE.js.map → sdk-UWFH5PY7.js.map} +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/telemetry/index.js +5 -5
- package/dist/telemetry/index.js.map +1 -1
- package/dist/tracker/index.js +2 -2
- package/dist/utils/index.js +1 -1
- package/dist/workspace-guard-524GBJQ6.js +5 -0
- package/dist/{workspace-guard-LHBNK4TG.js.map → workspace-guard-524GBJQ6.js.map} +1 -1
- package/package.json +1 -1
- package/dist/EventQueueFactory-6UJ3UIP4.js +0 -6
- package/dist/chunk-5FJZI7VX.js.map +0 -1
- package/dist/chunk-BESBOSX2.js.map +0 -1
- package/dist/chunk-O2MEBPDT.js.map +0 -1
- package/dist/chunk-OJDXWHRJ.js.map +0 -1
- package/dist/chunk-RRFNSBDZ.js.map +0 -1
- package/dist/chunk-SO57HNXV.js.map +0 -1
- package/dist/chunk-TM5RQ6P2.js.map +0 -1
- package/dist/chunk-V2VEENJ2.js.map +0 -1
- package/dist/pino-logger-RYLGXPHZ.js +0 -5
- package/dist/workspace-guard-LHBNK4TG.js +0 -5
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql/index.ts","../src/graphql/redis-streams-event-target.ts"],"names":["createRedisStreamsEventTarget","options","url","redisUrl","process","env","Error","prefix","subjectPrefix","maxLen","serializer","stringify","d","JSON","parse","m","conn","RedisStreamsConnection","type","password","name","connect","then","logger","info","catch","err","warn","error","message","String","streamKey","replace","listeners","Map","readers","closed","startReader","has","stopped","stream","loop","blockingClient","makeBlockingClient","lastId","raw","xreadgroup","call","debug","Promise","r","setTimeout","entries","id","rawFields","fields","i","length","payload","cbs","get","ev","CustomEvent","detail","cb","Array","from","cbErr","disconnect","set","stop","stopReader","delete","target","addEventListener","listener","Set","add","removeEventListener","size","dispatchEvent","event","getClient","xadd","close","values","clear","isHealthy","isConnected"],"mappings":"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","file":"chunk-RRFNSBDZ.js","sourcesContent":["/**\n * GraphQL Utilities Module\n *\n * Provides GraphQL-related utilities for Burdenoff products.\n *\n * @module graphql\n */\n\n// NATS event target was removed on 2026-05-16. Use\n// `createRedisStreamsEventTarget` from `./redis-streams-event-target.js`\n// for distributed GraphQL Yoga subscriptions.\n\nexport { createRedisStreamsEventTarget } from './redis-streams-event-target.js';\nexport type {\n RedisStreamsEventTarget,\n RedisStreamsEventTargetOptions,\n} from './redis-streams-event-target.js';\n\n// Injectable services for GraphQL Modules\nexport { Logger, createDatabaseService } from './services/index.js';\nexport type { DatabaseService, PrismaTransactionClient } from './services/index.js';\n","/**\n * Redis Streams-based EventTarget for graphql-yoga distributed PubSub.\n *\n * Each server tails a per-event-type stream with `XREAD BLOCK ... $` (no\n * consumer group) so every instance receives every dispatch — the fan-out\n * semantics GraphQL subscriptions require.\n *\n * For durable inter-svc events use `event-queue/createPublisher` instead.\n */\nimport { logger } from '../logger/index.js';\nimport { RedisStreamsConnection } from '../event-queue/implementations/redis-streams/RedisStreamsConnection.js';\n\nexport interface RedisStreamsEventTarget {\n addEventListener(type: string, listener: (event: Event) => void): void;\n removeEventListener(type: string, listener: (event: Event) => void): void;\n dispatchEvent(event: Event): boolean;\n close(): Promise<void>;\n isHealthy(): boolean;\n}\n\nexport interface RedisStreamsEventTargetOptions {\n /** Redis connection URL. Defaults to `REDIS_URL` env. */\n redisUrl?: string;\n /** Optional password override. */\n password?: string;\n /** Subject prefix; keys become `<prefix>.<type>` mapped via `:` separator. */\n subjectPrefix?: string;\n /** Approximate MAXLEN trim for each pubsub stream. Default 1000. */\n maxLen?: number;\n /** Per-event serialiser. */\n serializer?: {\n stringify: (data: unknown) => string | Promise<string>;\n parse: (msg: string) => unknown | Promise<unknown>;\n };\n}\n\nexport async function createRedisStreamsEventTarget(\n options: RedisStreamsEventTargetOptions = {}\n): Promise<RedisStreamsEventTarget> {\n const url = options.redisUrl ?? process.env['REDIS_URL'];\n if (!url) throw new Error('[RedisStreamsEventTarget] redisUrl or REDIS_URL is required');\n const prefix = options.subjectPrefix ?? 'graphql.pubsub';\n const maxLen = options.maxLen ?? 1000;\n const serializer = options.serializer ?? {\n stringify: (d: unknown): string => JSON.stringify(d),\n parse: (m: string): unknown => JSON.parse(m),\n };\n\n const conn = new RedisStreamsConnection({\n type: 'redis-streams',\n url,\n password: options.password ?? process.env['REDIS_PASSWORD'],\n name: 'graphql-pubsub',\n });\n // Connect in the background — don't block svc startup on Redis reachability.\n void conn\n .connect()\n .then(() => logger.info('[RedisStreamsEventTarget] redis connected'))\n .catch((err) => {\n logger.warn('[RedisStreamsEventTarget] redis connect failed; pubsub will retry on demand', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n const streamKey = (type: string): string => `boff:pubsub:${prefix}:${type.replace(/\\./g, ':')}`;\n\n const listeners = new Map<string, Set<(event: Event) => void>>();\n const readers = new Map<string, { stop: () => void }>();\n let closed = false;\n\n function startReader(type: string): void {\n if (readers.has(type) || closed) return;\n let stopped = false;\n const stream = streamKey(type);\n\n const loop = async (): Promise<void> => {\n const blockingClient = await conn.makeBlockingClient();\n let lastId = '$';\n try {\n while (!stopped && !closed) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await blockingClient.xreadgroup(\n // pretend-arg pattern: we actually want XREAD, fall through\n 'COUNT',\n 50,\n 'BLOCK',\n 5000,\n 'STREAMS',\n stream,\n lastId\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch {\n // Some ioredis typings make xreadgroup the only signature; fall back to xread via raw command.\n try {\n raw = (await (blockingClient as unknown as {\n call: (...args: unknown[]) => Promise<unknown>;\n }).call('XREAD', 'COUNT', 50, 'BLOCK', 5000, 'STREAMS', stream, lastId)) as Array<\n [string, Array<[string, string[]]>]\n > | null;\n } catch (err) {\n logger.debug('[RedisStreamsEventTarget] xread error', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n await new Promise((r) => setTimeout(r, 1000));\n continue;\n }\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n lastId = id;\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n fields[rawFields[i]!] = rawFields[i + 1]!;\n }\n const payload = await serializer.parse(fields['payload'] ?? 'null');\n const cbs = listeners.get(type);\n if (!cbs) continue;\n const ev = new CustomEvent(type, { detail: payload });\n for (const cb of Array.from(cbs)) {\n try {\n cb(ev);\n } catch (cbErr) {\n logger.error('[RedisStreamsEventTarget] listener error', {\n type,\n error: cbErr instanceof Error ? cbErr.message : String(cbErr),\n });\n }\n }\n }\n }\n }\n } finally {\n try {\n blockingClient.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n\n readers.set(type, {\n stop: (): void => {\n stopped = true;\n },\n });\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventTarget] reader crashed', {\n type,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n function stopReader(type: string): void {\n const r = readers.get(type);\n if (r) {\n r.stop();\n readers.delete(type);\n }\n }\n\n const target: RedisStreamsEventTarget = {\n addEventListener(type, listener): void {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n startReader(type);\n }\n set.add(listener);\n },\n removeEventListener(type, listener): void {\n const set = listeners.get(type);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) {\n listeners.delete(type);\n stopReader(type);\n }\n },\n dispatchEvent(event): boolean {\n const detail = 'detail' in event ? (event as CustomEvent).detail : event;\n void (async (): Promise<void> => {\n try {\n const payload = await serializer.stringify(detail);\n await conn.getClient().xadd(streamKey(event.type), 'MAXLEN', '~', maxLen, '*', 'payload', payload);\n } catch (err) {\n logger.error('[RedisStreamsEventTarget] dispatch failed', {\n type: event.type,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return true;\n },\n async close(): Promise<void> {\n closed = true;\n for (const r of readers.values()) r.stop();\n readers.clear();\n listeners.clear();\n await conn.disconnect();\n },\n isHealthy(): boolean {\n return conn.isConnected();\n },\n };\n\n logger.info('[RedisStreamsEventTarget] ready', { prefix });\n return target;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-queue/implementations/memory/MemoryEventQueue.ts","../src/event-queue/graph-emitter.ts"],"names":["MemoryEventBus","handlers","Map","emit","event","data","eventHandlers","get","forEach","handler","Promise","resolve","pattern","matchesPattern","on","has","set","Set","add","off","delete","endsWith","prefix","slice","startsWith","clear","MemoryEventQueue","queue","processing","maxRetries","retryDelay","options","publishEntityEvent","eventType","entity","context","subject","productName","type","split","logger","debug","entityId","id","entityType","enqueue","metadata","Date","now","randomUUID","timestamp","retries","push","processQueue","registerHandler","length","shift","ackEvent","correlationId","toISOString","ack","nak","term","isRedelivered","getDeliveryAttempt","setTimeout","publish","close","MemoryEventPublisher","_connected","publishCount","connect","info","disconnect","isConnected","ensureStream","Error","messageId","publishBatch","events","messageIds","publishWithAck","healthCheck","status","connected","latencyMs","getStatistics","messagesPublished","messagesConsumed","messagesPending","messagesFailed","getQueue","MemoryEventConsumer","bus","_subscriptions","consumeCount","subIdCounter","streamName","consumerName","stream","consumer","sub","values","unsubscribe","ensureConsumer","subscribe","subId","messagesReceived","messagesProcessed","lastActivity","active","subscription","isActive","getStats","subscriptionId","subscribeMultiple","subjects","subscriptions","pull","unsubscribeAll","getSubscriptions","Array","from","processDLQ","_handler","getBus","createMemoryPublisher","createMemoryConsumer","createGraphEventEmitter","uuidv4","crypto","GraphEventEmitterImpl","publisher","connecting","process","env","EventQueueFactory","createPublisherFromEnv","ensureConnected","then","rbac","eventId","action","hasRbac","streamSubjects","productSource","organizationId","actorId","workspaceId","result","isHealthy","healthy","message","error","_graphEventEmitter","getGraphEventEmitter","resetGraphEventEmitter"],"mappings":"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","file":"chunk-SO57HNXV.js","sourcesContent":["/**\n * In-Memory Event Queue Implementation\n *\n * A simple in-memory event bus and queue for development/testing environments\n * or when NATS is not available. Implements the same interfaces as the NATS\n * implementation for seamless swapping.\n *\n * @module event-queue/memory\n * @category Events\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { EventHandler, AcknowledgeableEvent, EventMetadata } from '../../types/events.js';\nimport type { EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void>;\n}\n\n/**\n * Simple event bus for in-memory pub/sub\n */\nexport class MemoryEventBus {\n private handlers: Map<string, Set<EventHandler<unknown>>> = new Map();\n\n /**\n * Emit an event to all handlers\n */\n emit<T>(event: string, data: T): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n\n // Also emit to wildcard handlers\n for (const [pattern, handlers] of this.handlers) {\n if (this.matchesPattern(event, pattern)) {\n handlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n }\n }\n\n /**\n * Register a handler for an event\n */\n on<T>(event: string, handler: EventHandler<T>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n /**\n * Remove a handler for an event\n */\n off<T>(event: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n /**\n * Check if pattern matches event (supports wildcards)\n */\n private matchesPattern(event: string, pattern: string): boolean {\n if (pattern === event) return false; // Already handled exact match\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n if (pattern.endsWith('.>')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n return false;\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Queued event structure\n */\ninterface QueuedEvent<T = unknown> {\n id: string;\n subject: string;\n data: T;\n metadata: Record<string, unknown>;\n timestamp: Date;\n retries: number;\n maxRetries: number;\n}\n\n/**\n * In-memory event queue with retry support\n */\nexport class MemoryEventQueue implements GraphEventEmitter {\n private queue: QueuedEvent[] = [];\n private processing = false;\n private handlers: Map<string, EventHandler<unknown>> = new Map();\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(options?: { maxRetries?: number; retryDelay?: number }) {\n this.maxRetries = options?.maxRetries ?? 3;\n this.retryDelay = options?.retryDelay ?? 1000;\n }\n\n /**\n * Publish entity event (implements GraphEventEmitter)\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n userId?: string;\n workspaceId?: string;\n }\n ): Promise<void> {\n const subject = `graph.${context.productName}.${entity.type}.${eventType.split('.')[1]}`;\n\n logger.debug('[MemoryEventQueue] Publishing entity event', {\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n });\n\n this.enqueue(subject, {\n eventType,\n entity,\n context,\n });\n }\n\n /**\n * Add an event to the queue\n */\n enqueue<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): string {\n const id = `evt_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const event: QueuedEvent<T> = {\n id,\n subject,\n data,\n metadata,\n timestamp: new Date(),\n retries: 0,\n maxRetries: this.maxRetries,\n };\n this.queue.push(event as QueuedEvent);\n void this.processQueue();\n return id;\n }\n\n /**\n * Register a handler for a subject\n */\n registerHandler<T>(subject: string, handler: EventHandler<T>): void {\n this.handlers.set(subject, handler as EventHandler<unknown>);\n }\n\n /**\n * Process the queue\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n\n while (this.queue.length > 0) {\n const event = this.queue.shift();\n if (!event) continue;\n\n const handler = this.handlers.get(event.subject);\n if (handler) {\n try {\n const ackEvent: AcknowledgeableEvent = {\n id: event.id,\n subject: event.subject,\n data: event.data as Record<string, unknown>,\n metadata: {\n correlationId: event.id,\n ...event.metadata,\n },\n timestamp: event.timestamp.toISOString(),\n ack: async () => {\n logger.debug('[MemoryEventQueue] Event acknowledged', { id: event.id });\n },\n nak: async () => {\n logger.debug('[MemoryEventQueue] Event negatively acknowledged', { id: event.id });\n if (event.retries < event.maxRetries) {\n event.retries++;\n this.queue.push(event);\n }\n },\n term: async () => {\n logger.debug('[MemoryEventQueue] Event terminated', { id: event.id });\n },\n isRedelivered: () => event.retries > 0,\n getDeliveryAttempt: () => event.retries + 1,\n };\n await handler(ackEvent);\n } catch {\n if (event.retries < event.maxRetries) {\n event.retries++;\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay));\n this.queue.push(event);\n }\n }\n }\n }\n\n this.processing = false;\n }\n\n /**\n * Get queue length\n */\n get length(): number {\n return this.queue.length;\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * Publish an event (fire-and-forget)\n */\n async publish<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): Promise<void> {\n this.enqueue(subject, data, metadata);\n logger.debug('[MemoryEventQueue] Published event', { subject });\n }\n\n /**\n * Close the event queue\n */\n async close(): Promise<void> {\n this.clear();\n this.handlers.clear();\n logger.debug('[MemoryEventQueue] Event queue closed');\n }\n}\n\n/**\n * In-memory event publisher implementation\n */\nexport class MemoryEventPublisher implements IEventPublisher {\n private queue: MemoryEventQueue;\n private _connected = false;\n private publishCount = 0;\n\n constructor() {\n this.queue = new MemoryEventQueue();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventPublisher] Connected (in-memory mode)');\n }\n\n async disconnect(): Promise<void> {\n await this.queue.close();\n this._connected = false;\n logger.info('[MemoryEventPublisher] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventPublisher] ensureStream called (no-op for in-memory)');\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }): Promise<string> {\n if (!this._connected) {\n throw new Error('Publisher not connected');\n }\n\n const messageId = this.queue.enqueue(options.subject, options.data, options.metadata);\n this.publishCount++;\n\n logger.debug('[MemoryEventPublisher] Published', {\n subject: options.subject,\n messageId,\n });\n\n return messageId;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }>\n ): Promise<string[]> {\n const messageIds: string[] = [];\n for (const event of events) {\n const id = await this.publish(event);\n messageIds.push(id);\n }\n return messageIds;\n }\n\n async publishWithAck<T = unknown, R = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n // For in-memory, just publish and return empty response\n await this.publish({\n subject: options.subject,\n data: options.data,\n metadata: options.metadata as Record<string, unknown>,\n });\n return {} as R;\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * In-memory event consumer implementation\n */\nexport class MemoryEventConsumer implements IEventConsumer {\n private queue: MemoryEventQueue;\n private bus: MemoryEventBus;\n private _connected = false;\n private _subscriptions: Map<string, ISubscription> = new Map();\n private consumeCount = 0;\n private subIdCounter = 0;\n\n constructor(\n private streamName: string,\n private consumerName: string\n ) {\n this.queue = new MemoryEventQueue();\n this.bus = new MemoryEventBus();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventConsumer] Connected (in-memory mode)', {\n stream: this.streamName,\n consumer: this.consumerName,\n });\n }\n\n async disconnect(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n await this.queue.close();\n this.bus.clear();\n this._connected = false;\n logger.info('[MemoryEventConsumer] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureStream called (no-op for in-memory)');\n }\n\n async ensureConsumer(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureConsumer called (no-op for in-memory)');\n }\n\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n queueGroup?: string;\n }): Promise<ISubscription> {\n if (!this._connected) {\n throw new Error('Consumer not connected');\n }\n\n const { subject, handler } = options;\n const subId = `sub_${++this.subIdCounter}`;\n let messagesReceived = 0;\n let messagesProcessed = 0;\n let messagesFailed = 0;\n let lastActivity = new Date().toISOString();\n let active = true;\n\n // Register with both queue and bus\n this.queue.registerHandler(subject, async (event) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(event as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n this.bus.on(subject, async (data) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(data as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n const subscription: ISubscription = {\n id: subId,\n subject,\n unsubscribe: async () => {\n active = false;\n this._subscriptions.delete(subId);\n logger.debug('[MemoryEventConsumer] Unsubscribed', { subject });\n },\n isActive: () => active,\n getStats: () => ({\n messagesReceived,\n messagesProcessed,\n messagesFailed,\n lastActivity,\n }),\n };\n\n this._subscriptions.set(subId, subscription);\n logger.info('[MemoryEventConsumer] Subscribed', { subject, subscriptionId: subId });\n\n return subscription;\n }\n\n async subscribeMultiple<T = unknown>(subjects: string[], handler: EventHandler<T>): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n for (const subject of subjects) {\n const sub = await this.subscribe<T>({ subject, handler });\n subscriptions.push(sub);\n }\n return subscriptions;\n }\n\n async pull<T = unknown>(): Promise<AcknowledgeableEvent<T>[]> {\n // In-memory doesn't support pull-based consumption in a meaningful way\n logger.debug('[MemoryEventConsumer] pull called (returning empty for in-memory)');\n return [];\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return Array.from(this._subscriptions.values());\n }\n\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n // No-op for in-memory (no DLQ)\n logger.debug('[MemoryEventConsumer] processDLQ called (no-op for in-memory)');\n }\n\n // eslint-disable-next-line sonarjs/no-identical-functions -- Same implementation needed for both Publisher and Consumer\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: 0,\n messagesConsumed: this.consumeCount,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying bus (for testing/debugging)\n */\n getBus(): MemoryEventBus {\n return this.bus;\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * Create an in-memory event publisher\n */\nexport function createMemoryPublisher(): IEventPublisher {\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an in-memory event consumer\n */\nexport function createMemoryConsumer(stream: string, consumer: string): IEventConsumer {\n return new MemoryEventConsumer(stream, consumer);\n}\n\n/**\n * Create a GraphEventEmitter instance (in-memory)\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new MemoryEventQueue();\n}\n","/**\n * Graph Event Emitter\n *\n * Provides a GraphEventEmitter implementation that works with the event queue system.\n * Uses Redis Streams when REDIS_URL is set, in-memory otherwise.\n *\n * @module event-queue/graph-emitter\n * @category Events\n */\nimport { logger } from '../logger/index.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * RBAC metadata included in entity lifecycle events.\n * When present, the RBAC consumer will create/update/delete resources accordingly.\n * When absent, only the graph consumer processes the event (strict mode).\n */\nexport interface EntityEventRbacMetadata {\n /** RBAC resource type name (e.g., 'tag', 'conversation', 'bot') */\n resourceTypeName: string;\n /** Human-readable resource name */\n name?: string;\n /** Resource identifier (defaults to entity.id if not provided) */\n identifier?: string;\n /** Parent resource identifier for hierarchy */\n parentResourceIdentifier?: string;\n /** Whether to create a resource in RBAC (default: true) */\n createResource?: boolean;\n}\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void>;\n}\n\n/**\n * Graph Event Emitter (Redis Streams-backed in production).\n *\n * Publishes graph entity events to the Redis Streams event bus for\n * processing by graph sync workers. Falls back to in-memory when\n * `REDIS_URL` is unset.\n */\nexport class GraphEventEmitterImpl implements GraphEventEmitter {\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor() {\n if (process.env['REDIS_URL']) {\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info('[GraphEventEmitter] Using Redis Streams publisher');\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info('[GraphEventEmitter] Using in-memory publisher (REDIS_URL not configured)');\n }\n }\n\n /**\n * Ensure publisher is connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info('[GraphEventEmitterImpl] Publisher connected');\n });\n\n await this.connecting;\n }\n\n /**\n * Publish entity event to graph queue\n *\n * @param eventType - The lifecycle event type\n * @param entity - Entity data (id, type, data)\n * @param context - Event context (product, org, user, workspace)\n * @param rbac - Optional RBAC metadata. When present, the RBAC consumer will\n * create/update/delete resources. When absent, only graph consumer processes.\n */\n async publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void> {\n await this.ensureConnected();\n\n const eventId = uuidv4();\n const action = eventType.split('.')[1]; // 'created', 'updated', 'deleted'\n const subject = `graph.${context.productName}.${entity.type}.${action}`;\n\n logger.debug('[GraphEventEmitterImpl] Publishing entity event', {\n eventId,\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n hasRbac: !!rbac,\n });\n\n // All graph events go to WSPACE_GRAPH_EVENTS stream (where graph-sync-consumer\n // and rbac-entity-consumer listen).\n const streamName = 'WSPACE_GRAPH_EVENTS';\n const streamSubjects = ['graph.>'];\n\n await this.publisher.publish({\n subject,\n data: {\n eventId,\n eventType,\n productSource: context.productName,\n organizationId: context.organizationId,\n entity,\n context: {\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n },\n // Include RBAC metadata when configured (consumed by rbac-entity-consumer)\n ...(rbac && { rbac }),\n timestamp: new Date().toISOString(),\n },\n metadata: {\n eventId,\n productName: context.productName,\n organizationId: context.organizationId,\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n entityType: entity.type,\n entityId: entity.id,\n },\n options: {\n stream: streamName,\n streamSubjects,\n },\n });\n }\n\n /**\n * Disconnect the publisher\n */\n async disconnect(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info('[GraphEventEmitterImpl] Publisher disconnected');\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Singleton instance\n */\nlet _graphEventEmitter: GraphEventEmitterImpl | null = null;\n\n/**\n * Get or create the graph event emitter singleton\n *\n * @returns Graph event emitter instance\n */\nexport function getGraphEventEmitter(): GraphEventEmitter {\n if (!_graphEventEmitter) {\n _graphEventEmitter = new GraphEventEmitterImpl();\n }\n return _graphEventEmitter;\n}\n\n/**\n * Create a new graph event emitter instance (non-singleton)\n *\n * @returns New graph event emitter instance\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new GraphEventEmitterImpl();\n}\n\n/**\n * Reset the singleton (for testing)\n */\nexport async function resetGraphEventEmitter(): Promise<void> {\n if (_graphEventEmitter) {\n await _graphEventEmitter.disconnect();\n _graphEventEmitter = null;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/types/config.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","TRACE_KEYS","injectTraceFields","api","carrier","propagation","inject","context","active","set","c","k","v","err","error","Error","message","String","extractTraceContext","fields","undefined","key","value","extract","get","keys","Object","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","id","randomUUID","receivedCount","processedCount","failedCount","lastActivity","Date","toISOString","unsubscribeFn","unsubscribe","isActive","getStats","messagesReceived","messagesProcessed","messagesFailed","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","Map","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","connect","t","setInterval","sweepPending","catch","unref","drainDelayQueues","disconnect","clearInterval","unsubscribeAll","isConnected","healthCheck","t0","now","pong","ping","status","timestamp","connected","latencyMs","details","length","getStatistics","messagesConsumed","messagesPublished","activeConsumers","ensureStream","_config","ensureConsumer","subscribe","opts","sub","filter","s","push","startId","resolveStartId","options","deliverPolicy","wildcard","isWildcard","handlerFn","stream","streamKey","prefix","ensureGroup","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","matchSubject","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","evt","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","nak","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","acked","ack","xack","xdel","delay","score","payload","stringify","zadd","delayQueueKey","term","flat","xadd","isRedelivered","getDeliveryAttempt","size","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","slice","zrem","del","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","publish","publishInternal","msgId","messageId","enableDedup","enableDeduplication","ok","dedupKey","priority","defaultPriority","source","userId","workspaceId","tenantId","sadd","publishBatch","events","e","publishWithAck","reply","replyKey","replyTo","timeoutMs","xrange","last","payloadIdx","sendReply","expire","QueueType","resolveQueueType","REDIS_STREAMS","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-TM5RQ6P2.js","sourcesContent":["/**\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 Configuration Types\n */\n\n/**\n * Queue type enum\n */\nexport enum QueueType {\n REDIS_STREAMS = 'redis-streams',\n RABBITMQ = 'rabbitmq',\n KAFKA = 'kafka',\n SQS = 'sqs',\n}\n\n/**\n * Base configuration for event queue\n */\nexport interface BaseQueueConfig {\n /** Queue type */\n type: QueueType | string;\n /** Connection URL */\n url: string;\n /** Optional username */\n user?: string;\n /** Optional password */\n password?: string;\n /** Optional auth token */\n token?: string;\n /** Optional credentials file contents (auth payload for the backend) */\n creds?: string;\n /** Optional path to a credentials file */\n credsFile?: string;\n /** Maximum reconnection attempts (-1 for infinite) */\n maxReconnectAttempts?: number;\n /** Time to wait between reconnection attempts (ms) */\n reconnectTimeWait?: number;\n /** Connection timeout (ms) */\n connectionTimeout?: number;\n /** Connection name/identifier */\n name?: string;\n}\n\n/**\n * Publisher-specific configuration\n */\nexport interface PublisherConfig extends BaseQueueConfig {\n /** Default message TTL (ms) */\n defaultTTL?: number;\n /** Enable message deduplication */\n enableDeduplication?: boolean;\n /** Default priority for messages */\n defaultPriority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Consumer-specific configuration\n */\nexport interface ConsumerConfig extends Partial<BaseQueueConfig> {\n /** Stream name to consume from */\n stream: string;\n /** Consumer name (durable) */\n consumer: string;\n /** Subject filter pattern */\n filterSubject?: string;\n /** Maximum concurrent message processing */\n maxConcurrent?: number;\n /** Maximum delivery attempts */\n maxDeliver?: number;\n /** Acknowledgment wait time (nanoseconds) */\n ackWait?: number;\n /** Acknowledgment policy */\n ackPolicy?: 'explicit' | 'all' | 'none';\n /** Delivery policy */\n deliverPolicy?: 'all' | 'last' | 'new' | 'byStartSequence' | 'byStartTime';\n /** Maximum pending acknowledgments */\n maxAckPending?: number;\n}\n\n/**\n * Health check result\n */\nexport interface EventQueueHealthCheckResult {\n /** Overall health status */\n status: 'healthy' | 'unhealthy' | 'degraded';\n /** Timestamp of health check */\n timestamp: string;\n /** Connection status */\n connected?: boolean;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Additional details */\n details?: Record<string, unknown>;\n /** Error message if unhealthy */\n error?: string;\n}\n\n/**\n * Statistics\n */\nexport interface QueueStatistics {\n /** Total messages published */\n messagesPublished?: number;\n /** Total messages consumed */\n messagesConsumed?: number;\n /** Messages currently pending */\n messagesPending?: number;\n /** Messages in queue */\n queueSize?: number;\n /** Failed message count */\n messagesFailed?: number;\n /** Active consumers count */\n activeConsumers?: number;\n /** Active publishers count */\n activePublishers?: number;\n /** Average processing time (ms) */\n avgProcessingTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n","/**\n * Event Queue Factory\n *\n * Single-backend wrapper around the Redis Streams publisher/consumer.\n * NATS support was removed on 2026-05-16 — Redis is the canonical fleet\n * event-bus. Other backends (RabbitMQ, Kafka, SQS) are listed in\n * `QueueType` for future extension; today only `redis-streams` is wired.\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\n\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 // Kept for the API contract — always returns REDIS_STREAMS now.\n return QueueType.REDIS_STREAMS;\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.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(\n `Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`\n );\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.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n throw new Error(\n `Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`\n );\n }\n\n /**\n * Create a publisher from environment variables.\n * Reads `REDIS_URL`, `REDIS_PASSWORD`, and standard queue options.\n */\n static createPublisherFromEnv(): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\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\n /**\n * Create a consumer from environment variables.\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\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'] ? 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 // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer.\n * The layer is preserved on the publisher name; otherwise identical to\n * `createPublisherFromEnv()`.\n */\n static createPublisherForLayer(_layer: ServiceLayer, serviceName: string): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\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 /**\n * Create a consumer for a specific layer.\n */\n static createConsumerForLayer(\n _layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\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\n// Internal helper kept exported for callers that imported it previously.\nexport { resolveQueueType };\n"]}
|