@burdenoff/be-sdk 2026.1008.3 → 2026.1010.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.
Files changed (41) hide show
  1. package/dist/EventQueueFactory-ZHBJD3OD.js +7 -0
  2. package/dist/{EventQueueFactory-XRAIXICA.js.map → EventQueueFactory-ZHBJD3OD.js.map} +1 -1
  3. package/dist/cache/index.js +1 -1
  4. package/dist/{chunk-BOKCGHLE.js → chunk-2TTE5KSS.js} +3 -3
  5. package/dist/{chunk-BOKCGHLE.js.map → chunk-2TTE5KSS.js.map} +1 -1
  6. package/dist/{chunk-L5TDUAFN.js → chunk-6VK53YR3.js} +62 -10
  7. package/dist/chunk-6VK53YR3.js.map +1 -0
  8. package/dist/{chunk-PVNNVIIA.js → chunk-AT52BRVL.js} +5 -3
  9. package/dist/chunk-AT52BRVL.js.map +1 -0
  10. package/dist/{chunk-VVBA3LQV.js → chunk-GJR6AQAL.js} +6 -5
  11. package/dist/chunk-GJR6AQAL.js.map +1 -0
  12. package/dist/{chunk-KXY4RSYI.js → chunk-HIO3DNKK.js} +2 -2
  13. package/dist/{chunk-KXY4RSYI.js.map → chunk-HIO3DNKK.js.map} +1 -1
  14. package/dist/{chunk-MLBNB5DB.js → chunk-P67HNJGL.js} +3 -3
  15. package/dist/{chunk-MLBNB5DB.js.map → chunk-P67HNJGL.js.map} +1 -1
  16. package/dist/{chunk-3CUOJTE3.js → chunk-RTBCGUHC.js} +4 -4
  17. package/dist/{chunk-3CUOJTE3.js.map → chunk-RTBCGUHC.js.map} +1 -1
  18. package/dist/{chunk-MYK6X4RS.js → chunk-TNYNRKLQ.js} +3 -3
  19. package/dist/{chunk-MYK6X4RS.js.map → chunk-TNYNRKLQ.js.map} +1 -1
  20. package/dist/{chunk-EOHPDXXW.js → chunk-TPKYZO3O.js} +4 -4
  21. package/dist/{chunk-EOHPDXXW.js.map → chunk-TPKYZO3O.js.map} +1 -1
  22. package/dist/{chunk-JRMQ2B3B.js → chunk-VD4B362H.js} +4 -4
  23. package/dist/{chunk-JRMQ2B3B.js.map → chunk-VD4B362H.js.map} +1 -1
  24. package/dist/{chunk-3AEU6G6V.js → chunk-XTIOBNT7.js} +3 -3
  25. package/dist/{chunk-3AEU6G6V.js.map → chunk-XTIOBNT7.js.map} +1 -1
  26. package/dist/event-queue/index.js +3 -3
  27. package/dist/export/index.js +3 -3
  28. package/dist/gateway/index.js +2 -2
  29. package/dist/gateway/security/index.js +1 -1
  30. package/dist/graph/index.d.ts +1 -1
  31. package/dist/graph/index.js +5 -5
  32. package/dist/{index-_dsCeVat.d.ts → index-D3DzCz1d.d.ts} +13 -2
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.js +15 -15
  35. package/dist/init/index.js +3 -3
  36. package/dist/prisma/index.js +4 -4
  37. package/package.json +1 -1
  38. package/dist/EventQueueFactory-XRAIXICA.js +0 -7
  39. package/dist/chunk-L5TDUAFN.js.map +0 -1
  40. package/dist/chunk-PVNNVIIA.js.map +0 -1
  41. package/dist/chunk-VVBA3LQV.js.map +0 -1
@@ -1042,6 +1042,6 @@ var EventQueueFactory = class _EventQueueFactory {
1042
1042
  }
1043
1043
  };
1044
1044
 
