@burdenoff/be-sdk 2026.518.2 → 2026.521.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/EventQueueFactory-PVXBZCT5.js +6 -0
  2. package/dist/{EventQueueFactory-6UJ3UIP4.js.map → EventQueueFactory-PVXBZCT5.js.map} +1 -1
  3. package/dist/auth/index.js +2 -2
  4. package/dist/cache/index.js +1 -1
  5. package/dist/{chunk-EZOXXSD4.js → chunk-2BG75H2K.js} +4 -4
  6. package/dist/{chunk-EZOXXSD4.js.map → chunk-2BG75H2K.js.map} +1 -1
  7. package/dist/{chunk-UNPJMENC.js → chunk-7NUQXGA7.js} +3 -3
  8. package/dist/{chunk-UNPJMENC.js.map → chunk-7NUQXGA7.js.map} +1 -1
  9. package/dist/{chunk-4XAEES25.js → chunk-ACYGOENW.js} +4 -850
  10. package/dist/chunk-ACYGOENW.js.map +1 -0
  11. package/dist/{chunk-MOCUBSTW.js → chunk-B7I4TABG.js} +2 -2
  12. package/dist/{chunk-MOCUBSTW.js.map → chunk-B7I4TABG.js.map} +1 -1
  13. package/dist/{chunk-O2MEBPDT.js → chunk-BNJFEOGH.js} +2 -2
  14. package/dist/chunk-BNJFEOGH.js.map +1 -0
  15. package/dist/{chunk-S5S6OBS6.js → chunk-BRYRHBAC.js} +3 -3
  16. package/dist/{chunk-S5S6OBS6.js.map → chunk-BRYRHBAC.js.map} +1 -1
  17. package/dist/{chunk-UBXFIIAW.js → chunk-BTQREMD4.js} +2 -2
  18. package/dist/{chunk-UBXFIIAW.js.map → chunk-BTQREMD4.js.map} +1 -1
  19. package/dist/{chunk-3F4SLVRL.js → chunk-DMPS4Y53.js} +3 -3
  20. package/dist/{chunk-3F4SLVRL.js.map → chunk-DMPS4Y53.js.map} +1 -1
  21. package/dist/{chunk-SNEOLWXT.js → chunk-E5USZ2MR.js} +2 -2
  22. package/dist/{chunk-SNEOLWXT.js.map → chunk-E5USZ2MR.js.map} +1 -1
  23. package/dist/{chunk-TM5RQ6P2.js → chunk-KGCISIBX.js} +22 -4
  24. package/dist/chunk-KGCISIBX.js.map +1 -0
  25. package/dist/{chunk-OJDXWHRJ.js → chunk-LD7ETTWG.js} +8 -7
  26. package/dist/chunk-LD7ETTWG.js.map +1 -0
  27. package/dist/{chunk-MVHOP4IG.js → chunk-MHNA7IS7.js} +2 -2
  28. package/dist/{chunk-MVHOP4IG.js.map → chunk-MHNA7IS7.js.map} +1 -1
  29. package/dist/{chunk-V2VEENJ2.js → chunk-PDSV3TFO.js} +3 -3
  30. package/dist/chunk-PDSV3TFO.js.map +1 -0
  31. package/dist/{chunk-CFUKZDDU.js → chunk-PPIDJP2W.js} +3 -3
  32. package/dist/chunk-PPIDJP2W.js.map +1 -0
  33. package/dist/{chunk-SO57HNXV.js → chunk-QRWTLPW5.js} +13 -7
  34. package/dist/chunk-QRWTLPW5.js.map +1 -0
  35. package/dist/chunk-REF7PANB.js +852 -0
  36. package/dist/chunk-REF7PANB.js.map +1 -0
  37. package/dist/{chunk-VLEOOG2L.js → chunk-SVONGBQR.js} +3 -3
  38. package/dist/{chunk-VLEOOG2L.js.map → chunk-SVONGBQR.js.map} +1 -1
  39. package/dist/{chunk-BESBOSX2.js → chunk-TGTJ653K.js} +4 -4
  40. package/dist/chunk-TGTJ653K.js.map +1 -0
  41. package/dist/{chunk-WCBKW3CL.js → chunk-X4GSV6NV.js} +5 -5
  42. package/dist/{chunk-WCBKW3CL.js.map → chunk-X4GSV6NV.js.map} +1 -1
  43. package/dist/{chunk-RRFNSBDZ.js → chunk-X4NELQLV.js} +3 -3
  44. package/dist/chunk-X4NELQLV.js.map +1 -0
  45. package/dist/event-queue/index.js +4 -4
  46. package/dist/export/index.js +3 -3
  47. package/dist/gateway/index.js +2 -2
  48. package/dist/gateway/security/index.js +1 -1
  49. package/dist/graph/index.d.ts +1 -1
  50. package/dist/graph/index.js +5 -5
  51. package/dist/graphql/index.js +2 -2
  52. package/dist/{index-CygU_fXS.d.ts → index-Cz9_vPi7.d.ts} +1 -0
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.js +23 -22
  55. package/dist/index.js.map +1 -1
  56. package/dist/init/index.js +3 -3
  57. package/dist/instrumentation/index.js +2 -1
  58. package/dist/metrics/index.d.ts +17 -0
  59. package/dist/metrics/index.js +53 -0
  60. package/dist/metrics/index.js.map +1 -0
  61. package/dist/pino-logger-NVZXQPWO.js +5 -0
  62. package/dist/{pino-logger-RYLGXPHZ.js.map → pino-logger-NVZXQPWO.js.map} +1 -1
  63. package/dist/prisma/index.js +4 -4
  64. package/dist/rbac/index.js +1 -1
  65. package/dist/{sdk-THO3IWEE.js → sdk-UWFH5PY7.js} +2 -2
  66. package/dist/{sdk-THO3IWEE.js.map → sdk-UWFH5PY7.js.map} +1 -1
  67. package/dist/server/index.js +3 -3
  68. package/dist/server/index.js.map +1 -1
  69. package/dist/telemetry/index.js +6 -5
  70. package/dist/telemetry/index.js.map +1 -1
  71. package/dist/tracker/index.js +2 -2
  72. package/dist/utils/index.js +1 -1
  73. package/dist/workspace-guard-524GBJQ6.js +5 -0
  74. package/dist/{workspace-guard-LHBNK4TG.js.map → workspace-guard-524GBJQ6.js.map} +1 -1
  75. package/package.json +3 -3
  76. package/dist/EventQueueFactory-6UJ3UIP4.js +0 -6
  77. package/dist/chunk-4XAEES25.js.map +0 -1
  78. package/dist/chunk-BESBOSX2.js.map +0 -1
  79. package/dist/chunk-CFUKZDDU.js.map +0 -1
  80. package/dist/chunk-O2MEBPDT.js.map +0 -1
  81. package/dist/chunk-OJDXWHRJ.js.map +0 -1
  82. package/dist/chunk-RRFNSBDZ.js.map +0 -1
  83. package/dist/chunk-SO57HNXV.js.map +0 -1
  84. package/dist/chunk-TM5RQ6P2.js.map +0 -1
  85. package/dist/chunk-V2VEENJ2.js.map +0 -1
  86. package/dist/pino-logger-RYLGXPHZ.js +0 -5
  87. package/dist/workspace-guard-LHBNK4TG.js +0 -5
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventPublisher.ts","../src/event-queue/types/config.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","TRACE_KEYS","injectTraceFields","api","carrier","propagation","inject","context","active","set","c","k","v","err","error","Error","message","String","extractTraceContext","fields","undefined","key","value","extract","get","keys","Object","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","id","randomUUID","receivedCount","processedCount","failedCount","lastActivity","Date","toISOString","unsubscribeFn","unsubscribe","isActive","getStats","messagesReceived","messagesProcessed","messagesFailed","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","Map","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","connect","t","setInterval","sweepPending","catch","unref","drainDelayQueues","disconnect","clearInterval","unsubscribeAll","isConnected","healthCheck","t0","now","pong","ping","status","timestamp","connected","latencyMs","details","length","getStatistics","messagesConsumed","messagesPublished","activeConsumers","ensureStream","_config","ensureConsumer","subscribe","opts","sub","filter","s","push","startId","resolveStartId","options","deliverPolicy","wildcard","isWildcard","handlerFn","stream","streamKey","prefix","ensureGroup","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","matchSubject","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","evt","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","nak","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","acked","ack","xack","xdel","delay","score","payload","stringify","zadd","delayQueueKey","term","flat","xadd","isRedelivered","getDeliveryAttempt","size","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","slice","zrem","del","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","publish","publishInternal","msgId","messageId","enableDedup","enableDeduplication","ok","dedupKey","priority","defaultPriority","source","userId","workspaceId","tenantId","sadd","publishBatch","events","e","publishWithAck","reply","replyKey","replyTo","timeoutMs","xrange","last","payloadIdx","sendReply","expire","QueueType","resolveQueueType","REDIS_STREAMS","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-TM5RQ6P2.js","sourcesContent":["/**\n * W3C trace context propagation for Redis Streams entries.\n *\n * Stream entries carry trace context as ordinary fields (`traceparent`,\n * `tracestate`, `baggage`). When `@opentelemetry/api` isn't installed at the\n * consumer, these helpers degrade to no-ops.\n */\nimport { logger } from '../../../logger/index.js';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) return otelApiPromise;\n otelApiPromise = (async () => {\n try {\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[redis-streams/trace-context] @opentelemetry/api not available; tracing disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst TRACE_KEYS = ['traceparent', 'tracestate', 'baggage'] as const;\n\n/** Inject the active OTel context into a plain record of stream fields. */\nexport async function injectTraceFields(): Promise<Record<string, string>> {\n const api = await loadOtelApi();\n if (!api) return {};\n const carrier: Record<string, string> = {};\n try {\n api.propagation.inject(\n api.context.active(),\n carrier,\n {\n set(c, k, v) {\n c[k] = v;\n },\n }\n );\n } catch (err) {\n logger.debug('[redis-streams/trace-context] inject failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return carrier;\n}\n\n/** Extract OTel context from stream-entry fields. */\nexport async function extractTraceContext(fields: Record<string, string>): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api) return undefined;\n const carrier: Record<string, string> = {};\n for (const key of TRACE_KEYS) {\n const value = fields[key];\n if (value) carrier[key] = value;\n }\n try {\n return api.propagation.extract(api.context.active(), carrier, {\n get(c, k) {\n return c[k];\n },\n keys(c) {\n return Object.keys(c);\n },\n });\n } catch {\n return undefined;\n }\n}\n\n/** Wrap a consumer handler in a CONSUMER-kind span rooted at the carried trace. */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n fields: Record<string, string>,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractTraceContext(fields);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/redis-streams');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `redis-streams.consume ${subject}`,\n {\n kind: 5,\n attributes: { 'messaging.system': 'redis', 'messaging.destination.name': subject },\n },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch {\n return handler();\n }\n}\n","/**\n * Redis Streams implementation of IEventConsumer.\n *\n * One ioredis client per active subscription handles `XREADGROUP BLOCK` in a\n * background loop, with periodic XAUTOCLAIM reclaiming abandoned pending\n * entries and a small ZSET-based delay queue draining NAK'd messages back\n * into the stream when their delay expires.\n */\nimport { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { logger } from '../../../logger/index.js';\nimport type {\n IEventConsumer,\n ISubscription,\n} from '../../interfaces/IEventConsumer.js';\nimport type {\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from '../../types/config.js';\nimport type {\n AcknowledgeableEvent,\n EventHandler,\n EventMetadata,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n delayLockKey,\n delayQueueKey,\n dlqKey,\n isWildcard,\n matchSubject,\n registryKey,\n streamKey,\n} from './keyspace.js';\nimport { runWithConsumerSpan } from './trace-context.js';\n\ninterface ParsedEntry<T = unknown> {\n id: string;\n stream: string;\n subject: string;\n data: T;\n metadata: EventMetadata;\n timestamp: string;\n fields: Record<string, string>;\n deliveryCount: number;\n}\n\nconst DEFAULT_BLOCK_MS = 5000;\nconst DEFAULT_BATCH = 10;\nconst REGISTRY_REFRESH_MS = 10_000;\nconst DEFAULT_ACK_WAIT_MS = 30_000;\nconst DEFAULT_MAX_DELIVER = 3;\nconst SWEEP_INTERVAL_MS = 15_000;\nconst DELAYQ_INTERVAL_MS = 1_000;\n\nclass RedisStreamsSubscription implements ISubscription {\n readonly id = randomUUID();\n private active = true;\n private receivedCount = 0;\n private processedCount = 0;\n private failedCount = 0;\n private lastActivity = new Date().toISOString();\n\n constructor(\n readonly subject: string,\n private readonly unsubscribeFn: () => Promise<void>\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) return;\n this.active = false;\n await this.unsubscribeFn();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.receivedCount,\n messagesProcessed: this.processedCount,\n messagesFailed: this.failedCount,\n lastActivity: this.lastActivity,\n };\n }\n\n recordReceived(): void {\n this.receivedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordProcessed(): void {\n this.processedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordFailed(): void {\n this.failedCount++;\n this.lastActivity = new Date().toISOString();\n }\n}\n\nexport interface RedisStreamsConsumerConfig extends ConsumerConfig {\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventConsumer implements IEventConsumer {\n private readonly connection: RedisStreamsConnection;\n private subscriptions: RedisStreamsSubscription[] = [];\n private readonly subscriptionLoops: Set<() => Promise<void>> = new Set();\n private readonly keyPrefix: string;\n private readonly consumerName: string;\n private readonly group: string;\n private readonly maxDeliver: number;\n private readonly ackWaitMs: number;\n private readonly maxConcurrent: number;\n private consumedCount = 0;\n private failedCount = 0;\n private lastActivity: Date | null = null;\n private stopped = false;\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private delayqTimer: ReturnType<typeof setInterval> | null = null;\n private knownStreams: Map<string, string> = new Map(); // streamKey -> subject\n\n constructor(config: RedisStreamsConsumerConfig) {\n this.connection = new RedisStreamsConnection({\n type: 'redis-streams',\n url: config.url ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n user: config.user,\n password: config.password,\n name: config.name,\n connectionTimeout: config.connectionTimeout,\n });\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.group = config.consumer || config.name || 'default-consumer';\n this.consumerName = `${this.group}:${hostname()}:${process.pid}`;\n this.maxDeliver = config.maxDeliver ?? DEFAULT_MAX_DELIVER;\n this.ackWaitMs = config.ackWait\n ? Math.max(1000, Math.round(config.ackWait / 1_000_000))\n : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n if (!this.sweepTimer) {\n const t = setInterval(() => {\n void this.sweepPending().catch((err) => {\n logger.debug('[RedisStreamsEventConsumer] sweep error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, SWEEP_INTERVAL_MS);\n t.unref?.();\n this.sweepTimer = t;\n }\n if (!this.delayqTimer) {\n const t = setInterval(() => {\n void this.drainDelayQueues().catch(() => undefined);\n }, DELAYQ_INTERVAL_MS);\n t.unref?.();\n this.delayqTimer = t;\n }\n }\n\n async disconnect(): Promise<void> {\n this.stopped = true;\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n if (this.delayqTimer) clearInterval(this.delayqTimer);\n await this.unsubscribeAll();\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: {\n type: 'redis-streams',\n subscriptions: this.subscriptions.length,\n },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return Promise.resolve({\n messagesConsumed: this.consumedCount,\n messagesFailed: this.failedCount,\n messagesPublished: 0,\n activeConsumers: this.subscriptions.length,\n lastActivity: this.lastActivity?.toISOString() ?? null,\n details: { type: 'redis-streams', group: this.group },\n });\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async ensureConsumer(_config: ConsumerConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async subscribe<T = unknown>(opts: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n await this.connect();\n const sub = new RedisStreamsSubscription(opts.subject, async () => {\n this.subscriptions = this.subscriptions.filter((s) => s !== sub);\n });\n this.subscriptions.push(sub);\n\n const startId = this.resolveStartId(opts.options?.deliverPolicy);\n const wildcard = isWildcard(opts.subject);\n const handlerFn = opts.handler as EventHandler<unknown>;\n\n if (!wildcard) {\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n this.spawnLoop(sub, stream, opts.subject, handlerFn);\n } else {\n const boundary = boundaryOf(opts.subject);\n const refresh = async (): Promise<void> => {\n const client = this.connection.getClient();\n const subjects = await client.smembers(registryKey(boundary));\n for (const s of subjects) {\n if (!matchSubject(opts.subject, s)) continue;\n const stream = streamKey(s, { prefix: this.keyPrefix });\n if (this.knownStreams.has(stream)) continue;\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, s);\n this.spawnLoop(sub, stream, s, handlerFn);\n }\n };\n await refresh();\n const t = setInterval(() => {\n if (this.stopped || !sub.isActive()) {\n clearInterval(t);\n return;\n }\n void refresh().catch(() => undefined);\n }, REGISTRY_REFRESH_MS);\n t.unref?.();\n }\n\n return sub;\n }\n\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const out: ISubscription[] = [];\n for (const subject of subjects) {\n out.push(await this.subscribe({ subject, handler, options }));\n }\n return out;\n }\n\n async pull<T = unknown>(opts: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n await this.connect();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, '$');\n const client = this.connection.getClient();\n const raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n opts.batch ?? DEFAULT_BATCH,\n 'BLOCK',\n opts.timeout ?? DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!raw) return [];\n const out: AcknowledgeableEvent<T>[] = [];\n for (const [streamName, entries] of raw) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(streamName, id, rawFields);\n out.push(this.toAcknowledgeable(streamName, id, parsed));\n }\n }\n return out;\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of [...this.subscriptions]) {\n await sub.unsubscribe();\n }\n this.subscriptions = [];\n this.subscriptionLoops.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return [...this.subscriptions];\n }\n\n async processDLQ<T = unknown>(handler: EventHandler<T>): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const dlqGroup = `${this.group}-dlq`;\n for (const [stream] of this.knownStreams) {\n const dlq = dlqKey(stream);\n try {\n await client.xgroup('CREATE', dlq, dlqGroup, '0', 'MKSTREAM');\n } catch {\n /* already exists */\n }\n const res = (await client.xreadgroup(\n 'GROUP',\n dlqGroup,\n this.consumerName,\n 'COUNT',\n 50,\n 'BLOCK',\n 100,\n 'STREAMS',\n dlq,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!res) continue;\n for (const [, entries] of res) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(dlq, id, rawFields);\n const evt = this.toAcknowledgeable<T>(dlq, id, parsed, dlqGroup);\n try {\n await handler(evt);\n } catch (err) {\n logger.error('[RedisStreamsEventConsumer] DLQ handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n }\n }\n\n async listSubjects(_stream?: string): Promise<string[]> {\n await this.connect();\n const client = this.connection.getClient();\n const seen = new Set<string>();\n for (const subject of this.knownStreams.values()) {\n const members = await client.smembers(registryKey(boundaryOf(subject)));\n for (const m of members) seen.add(m);\n }\n return [...seen];\n }\n\n // ---- internals ----\n\n private resolveStartId(policy: SubscriptionOptions['deliverPolicy'] | undefined): string {\n switch (policy) {\n case 'all':\n return '0';\n case 'new':\n return '$';\n case 'last':\n return '$';\n default:\n return '$';\n }\n }\n\n private async ensureGroup(stream: string, startId: string): Promise<void> {\n const client = this.connection.getClient();\n try {\n await client.xgroup('CREATE', stream, this.group, startId, 'MKSTREAM');\n logger.debug('[RedisStreamsEventConsumer] group created', {\n stream,\n group: this.group,\n startId,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('BUSYGROUP')) {\n throw err;\n }\n }\n }\n\n private spawnLoop(\n sub: RedisStreamsSubscription,\n stream: string,\n subject: string,\n handler: EventHandler<unknown>\n ): void {\n const loop = async (): Promise<void> => {\n const client = await this.connection.makeBlockingClient();\n try {\n while (!this.stopped && sub.isActive()) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n this.maxConcurrent,\n 'BLOCK',\n DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) {\n await this.ensureGroup(stream, '$');\n continue;\n }\n logger.warn('[RedisStreamsEventConsumer] read error', { stream, error: msg });\n await new Promise((res) => setTimeout(res, 1000));\n continue;\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n sub.recordReceived();\n this.consumedCount++;\n this.lastActivity = new Date();\n const parsed = this.parseEntry(stream, id, rawFields);\n const evt = this.toAcknowledgeable(stream, id, parsed);\n try {\n await runWithConsumerSpan(subject, parsed.fields, () => handler(evt));\n sub.recordProcessed();\n } catch (err) {\n sub.recordFailed();\n this.failedCount++;\n logger.error('[RedisStreamsEventConsumer] handler error', {\n subject,\n id,\n error: err instanceof Error ? err.message : String(err),\n });\n // Auto-nak on uncaught throw (re-deliver after ackWait).\n try {\n await evt.nak();\n } catch {\n /* ignore */\n }\n }\n }\n }\n }\n } finally {\n try {\n client.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventConsumer] loop crashed', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n private parseEntry<T>(stream: string, id: string, rawFields: string[]): ParsedEntry<T> {\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const key = rawFields[i];\n const val = rawFields[i + 1];\n if (key === undefined || val === undefined) continue;\n fields[key] = val;\n }\n let data: T;\n try {\n data = JSON.parse(fields['payload'] ?? 'null') as T;\n } catch {\n data = fields['payload'] as unknown as T;\n }\n let metadata: EventMetadata;\n try {\n metadata = JSON.parse(fields['metadata'] ?? '{}') as EventMetadata;\n } catch {\n metadata = { correlationId: fields['correlation-id'] ?? '' };\n }\n if (!metadata.correlationId) metadata.correlationId = fields['correlation-id'] ?? '';\n return {\n id,\n stream,\n subject: fields['subject'] ?? '',\n data,\n metadata,\n timestamp: fields['timestamp'] ?? new Date().toISOString(),\n fields,\n deliveryCount: 1,\n };\n }\n\n private toAcknowledgeable<T>(\n stream: string,\n id: string,\n parsed: ParsedEntry<T>,\n group: string = this.group\n ): AcknowledgeableEvent<T> {\n const connection = this.connection;\n let acked = false;\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n async ack(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n async nak(delay = 0): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n if (delay > 0) {\n // Park in delay queue; worker will re-XADD and ACK original.\n const score = Date.now() + delay;\n const payload = JSON.stringify(parsed.fields);\n await client.zadd(delayQueueKey(stream), score, `${id}|${payload}`);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n }\n // delay=0: do nothing — XAUTOCLAIM will reclaim after ackWait.\n },\n async term(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n const dlq = dlqKey(stream);\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n await client.xadd(dlq, 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private async sweepPending(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n try {\n const claimed = (await client.xautoclaim(\n stream,\n this.group,\n this.consumerName,\n this.ackWaitMs,\n '0',\n 'COUNT',\n 50\n )) as [string, Array<[string, string[]]>, string[]] | null;\n if (!claimed) continue;\n const entries = claimed[1] ?? [];\n for (const [id, rawFields] of entries) {\n const pending = (await client.xpending(\n stream,\n this.group,\n 'IDLE',\n 0,\n '-',\n '+',\n 1,\n this.consumerName\n )) as Array<[string, string, number, number]>;\n const deliveryCount = Array.isArray(pending) && pending[0] ? pending[0][3] : 1;\n if (deliveryCount > this.maxDeliver) {\n const flat: string[] = [];\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n flat.push(rawFields[i]!, rawFields[i + 1]!);\n }\n flat.push('dlq-reason', 'max-deliver-exceeded');\n flat.push('dlq-deliveries', String(deliveryCount));\n await client.xadd(dlqKey(stream), 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, this.group, id);\n await client.xdel(stream, id).catch(() => undefined);\n logger.warn('[RedisStreamsEventConsumer] message moved to DLQ', {\n stream,\n id,\n deliveryCount,\n });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) continue;\n logger.debug('[RedisStreamsEventConsumer] sweep iteration error', { stream, error: msg });\n }\n }\n }\n\n private async drainDelayQueues(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n const lockKey = delayLockKey(stream);\n const got = await client.set(lockKey, this.consumerName, 'NX', 'EX', 30).catch(() => null);\n if (got !== 'OK') continue;\n try {\n const due = await client.zrangebyscore(\n delayQueueKey(stream),\n 0,\n Date.now(),\n 'LIMIT',\n 0,\n 50\n );\n for (const member of due) {\n const split = member.indexOf('|');\n if (split < 0) continue;\n const payload = member.slice(split + 1);\n let fields: Record<string, string> = {};\n try {\n fields = JSON.parse(payload) as Record<string, string>;\n } catch {\n continue;\n }\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) flat.push(k, v);\n await client.xadd(stream, 'MAXLEN', '~', 100_000, '*', ...flat);\n await client.zrem(delayQueueKey(stream), member);\n }\n } finally {\n await client.del(lockKey).catch(() => undefined);\n }\n }\n }\n}\n\nexport type { IoRedis };\n","/**\n * Redis Streams implementation of IEventPublisher.\n *\n * Each subject is its own stream (`boff:events:<subject-with-colons>`); MAXLEN\n * trimming keeps each stream bounded; dedup is enforced by `SET NX EX` on a\n * per-message-id key before XADD.\n */\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type { EventMetadata, StreamConfig } from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n dedupKey,\n registryKey,\n replyKey,\n streamKey,\n} from './keyspace.js';\nimport { injectTraceFields } from './trace-context.js';\n\nexport interface RedisStreamsPublisherConfig extends PublisherConfig {\n /** Approximate MAXLEN trim threshold per stream. Default 100_000. */\n maxLen?: number;\n /** Dedup TTL window in seconds. Default 120. */\n dedupTtlSeconds?: number;\n /** Key namespace override. Default `boff:events`. */\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventPublisher implements IEventPublisher {\n private connection: RedisStreamsConnection;\n private publishCount = 0;\n private lastPublishTime: Date | null = null;\n private readonly maxLen: number;\n private readonly dedupTtl: number;\n private readonly keyPrefix: string;\n\n constructor(private config: RedisStreamsPublisherConfig) {\n this.connection = new RedisStreamsConnection(config);\n this.maxLen = config.maxLen ?? parseInt(process.env['REDIS_STREAMS_MAXLEN'] ?? '100000', 10);\n this.dedupTtl = config.dedupTtlSeconds ?? parseInt(process.env['REDIS_STREAMS_DEDUP_TTL'] ?? '120', 10);\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: { type: 'redis-streams', url: this.config.url },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesFailed: 0,\n activePublishers: 1,\n activeConsumers: 0,\n lastActivity: this.lastPublishTime?.toISOString() ?? null,\n details: { type: 'redis-streams' },\n };\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n // Streams are created lazily by XADD; no-op here.\n return Promise.resolve();\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n return this.publishInternal(options);\n }\n\n private async publishInternal<T>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<string> {\n await this.connect();\n const client = this.connection.getClient();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup =\n this.config.enableDeduplication === true || opts.options?.messageId !== undefined;\n\n if (enableDedup) {\n const ok = await client.set(dedupKey(stream, msgId), '1', 'NX', 'EX', this.dedupTtl);\n if (ok !== 'OK') {\n logger.debug('[RedisStreamsEventPublisher] dedup hit; skipping publish', {\n subject: opts.subject,\n msgId,\n });\n return msgId;\n }\n }\n\n const trace = await injectTraceFields();\n const fields: Record<string, string> = {\n 'msg-id': msgId,\n subject: opts.subject,\n 'correlation-id': correlationId,\n timestamp: new Date().toISOString(),\n priority: opts.options?.priority ?? this.config.defaultPriority ?? 'normal',\n source: opts.metadata?.source ?? this.config.name ?? 'unknown',\n payload: JSON.stringify(opts.data ?? null),\n metadata: JSON.stringify(opts.metadata ?? {}),\n ...trace,\n };\n if (opts.metadata?.userId) fields['user-id'] = String(opts.metadata.userId);\n if (opts.metadata?.workspaceId) fields['workspace-id'] = String(opts.metadata.workspaceId);\n if (opts.metadata?.tenantId) fields['tenant-id'] = String(opts.metadata.tenantId);\n\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n flat.push(k, v);\n }\n\n const id = await client.xadd(stream, 'MAXLEN', '~', this.maxLen, '*', ...flat);\n\n // Async fire-and-forget registry update\n void client.sadd(registryKey(boundaryOf(opts.subject)), opts.subject).catch(() => undefined);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n logger.debug('[RedisStreamsEventPublisher] published', {\n subject: opts.subject,\n stream,\n id,\n });\n return id;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const out: string[] = [];\n for (const e of events) {\n out.push(await this.publishInternal(e));\n }\n return out;\n }\n\n /**\n * Emulated request/response: writer XADDs onto its own subject, then\n * blocks on a one-shot reply stream keyed by correlationId.\n */\n async publishWithAck<T = unknown, R = unknown>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n await this.connect();\n const client = this.connection.getClient();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const reply = replyKey(correlationId);\n await this.publishInternal({\n subject: opts.subject,\n data: opts.data,\n metadata: { ...opts.metadata, correlationId, replyTo: reply },\n });\n\n const timeoutMs = opts.timeout ?? 5000;\n const t0 = Date.now();\n while (Date.now() - t0 < timeoutMs) {\n const entries = (await client.xrange(reply, '-', '+')) as Array<[string, string[]]>;\n if (Array.isArray(entries) && entries.length > 0) {\n const last = entries[entries.length - 1];\n if (!last) break;\n const rawFields = last[1];\n const payloadIdx = rawFields.indexOf('payload');\n const payload = payloadIdx >= 0 ? rawFields[payloadIdx + 1] : '{}';\n await client.del(reply);\n return JSON.parse(payload ?? '{}') as R;\n }\n await new Promise((res) => setTimeout(res, 50));\n }\n await client.del(reply).catch(() => undefined);\n throw new Error(`[RedisStreamsEventPublisher] publishWithAck timed out for subject=${opts.subject}`);\n }\n\n /** Internal helper used by the consumer's reply path. */\n async sendReply(correlationId: string, data: unknown): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const key = replyKey(correlationId);\n await client.xadd(key, '*', 'payload', JSON.stringify(data ?? null));\n await client.expire(key, 60);\n }\n}\n\nexport type { IoRedis };\n","/**\n * Event Queue Configuration Types\n */\n\n/**\n * Queue type enum\n */\nexport enum QueueType {\n REDIS_STREAMS = 'redis-streams',\n RABBITMQ = 'rabbitmq',\n KAFKA = 'kafka',\n SQS = 'sqs',\n}\n\n/**\n * Base configuration for event queue\n */\nexport interface BaseQueueConfig {\n /** Queue type */\n type: QueueType | string;\n /** Connection URL */\n url: string;\n /** Optional username */\n user?: string;\n /** Optional password */\n password?: string;\n /** Optional auth token */\n token?: string;\n /** Optional credentials file contents (auth payload for the backend) */\n creds?: string;\n /** Optional path to a credentials file */\n credsFile?: string;\n /** Maximum reconnection attempts (-1 for infinite) */\n maxReconnectAttempts?: number;\n /** Time to wait between reconnection attempts (ms) */\n reconnectTimeWait?: number;\n /** Connection timeout (ms) */\n connectionTimeout?: number;\n /** Connection name/identifier */\n name?: string;\n}\n\n/**\n * Publisher-specific configuration\n */\nexport interface PublisherConfig extends BaseQueueConfig {\n /** Default message TTL (ms) */\n defaultTTL?: number;\n /** Enable message deduplication */\n enableDeduplication?: boolean;\n /** Default priority for messages */\n defaultPriority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Consumer-specific configuration\n */\nexport interface ConsumerConfig extends Partial<BaseQueueConfig> {\n /** Stream name to consume from */\n stream: string;\n /** Consumer name (durable) */\n consumer: string;\n /** Subject filter pattern */\n filterSubject?: string;\n /** Maximum concurrent message processing */\n maxConcurrent?: number;\n /** Maximum delivery attempts */\n maxDeliver?: number;\n /** Acknowledgment wait time (nanoseconds) */\n ackWait?: number;\n /** Acknowledgment policy */\n ackPolicy?: 'explicit' | 'all' | 'none';\n /** Delivery policy */\n deliverPolicy?: 'all' | 'last' | 'new' | 'byStartSequence' | 'byStartTime';\n /** Maximum pending acknowledgments */\n maxAckPending?: number;\n}\n\n/**\n * Health check result\n */\nexport interface EventQueueHealthCheckResult {\n /** Overall health status */\n status: 'healthy' | 'unhealthy' | 'degraded';\n /** Timestamp of health check */\n timestamp: string;\n /** Connection status */\n connected?: boolean;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Additional details */\n details?: Record<string, unknown>;\n /** Error message if unhealthy */\n error?: string;\n}\n\n/**\n * Statistics\n */\nexport interface QueueStatistics {\n /** Total messages published */\n messagesPublished?: number;\n /** Total messages consumed */\n messagesConsumed?: number;\n /** Messages currently pending */\n messagesPending?: number;\n /** Messages in queue */\n queueSize?: number;\n /** Failed message count */\n messagesFailed?: number;\n /** Active consumers count */\n activeConsumers?: number;\n /** Active publishers count */\n activePublishers?: number;\n /** Average processing time (ms) */\n avgProcessingTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n","/**\n * Event Queue Factory\n *\n * Single-backend wrapper around the Redis Streams publisher/consumer.\n * NATS support was removed on 2026-05-16 — Redis is the canonical fleet\n * event-bus. Other backends (RabbitMQ, Kafka, SQS) are listed in\n * `QueueType` for future extension; today only `redis-streams` is wired.\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\n\nimport { RedisStreamsEventConsumer } from '../implementations/redis-streams/RedisStreamsEventConsumer.js';\nimport { RedisStreamsEventPublisher } from '../implementations/redis-streams/RedisStreamsEventPublisher.js';\nimport type { IEventConsumer } from '../interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from '../interfaces/IEventPublisher.js';\nimport { type ConsumerConfig, type PublisherConfig, QueueType } from '../types/config.js';\n\nfunction resolveQueueType(): QueueType {\n // Kept for the API contract — always returns REDIS_STREAMS now.\n return QueueType.REDIS_STREAMS;\n}\n\n/**\n * Factory for creating event queue instances\n */\nexport class EventQueueFactory {\n /**\n * Create an event publisher based on configuration\n */\n static createPublisher(config: PublisherConfig): IEventPublisher {\n logger.info('[EventQueueFactory] Creating event publisher', {\n type: config.type,\n url: config.url,\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(\n `Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`\n );\n }\n\n /**\n * Create an event consumer based on configuration\n */\n static createConsumer(config: ConsumerConfig): IEventConsumer {\n logger.info('[EventQueueFactory] Creating event consumer', {\n type: config.type,\n url: config.url,\n stream: config.stream,\n consumer: config.consumer,\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n throw new Error(\n `Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`\n );\n }\n\n /**\n * Create a publisher from environment variables.\n * Reads `REDIS_URL`, `REDIS_PASSWORD`, and standard queue options.\n */\n static createPublisherFromEnv(): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'be-sdk-publisher',\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer from environment variables.\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? consumer,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer.\n * The layer is preserved on the publisher name; otherwise identical to\n * `createPublisherFromEnv()`.\n */\n static createPublisherForLayer(_layer: ServiceLayer, serviceName: string): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer for a specific layer.\n */\n static createConsumerForLayer(\n _layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n}\n\n// Internal helper kept exported for callers that imported it previously.\nexport { resolveQueueType };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cache/index.ts","../src/cache/implementations/memory/MemoryCacheProvider.ts","../src/cache/implementations/valkey/ValkeyGlideProvider.ts","../src/cache/factory/CacheFactory.ts","../src/cache/types/config.ts"],"names":["MemoryCacheProvider","cache","Map","namespace","defaultTTL","maxSize","enableLogging","connected","stats","hits","misses","sets","deletes","evictions","config","startCleanupInterval","connect","Promise","resolve","logger","info","disconnect","clear","isConnected","healthCheck","status","timestamp","Date","toISOString","latencyMs","details","provider","cacheSize","size","getStatistics","totalOperations","hitRate","memoryUsed","keyCount","buildKey","key","isExpired","expiresAt","now","evictIfNeeded","firstKey","keys","next","value","delete","cleanup","cleaned","entries","debug","setInterval","get","_options","cacheKey","cached","set","entry","data","options","ttlSeconds","ttl","metadata","deleted","has","remaining","Math","floor","expire","mget","result","mset","mdel","matchPattern","pattern","includes","parts","split","position","i","length","part","index","indexOf","lastPart","endsWith","clearPattern","searchPattern","matchedKeys","prefix","push","replace","limitedKeys","limit","slice","nextCursor","totalCount","cleared","Array","from","startsWith","increment","amount","current","newValue","decrement","getOrSet","fetcher","invalidateTags","tags","totalDeleted","tag","ValkeyGlideProvider","client","clusterScanCursor","clientIsCluster","connectPromise","errors","process","env","serverReportsCluster","test","scanClusterKeys","clusterClient","cursor","batch","scan","match","count","isFinished","getKeys","ensureConnected","Error","finally","glideModule","GlideClient","default","GlideClusterClient","ClusterScanCursor","host","port","password","username","useTLSFromUrl","databaseFromUrl","url","rawUrl","URL","hostname","parseInt","decodeURIComponent","dbMatch","pathname","isAzureManagedRedis","warn","String","addresses","clusterNodes","baseClientConfig","useTLS","credentials","undefined","clientName","name","databaseId","db","connectionTimeout","readFrom","cluster","createClient","periodicChecks","duration_in_sec","advancedConfiguration","refreshTopologyFromInitialNodes","standaloneClient","close","error","startTime","ping","message","memoryRegex","memoryMatch","exec","dbsize","JSON","parse","stringify","expiry","type","del","exists","cacheKeys","map","values","requested","found","keyValuePairs","Object","cleanKeys","incrBy","decrBy","CacheFactory","instances","parseBoolean","normalized","trim","toLowerCase","parseClusterNodes","nodes","node","filter","Boolean","rawPort","Number","isFinite","resolvePort","layerPort","genericPort","defaultPort","createCache","keyPrefix","maxReconnectAttempts","reconnectTimeWait","tls","enabled","createCacheFromEnv","envType","getInstance","instanceKey","closeInstance","closeAll","promises","all","createCacheForLayer","layer","serviceName","envPrefix","toUpperCase","defaults","DEFAULT_LAYER_RESOURCES","valkeyUrl","resolvedPort","getInstanceForLayer","CacheProviderType","getCache","getValkeyClient","valkeyConfig","VALKEY","closeAllCaches"],"mappings":"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","file":"chunk-V2VEENJ2.js","sourcesContent":["/**\n * Cache - Public API\n *\n * This module provides a complete abstraction over caching systems (Valkey, Memory, etc.)\n * allowing the application to cache data without direct dependency on any specific caching implementation.\n *\n * Usage:\n *\n * // Create cache from environment variables (workspaces-backend)\n * import { createCache } from '@burdenoff/be-sdk/cache';\n *\n * const cache = createCache('my-module');\n * await cache.connect();\n *\n * // Set value\n * await cache.set('user:123', { name: 'John', email: 'john@example.com' }, { ttl: 3600 });\n *\n * // Get value\n * const user = await cache.get<User>('user:123');\n *\n * // Delete value\n * await cache.delete('user:123');\n *\n * // Disconnect when done\n * await cache.disconnect();\n */\n// Import factory for use in convenience functions\nimport { CacheFactory } from './factory/CacheFactory.js';\nimport type { ICacheProvider } from './interfaces/ICacheProvider.js';\n// Re-export for convenience\nimport type { CacheConfig, ValkeyCacheConfig } from './types/config.js';\nimport { CacheProviderType } from './types/config.js';\n\n// Export interfaces\nexport type { ICache } from './interfaces/ICache.js';\nexport type { ICacheProvider } from './interfaces/ICacheProvider.js';\n\n// Export types\nexport type { CacheEntry, CacheOptions, BatchCacheOptions, PatternOptions, PatternResult } from './types/cache.js';\n\nexport type {\n BaseCacheConfig,\n ValkeyCacheConfig,\n MemoryCacheConfig,\n MemcachedCacheConfig,\n CacheConfig,\n CacheHealthCheckResult,\n CacheStatistics,\n CacheProviderTypeLiteral,\n} from './types/config.js';\n\nexport { CacheProviderType } from './types/config.js';\n\n// Export factory\nexport { CacheFactory } from './factory/CacheFactory.js';\n\n// Export implementations (in case direct access is needed)\nexport { ValkeyGlideProvider } from './implementations/valkey/ValkeyGlideProvider.js';\nexport type { ValkeyGlideConfig } from './implementations/valkey/ValkeyGlideProvider.js';\nexport { MemoryCacheProvider } from './implementations/memory/MemoryCacheProvider.js';\n\n/**\n * Create a cache instance from environment configuration\n * Convenience function for creating a cache without manual config\n *\n * @param namespace - Cache namespace (e.g., 'analytics', 'files', 'users')\n * @returns Cache provider instance\n */\nexport function createCache(namespace: string = 'default'): ICacheProvider {\n return CacheFactory.createCacheFromEnv(namespace);\n}\n\n/**\n * Get or create a singleton cache instance\n * Convenience function for getting/creating a singleton cache\n *\n * @param namespace - Cache namespace\n * @param config - Optional cache configuration\n * @returns Singleton cache provider instance\n */\nexport function getCache(namespace: string = 'default', config?: CacheConfig): ICacheProvider {\n return CacheFactory.getInstance(namespace, config);\n}\n\n/**\n * Valkey Glide client interface for raw Valkey operations\n */\nexport interface ValkeyGlideClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options?: { EX?: number }): Promise<string | null>;\n del(keys: string[]): Promise<number>;\n exists(keys: string[]): Promise<number>;\n ttl(key: string): Promise<number>;\n expire(key: string, seconds: number): Promise<boolean>;\n mget(keys: string[]): Promise<(string | null)[]>;\n mset(keyValuePairs: Record<string, string>): Promise<string | null>;\n keys(pattern: string): Promise<string[]>;\n incrBy(key: string, amount: number): Promise<number>;\n decrBy(key: string, amount: number): Promise<number>;\n ping(): Promise<string>;\n info(section?: string): Promise<string>;\n dbsize(): Promise<number>;\n close(): Promise<void>;\n // Additional list operations\n lpush(key: string, ...values: string[]): Promise<number>;\n rpush(key: string, ...values: string[]): Promise<number>;\n lpop(key: string): Promise<string | null>;\n rpop(key: string): Promise<string | null>;\n lrange(key: string, start: number, stop: number): Promise<string[]>;\n llen(key: string): Promise<number>;\n // Additional set operations\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n sismember(key: string, member: string): Promise<boolean>;\n // Additional hash operations\n hset(key: string, field: string, value: string): Promise<number>;\n hget(key: string, field: string): Promise<string | null>;\n hdel(key: string, ...fields: string[]): Promise<number>;\n hgetall(key: string): Promise<Record<string, string>>;\n // Pub/Sub operations\n publish(channel: string, message: string): Promise<number>;\n}\n\n/**\n * Get direct access to Valkey client via @valkey/valkey-glide\n * Useful for cases where you need raw Valkey operations beyond caching\n *\n * @param config - Optional Valkey configuration. If not provided, uses environment variables\n * @returns ValkeyGlideClient instance from @valkey/valkey-glide\n *\n * @example\n * ```typescript\n * import { getValkeyClient } from '@burdenoff/be-sdk';\n *\n * const valkey = await getValkeyClient();\n * await valkey.lpush('mylist', 'value');\n * ```\n */\nexport async function getValkeyClient(config?: ValkeyCacheConfig): Promise<ValkeyGlideClient> {\n const glideModule = await import('@valkey/valkey-glide');\n const GlideClient = glideModule.GlideClient || glideModule.default;\n\n const valkeyConfig: ValkeyCacheConfig = config || {\n type: CacheProviderType.VALKEY,\n url: process.env['VALKEY_URL'],\n host: process.env['VALKEY_HOST'] || 'localhost',\n port: process.env['VALKEY_PORT'] ? parseInt(process.env['VALKEY_PORT'], 10) : 6379,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n };\n\n // Parse URL if provided\n let host = valkeyConfig.host || 'localhost';\n let port = valkeyConfig.port || 6379;\n\n if (valkeyConfig.url) {\n const url = new URL(valkeyConfig.url.replace('valkey://', 'redis://'));\n host = url.hostname;\n port = parseInt(url.port || '6379', 10);\n }\n\n // Create Glide client\n const createClient = GlideClient as {\n createClient: (config: {\n addresses: Array<{ host: string; port: number }>;\n useTLS?: boolean;\n credentials?: { password?: string; username?: string };\n clientName?: string;\n readFrom?: string;\n }) => Promise<ValkeyGlideClient>;\n };\n\n return createClient.createClient({\n addresses: [{ host, port }],\n useTLS: valkeyConfig.useTLS,\n credentials: valkeyConfig.password\n ? {\n password: valkeyConfig.password,\n username: valkeyConfig.username,\n }\n : undefined,\n clientName: valkeyConfig.name || 'valkey-glide-client',\n readFrom: 'primary',\n });\n}\n\n/**\n * Close all cache connections\n * Call this during application shutdown\n */\nexport async function closeAllCaches(): Promise<void> {\n await CacheFactory.closeAll();\n}\n","/**\n * Memory Cache Provider\n * In-memory cache implementation (for testing and fallback)\n */\nimport { logger } from '../../../logger/index.js';\n\nimport type { ICacheProvider } from '../../interfaces/ICacheProvider.js';\nimport type {\n BatchCacheOptions,\n CacheEntry,\n CacheOptions,\n CacheStatistics,\n CacheHealthCheckResult,\n MemoryCacheConfig,\n PatternOptions,\n PatternResult,\n} from '../../types/index.js';\n\n/**\n * Memory cache provider implementation (LRU-based)\n */\nexport class MemoryCacheProvider implements ICacheProvider {\n private cache: Map<string, { entry: CacheEntry<unknown>; expiresAt: number }> = new Map();\n private readonly namespace: string;\n private readonly defaultTTL: number;\n private readonly maxSize: number;\n private readonly enableLogging: boolean;\n private connected: boolean = false;\n\n // Statistics\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n evictions: 0,\n };\n\n constructor(config: MemoryCacheConfig, namespace: string = 'default') {\n this.namespace = namespace;\n this.defaultTTL = config.defaultTTL || 300; // 5 minutes default\n this.maxSize = config.maxSize || 1000; // Max 1000 entries by default\n this.enableLogging = config.enableLogging ?? false;\n\n // Start cleanup interval for expired entries\n this.startCleanupInterval();\n }\n\n /**\n * Connect (no-op for memory cache)\n */\n async connect(): Promise<void> {\n await Promise.resolve();\n this.connected = true;\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Connected (in-memory)`);\n }\n }\n\n /**\n * Disconnect (cleanup)\n */\n async disconnect(): Promise<void> {\n await Promise.resolve();\n this.connected = false;\n this.cache.clear();\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Disconnected`);\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<CacheHealthCheckResult> {\n await Promise.resolve();\n return {\n status: 'healthy',\n timestamp: new Date().toISOString(),\n connected: this.connected,\n latencyMs: 0,\n details: {\n provider: 'memory',\n cacheSize: this.cache.size,\n maxSize: this.maxSize,\n },\n };\n }\n\n /**\n * Get statistics\n */\n async getStatistics(): Promise<CacheStatistics> {\n await Promise.resolve();\n const totalOperations = this.stats.hits + this.stats.misses;\n const hitRate = totalOperations > 0 ? this.stats.hits / totalOperations : 0;\n\n // Calculate approximate memory usage (rough estimate)\n const memoryUsed = this.cache.size * 500; // Assume ~500 bytes per entry\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n keyCount: this.cache.size,\n memoryUsed,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n evictions: this.stats.evictions,\n maxSize: this.maxSize,\n },\n };\n }\n\n /**\n * Build cache key with namespace\n */\n private buildKey(key: string): string {\n return `${this.namespace}:${key}`;\n }\n\n /**\n * Check if entry is expired\n */\n private isExpired(expiresAt: number): boolean {\n return Date.now() > expiresAt;\n }\n\n /**\n * Evict LRU entry if cache is full\n */\n private evictIfNeeded(): void {\n if (this.cache.size >= this.maxSize) {\n // Evict the first (oldest) entry (simple LRU)\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n this.stats.evictions++;\n }\n }\n }\n\n /**\n * Cleanup expired entries\n */\n private cleanup(): void {\n let cleaned = 0;\n\n for (const [key, value] of this.cache.entries()) {\n if (this.isExpired(value.expiresAt)) {\n this.cache.delete(key);\n cleaned++;\n }\n }\n\n if (cleaned > 0 && this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cleaned up ${cleaned} expired entries`);\n }\n }\n\n /**\n * Start cleanup interval\n */\n private startCleanupInterval(): void {\n setInterval(() => this.cleanup(), 60000); // Cleanup every minute\n }\n\n /**\n * Get value from cache\n */\n async get<T>(key: string, _options?: CacheOptions): Promise<T | null> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache miss`, { key });\n }\n return null;\n }\n\n // Check if expired\n if (this.isExpired(cached.expiresAt)) {\n this.cache.delete(cacheKey);\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache miss (expired)`, { key });\n }\n return null;\n }\n\n this.stats.hits++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache hit`, { key });\n }\n\n // Move to end (LRU)\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, cached);\n\n return cached.entry.data as T;\n }\n\n /**\n * Set value in cache\n */\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const ttlSeconds = options?.ttl || this.defaultTTL;\n\n this.evictIfNeeded();\n\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n\n this.cache.set(cacheKey, {\n entry: entry as CacheEntry<unknown>,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n\n this.stats.sets++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache set`, {\n key,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n }\n\n /**\n * Delete value from cache\n */\n async delete(key: string): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const deleted = this.cache.delete(cacheKey);\n\n if (deleted) {\n this.stats.deletes++;\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Cache delete`, { key });\n }\n }\n\n return deleted;\n }\n\n /**\n * Check if key exists\n */\n async has(key: string): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return false;\n }\n\n // Check if expired\n if (this.isExpired(cached.expiresAt)) {\n this.cache.delete(cacheKey);\n return false;\n }\n\n return true;\n }\n\n /**\n * Get TTL for key\n */\n async ttl(key: string): Promise<number> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return -2; // Key doesn't exist\n }\n\n const remaining = Math.floor((cached.expiresAt - Date.now()) / 1000);\n\n if (remaining <= 0) {\n this.cache.delete(cacheKey);\n return -2;\n }\n\n return remaining;\n }\n\n /**\n * Update TTL for key\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n await Promise.resolve();\n const cacheKey = this.buildKey(key);\n const cached = this.cache.get(cacheKey);\n\n if (!cached) {\n return false;\n }\n\n cached.expiresAt = Date.now() + ttl * 1000;\n cached.entry.ttl = ttl;\n\n return true;\n }\n\n /**\n * Get multiple values (batch operation)\n */\n async mget<T>(keys: string[], _options?: BatchCacheOptions): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n\n for (const key of keys) {\n const value = await this.get<T>(key);\n if (value !== null) {\n result.set(key, value);\n }\n }\n\n return result;\n }\n\n /**\n * Set multiple values (batch operation)\n */\n async mset<T>(entries: Map<string, T>, options?: BatchCacheOptions): Promise<boolean> {\n for (const [key, value] of entries) {\n await this.set(key, value, options);\n }\n\n return true;\n }\n\n /**\n * Delete multiple keys (batch operation)\n */\n async mdel(keys: string[]): Promise<number> {\n let deleted = 0;\n\n for (const key of keys) {\n const result = await this.delete(key);\n if (result) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * Match key against pattern (supports * wildcard)\n */\n private matchPattern(key: string, pattern: string): boolean {\n // Simple wildcard matching without regex\n if (!pattern.includes('*')) {\n return key === pattern;\n }\n\n const parts = pattern.split('*');\n let position = 0;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!part || part === '') continue;\n\n const index = key.indexOf(part, position);\n if (index === -1) return false;\n if (i === 0 && index !== 0) return false;\n position = index + part.length;\n }\n\n const lastPart = parts[parts.length - 1];\n return !lastPart || lastPart === '' || key.endsWith(lastPart);\n }\n\n /**\n * Clear keys by pattern\n */\n async clearPattern(pattern: string): Promise<number> {\n await Promise.resolve();\n const searchPattern = this.buildKey(pattern);\n let deleted = 0;\n\n for (const key of this.cache.keys()) {\n if (this.matchPattern(key, searchPattern)) {\n this.cache.delete(key);\n deleted++;\n }\n }\n\n if (this.enableLogging) {\n logger.debug(`[MemoryCacheProvider:${this.namespace}] Pattern cleared`, {\n pattern,\n deleted,\n });\n }\n\n return deleted;\n }\n\n /**\n * Get keys by pattern\n */\n async keys(options: PatternOptions): Promise<PatternResult> {\n await Promise.resolve();\n const searchPattern = this.buildKey(options.pattern);\n const matchedKeys: string[] = [];\n const prefix = `${this.namespace}:`;\n\n for (const key of this.cache.keys()) {\n if (this.matchPattern(key, searchPattern)) {\n matchedKeys.push(key.replace(prefix, ''));\n }\n }\n\n // Apply limit if specified\n const limitedKeys = options.limit ? matchedKeys.slice(0, options.limit) : matchedKeys;\n\n return {\n keys: limitedKeys,\n nextCursor: null,\n totalCount: matchedKeys.length,\n };\n }\n\n /**\n * Clear all keys in namespace\n */\n async clear(): Promise<boolean> {\n await Promise.resolve();\n const prefix = `${this.namespace}:`;\n let cleared = 0;\n\n for (const key of Array.from(this.cache.keys())) {\n if (key.startsWith(prefix)) {\n this.cache.delete(key);\n cleared++;\n }\n }\n\n if (this.enableLogging) {\n logger.info(`[MemoryCacheProvider:${this.namespace}] Cleared ${cleared} keys`);\n }\n\n return true;\n }\n\n /**\n * Increment numeric value\n */\n async increment(key: string, amount: number = 1): Promise<number> {\n const current = await this.get<number>(key);\n const newValue = (current || 0) + amount;\n await this.set(key, newValue);\n return newValue;\n }\n\n /**\n * Decrement numeric value\n */\n async decrement(key: string, amount: number = 1): Promise<number> {\n const current = await this.get<number>(key);\n const newValue = (current || 0) - amount;\n await this.set(key, newValue);\n return newValue;\n }\n\n /**\n * Get or set value\n */\n async getOrSet<T>(key: string, fetcher: () => Promise<T>, options?: CacheOptions): Promise<T> {\n const cached = await this.get<T>(key, options);\n if (cached !== null) {\n return cached;\n }\n\n const value = await fetcher();\n await this.set(key, value, options);\n\n return value;\n }\n\n /**\n * Invalidate by tags\n */\n async invalidateTags(tags: string[]): Promise<number> {\n let totalDeleted = 0;\n\n for (const tag of tags) {\n const pattern = `*:tag:${tag}:*`;\n const deleted = await this.clearPattern(pattern);\n totalDeleted += deleted;\n }\n\n return totalDeleted;\n }\n}\n","/**\n * Valkey Glide Cache Provider\n *\n * Implements ICacheProvider using @valkey/valkey-glide client.\n * Provides a modern, high-performance Valkey/Redis client implementation.\n *\n * @module cache/implementations/valkey/ValkeyGlideProvider\n * @category Cache\n *\n * @example\n * ```typescript\n * import { ValkeyGlideProvider } from '@burdenoff/be-sdk/cache';\n *\n * const cache = new ValkeyGlideProvider({\n * type: 'valkey-glide',\n * url: 'valkey://localhost:6379',\n * defaultTTL: 300,\n * }, 'my-namespace');\n *\n * await cache.connect();\n * await cache.set('key', 'value', { ttl: 60 });\n * const value = await cache.get('key');\n * ```\n */\n\nimport { logger } from '../../../logger/index.js';\nimport type { ICacheProvider } from '../../interfaces/ICacheProvider.js';\nimport type {\n BatchCacheOptions,\n CacheEntry,\n CacheOptions,\n CacheStatistics,\n CacheHealthCheckResult,\n PatternOptions,\n PatternResult,\n} from '../../types/index.js';\n\n/**\n * Valkey Glide configuration\n */\nexport interface ValkeyGlideConfig {\n /**\n * Cache provider type\n */\n type: 'valkey-glide';\n\n /**\n * Valkey server URL\n * @example 'valkey://localhost:6379' or 'redis://localhost:6379'\n */\n url?: string;\n\n /**\n * Valkey host\n * @default 'localhost'\n */\n host?: string;\n\n /**\n * Valkey port\n * @default 6379\n */\n port?: number;\n\n /**\n * Password for authentication\n */\n password?: string;\n\n /**\n * Username for authentication\n */\n username?: string;\n\n /**\n * Database number\n * @default 0\n */\n db?: number;\n\n /**\n * Key prefix for all keys\n * @default 'cache'\n */\n keyPrefix?: string;\n\n /**\n * Default TTL in seconds\n * @default 300 (5 minutes)\n */\n defaultTTL?: number;\n\n /**\n * Enable logging\n * @default NODE_ENV === 'development'\n */\n enableLogging?: boolean;\n\n /**\n * Connection timeout in milliseconds\n * @default 10000\n */\n connectionTimeout?: number;\n\n /**\n * Max reconnect attempts\n * @default -1 (infinite)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Reconnect time wait in milliseconds\n * @default 2000\n */\n reconnectTimeWait?: number;\n\n /**\n * Client name for identification\n */\n name?: string;\n\n /**\n * Use TLS for connection\n * @default false\n */\n useTLS?: boolean;\n\n /**\n * Force Valkey Cluster mode. If unset, the provider auto-detects cluster mode.\n */\n cluster?: boolean;\n\n /**\n * Seed nodes for Valkey Cluster topology discovery.\n */\n clusterNodes?: Array<{ host: string; port: number }>;\n}\n\n/**\n * Valkey Glide TimeUnit enum (mirror of @valkey/valkey-glide's TimeUnit).\n * We re-declare locally so this file has zero compile-time dependency on the\n * peer-dep types — the enum values are ABI-stable Redis expiry tokens\n * (\"EX\", \"PX\", \"EXAT\", \"PXAT\", \"KEEPTTL\") so the runtime client accepts them\n * regardless of whether the peer package is installed.\n */\nconst enum GlideTimeUnit {\n Seconds = 'EX',\n Milliseconds = 'PX',\n UnixSeconds = 'EXAT',\n UnixMilliseconds = 'PXAT',\n KeepExisting = 'KEEPTTL',\n}\n\n/**\n * Valkey Glide set()-options shape. The real client takes\n * `{ expiry: { type: TimeUnit, count: number } }` and silently ignores the\n * legacy `{ EX: number }` shape — that silent drop caused rate-limit\n * counters to persist forever (no TTL on the key). See\n * node_modules/@valkey/valkey-glide/build-ts/BaseClient.d.ts `set(...)`.\n */\ninterface GlideSetOptions {\n expiry?: 'persist' | { type: GlideTimeUnit; count: number; duration?: number };\n conditionalSet?: 'onlyIfExists' | 'onlyIfDoesNotExist' | 'onlyIfEqual';\n returnOldValue?: boolean;\n}\n\ninterface GlideAddress {\n host: string;\n port: number;\n}\n\ninterface GlideCreateClientConfig {\n addresses: GlideAddress[];\n useTLS?: boolean;\n credentials?: { password?: string; username?: string };\n clientName?: string;\n readFrom?: string;\n databaseId?: number;\n connectionTimeout?: number;\n periodicChecks?: { duration_in_sec?: number };\n advancedConfiguration?: { refreshTopologyFromInitialNodes?: boolean };\n}\n\ninterface GlideClientFactory {\n createClient(config: GlideCreateClientConfig): Promise<ValkeyGlideClient>;\n}\n\ninterface ClusterScanCursorLike {\n getCursor(): string;\n isFinished(): boolean;\n}\n\ntype ClusterScanCursorConstructor = new (newCursor?: string | undefined | null) => ClusterScanCursorLike;\n\ninterface ValkeyGlideModule {\n GlideClient?: GlideClientFactory;\n GlideClusterClient?: GlideClientFactory;\n ClusterScanCursor?: ClusterScanCursorConstructor;\n default?: GlideClientFactory;\n}\n\n/**\n * Valkey Glide client interface (minimal type definition)\n * This is a simplified interface - full types come from @valkey/valkey-glide\n */\ninterface ValkeyGlideClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options?: GlideSetOptions): Promise<string | null>;\n del(keys: string[]): Promise<number>;\n exists(keys: string[]): Promise<number>;\n ttl(key: string): Promise<number>;\n expire(key: string, seconds: number): Promise<boolean>;\n mget(keys: string[]): Promise<(string | null)[]>;\n mset(keyValuePairs: Record<string, string>): Promise<string | null>;\n keys?(pattern: string): Promise<string[]>;\n incrBy(key: string, amount: number): Promise<number>;\n decrBy(key: string, amount: number): Promise<number>;\n ping(): Promise<string>;\n info(section?: string): Promise<string>;\n dbsize(): Promise<number>;\n close(): Promise<void>;\n}\n\ninterface ValkeyGlideClusterClient extends ValkeyGlideClient {\n scan(\n cursor: ClusterScanCursorLike,\n options?: { match?: string; count?: number }\n ): Promise<[ClusterScanCursorLike, string[]]>;\n}\n\n/**\n * Valkey Glide cache provider implementation\n */\nexport class ValkeyGlideProvider implements ICacheProvider {\n private client: ValkeyGlideClient | null = null;\n private clusterScanCursor: ClusterScanCursorConstructor | null = null;\n private clientIsCluster = false;\n private connected = false;\n // Single in-flight connect promise so concurrent first-time `get/set` calls\n // share one connect attempt instead of racing into N parallel `createClient`\n // invocations. Reset to `null` after connect resolves/rejects so the next\n // call after an explicit disconnect() (or a connect failure) can retry.\n private connectPromise: Promise<void> | null = null;\n private readonly config: ValkeyGlideConfig;\n // Mutable: when a URL like `…/4` lands on Azure Managed Redis we fold the\n // DB index into the namespace at connect time to preserve per-service\n // isolation on the forced-DB-0 connection. Not const, but only ever\n // appended to once during connect().\n private namespace: string;\n private readonly defaultTTL: number;\n private readonly enableLogging: boolean;\n\n // Statistics\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n };\n\n constructor(config: ValkeyGlideConfig, namespace: string = 'default') {\n this.config = config;\n this.namespace = namespace;\n this.defaultTTL = config.defaultTTL || 300;\n this.enableLogging = config.enableLogging ?? process.env['NODE_ENV'] === 'development';\n }\n\n private async serverReportsCluster(client: ValkeyGlideClient): Promise<boolean> {\n try {\n const info = await client.info('cluster');\n return /(?:^|\\n)cluster_enabled:1(?:\\r?\\n|$)/.test(info);\n } catch {\n return false;\n }\n }\n\n private async scanClusterKeys(pattern: string): Promise<string[]> {\n if (!this.client || !this.clientIsCluster || !this.clusterScanCursor) {\n return [];\n }\n\n const clusterClient = this.client as ValkeyGlideClusterClient;\n let cursor: ClusterScanCursorLike = new this.clusterScanCursor();\n const keys: string[] = [];\n\n do {\n const [nextCursor, batch] = await clusterClient.scan(cursor, { match: pattern, count: 1000 });\n keys.push(...batch);\n cursor = nextCursor;\n } while (!cursor.isFinished());\n\n return keys;\n }\n\n private async getKeys(pattern: string): Promise<string[]> {\n const client = await this.ensureConnected();\n\n if (this.clientIsCluster) {\n return this.scanClusterKeys(pattern);\n }\n\n if (!client.keys) {\n throw new Error('KEYS command is not available on this Valkey client');\n }\n\n return client.keys(pattern);\n }\n\n /**\n * Connect to Valkey server using @valkey/valkey-glide\n */\n /**\n * Lazy-connect helper used by every public operation so callers can just do\n * `const cache = createCache('x'); await cache.set(...)` without an explicit\n * `await cache.connect()`. Multiple concurrent ops share the same in-flight\n * connect promise.\n */\n private async ensureConnected(): Promise<ValkeyGlideClient> {\n if (!(this.connected && this.client)) {\n if (!this.connectPromise) {\n this.connectPromise = this.connect().finally(() => {\n this.connectPromise = null;\n });\n }\n await this.connectPromise;\n }\n if (!this.client) {\n throw new Error('Valkey client connect failed');\n }\n return this.client;\n }\n\n async connect(): Promise<void> {\n if (this.connected && this.client) {\n return;\n }\n\n try {\n // Dynamically import @valkey/valkey-glide\n const glideModule = (await import('@valkey/valkey-glide')) as ValkeyGlideModule;\n const GlideClient = glideModule.GlideClient || glideModule.default;\n const GlideClusterClient = glideModule.GlideClusterClient;\n this.clusterScanCursor = glideModule.ClusterScanCursor ?? null;\n\n if (!GlideClient) {\n throw new Error('Valkey GLIDE standalone client is unavailable');\n }\n\n // Parse URL if provided\n let host = this.config.host || 'localhost';\n let port = this.config.port || 6379;\n let password = this.config.password;\n let username = this.config.username;\n // Auto-detect TLS from URL scheme. `rediss://` (Redis-over-TLS) and\n // `valkeys://` are the canonical \"TLS-required\" schemes — Azure Managed\n // Redis on port 10000 only accepts TLS, so missing this flag manifests as\n // a connect timeout (plaintext handshake on a TLS-only socket).\n let useTLSFromUrl: boolean | undefined;\n let databaseFromUrl: number | undefined;\n\n if (this.config.url) {\n const rawUrl = this.config.url;\n useTLSFromUrl = /^(rediss|valkeys):\\/\\//i.test(rawUrl);\n const url = new URL(rawUrl.replace(/^valkey:\\/\\//i, 'redis://').replace(/^valkeys:\\/\\//i, 'rediss://'));\n host = url.hostname;\n port = parseInt(url.port || '6379', 10);\n if (!password && url.password) {\n try {\n password = decodeURIComponent(url.password);\n } catch {\n password = url.password;\n }\n }\n if (!username && url.username) {\n try {\n username = decodeURIComponent(url.username);\n } catch {\n username = url.username;\n }\n }\n // Pull DB number from path (e.g. `/0`, `/1`).\n //\n // Azure Managed Redis Balanced/B0 only exposes DB 0. If the URL pins\n // a non-zero DB index, glide's CLIENT SETINFO + SELECT chain fails\n // on every connect with `ERR DB index is out of range`. Detect the\n // Azure hostname and force DB 0 — also fold the original DB # into\n // the per-instance namespace so two services pointed at the same\n // managed-redis with different `/N` paths stay isolated by key.\n const dbMatch = url.pathname.match(/^\\/(\\d+)$/);\n if (dbMatch && dbMatch[1]) {\n databaseFromUrl = parseInt(dbMatch[1], 10);\n const isAzureManagedRedis = /\\.redis\\.azure\\.net$/i.test(host);\n if (isAzureManagedRedis && databaseFromUrl > 0) {\n logger.warn(\n `[ValkeyGlideProvider] Azure Managed Redis only supports DB 0; ` +\n `ignoring /${String(databaseFromUrl)} in URL and folding it into namespace.`\n );\n // Suffix the namespace with `:db{N}` so two services that used to\n // rely on the URL's DB index for isolation keep getting disjoint\n // keysets on the shared DB 0.\n this.namespace = `${this.namespace}:db${String(databaseFromUrl)}`;\n databaseFromUrl = 0;\n }\n }\n }\n\n const addresses = this.config.clusterNodes?.length ? this.config.clusterNodes : [{ host, port }];\n const baseClientConfig: GlideCreateClientConfig = {\n addresses,\n useTLS: this.config.useTLS ?? useTLSFromUrl,\n credentials:\n password || username\n ? {\n password,\n username,\n }\n : undefined,\n clientName: this.config.name || `valkey-glide-${this.namespace}`,\n databaseId: this.config.db ?? databaseFromUrl,\n connectionTimeout: this.config.connectionTimeout,\n readFrom: 'primary',\n };\n\n if (this.config.cluster === true) {\n if (!GlideClusterClient) {\n throw new Error('Valkey GLIDE cluster client is unavailable');\n }\n this.client = await GlideClusterClient.createClient({\n ...baseClientConfig,\n periodicChecks: { duration_in_sec: 30 },\n advancedConfiguration: { refreshTopologyFromInitialNodes: true },\n });\n this.clientIsCluster = true;\n } else {\n const standaloneClient = await GlideClient.createClient(baseClientConfig);\n if (this.config.cluster !== false && (await this.serverReportsCluster(standaloneClient))) {\n if (!GlideClusterClient) {\n throw new Error('Valkey server is clustered but GLIDE cluster client is unavailable');\n }\n await standaloneClient.close();\n this.client = await GlideClusterClient.createClient({\n ...baseClientConfig,\n periodicChecks: { duration_in_sec: 30 },\n advancedConfiguration: { refreshTopologyFromInitialNodes: true },\n });\n this.clientIsCluster = true;\n } else {\n this.client = standaloneClient;\n this.clientIsCluster = false;\n }\n }\n\n this.connected = true;\n\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Connected to Valkey`, {\n host,\n port,\n cluster: this.clientIsCluster,\n });\n }\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Failed to connect:`, error as Record<string, unknown>);\n throw error;\n }\n }\n\n /**\n * Disconnect from Valkey server\n */\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.clientIsCluster = false;\n this.connected = false;\n\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Disconnected`);\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.client !== null;\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<CacheHealthCheckResult> {\n const startTime = Date.now();\n\n try {\n if (!this.client) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: 'Not connected',\n };\n }\n\n const result = await this.client.ping();\n const latencyMs = Date.now() - startTime;\n\n if (result === 'PONG') {\n return {\n status: 'healthy',\n timestamp: new Date().toISOString(),\n connected: true,\n latencyMs,\n };\n }\n\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: 'Unexpected ping response',\n };\n } catch (error) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n latencyMs: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Get statistics\n */\n async getStatistics(): Promise<CacheStatistics> {\n const totalOperations = this.stats.hits + this.stats.misses;\n const hitRate = totalOperations > 0 ? this.stats.hits / totalOperations : 0;\n\n try {\n const client = await this.ensureConnected();\n\n const info = await client.info('memory');\n const memoryRegex = /used_memory:(\\d+)/;\n const memoryMatch = memoryRegex.exec(info);\n const memoryUsed = memoryMatch && memoryMatch[1] ? parseInt(memoryMatch[1], 10) : undefined;\n\n const keyCount = await client.dbsize();\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n keyCount,\n memoryUsed,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n errors: this.stats.errors,\n },\n };\n } catch (error) {\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Failed to get statistics:`,\n error as Record<string, unknown>\n );\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n totalOperations,\n details: {\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n errors: this.stats.errors,\n },\n };\n }\n }\n\n /**\n * Build cache key with namespace\n */\n private buildKey(key: string): string {\n return `${this.namespace}:${key}`;\n }\n\n /**\n * Get value from cache\n */\n async get<T>(key: string, _options?: CacheOptions): Promise<T | null> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const value = await client.get(cacheKey);\n\n if (value === null) {\n this.stats.misses++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache miss`, { key });\n }\n return null;\n }\n\n this.stats.hits++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache hit`, { key });\n }\n\n const entry: CacheEntry<T> = JSON.parse(value);\n return entry.data;\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error getting cache key:`,\n error as Record<string, unknown>\n );\n return null;\n }\n }\n\n /**\n * Set value in cache\n */\n async set<T>(key: string, value: T, options?: CacheOptions): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const ttlSeconds = options?.ttl || this.defaultTTL;\n\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n\n // Valkey Glide expects `{ expiry: { type: TimeUnit.Seconds, count } }`\n // and silently ignores the legacy `{ EX }` shape — passing EX meant\n // keys were written with no TTL, which wedged rate-limit counters\n // (e.g. APP_TOKEN_GENERATION bucket filling up permanently).\n await client.set(cacheKey, JSON.stringify(entry), {\n expiry: { type: GlideTimeUnit.Seconds, count: ttlSeconds },\n });\n\n this.stats.sets++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache set`, {\n key,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error setting cache key:`,\n error as Record<string, unknown>\n );\n return false;\n }\n }\n\n /**\n * Delete value from cache\n */\n async delete(key: string): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const result = await client.del([cacheKey]);\n\n this.stats.deletes++;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Cache delete`, {\n key,\n deleted: result > 0,\n });\n }\n\n return result > 0;\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error deleting cache key:`,\n error as Record<string, unknown>\n );\n return false;\n }\n }\n\n /**\n * Check if key exists\n */\n async has(key: string): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n const exists = await client.exists([cacheKey]);\n return exists === 1;\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error checking cache key:`,\n error as Record<string, unknown>\n );\n return false;\n }\n }\n\n /**\n * Get TTL for key\n */\n async ttl(key: string): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.ttl(cacheKey);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting TTL:`, error as Record<string, unknown>);\n return -2;\n }\n }\n\n /**\n * Update TTL for key\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.expire(cacheKey, ttl);\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error setting expiration:`,\n error as Record<string, unknown>\n );\n return false;\n }\n }\n\n /**\n * Get multiple values (batch operation)\n */\n async mget<T>(keys: string[], _options?: BatchCacheOptions): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n\n if (keys.length === 0) {\n return result;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const cacheKeys = keys.map((key) => this.buildKey(key));\n const values = await client.mget(cacheKeys);\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!key) continue;\n\n if (values[i] !== null) {\n const entry: CacheEntry<T> = JSON.parse(values[i]!);\n result.set(key, entry.data);\n this.stats.hits++;\n } else {\n this.stats.misses++;\n }\n }\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch get`, {\n requested: keys.length,\n found: result.size,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch get:`, error as Record<string, unknown>);\n return result;\n }\n }\n\n /**\n * Set multiple values (batch operation)\n */\n async mset<T>(entries: Map<string, T>, options?: BatchCacheOptions): Promise<boolean> {\n if (entries.size === 0) {\n return true;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const ttlSeconds = options?.ttl || this.defaultTTL;\n const keyValuePairs: Record<string, string> = {};\n\n for (const [key, value] of entries) {\n const cacheKey = this.buildKey(key);\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n ttl: ttlSeconds,\n metadata: options?.metadata,\n };\n keyValuePairs[cacheKey] = JSON.stringify(entry);\n }\n\n await client.mset(keyValuePairs);\n\n // Set TTL for each key (mset doesn't support TTL directly)\n for (const cacheKey of Object.keys(keyValuePairs)) {\n await client.expire(cacheKey, ttlSeconds);\n }\n\n this.stats.sets += entries.size;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch set`, {\n count: entries.size,\n ttl: ttlSeconds,\n });\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch set:`, error as Record<string, unknown>);\n return false;\n }\n }\n\n /**\n * Delete multiple keys (batch operation)\n */\n async mdel(keys: string[]): Promise<number> {\n if (keys.length === 0) {\n return 0;\n }\n\n try {\n const client = await this.ensureConnected();\n\n const cacheKeys = keys.map((key) => this.buildKey(key));\n const result = await client.del(cacheKeys);\n\n this.stats.deletes += result;\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Batch delete`, {\n requested: keys.length,\n deleted: result,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error in batch delete:`, error as Record<string, unknown>);\n return 0;\n }\n }\n\n /**\n * Clear keys by pattern\n */\n async clearPattern(pattern: string): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const searchPattern = this.buildKey(pattern);\n const keys = await this.getKeys(searchPattern);\n\n if (keys.length === 0) {\n return 0;\n }\n\n const result = await client.del(keys);\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Pattern cleared`, {\n pattern,\n deleted: result,\n });\n }\n\n return result;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error clearing pattern:`, error as Record<string, unknown>);\n return 0;\n }\n }\n\n /**\n * Get keys by pattern\n */\n async keys(options: PatternOptions): Promise<PatternResult> {\n try {\n await this.ensureConnected();\n\n const searchPattern = this.buildKey(options.pattern);\n const keys = await this.getKeys(searchPattern);\n\n const prefix = `${this.namespace}:`;\n const cleanKeys = keys.map((key) => key.replace(prefix, ''));\n\n const limitedKeys = options.limit ? cleanKeys.slice(0, options.limit) : cleanKeys;\n\n return {\n keys: limitedKeys,\n nextCursor: null,\n totalCount: cleanKeys.length,\n };\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error getting keys:`, error as Record<string, unknown>);\n return {\n keys: [],\n nextCursor: null,\n totalCount: 0,\n };\n }\n }\n\n /**\n * Clear all keys in namespace\n */\n async clear(): Promise<boolean> {\n try {\n const client = await this.ensureConnected();\n\n const pattern = this.buildKey('*');\n const keys = await this.getKeys(pattern);\n\n if (keys.length > 0) {\n await client.del(keys);\n if (this.enableLogging) {\n logger.info(`[ValkeyGlideProvider:${this.namespace}] Cleared ${keys.length} keys`);\n }\n }\n\n return true;\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error clearing cache:`, error as Record<string, unknown>);\n return false;\n }\n }\n\n /**\n * Increment numeric value\n */\n async increment(key: string, amount: number = 1): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.incrBy(cacheKey, amount);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error incrementing:`, error as Record<string, unknown>);\n throw error;\n }\n }\n\n /**\n * Decrement numeric value\n */\n async decrement(key: string, amount: number = 1): Promise<number> {\n try {\n const client = await this.ensureConnected();\n\n const cacheKey = this.buildKey(key);\n return await client.decrBy(cacheKey, amount);\n } catch (error) {\n this.stats.errors++;\n logger.error(`[ValkeyGlideProvider:${this.namespace}] Error decrementing:`, error as Record<string, unknown>);\n throw error;\n }\n }\n\n /**\n * Get or set value\n */\n async getOrSet<T>(key: string, fetcher: () => Promise<T>, options?: CacheOptions): Promise<T> {\n const cached = await this.get<T>(key, options);\n if (cached !== null) {\n return cached;\n }\n\n const value = await fetcher();\n await this.set(key, value, options);\n\n return value;\n }\n\n /**\n * Invalidate by tags\n */\n async invalidateTags(tags: string[]): Promise<number> {\n try {\n let totalDeleted = 0;\n\n for (const tag of tags) {\n const pattern = `*:tag:${tag}:*`;\n const deleted = await this.clearPattern(pattern);\n totalDeleted += deleted;\n }\n\n if (this.enableLogging) {\n logger.debug(`[ValkeyGlideProvider:${this.namespace}] Tags invalidated`, {\n tags,\n deleted: totalDeleted,\n });\n }\n\n return totalDeleted;\n } catch (error) {\n this.stats.errors++;\n logger.error(\n `[ValkeyGlideProvider:${this.namespace}] Error invalidating tags:`,\n error as Record<string, unknown>\n );\n return 0;\n }\n }\n}\n","/**\n * Cache Factory\n * Creates appropriate cache provider instances based on configuration\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\nimport { DEFAULT_LAYER_RESOURCES } from '../../types/layer.js';\n\nimport { MemoryCacheProvider } from '../implementations/memory/MemoryCacheProvider.js';\nimport { ValkeyGlideProvider } from '../implementations/valkey/ValkeyGlideProvider.js';\nimport type { ICacheProvider } from '../interfaces/ICacheProvider.js';\nimport type { CacheConfig, CacheProviderTypeLiteral } from '../types/config.js';\n\n/**\n * Factory for creating cache instances\n */\nexport class CacheFactory {\n private static instances: Map<string, ICacheProvider> = new Map();\n\n private static parseBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) return undefined;\n const normalized = value.trim().toLowerCase();\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true;\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false;\n return undefined;\n }\n\n private static parseClusterNodes(value: string | undefined): Array<{ host: string; port: number }> | undefined {\n if (!value) return undefined;\n\n const nodes = value\n .split(',')\n .map((node) => node.trim())\n .filter(Boolean)\n .map((node) => {\n const [host, rawPort] = node\n .replace(/^redis:\\/\\//, '')\n .replace(/^valkey:\\/\\//, '')\n .split(':');\n if (!host) return null;\n return { host, port: rawPort ? parseInt(rawPort, 10) : 6379 };\n })\n .filter((node): node is { host: string; port: number } => node !== null && Number.isFinite(node.port));\n\n return nodes.length > 0 ? nodes : undefined;\n }\n\n /**\n * Resolve port from multiple environment variable sources\n * @param layerPort - Layer-specific port environment variable value\n * @param genericPort - Generic port environment variable value\n * @param defaultPort - Default port if none provided\n * @returns Resolved port number\n */\n private static resolvePort(\n layerPort: string | undefined,\n genericPort: string | undefined,\n defaultPort: number = 6379\n ): number {\n if (layerPort) {\n return parseInt(layerPort, 10);\n }\n if (genericPort) {\n return parseInt(genericPort, 10);\n }\n return defaultPort;\n }\n\n /**\n * Create a cache provider based on configuration\n */\n static createCache(config: CacheConfig, namespace: string = 'default'): ICacheProvider {\n logger.info('[CacheFactory] Creating cache provider', {\n type: config.type,\n namespace,\n });\n\n switch (config.type) {\n case 'valkey':\n case 'redis': // Backwards compatibility - redis maps to valkey\n return new ValkeyGlideProvider(\n {\n type: 'valkey-glide',\n url: config.url,\n host: config.host,\n port: config.port,\n password: config.password,\n username: config.username,\n db: config.db,\n keyPrefix: config.keyPrefix,\n defaultTTL: config.defaultTTL,\n enableLogging: config.enableLogging,\n maxReconnectAttempts: config.maxReconnectAttempts,\n reconnectTimeWait: config.reconnectTimeWait,\n connectionTimeout: config.connectionTimeout,\n name: config.name,\n useTLS: config.tls?.enabled,\n cluster: config.cluster,\n clusterNodes: config.clusterNodes,\n },\n namespace\n );\n\n case 'memory':\n return new MemoryCacheProvider(config, namespace);\n\n // Future implementations can be added here\n // case 'memcached':\n // return new MemcachedCacheProvider(config as MemcachedCacheConfig, namespace);\n\n default:\n throw new Error(`Unsupported cache provider type: ${config.type}`);\n }\n }\n\n /**\n * Create a cache from environment variables\n */\n static createCacheFromEnv(namespace: string = 'default'): ICacheProvider {\n const envType = process.env['CACHE_PROVIDER_TYPE'] as CacheProviderTypeLiteral | undefined;\n // Default to valkey, but treat 'redis' as 'valkey' for backwards compatibility\n const type = envType === 'memory' ? 'memory' : 'valkey';\n\n const config: CacheConfig =\n type === 'valkey'\n ? {\n type: 'valkey',\n url: process.env['VALKEY_URL'],\n host: process.env['VALKEY_HOST'] || 'localhost',\n port: process.env['VALKEY_PORT'] ? parseInt(process.env['VALKEY_PORT'], 10) : 6379,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || 'cache',\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n maxReconnectAttempts: process.env['VALKEY_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['VALKEY_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['VALKEY_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['VALKEY_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n connectionTimeout: process.env['VALKEY_CONNECTION_TIMEOUT']\n ? parseInt(process.env['VALKEY_CONNECTION_TIMEOUT'], 10)\n : 10000,\n name: process.env['CACHE_CLIENT_NAME'] || `cache-${namespace}`,\n cluster: CacheFactory.parseBoolean(process.env['VALKEY_CLUSTER'] || process.env['CACHE_CLUSTER']),\n clusterNodes: CacheFactory.parseClusterNodes(\n process.env['VALKEY_CLUSTER_NODES'] || process.env['CACHE_CLUSTER_NODES']\n ),\n }\n : {\n type: 'memory',\n maxSize: process.env['CACHE_MAX_SIZE'] ? parseInt(process.env['CACHE_MAX_SIZE'], 10) : 1000,\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || 'cache',\n };\n\n return CacheFactory.createCache(config, namespace);\n }\n\n /**\n * Get or create a singleton cache instance for a namespace\n */\n static getInstance(namespace: string = 'default', config?: CacheConfig): ICacheProvider {\n const instanceKey = `${config?.type || 'default'}:${namespace}`;\n\n if (!CacheFactory.instances.has(instanceKey)) {\n const cache = config ? CacheFactory.createCache(config, namespace) : CacheFactory.createCacheFromEnv(namespace);\n CacheFactory.instances.set(instanceKey, cache);\n }\n\n return CacheFactory.instances.get(instanceKey)!;\n }\n\n /**\n * Close a specific cache instance\n */\n static async closeInstance(namespace: string): Promise<void> {\n for (const [key, cache] of CacheFactory.instances.entries()) {\n if (key.endsWith(`:${namespace}`)) {\n await cache.disconnect();\n CacheFactory.instances.delete(key);\n logger.info('[CacheFactory] Closed cache instance', { namespace });\n }\n }\n }\n\n /**\n * Close all cache instances\n * Call this during application shutdown\n */\n static async closeAll(): Promise<void> {\n const promises = Array.from(CacheFactory.instances.values()).map(async (cache) => cache.disconnect());\n await Promise.all(promises);\n CacheFactory.instances.clear();\n logger.info('[CacheFactory] All cache instances closed');\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a cache provider for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param namespace - Cache namespace (default: 'default')\n * @returns Cache provider configured for the layer\n *\n * @example\n * ```typescript\n * const cache = CacheFactory.createCacheForLayer('wspace', 'wspace-tags-svc');\n * await cache.connect();\n * await cache.set('key', { data: 'value' });\n * ```\n */\n static createCacheForLayer(layer: ServiceLayer, serviceName: string, namespace: string = 'default'): ICacheProvider {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n\n // Build Valkey URL from layer-specific or generic env vars\n const url = process.env[`${envPrefix}_VALKEY_URL`] || process.env['VALKEY_URL'] || defaults.valkeyUrl;\n\n // Resolve port with fallback chain\n const resolvedPort = CacheFactory.resolvePort(process.env[`${envPrefix}_VALKEY_PORT`], process.env['VALKEY_PORT']);\n\n const config: CacheConfig = {\n type: 'valkey',\n url,\n host: process.env[`${envPrefix}_VALKEY_HOST`] || process.env['VALKEY_HOST'] || 'localhost',\n port: resolvedPort,\n password: process.env['VALKEY_PASSWORD'],\n db: process.env['VALKEY_DB'] ? parseInt(process.env['VALKEY_DB'], 10) : 0,\n username: process.env['VALKEY_USERNAME'],\n keyPrefix: process.env['CACHE_KEY_PREFIX'] || `${layer}-cache`,\n defaultTTL: process.env['CACHE_DEFAULT_TTL'] ? parseInt(process.env['CACHE_DEFAULT_TTL'], 10) : 300,\n enableLogging: process.env['CACHE_ENABLE_LOGGING'] === 'true',\n maxReconnectAttempts: process.env['VALKEY_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['VALKEY_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['VALKEY_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['VALKEY_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n connectionTimeout: process.env['VALKEY_CONNECTION_TIMEOUT']\n ? parseInt(process.env['VALKEY_CONNECTION_TIMEOUT'], 10)\n : 10000,\n name: serviceName,\n cluster: CacheFactory.parseBoolean(\n process.env[`${envPrefix}_VALKEY_CLUSTER`] || process.env['VALKEY_CLUSTER'] || process.env['CACHE_CLUSTER']\n ),\n clusterNodes: CacheFactory.parseClusterNodes(\n process.env[`${envPrefix}_VALKEY_CLUSTER_NODES`] ||\n process.env['VALKEY_CLUSTER_NODES'] ||\n process.env['CACHE_CLUSTER_NODES']\n ),\n };\n\n logger.info('[CacheFactory] Creating layer cache', {\n layer,\n serviceName,\n namespace,\n url: config.url,\n });\n\n return CacheFactory.createCache(config, namespace);\n }\n\n /**\n * Get or create a singleton cache instance for a layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param namespace - Cache namespace (default: 'default')\n * @returns Singleton cache provider for the layer\n */\n static getInstanceForLayer(layer: ServiceLayer, serviceName: string, namespace: string = 'default'): ICacheProvider {\n const instanceKey = `${layer}:${serviceName}:${namespace}`;\n\n if (!CacheFactory.instances.has(instanceKey)) {\n const cache = CacheFactory.createCacheForLayer(layer, serviceName, namespace);\n CacheFactory.instances.set(instanceKey, cache);\n }\n\n return CacheFactory.instances.get(instanceKey)!;\n }\n}\n","/**\n * Cache Configuration Types\n */\n\n/**\n * Cache provider type enum\n */\nexport enum CacheProviderType {\n VALKEY = 'valkey',\n MEMORY = 'memory',\n MEMCACHED = 'memcached',\n}\n\n/**\n * Cache provider type string literal\n */\nexport type CacheProviderTypeLiteral = 'valkey' | 'redis' | 'memory' | 'memcached';\n\n/**\n * Base configuration for cache\n */\nexport interface BaseCacheConfig {\n /** Cache provider type */\n type: CacheProviderType | CacheProviderTypeLiteral;\n /** Connection URL or host */\n url?: string;\n /** Cache key prefix */\n keyPrefix?: string;\n /** Default TTL in seconds */\n defaultTTL?: number;\n /** Enable debug logging */\n enableLogging?: boolean;\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 /** Client name/identifier */\n name?: string;\n}\n\n/**\n * Valkey-specific configuration\n * Compatible with Redis protocol (Valkey is a Redis fork)\n */\nexport interface ValkeyCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.VALKEY | 'valkey' | 'redis';\n /** Valkey host */\n host?: string;\n /** Valkey port */\n port?: number;\n /** Valkey password */\n password?: string;\n /** Valkey database number */\n db?: number;\n /** Valkey username */\n username?: string;\n /** Use TLS for connection (simple boolean flag) */\n useTLS?: boolean;\n /** TLS configuration (detailed) */\n tls?: {\n enabled: boolean;\n cert?: string;\n key?: string;\n ca?: string;\n };\n /** Enable cluster mode */\n cluster?: boolean;\n /** Cluster nodes (if cluster mode enabled) */\n clusterNodes?: Array<{ host: string; port: number }>;\n /** Sentinel configuration */\n sentinel?: {\n enabled: boolean;\n sentinels: Array<{ host: string; port: number }>;\n name: string;\n };\n}\n\n/**\n * Memory cache-specific configuration\n */\nexport interface MemoryCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.MEMORY | 'memory';\n /** Maximum number of items in cache */\n maxSize?: number;\n /** Eviction strategy */\n evictionStrategy?: 'lru' | 'lfu' | 'fifo';\n}\n\n/**\n * Memcached-specific configuration\n */\nexport interface MemcachedCacheConfig extends BaseCacheConfig {\n type: CacheProviderType.MEMCACHED | 'memcached';\n /** Memcached servers */\n servers?: string[];\n}\n\n/**\n * Union type for all cache configurations\n */\nexport type CacheConfig = ValkeyCacheConfig | MemoryCacheConfig | MemcachedCacheConfig;\n\n/**\n * Health check result\n */\nexport interface CacheHealthCheckResult {\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 * Cache statistics\n */\nexport interface CacheStatistics {\n /** Total cache hits */\n hits?: number;\n /** Total cache misses */\n misses?: number;\n /** Hit rate (0-1) */\n hitRate?: number;\n /** Total number of keys */\n keyCount?: number;\n /** Total memory used (bytes) */\n memoryUsed?: number;\n /** Total cache operations */\n totalOperations?: number;\n /** Average operation time (ms) */\n avgOperationTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n"]}
@@ -1,5 +0,0 @@
1
- export { createPinoLogger } from './chunk-SNEOLWXT.js';
2
- import './chunk-CBZNP6RF.js';
3
- import './chunk-XE4OXN2W.js';
4
- //# sourceMappingURL=pino-logger-RYLGXPHZ.js.map
5
- //# sourceMappingURL=pino-logger-RYLGXPHZ.js.map
@@ -1,5 +0,0 @@
1
- export { createWorkspaceGuardPlugin } from './chunk-UBXFIIAW.js';
2
- import './chunk-CBZNP6RF.js';
3
- import './chunk-XE4OXN2W.js';
4
- //# sourceMappingURL=workspace-guard-LHBNK4TG.js.map
5
- //# sourceMappingURL=workspace-guard-LHBNK4TG.js.map