1045
- export { EventQueueFactory, QueueType, RedisStreamsEventConsumer, RedisStreamsEventPublisher, resolveQueueType };
1046
- //# sourceMappingURL=chunk-MLBNB5DB.js.map
1047
- //# sourceMappingURL=chunk-MLBNB5DB.js.map
1045
+ export { EventQueueFactory, QueueType, RedisStreamsEventConsumer, RedisStreamsEventPublisher, resolveQueueType, safeStringify };
1046
+ //# sourceMappingURL=chunk-P67HNJGL.js.map
1047
+ //# sourceMappingURL=chunk-P67HNJGL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/settlement.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/serialize.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","messageSettlement","transport","tail","confirmed","publication","published","held","serial","operation","then","catch","acknowledge","settle","intent","publish","ack","nak","delay","Number","isSafeInteger","term","reason","terminate","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","shutdownName","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","settlements","Map","retainedSerializedFieldsBytes","knownStreams","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","registerDisposable","dispose","disconnect","connect","t","setInterval","sweepPending","unref","drainDelayQueues","unregisterDisposable","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","subjectFilter","filteredHandler","evt","matchSubject","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","actions","settlement","isRedelivered","getDeliveryAttempt","stringify","existing","entry","serializedFieldsBytes","TextEncoder","encode","byteLength","size","xack","milliseconds","score","zadd","delayQueueKey","flat","xadd","retained","delete","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","payload","slice","zrem","del","safeStringify","_key","toString","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","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","redactConnectionUrl","URL","rendered","authorityStart","authorityEnd","schemeEnd","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-MLBNB5DB.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(api.context.active(), carrier, {\n set(c, k, v) {\n c[k] = v;\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","/** Per-message, per-consumer-group confirmation. No durable publication deduplication is claimed. */\nexport interface SettlementTransport {\n acknowledge(): Promise<void>;\n delay(milliseconds: number): Promise<void>;\n terminate(reason?: 'max-deliver-exceeded'): Promise<void>;\n confirmed(): void;\n}\n\nexport interface SettlementActions {\n ack(): Promise<void>;\n nak(delay?: number): Promise<void>;\n term(reason?: 'max-deliver-exceeded'): Promise<void>;\n}\n\n/** Serializes concurrent operations; only an idempotent XACK may retry after an uncertain response. */\nexport function messageSettlement(transport: SettlementTransport): SettlementActions {\n let tail: Promise<void> = Promise.resolve();\n let confirmed = false;\n let publication: string | null = null;\n let published = false;\n let held = false;\n const serial = (operation: () => Promise<void>): Promise<void> => {\n const result = tail.then(operation);\n tail = result.catch(() => undefined);\n return result;\n };\n const acknowledge = async (): Promise<void> => {\n await transport.acknowledge();\n confirmed = true;\n transport.confirmed();\n };\n const settle = (intent: string, publish?: () => Promise<void>): Promise<void> =>\n serial(async () => {\n if (confirmed) return;\n if (held) throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n if (publication && intent !== publication && intent !== 'ACK')\n throw new Error('EVENT_SETTLEMENT_INTENT_CONFLICT');\n publication ??= intent;\n if (publish && !published) {\n publication = intent;\n // A rejected enqueue may already have reached Redis. Do not publish it again blindly.\n held = true;\n try {\n await publish();\n published = true;\n held = false;\n } catch {\n throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n }\n }\n await acknowledge();\n });\n return {\n ack: () => settle('ACK'),\n nak: (delay = 0) => {\n if (!Number.isSafeInteger(delay) || delay < 0) return Promise.reject(new Error('EVENT_SETTLEMENT_DELAY_INVALID'));\n // Leave the original PEL entry pending for normal reclaim; this is not an ACK.\n if (delay === 0)\n return serial(async () => {\n if (held) throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n if (publication && !confirmed) throw new Error('EVENT_SETTLEMENT_INTENT_CONFLICT');\n });\n return settle(`DELAY:${delay}`, () => transport.delay(delay));\n },\n term: (reason) => settle(`TERM:${reason ?? 'explicit'}`, () => transport.terminate(reason)),\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 { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { ConsumerConfig, EventQueueHealthCheckResult, QueueStatistics } 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';\nimport { messageSettlement, type SettlementActions } from './settlement.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.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, ShutdownDisposable {\n public readonly shutdownName: string;\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 readonly settlements = new Map<\n string,\n { actions: SettlementActions; entry: ParsedEntry; serializedFieldsBytes: number }\n >();\n private retainedSerializedFieldsBytes = 0;\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 ? Math.max(1000, Math.round(config.ackWait / 1_000_000)) : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n this.shutdownName = `redis-streams-consumer:${config.name ?? this.group}`;\n // The consumer holds one blocking ioredis client per subscribed stream —\n // the bulk of the event-bus connections. Ensure they are all closed on\n // graceful shutdown even if the owner never calls disconnect().\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\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 unregisterDisposable(this);\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 // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // pin the consumer to that single aggregated stream and filter by subject locally.\n // This mirrors the publisher's stream override logic so both sides use the same key.\n if (opts.options?.stream) {\n const stream = streamKey(opts.options.stream, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n const subjectFilter = wildcard ? opts.subject : null;\n const filteredHandler: EventHandler<unknown> = subjectFilter\n ? async (evt) => {\n if (matchSubject(subjectFilter, evt.subject)) {\n await handlerFn(evt);\n } else {\n await evt.ack();\n }\n }\n : handlerFn;\n this.spawnLoop(sub, stream, opts.subject, filteredHandler);\n return sub;\n }\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 actions = this.settlement(stream, id, parsed, group);\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n ack: actions.ack,\n nak: actions.nak,\n term: () => actions.term(),\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private settlement<T>(stream: string, id: string, parsed: ParsedEntry<T>, group: string): SettlementActions {\n const key = JSON.stringify([stream, group, id]);\n const existing = this.settlements.get(key);\n if (existing) {\n existing.entry.deliveryCount = Math.max(existing.entry.deliveryCount, parsed.deliveryCount);\n return existing.actions;\n }\n // Unknown publications are retained for this consumer lifetime, never evicted into a blind retry.\n const serializedFieldsBytes = new TextEncoder().encode(JSON.stringify(parsed.fields)).byteLength;\n if (this.settlements.size >= 10000 || this.retainedSerializedFieldsBytes + serializedFieldsBytes > 64 * 1024 * 1024)\n throw new Error('EVENT_SETTLEMENT_CAPACITY_HELD');\n const actions = messageSettlement({\n acknowledge: async () => {\n await this.connection.getClient().xack(stream, group, id);\n // XACK is group-local. Keep the stream entry available to independent groups.\n },\n delay: async (milliseconds) => {\n const score = Date.now() + milliseconds;\n if (!Number.isSafeInteger(score)) throw new Error('EVENT_SETTLEMENT_DELAY_INVALID');\n await this.connection.getClient().zadd(delayQueueKey(stream), score, `${id}|${JSON.stringify(parsed.fields)}`);\n },\n terminate: async (reason) => {\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n if (reason) flat.push('dlq-reason', reason, 'dlq-deliveries', String(parsed.deliveryCount));\n await this.connection.getClient().xadd(dlqKey(stream), 'MAXLEN', '~', 10000, '*', ...flat);\n },\n confirmed: () => {\n const retained = this.settlements.get(key);\n if (retained) this.retainedSerializedFieldsBytes -= retained.serializedFieldsBytes;\n this.settlements.delete(key);\n },\n });\n this.settlements.set(key, { actions, entry: parsed, serializedFieldsBytes });\n this.retainedSerializedFieldsBytes += serializedFieldsBytes;\n return actions;\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 parsed = this.parseEntry(stream, id, rawFields);\n parsed.deliveryCount = deliveryCount;\n await this.settlement(stream, id, parsed, this.group).term('max-deliver-exceeded');\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(delayQueueKey(stream), 0, Date.now(), 'LIMIT', 0, 50);\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 * Serialization helpers for the Redis Streams backend.\n *\n * @module event-queue/implementations/redis-streams/serialize\n */\n\n/**\n * `JSON.stringify` that does not throw on BigInt values.\n *\n * Event payloads frequently originate from Prisma rows, which expose BigInt\n * columns (e.g. counters / durations) as native `bigint`. The standard\n * `JSON.stringify` throws `TypeError: Do not know how to serialize a BigInt`,\n * which would drop the entire event — an entity would then silently never reach\n * the graph / search index. We serialize BigInt as its decimal string so the\n * value is preserved and the event is published.\n */\nexport function safeStringify(value: unknown): string {\n return JSON.stringify(value ?? null, (_key, val) => (typeof val === 'bigint' ? val.toString() : val));\n}\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 { boundaryOf, dedupKey, registryKey, replyKey, streamKey } from './keyspace.js';\nimport { safeStringify } from './serialize.js';\nimport { injectTraceFields } from './trace-context.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.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, ShutdownDisposable {\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 public readonly shutdownName: 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 this.shutdownName = `redis-streams-publisher:${config.name ?? 'default'}`;\n // Ensure the socket is closed on graceful shutdown even if the owner never\n // calls disconnect() (see lifecycle/shutdown-registry).\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n unregisterDisposable(this);\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 // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // use it as the Redis stream key so all events land in one aggregated stream that\n // a single consumer can read. Fall back to the per-subject stream when no override.\n const streamName = opts.options?.stream ?? opts.subject;\n const stream = streamKey(streamName, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup = 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: safeStringify(opts.data ?? null),\n metadata: safeStringify(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', safeStringify(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\nfunction redactConnectionUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n const rendered = parsed.toString();\n const authorityStart = rendered.indexOf('//') + 2;\n const authorityEnd = rendered.indexOf('@', authorityStart);\n if (authorityStart < 2 || authorityEnd < 0) return rendered;\n return `${rendered.slice(0, authorityStart)}:***@${rendered.slice(authorityEnd + 1)}`;\n } catch {\n const schemeEnd = url.indexOf('://');\n if (schemeEnd < 0) return url;\n const authorityStart = schemeEnd + 3;\n const authorityEnd = url.indexOf('@', authorityStart);\n if (authorityEnd < 0) return url;\n return `${url.slice(0, authorityStart)}:***@${url.slice(authorityEnd + 1)}`;\n }\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: redactConnectionUrl(config.url),\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\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: redactConnectionUrl(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(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\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"]}
1
+ {"version":3,"sources":["../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/settlement.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/serialize.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","messageSettlement","transport","tail","confirmed","publication","published","held","serial","operation","then","catch","acknowledge","settle","intent","publish","ack","nak","delay","Number","isSafeInteger","term","reason","terminate","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","shutdownName","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","settlements","Map","retainedSerializedFieldsBytes","knownStreams","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","registerDisposable","dispose","disconnect","connect","t","setInterval","sweepPending","unref","drainDelayQueues","unregisterDisposable","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","subjectFilter","filteredHandler","evt","matchSubject","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","actions","settlement","isRedelivered","getDeliveryAttempt","stringify","existing","entry","serializedFieldsBytes","TextEncoder","encode","byteLength","size","xack","milliseconds","score","zadd","delayQueueKey","flat","xadd","retained","delete","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","payload","slice","zrem","del","safeStringify","_key","toString","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","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","redactConnectionUrl","URL","rendered","authorityStart","authorityEnd","schemeEnd","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-P67HNJGL.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(api.context.active(), carrier, {\n set(c, k, v) {\n c[k] = v;\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","/** Per-message, per-consumer-group confirmation. No durable publication deduplication is claimed. */\nexport interface SettlementTransport {\n acknowledge(): Promise<void>;\n delay(milliseconds: number): Promise<void>;\n terminate(reason?: 'max-deliver-exceeded'): Promise<void>;\n confirmed(): void;\n}\n\nexport interface SettlementActions {\n ack(): Promise<void>;\n nak(delay?: number): Promise<void>;\n term(reason?: 'max-deliver-exceeded'): Promise<void>;\n}\n\n/** Serializes concurrent operations; only an idempotent XACK may retry after an uncertain response. */\nexport function messageSettlement(transport: SettlementTransport): SettlementActions {\n let tail: Promise<void> = Promise.resolve();\n let confirmed = false;\n let publication: string | null = null;\n let published = false;\n let held = false;\n const serial = (operation: () => Promise<void>): Promise<void> => {\n const result = tail.then(operation);\n tail = result.catch(() => undefined);\n return result;\n };\n const acknowledge = async (): Promise<void> => {\n await transport.acknowledge();\n confirmed = true;\n transport.confirmed();\n };\n const settle = (intent: string, publish?: () => Promise<void>): Promise<void> =>\n serial(async () => {\n if (confirmed) return;\n if (held) throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n if (publication && intent !== publication && intent !== 'ACK')\n throw new Error('EVENT_SETTLEMENT_INTENT_CONFLICT');\n publication ??= intent;\n if (publish && !published) {\n publication = intent;\n // A rejected enqueue may already have reached Redis. Do not publish it again blindly.\n held = true;\n try {\n await publish();\n published = true;\n held = false;\n } catch {\n throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n }\n }\n await acknowledge();\n });\n return {\n ack: () => settle('ACK'),\n nak: (delay = 0) => {\n if (!Number.isSafeInteger(delay) || delay < 0) return Promise.reject(new Error('EVENT_SETTLEMENT_DELAY_INVALID'));\n // Leave the original PEL entry pending for normal reclaim; this is not an ACK.\n if (delay === 0)\n return serial(async () => {\n if (held) throw new Error('EVENT_SETTLEMENT_PUBLICATION_UNKNOWN');\n if (publication && !confirmed) throw new Error('EVENT_SETTLEMENT_INTENT_CONFLICT');\n });\n return settle(`DELAY:${delay}`, () => transport.delay(delay));\n },\n term: (reason) => settle(`TERM:${reason ?? 'explicit'}`, () => transport.terminate(reason)),\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 { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { ConsumerConfig, EventQueueHealthCheckResult, QueueStatistics } 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';\nimport { messageSettlement, type SettlementActions } from './settlement.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.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, ShutdownDisposable {\n public readonly shutdownName: string;\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 readonly settlements = new Map<\n string,\n { actions: SettlementActions; entry: ParsedEntry; serializedFieldsBytes: number }\n >();\n private retainedSerializedFieldsBytes = 0;\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 ? Math.max(1000, Math.round(config.ackWait / 1_000_000)) : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n this.shutdownName = `redis-streams-consumer:${config.name ?? this.group}`;\n // The consumer holds one blocking ioredis client per subscribed stream —\n // the bulk of the event-bus connections. Ensure they are all closed on\n // graceful shutdown even if the owner never calls disconnect().\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\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 unregisterDisposable(this);\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 // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // pin the consumer to that single aggregated stream and filter by subject locally.\n // This mirrors the publisher's stream override logic so both sides use the same key.\n if (opts.options?.stream) {\n const stream = streamKey(opts.options.stream, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n const subjectFilter = wildcard ? opts.subject : null;\n const filteredHandler: EventHandler<unknown> = subjectFilter\n ? async (evt) => {\n if (matchSubject(subjectFilter, evt.subject)) {\n await handlerFn(evt);\n } else {\n await evt.ack();\n }\n }\n : handlerFn;\n this.spawnLoop(sub, stream, opts.subject, filteredHandler);\n return sub;\n }\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 actions = this.settlement(stream, id, parsed, group);\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n ack: actions.ack,\n nak: actions.nak,\n term: () => actions.term(),\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private settlement<T>(stream: string, id: string, parsed: ParsedEntry<T>, group: string): SettlementActions {\n const key = JSON.stringify([stream, group, id]);\n const existing = this.settlements.get(key);\n if (existing) {\n existing.entry.deliveryCount = Math.max(existing.entry.deliveryCount, parsed.deliveryCount);\n return existing.actions;\n }\n // Unknown publications are retained for this consumer lifetime, never evicted into a blind retry.\n const serializedFieldsBytes = new TextEncoder().encode(JSON.stringify(parsed.fields)).byteLength;\n if (this.settlements.size >= 10000 || this.retainedSerializedFieldsBytes + serializedFieldsBytes > 64 * 1024 * 1024)\n throw new Error('EVENT_SETTLEMENT_CAPACITY_HELD');\n const actions = messageSettlement({\n acknowledge: async () => {\n await this.connection.getClient().xack(stream, group, id);\n // XACK is group-local. Keep the stream entry available to independent groups.\n },\n delay: async (milliseconds) => {\n const score = Date.now() + milliseconds;\n if (!Number.isSafeInteger(score)) throw new Error('EVENT_SETTLEMENT_DELAY_INVALID');\n await this.connection.getClient().zadd(delayQueueKey(stream), score, `${id}|${JSON.stringify(parsed.fields)}`);\n },\n terminate: async (reason) => {\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n if (reason) flat.push('dlq-reason', reason, 'dlq-deliveries', String(parsed.deliveryCount));\n await this.connection.getClient().xadd(dlqKey(stream), 'MAXLEN', '~', 10000, '*', ...flat);\n },\n confirmed: () => {\n const retained = this.settlements.get(key);\n if (retained) this.retainedSerializedFieldsBytes -= retained.serializedFieldsBytes;\n this.settlements.delete(key);\n },\n });\n this.settlements.set(key, { actions, entry: parsed, serializedFieldsBytes });\n this.retainedSerializedFieldsBytes += serializedFieldsBytes;\n return actions;\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 parsed = this.parseEntry(stream, id, rawFields);\n parsed.deliveryCount = deliveryCount;\n await this.settlement(stream, id, parsed, this.group).term('max-deliver-exceeded');\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(delayQueueKey(stream), 0, Date.now(), 'LIMIT', 0, 50);\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 * Serialization helpers for the Redis Streams backend.\n *\n * @module event-queue/implementations/redis-streams/serialize\n */\n\n/**\n * `JSON.stringify` that does not throw on BigInt values.\n *\n * Event payloads frequently originate from Prisma rows, which expose BigInt\n * columns (e.g. counters / durations) as native `bigint`. The standard\n * `JSON.stringify` throws `TypeError: Do not know how to serialize a BigInt`,\n * which would drop the entire event — an entity would then silently never reach\n * the graph / search index. We serialize BigInt as its decimal string so the\n * value is preserved and the event is published.\n */\nexport function safeStringify(value: unknown): string {\n return JSON.stringify(value ?? null, (_key, val) => (typeof val === 'bigint' ? val.toString() : val));\n}\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 { boundaryOf, dedupKey, registryKey, replyKey, streamKey } from './keyspace.js';\nimport { safeStringify } from './serialize.js';\nimport { injectTraceFields } from './trace-context.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.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, ShutdownDisposable {\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 public readonly shutdownName: 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 this.shutdownName = `redis-streams-publisher:${config.name ?? 'default'}`;\n // Ensure the socket is closed on graceful shutdown even if the owner never\n // calls disconnect() (see lifecycle/shutdown-registry).\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n unregisterDisposable(this);\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 // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // use it as the Redis stream key so all events land in one aggregated stream that\n // a single consumer can read. Fall back to the per-subject stream when no override.\n const streamName = opts.options?.stream ?? opts.subject;\n const stream = streamKey(streamName, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup = 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: safeStringify(opts.data ?? null),\n metadata: safeStringify(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', safeStringify(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\nfunction redactConnectionUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n const rendered = parsed.toString();\n const authorityStart = rendered.indexOf('//') + 2;\n const authorityEnd = rendered.indexOf('@', authorityStart);\n if (authorityStart < 2 || authorityEnd < 0) return rendered;\n return `${rendered.slice(0, authorityStart)}:***@${rendered.slice(authorityEnd + 1)}`;\n } catch {\n const schemeEnd = url.indexOf('://');\n if (schemeEnd < 0) return url;\n const authorityStart = schemeEnd + 3;\n const authorityEnd = url.indexOf('@', authorityStart);\n if (authorityEnd < 0) return url;\n return `${url.slice(0, authorityStart)}:***@${url.slice(authorityEnd + 1)}`;\n }\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: redactConnectionUrl(config.url),\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\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: redactConnectionUrl(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(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\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"]}
@@ -1,6 +1,6 @@
1
1
  import { configureResourceCaps } from './chunk-MZCBEJ67.js';
2
2
  import { createCounter } from './chunk-AWPNRV3L.js';
3
- import { GatewayClient } from './chunk-BOKCGHLE.js';
3
+ import { GatewayClient } from './chunk-2TTE5KSS.js';
4
4
  import { LayerManager } from './chunk-5NT2OEDQ.js';
5
5
  import { logger } from './chunk-RU266375.js';
6
6
  import { __export, __name } from './chunk-XE4OXN2W.js';
@@ -160,7 +160,7 @@ async function initializeEventQueue(_config) {
160
160
  return void 0;
161
161
  }
162
162
  try {
163
- const { EventQueueFactory } = await import('./EventQueueFactory-XRAIXICA.js');
163
+ const { EventQueueFactory } = await import('./EventQueueFactory-ZHBJD3OD.js');
164
164
  const publisher = EventQueueFactory.createPublisherFromEnv();
165
165
  await publisher.connect();
166
166
  logger.info("[SDK Init] Redis Streams event publisher connected");
@@ -267,5 +267,5 @@ async function initializeLayerStreams(config) {
267
267
  __name(initializeLayerStreams, "initializeLayerStreams");
268
268
 
269
269
  export { getSDKState, init_exports, initializeBurdenoffSDK, isSDKInitialized, resetSDK };
270
- //# sourceMappingURL=chunk-3CUOJTE3.js.map
271
- //# sourceMappingURL=chunk-3CUOJTE3.js.map
270
+ //# sourceMappingURL=chunk-RTBCGUHC.js.map
271
+ //# sourceMappingURL=chunk-RTBCGUHC.js.map