@burdenoff/be-sdk 2026.513.8 → 2026.514.2

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 (53) hide show
  1. package/dist/EventQueueFactory-DGHBOV7I.js +8 -0
  2. package/dist/{EventQueueFactory-TWDDFMQY.js.map → EventQueueFactory-DGHBOV7I.js.map} +1 -1
  3. package/dist/cache/index.d.ts +1 -1
  4. package/dist/cache/index.js +1 -1
  5. package/dist/{chunk-GCDQ4RCD.js → chunk-6U2P4ANJ.js} +3 -3
  6. package/dist/{chunk-GCDQ4RCD.js.map → chunk-6U2P4ANJ.js.map} +1 -1
  7. package/dist/{chunk-MI72VKNQ.js → chunk-7V6GUNGP.js} +3 -3
  8. package/dist/{chunk-MI72VKNQ.js.map → chunk-7V6GUNGP.js.map} +1 -1
  9. package/dist/{chunk-I43B35CP.js → chunk-AQTNM2EY.js} +36 -18
  10. package/dist/chunk-AQTNM2EY.js.map +1 -0
  11. package/dist/{chunk-L72RC2EI.js → chunk-CCV2AVAI.js} +3 -3
  12. package/dist/{chunk-L72RC2EI.js.map → chunk-CCV2AVAI.js.map} +1 -1
  13. package/dist/{chunk-A46X4Y5Q.js → chunk-D35GTG7Y.js} +3 -3
  14. package/dist/{chunk-A46X4Y5Q.js.map → chunk-D35GTG7Y.js.map} +1 -1
  15. package/dist/{chunk-3JBKPVWY.js → chunk-FSTWNBRX.js} +5 -5
  16. package/dist/{chunk-3JBKPVWY.js.map → chunk-FSTWNBRX.js.map} +1 -1
  17. package/dist/{chunk-4B765NQA.js → chunk-FT74HIIG.js} +2 -2
  18. package/dist/{chunk-4B765NQA.js.map → chunk-FT74HIIG.js.map} +1 -1
  19. package/dist/{chunk-NAOHXHUP.js → chunk-IX5QCHWE.js} +3 -3
  20. package/dist/{chunk-NAOHXHUP.js.map → chunk-IX5QCHWE.js.map} +1 -1
  21. package/dist/{chunk-Q6HJARHV.js → chunk-KLYAIEAX.js} +3 -3
  22. package/dist/{chunk-Q6HJARHV.js.map → chunk-KLYAIEAX.js.map} +1 -1
  23. package/dist/{chunk-EMSON3UD.js → chunk-LRGXT37B.js} +4 -74
  24. package/dist/chunk-LRGXT37B.js.map +1 -0
  25. package/dist/{chunk-Y4TPKRZB.js → chunk-M3PYLAPT.js} +3 -3
  26. package/dist/{chunk-Y4TPKRZB.js.map → chunk-M3PYLAPT.js.map} +1 -1
  27. package/dist/{chunk-QKJR4L7B.js → chunk-N52W3RQA.js} +100 -6
  28. package/dist/chunk-N52W3RQA.js.map +1 -0
  29. package/dist/{chunk-6JHB4FDQ.js → chunk-Q4HKXQVD.js} +5 -5
  30. package/dist/{chunk-6JHB4FDQ.js.map → chunk-Q4HKXQVD.js.map} +1 -1
  31. package/dist/{chunk-6PKIKOTT.js → chunk-S74C6CEN.js} +12 -2
  32. package/dist/chunk-S74C6CEN.js.map +1 -0
  33. package/dist/event-queue/index.d.ts +1 -1
  34. package/dist/event-queue/index.js +4 -4
  35. package/dist/export/index.js +3 -3
  36. package/dist/gateway/index.js +2 -2
  37. package/dist/gateway/security/index.js +1 -1
  38. package/dist/graph/index.js +5 -5
  39. package/dist/graphql/index.js +2 -2
  40. package/dist/{index-BODgvRtL.d.ts → index-C1ojTQq0.d.ts} +1 -1
  41. package/dist/{index-eUvoVdr7.d.ts → index-syMAjErz.d.ts} +1 -0
  42. package/dist/index.d.ts +3 -3
  43. package/dist/index.js +18 -18
  44. package/dist/init/index.js +5 -5
  45. package/dist/notifications/index.js +1 -1
  46. package/dist/prisma/index.js +4 -4
  47. package/dist/tracker/index.js +2 -2
  48. package/package.json +1 -1
  49. package/dist/EventQueueFactory-TWDDFMQY.js +0 -8
  50. package/dist/chunk-6PKIKOTT.js.map +0 -1
  51. package/dist/chunk-EMSON3UD.js.map +0 -1
  52. package/dist/chunk-I43B35CP.js.map +0 -1
  53. package/dist/chunk-QKJR4L7B.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/event-queue/implementations/nats/trace-context.ts","../src/event-queue/implementations/nats/NatsEventConsumer.ts","../src/event-queue/implementations/nats/NatsEventPublisher.ts","../src/event-queue/implementations/redis-streams/keyspace.ts","../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventPublisher.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","setter","set","carrier","key","value","getter","get","keys","Object","injectW3CTraceContext","hdrs","api","propagation","inject","context","active","entries","err","error","Error","message","String","extractW3CTraceContext","undefined","extract","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_STREAM_MAX_BYTES","NatsSubscription","stats","messagesReceived","messagesProcessed","messagesFailed","lastActivity","Date","toISOString","id","stopFn","unsubscribe","isActive","getStats","incrementReceived","incrementProcessed","incrementFailed","NatsEventConsumer","connectionManager","subscriptions","Map","config","baseConfig","type","url","user","password","token","creds","credsFile","maxReconnectAttempts","reconnectTimeWait","connectionTimeout","name","NatsConnectionManager","connect","disconnect","unsubscribeAll","isConnected","healthCheck","status","timestamp","connected","details","activeSubscriptions","size","getStatistics","totalReceived","totalProcessed","totalFailed","subscription","values","messagesPublished","messagesConsumed","activeConsumers","activePublishers","queueSize","ensureStream","jsm","getJetStreamManager","streams","info","stream","streamConfig","subjects","retention","mapRetentionPolicy","storage","mapStorageType","max_consumers","maxConsumers","max_msgs","maxMsgs","max_bytes","maxBytes","max_age","maxAge","duplicate_window","duplicateWindow","add","ensureConsumer","consumers","consumer","durable_name","filter_subject","filterSubject","ack_policy","mapAckPolicy","ackPolicy","deliver_policy","mapDeliverPolicy","deliverPolicy","max_deliver","maxDeliver","ack_wait","ackWait","max_ack_pending","maxAckPending","includes","deriveStreamSubjects","firstSegment","split","replace","subscribe","options","js","getJetStream","streamName","consumerName","streamSubjects","errorMessage","find","requestedStream","subscriptionId","now","crypto","randomUUID","substring","stopRequested","consumeMessages","maxConcurrent","catch","subscribeMultiple","push","pull","messages","fetch","max_messages","batch","expires","timeout","events","msg","event","wrapMessage","unsubscribePromises","Array","from","map","all","clear","getSubscriptions","processDLQ","_handler","warn","listSubjects","consume","headers","nak","eventMessage","JSON","parse","data","toString","sequence","seq","ack","delay","term","isRedelivered","redelivered","getDeliveryAttempt","deliveryCount","policy","toLowerCase","RetentionPolicy","Limits","Interest","Workqueue","StorageType","Memory","File","AckPolicy","None","All","Explicit","DeliverPolicy","New","Last","LastPerSubject","NatsEventPublisher","publishCount","lastPublishTime","list","next","streamCount","length","deriveStreamName","toUpperCase","publish","messageId","generateMessageId","metadata","source","correlationId","generateCorrelationId","userId","workspaceId","priority","defaultPriority","publishOpts","msgID","enableDeduplication","ttl","stringify","publishBatch","results","publishWithAck","nc","getNatsConnection","response","request","DEFAULT_PREFIX","REGISTRY_PREFIX","DELAYQ_PREFIX","DELAYQ_LOCK_PREFIX","DLQ_PREFIX","DEDUP_PREFIX","REPLY_PREFIX","subjectToKey","streamKey","opts","prefix","registryKey","boundary","boundaryOf","first","delayQueueKey","delayLockKey","dlqKey","dedupKey","msgId","replyKey","matchSubject","pattern","pParts","sParts","last","i","isWildcard","TRACE_KEYS","injectTraceFields","c","k","v","extractTraceContext","fields","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","receivedCount","processedCount","failedCount","unsubscribeFn","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","connection","subscriptionLoops","Set","keyPrefix","group","ackWaitMs","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","RedisStreamsConnection","process","env","hostname","pid","Math","max","round","t","setInterval","sweepPending","unref","drainDelayQueues","clearInterval","t0","pong","ping","latencyMs","_config","sub","filter","s","startId","resolveStartId","wildcard","handlerFn","ensureGroup","spawnLoop","refresh","client","getClient","smembers","has","out","raw","xreadgroup","rawFields","parsed","parseEntry","toAcknowledgeable","dlqGroup","dlq","xgroup","res","evt","_stream","seen","members","m","loop","makeBlockingClient","setTimeout","val","acked","xack","xdel","score","payload","zadd","flat","xadd","claimed","xautoclaim","pending","xpending","isArray","lockKey","got","due","zrangebyscore","member","indexOf","slice","zrem","del","RedisStreamsEventPublisher","maxLen","dedupTtl","parseInt","dedupTtlSeconds","publishInternal","enableDedup","ok","tenantId","sadd","e","reply","replyTo","timeoutMs","xrange","payloadIdx","sendReply","expire","resolveQueueType","QueueType","REDIS_STREAMS","NATS","EventQueueFactory","createPublisher","createConsumer","createPublisherFromEnv","defaultTTL","createConsumerFromEnv","createPublisherForLayer","layer","serviceName","envPrefix","defaults","DEFAULT_LAYER_RESOURCES","natsUrl","createConsumerForLayer"],"mappings":"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","file":"chunk-EMSON3UD.js","sourcesContent":["/**\n * W3C trace context injection/extraction for NATS headers.\n *\n * Uses `@opentelemetry/api` when available to read/write `traceparent`,\n * `tracestate`, and `baggage` headers. When the API module isn't installed\n * (optional peer dep), these helpers are no-ops so NATS continues to work.\n */\nimport { logger } from '../../../logger/index.js';\nimport type { MsgHdrs } from 'nats';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) {\n return otelApiPromise;\n }\n otelApiPromise = (async () => {\n try {\n // Dynamic import so services without OTel installed still work.\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[trace-context] @opentelemetry/api not available; NATS traces disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst setter = {\n set(carrier: Record<string, string>, key: string, value: string): void {\n carrier[key] = value;\n },\n};\n\nconst getter = {\n get(carrier: Record<string, string>, key: string): string | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n};\n\n/**\n * Inject the active W3C trace context into the given NATS headers.\n * Adds `traceparent`, `tracestate`, and `baggage` when present in the\n * active context.\n */\nexport async function injectW3CTraceContext(hdrs: MsgHdrs): Promise<void> {\n const api = await loadOtelApi();\n if (!api) return;\n try {\n const carrier: Record<string, string> = {};\n api.propagation.inject(api.context.active(), carrier, setter);\n for (const [key, value] of Object.entries(carrier)) {\n if (value) hdrs.set(key, value);\n }\n } catch (err) {\n logger.debug('[trace-context] injection failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Extract a W3C trace context from the given NATS headers and return the\n * resulting OTel context. Callers wrap their handler in `context.with(...)`\n * to stitch parent spans.\n */\nexport async function extractW3CTraceContext(hdrs: MsgHdrs | undefined): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api || !hdrs) return undefined;\n try {\n const carrier: Record<string, string> = {};\n for (const key of ['traceparent', 'tracestate', 'baggage']) {\n const value = hdrs.get(key);\n if (value) carrier[key] = value;\n }\n return api.propagation.extract(api.context.active(), carrier, getter);\n } catch (err) {\n logger.debug('[trace-context] extraction failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n return undefined;\n }\n}\n\n/**\n * Wrap a NATS consumer handler in a CONSUMER-kind span rooted at the\n * extracted W3C context. If OTel isn't available, the handler runs\n * directly. Errors are recorded on the span and re-thrown so ack/nak\n * semantics are preserved by the caller.\n */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n hdrs: MsgHdrs | undefined,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractW3CTraceContext(hdrs);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/nats');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `nats.consume ${subject}`,\n { kind: 5, attributes: { 'messaging.system': 'nats', 'messaging.destination.name': subject } },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch (err) {\n logger.debug('[trace-context] consumer span failed to start; running without span', {\n error: err instanceof Error ? err.message : String(err),\n });\n return handler();\n }\n}\n","/**\n * NATS Event Consumer Implementation\n * Implements IEventConsumer interface for NATS JetStream\n */\nimport { logger } from '../../../logger/index.js';\nimport { runWithConsumerSpan } from './trace-context.js';\nimport {\n AckPolicy,\n type Consumer,\n DeliverPolicy,\n type JsMsg,\n type StreamConfig as NatsStreamConfig,\n RetentionPolicy,\n StorageType,\n} from 'nats';\n\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type {\n AcknowledgeableEvent,\n ConsumerConfig,\n EventHandler,\n EventMessage,\n EventQueueHealthCheckResult,\n QueueStatistics,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/index.js';\nimport { NatsConnectionManager } from './NatsConnection.js';\n\nconst DEFAULT_STREAM_MAX_BYTES = 10 * 1024 * 1024;\n\n/**\n * NATS Subscription Implementation\n */\nclass NatsSubscription implements ISubscription {\n private active: boolean = true;\n private stats = {\n messagesReceived: 0,\n messagesProcessed: 0,\n messagesFailed: 0,\n lastActivity: new Date().toISOString(),\n };\n\n constructor(\n public readonly id: string,\n public readonly subject: string,\n private stopFn: () => void\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) {\n return Promise.resolve();\n }\n this.active = false;\n this.stopFn();\n return Promise.resolve();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.stats.messagesReceived,\n messagesProcessed: this.stats.messagesProcessed,\n messagesFailed: this.stats.messagesFailed,\n lastActivity: this.stats.lastActivity,\n };\n }\n\n incrementReceived(): void {\n this.stats.messagesReceived++;\n this.stats.lastActivity = new Date().toISOString();\n }\n\n incrementProcessed(): void {\n this.stats.messagesProcessed++;\n this.stats.lastActivity = new Date().toISOString();\n }\n\n incrementFailed(): void {\n this.stats.messagesFailed++;\n this.stats.lastActivity = new Date().toISOString();\n }\n}\n\n/**\n * NATS implementation of IEventConsumer\n */\nexport class NatsEventConsumer implements IEventConsumer {\n private connectionManager: NatsConnectionManager;\n private subscriptions: Map<string, NatsSubscription> = new Map();\n\n constructor(private config: ConsumerConfig) {\n // Create base config for connection manager\n const baseConfig = {\n type: config.type || 'nats',\n url: config.url || 'nats://localhost:4222',\n user: config.user,\n password: config.password,\n token: config.token,\n creds: config.creds,\n credsFile: config.credsFile,\n maxReconnectAttempts: config.maxReconnectAttempts,\n reconnectTimeWait: config.reconnectTimeWait,\n connectionTimeout: config.connectionTimeout,\n name: config.name,\n };\n this.connectionManager = new NatsConnectionManager(baseConfig);\n }\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n await this.connectionManager.connect();\n }\n\n /**\n * Disconnect from NATS server\n */\n async disconnect(): Promise<void> {\n await this.unsubscribeAll();\n await this.connectionManager.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n await Promise.resolve();\n const isConnected = this.isConnected();\n\n return {\n status: isConnected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: isConnected,\n details: {\n type: 'nats',\n url: this.config.url,\n activeSubscriptions: this.subscriptions.size,\n },\n };\n }\n\n /**\n * Get queue statistics\n */\n async getStatistics(): Promise<QueueStatistics> {\n await Promise.resolve();\n let totalReceived = 0;\n let totalProcessed = 0;\n let totalFailed = 0;\n let lastActivity: string | null = null;\n\n for (const subscription of this.subscriptions.values()) {\n const stats = subscription.getStats();\n totalReceived += stats.messagesReceived;\n totalProcessed += stats.messagesProcessed;\n totalFailed += stats.messagesFailed;\n\n if (stats.lastActivity && (!lastActivity || stats.lastActivity > lastActivity)) {\n lastActivity = stats.lastActivity;\n }\n }\n\n return {\n messagesPublished: 0, // Consumer doesn't track publishing\n messagesConsumed: totalProcessed,\n messagesFailed: totalFailed,\n activeConsumers: this.subscriptions.size,\n activePublishers: 0,\n queueSize: 0,\n lastActivity: lastActivity,\n details: {\n totalReceived,\n type: 'nats',\n },\n };\n }\n\n /**\n * Ensure a stream exists\n */\n async ensureStream(config: StreamConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n // Check if stream exists\n try {\n await jsm.streams.info(config.name);\n logger.debug('[NatsEventConsumer] Stream already exists', {\n stream: config.name,\n });\n return;\n } catch {\n // Stream doesn't exist, create it\n }\n\n const streamConfig: Partial<NatsStreamConfig> = {\n name: config.name,\n subjects: config.subjects,\n retention: this.mapRetentionPolicy(config.retention),\n storage: this.mapStorageType(config.storage),\n max_consumers: config.maxConsumers,\n max_msgs: config.maxMsgs,\n max_bytes: config.maxBytes ?? DEFAULT_STREAM_MAX_BYTES,\n max_age: config.maxAge,\n duplicate_window: config.duplicateWindow,\n };\n\n await jsm.streams.add(streamConfig);\n\n logger.info('[NatsEventConsumer] Stream created successfully', {\n stream: config.name,\n subjects: config.subjects,\n });\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to ensure stream', {\n stream: config.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Ensure a consumer exists\n */\n async ensureConsumer(config: ConsumerConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n await jsm.consumers.add(config.stream, {\n name: config.consumer,\n durable_name: config.consumer,\n filter_subject: config.filterSubject,\n ack_policy: this.mapAckPolicy(config.ackPolicy),\n deliver_policy: this.mapDeliverPolicy(config.deliverPolicy),\n max_deliver: config.maxDeliver || 3,\n ack_wait: config.ackWait || 30_000_000_000, // 30 seconds in nanoseconds\n max_ack_pending: config.maxAckPending || 100,\n });\n\n logger.info('[NatsEventConsumer] Consumer created successfully', {\n stream: config.stream,\n consumer: config.consumer,\n });\n } catch (error) {\n if (error instanceof Error && error.message?.includes('already exists')) {\n logger.debug('[NatsEventConsumer] Consumer already exists', {\n stream: config.stream,\n consumer: config.consumer,\n });\n } else {\n logger.error('[NatsEventConsumer] Failed to ensure consumer', {\n stream: config.stream,\n consumer: config.consumer,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n }\n\n /**\n * Derive stream subject pattern from subscription subject\n * Examples:\n * - \"channel.conversation.message\" → [\"channel.>\"]\n * - \"wspace.tags.created\" → [\"wspace.>\"]\n * - \"global.auth.login\" → [\"global.>\"]\n */\n private deriveStreamSubjects(subject: string): string[] {\n // Extract the first segment and create a wildcard pattern\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return [`${firstSegment}.>`];\n }\n // Fallback to the subject itself with a wildcard\n return [`${subject.replace(/\\.[^.]+$/, '.>')}`];\n }\n\n /**\n * Subscribe to a subject\n */\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n const js = this.connectionManager.getJetStream();\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n let streamName = options.options?.stream || this.config.stream;\n const consumerName =\n options.options?.consumer || `${this.config.consumer}-${options.subject.replace(/\\./g, '-')}`;\n\n // Auto-create stream if it doesn't exist\n // Derive subjects from the subscription subject pattern\n const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);\n try {\n await this.ensureStream({\n name: streamName,\n subjects: streamSubjects,\n retention: options.options?.retention || 'limits',\n storage: options.options?.storage || 'file',\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (!errorMessage.includes('subjects overlap')) {\n throw error;\n }\n\n streamName = await jsm.streams.find(options.subject);\n logger.info('[NatsEventConsumer] Using existing stream for overlapping subject', {\n requestedStream: options.options?.stream || this.config.stream,\n stream: streamName,\n subject: options.subject,\n });\n }\n\n // Ensure consumer exists\n await this.ensureConsumer({\n type: this.config.type,\n url: this.config.url,\n consumer: consumerName,\n stream: streamName,\n filterSubject: options.subject,\n ackPolicy: options.options?.ackPolicy,\n deliverPolicy: options.options?.deliverPolicy,\n maxDeliver: options.options?.maxDeliver || this.config.maxDeliver,\n ackWait: options.options?.ackWait || this.config.ackWait,\n maxAckPending: options.options?.maxAckPending,\n });\n\n // Get consumer\n const consumer = await js.consumers.get(streamName, consumerName);\n\n const subscriptionId = `sub_${Date.now()}_${crypto.randomUUID().substring(0, 7)}`;\n let stopRequested = false;\n\n // Create subscription\n const stopFn = (): void => {\n stopRequested = true;\n };\n\n const subscription = new NatsSubscription(subscriptionId, options.subject, stopFn);\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Start consuming messages\n this.consumeMessages(\n consumer,\n subscription,\n options.handler,\n options.options?.maxConcurrent || this.config.maxConcurrent || 1,\n () => stopRequested\n ).catch((error) => {\n logger.error('[NatsEventConsumer] Error in message consumption loop', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n });\n\n logger.info('[NatsEventConsumer] Subscription created', {\n subscriptionId,\n subject: options.subject,\n });\n\n return subscription;\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to subscribe', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Subscribe to multiple subjects\n */\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n\n for (const subject of subjects) {\n const subscription = await this.subscribe({\n subject,\n handler,\n options,\n });\n subscriptions.push(subscription);\n }\n\n return subscriptions;\n }\n\n /**\n * Pull messages manually\n */\n async pull<T = unknown>(options: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n const js = this.connectionManager.getJetStream();\n\n try {\n const consumer = await js.consumers.get(this.config.stream, this.config.consumer);\n\n const messages = await consumer.fetch({\n max_messages: options.batch || 10,\n expires: options.timeout || 30000,\n });\n\n const events: AcknowledgeableEvent<T>[] = [];\n\n for await (const msg of messages) {\n const event = this.wrapMessage<T>(msg);\n events.push(event);\n }\n\n return events;\n } catch (error) {\n logger.error('[NatsEventConsumer] Failed to pull messages', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Unsubscribe from all active subscriptions\n */\n async unsubscribeAll(): Promise<void> {\n const unsubscribePromises = Array.from(this.subscriptions.values()).map(async (subscription) =>\n subscription.unsubscribe()\n );\n\n await Promise.all(unsubscribePromises);\n\n this.subscriptions.clear();\n\n logger.info('[NatsEventConsumer] All subscriptions unsubscribed');\n }\n\n /**\n * Get all active subscriptions\n */\n getSubscriptions(): ISubscription[] {\n return Array.from(this.subscriptions.values());\n }\n\n /**\n * Process pending messages in dead letter queue\n */\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n await Promise.resolve();\n // Would need to implement DLQ stream pattern\n logger.warn('[NatsEventConsumer] DLQ processing not yet implemented');\n }\n\n /**\n * List subjects for the configured stream\n */\n async listSubjects(streamName?: string): Promise<string[]> {\n const jsm = this.connectionManager.getJetStreamManager();\n const info = await jsm.streams.info(streamName || this.config.stream);\n return info.config.subjects || [];\n }\n\n /**\n * Consume messages from consumer\n */\n private async consumeMessages<T>(\n consumer: Consumer,\n subscription: NatsSubscription,\n handler: EventHandler<T>,\n maxConcurrent: number,\n stopRequested: () => boolean\n ): Promise<void> {\n try {\n const messages = await consumer.consume({\n max_messages: maxConcurrent,\n expires: 30000, // 30 seconds\n });\n\n for await (const msg of messages) {\n if (stopRequested()) {\n break;\n }\n\n subscription.incrementReceived();\n\n try {\n const event = this.wrapMessage<T>(msg);\n // Wrap in a CONSUMER-kind span rooted at the producer's trace\n // context (if present in headers). No-op when OTel isn't installed.\n await runWithConsumerSpan(msg.subject, msg.headers, async () => handler(event));\n subscription.incrementProcessed();\n } catch (error) {\n subscription.incrementFailed();\n logger.error('[NatsEventConsumer] Error processing message', {\n subject: msg.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n // Don't ack - let it retry\n msg.nak();\n }\n }\n } catch (error) {\n logger.error('[NatsEventConsumer] Error consuming messages', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Wrap NATS message in AcknowledgeableEvent\n */\n private wrapMessage<T>(msg: JsMsg): AcknowledgeableEvent<T> {\n const eventMessage: EventMessage<T> = JSON.parse(msg.data.toString());\n\n return {\n ...eventMessage,\n sequence: msg.seq,\n ack: async (): Promise<void> => {\n await Promise.resolve();\n msg.ack();\n },\n nak: async (delay?: number): Promise<void> => {\n await Promise.resolve();\n if (delay) {\n msg.nak(delay);\n } else {\n msg.nak();\n }\n },\n term: async (): Promise<void> => {\n await Promise.resolve();\n msg.term();\n },\n isRedelivered: (): boolean => {\n return msg.redelivered;\n },\n getDeliveryAttempt: (): number => {\n return msg.info.deliveryCount;\n },\n };\n }\n\n /**\n * Map retention policy string to NATS enum\n */\n private mapRetentionPolicy(policy?: string): RetentionPolicy {\n switch (policy?.toLowerCase()) {\n case 'limits':\n return RetentionPolicy.Limits;\n case 'interest':\n return RetentionPolicy.Interest;\n case 'workqueue':\n default:\n return RetentionPolicy.Workqueue;\n }\n }\n\n /**\n * Map storage type string to NATS enum\n */\n private mapStorageType(storage?: string): StorageType {\n switch (storage?.toLowerCase()) {\n case 'memory':\n return StorageType.Memory;\n case 'file':\n default:\n return StorageType.File;\n }\n }\n\n /**\n * Map ack policy string to NATS enum\n */\n private mapAckPolicy(policy?: string): AckPolicy {\n switch (policy?.toLowerCase()) {\n case 'none':\n return AckPolicy.None;\n case 'all':\n return AckPolicy.All;\n case 'explicit':\n default:\n return AckPolicy.Explicit;\n }\n }\n\n /**\n * Map deliver policy string to NATS enum\n */\n private mapDeliverPolicy(policy?: string): DeliverPolicy {\n switch (policy?.toLowerCase()) {\n case 'new':\n return DeliverPolicy.New;\n case 'last':\n return DeliverPolicy.Last;\n case 'lastpersubject':\n return DeliverPolicy.LastPerSubject;\n case 'all':\n default:\n return DeliverPolicy.All;\n }\n }\n}\n","/**\n * NATS Event Publisher Implementation\n * Implements IEventPublisher interface for NATS JetStream\n */\nimport { logger } from '../../../logger/index.js';\nimport { injectW3CTraceContext } from './trace-context.js';\nimport { type StreamConfig as NatsStreamConfig, RetentionPolicy, StorageType, headers } from 'nats';\n\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig } from '../../types/config.js';\nimport type {\n EventMessage,\n EventMetadata,\n EventQueueHealthCheckResult,\n QueueStatistics,\n StreamConfig,\n} from '../../types/index.js';\nimport { NatsConnectionManager } from './NatsConnection.js';\n\nconst DEFAULT_STREAM_MAX_BYTES = 10 * 1024 * 1024;\n\n/**\n * NATS implementation of IEventPublisher\n */\nexport class NatsEventPublisher implements IEventPublisher {\n private connectionManager: NatsConnectionManager;\n private publishCount: number = 0;\n private lastPublishTime: Date | null = null;\n\n constructor(private config: PublisherConfig) {\n this.connectionManager = new NatsConnectionManager(config);\n }\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n await this.connectionManager.connect();\n }\n\n /**\n * Disconnect from NATS server\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n await Promise.resolve();\n const isConnected = this.isConnected();\n\n return {\n status: isConnected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n details: {\n connected: isConnected,\n type: 'nats',\n url: this.config.url,\n },\n };\n }\n\n /**\n * Get queue statistics\n */\n async getStatistics(): Promise<QueueStatistics> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n const streams = await jsm.streams.list().next();\n const streamCount = streams.length;\n\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0, // Publisher doesn't track consumption\n messagesFailed: 0,\n activeConsumers: 0,\n activePublishers: 1,\n queueSize: 0, // Would need to sum all stream messages\n lastActivity: this.lastPublishTime?.toISOString() || null,\n details: {\n streamCount,\n type: 'nats',\n },\n };\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to get statistics', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Ensure a stream exists\n */\n async ensureStream(config: StreamConfig): Promise<void> {\n const jsm = this.connectionManager.getJetStreamManager();\n\n try {\n // Check if stream exists\n try {\n await jsm.streams.info(config.name);\n logger.debug('[NatsEventPublisher] Stream already exists', {\n stream: config.name,\n });\n return;\n } catch {\n // Stream doesn't exist, create it\n }\n\n const streamConfig: Partial<NatsStreamConfig> = {\n name: config.name,\n subjects: config.subjects,\n retention: this.mapRetentionPolicy(config.retention),\n storage: this.mapStorageType(config.storage),\n max_consumers: config.maxConsumers,\n max_msgs: config.maxMsgs,\n max_bytes: config.maxBytes ?? DEFAULT_STREAM_MAX_BYTES,\n max_age: config.maxAge,\n duplicate_window: config.duplicateWindow,\n };\n\n await jsm.streams.add(streamConfig);\n\n logger.info('[NatsEventPublisher] Stream created successfully', {\n stream: config.name,\n subjects: config.subjects,\n });\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to ensure stream', {\n stream: config.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Derive stream subject pattern from subscription subject\n * Examples:\n * - \"channel.conversation.message\" → [\"channel.>\"]\n * - \"wspace.tags.created\" → [\"wspace.>\"]\n * - \"global.auth.login\" → [\"global.>\"]\n */\n private deriveStreamSubjects(subject: string): string[] {\n // Extract the first segment and create a wildcard pattern\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return [`${firstSegment}.>`];\n }\n // Fallback to the subject itself with a wildcard\n return [`${subject.replace(/\\.[^.]+$/, '.>')}`];\n }\n\n /**\n * Derive stream name from subject\n * Examples:\n * - \"channel.conversation.message\" → \"CHANNEL_EVENTS\"\n * - \"wspace.tags.created\" → \"WSPACE_EVENTS\"\n * - \"global.auth.login\" → \"GLOBAL_EVENTS\"\n */\n private deriveStreamName(subject: string): string {\n const firstSegment = subject.split('.')[0];\n if (firstSegment) {\n return `${firstSegment.toUpperCase()}_EVENTS`;\n }\n return 'EVENTS';\n }\n\n /**\n * Publish an event to a subject\n */\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n const js = this.connectionManager.getJetStream();\n\n try {\n // Auto-create stream if it doesn't exist\n const streamName = options.options?.stream || this.deriveStreamName(options.subject);\n const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);\n await this.ensureStream({\n name: streamName,\n subjects: streamSubjects,\n retention: options.options?.retention || 'limits',\n storage: options.options?.storage || 'file',\n });\n\n // Create event message\n const message: EventMessage<T> = {\n id: options.options?.messageId || this.generateMessageId(),\n subject: options.subject,\n data: options.data,\n metadata: {\n source: options.metadata?.source || 'workspaces-backend',\n correlationId: options.metadata?.correlationId || this.generateCorrelationId(),\n userId: options.metadata?.userId,\n workspaceId: options.metadata?.workspaceId,\n priority: options.options?.priority || this.config.defaultPriority || 'normal',\n ...options.metadata,\n },\n timestamp: new Date().toISOString(),\n };\n\n // Create headers\n const hdrs = headers();\n hdrs.set('message-id', message.id);\n hdrs.set('correlation-id', message.metadata.correlationId);\n\n if (message.metadata.source) {\n hdrs.set('source', message.metadata.source);\n }\n if (message.metadata['priority'] && typeof message.metadata['priority'] === 'string') {\n hdrs.set('priority', message.metadata['priority']);\n }\n if (message.metadata.userId) {\n hdrs.set('user-id', message.metadata.userId);\n }\n if (message.metadata.workspaceId) {\n hdrs.set('workspace-id', message.metadata.workspaceId);\n }\n\n // Inject W3C trace context so the consumer can link its span to the\n // producer's trace. Dynamic import keeps @opentelemetry/api optional.\n await injectW3CTraceContext(hdrs);\n\n // Publish options\n const publishOpts: {\n msgID?: string;\n headers: ReturnType<typeof headers>;\n } = {\n msgID: this.config.enableDeduplication ? message.id : undefined,\n headers: hdrs,\n };\n\n // Handle TTL\n if (options.options?.ttl) {\n // NATS doesn't have per-message TTL, would need stream-level configuration\n logger.warn('[NatsEventPublisher] Per-message TTL not supported in NATS', {\n subject: options.subject,\n ttl: options.options.ttl,\n });\n }\n\n // Handle delay\n if (options.options?.delay) {\n // NATS doesn't have native delay, would need to implement with separate delayed stream\n logger.warn('[NatsEventPublisher] Message delay not supported in NATS', {\n subject: options.subject,\n delay: options.options.delay,\n });\n }\n\n // Publish message\n const ack = await js.publish(options.subject, JSON.stringify(message), publishOpts);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n\n logger.debug('[NatsEventPublisher] Event published', {\n subject: options.subject,\n messageId: message.id,\n sequence: ack.seq,\n });\n\n return ack.seq;\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to publish event', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Publish multiple events in a batch\n */\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const results: Array<number | string> = [];\n\n for (const event of events) {\n const seq = await this.publish(event);\n results.push(seq);\n }\n\n return results;\n }\n\n /**\n * Publish an event and wait for acknowledgment\n * Note: This is not natively supported by NATS JetStream\n * Would require implementing request-reply pattern\n */\n async publishWithAck<T = unknown, R = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n const nc = this.connectionManager.getNatsConnection();\n\n try {\n const message: EventMessage<T> = {\n id: this.generateMessageId(),\n subject: options.subject,\n data: options.data,\n metadata: {\n source: options.metadata?.source || 'workspaces-backend',\n correlationId: options.metadata?.correlationId || this.generateCorrelationId(),\n userId: options.metadata?.userId,\n workspaceId: options.metadata?.workspaceId,\n ...options.metadata,\n },\n timestamp: new Date().toISOString(),\n };\n\n const response = await nc.request(options.subject, JSON.stringify(message), {\n timeout: options.timeout || 30000,\n });\n\n const result = JSON.parse(response.data.toString()) as R;\n\n logger.debug('[NatsEventPublisher] Event published with ack', {\n subject: options.subject,\n messageId: message.id,\n });\n\n return result;\n } catch (error) {\n logger.error('[NatsEventPublisher] Failed to publish event with ack', {\n subject: options.subject,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Map retention policy string to NATS enum\n */\n private mapRetentionPolicy(policy?: string): RetentionPolicy {\n switch (policy?.toLowerCase()) {\n case 'limits':\n return RetentionPolicy.Limits;\n case 'interest':\n return RetentionPolicy.Interest;\n case 'workqueue':\n default:\n return RetentionPolicy.Workqueue;\n }\n }\n\n /**\n * Map storage type string to NATS enum\n */\n private mapStorageType(storage?: string): StorageType {\n switch (storage?.toLowerCase()) {\n case 'memory':\n return StorageType.Memory;\n case 'file':\n default:\n return StorageType.File;\n }\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;\n }\n\n /**\n * Generate correlation ID\n */\n private generateCorrelationId(): string {\n return `corr_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;\n }\n}\n","/**\n * Redis Streams key namespace helpers.\n *\n * All keys are prefixed with `boff:` because DB 0 of Azure Managed Redis is\n * shared with the be-sdk cache provider.\n */\n\nexport interface KeyspaceOptions {\n /** Top-level prefix for event streams. Defaults to `boff:events`. */\n prefix?: string;\n}\n\nconst DEFAULT_PREFIX = 'boff:events';\nconst REGISTRY_PREFIX = 'boff:registry:subjects';\nconst DELAYQ_PREFIX = 'boff:delayq';\nconst DELAYQ_LOCK_PREFIX = 'boff:lock:delayq';\nconst DLQ_PREFIX = 'boff:dlq';\nconst DEDUP_PREFIX = 'boff:dedup';\nconst REPLY_PREFIX = 'boff:replies';\n\n/** Convert a NATS-style subject to a Redis key segment (`.` → `:`). */\nexport function subjectToKey(subject: string): string {\n return subject.replace(/\\./g, ':');\n}\n\n/** Build the stream key for a given subject. */\nexport function streamKey(subject: string, opts: KeyspaceOptions = {}): string {\n const prefix = opts.prefix ?? DEFAULT_PREFIX;\n return `${prefix}:${subjectToKey(subject)}`;\n}\n\n/** Stream key from a NATS-style wildcard prefix (e.g. `wspace`). */\nexport function registryKey(boundary: string): string {\n return `${REGISTRY_PREFIX}:${boundary}`;\n}\n\n/** Extract the leading boundary (`x` in `x.y.z`). */\nexport function boundaryOf(subject: string): string {\n const first = subject.split('.')[0];\n return first ?? subject;\n}\n\n/** Sorted-set key for delayed-NAK re-delivery, scoped per stream. */\nexport function delayQueueKey(stream: string): string {\n return `${DELAYQ_PREFIX}:${stream}`;\n}\n\n/** Lock key the delay-queue worker uses to serialise across replicas. */\nexport function delayLockKey(stream: string): string {\n return `${DELAYQ_LOCK_PREFIX}:${stream}`;\n}\n\n/** Per-stream dead-letter queue. */\nexport function dlqKey(stream: string): string {\n return `${DLQ_PREFIX}:${stream}`;\n}\n\n/** Per-message dedup marker key. */\nexport function dedupKey(stream: string, msgId: string): string {\n return `${DEDUP_PREFIX}:${stream}:${msgId}`;\n}\n\n/** Reply-stream key for request/response emulation. */\nexport function replyKey(correlationId: string): string {\n return `${REPLY_PREFIX}:${correlationId}`;\n}\n\n/**\n * Resolve a NATS-style subject pattern to a concrete list of stream keys, using\n * a registry of known subjects.\n *\n * Patterns supported:\n * - `x.y.z` — exact subject, returns single stream\n * - `x.>` — all subjects starting with `x.`\n * - `x.*` — all subjects with exactly one more segment after `x.`\n * - `x.*.z` — single-segment wildcard at position\n */\nexport function matchSubject(pattern: string, subject: string): boolean {\n if (pattern === subject) return true;\n const pParts = pattern.split('.');\n const sParts = subject.split('.');\n const last = pParts[pParts.length - 1];\n if (last === '>') {\n if (sParts.length < pParts.length) return false;\n for (let i = 0; i < pParts.length - 1; i++) {\n if (pParts[i] !== sParts[i]) return false;\n }\n return true;\n }\n if (pParts.length !== sParts.length) return false;\n for (let i = 0; i < pParts.length; i++) {\n if (pParts[i] !== '*' && pParts[i] !== sParts[i]) return false;\n }\n return true;\n}\n\n/** True if subject pattern contains a wildcard token. */\nexport function isWildcard(pattern: string): boolean {\n return pattern.includes('*') || pattern.includes('>');\n}\n","/**\n * W3C trace context propagation for Redis Streams entries.\n *\n * Stream entries carry trace context as ordinary fields (`traceparent`,\n * `tracestate`, `baggage`). When `@opentelemetry/api` isn't installed at the\n * consumer, these helpers degrade to no-ops.\n */\nimport { logger } from '../../../logger/index.js';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) return otelApiPromise;\n otelApiPromise = (async () => {\n try {\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[redis-streams/trace-context] @opentelemetry/api not available; tracing disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst TRACE_KEYS = ['traceparent', 'tracestate', 'baggage'] as const;\n\n/** Inject the active OTel context into a plain record of stream fields. */\nexport async function injectTraceFields(): Promise<Record<string, string>> {\n const api = await loadOtelApi();\n if (!api) return {};\n const carrier: Record<string, string> = {};\n try {\n api.propagation.inject(\n api.context.active(),\n carrier,\n {\n set(c, k, v) {\n c[k] = v;\n },\n }\n );\n } catch (err) {\n logger.debug('[redis-streams/trace-context] inject failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return carrier;\n}\n\n/** Extract OTel context from stream-entry fields. */\nexport async function extractTraceContext(fields: Record<string, string>): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api) return undefined;\n const carrier: Record<string, string> = {};\n for (const key of TRACE_KEYS) {\n const value = fields[key];\n if (value) carrier[key] = value;\n }\n try {\n return api.propagation.extract(api.context.active(), carrier, {\n get(c, k) {\n return c[k];\n },\n keys(c) {\n return Object.keys(c);\n },\n });\n } catch {\n return undefined;\n }\n}\n\n/** Wrap a consumer handler in a CONSUMER-kind span rooted at the carried trace. */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n fields: Record<string, string>,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractTraceContext(fields);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/redis-streams');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `redis-streams.consume ${subject}`,\n {\n kind: 5,\n attributes: { 'messaging.system': 'redis', 'messaging.destination.name': subject },\n },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch {\n return handler();\n }\n}\n","/**\n * Redis Streams implementation of IEventConsumer.\n *\n * One ioredis client per active subscription handles `XREADGROUP BLOCK` in a\n * background loop, with periodic XAUTOCLAIM reclaiming abandoned pending\n * entries and a small ZSET-based delay queue draining NAK'd messages back\n * into the stream when their delay expires.\n */\nimport { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { logger } from '../../../logger/index.js';\nimport type {\n IEventConsumer,\n ISubscription,\n} from '../../interfaces/IEventConsumer.js';\nimport type {\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from '../../types/config.js';\nimport type {\n AcknowledgeableEvent,\n EventHandler,\n EventMetadata,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n delayLockKey,\n delayQueueKey,\n dlqKey,\n isWildcard,\n matchSubject,\n registryKey,\n streamKey,\n} from './keyspace.js';\nimport { runWithConsumerSpan } from './trace-context.js';\n\ninterface ParsedEntry<T = unknown> {\n id: string;\n stream: string;\n subject: string;\n data: T;\n metadata: EventMetadata;\n timestamp: string;\n fields: Record<string, string>;\n deliveryCount: number;\n}\n\nconst DEFAULT_BLOCK_MS = 5000;\nconst DEFAULT_BATCH = 10;\nconst REGISTRY_REFRESH_MS = 10_000;\nconst DEFAULT_ACK_WAIT_MS = 30_000;\nconst DEFAULT_MAX_DELIVER = 3;\nconst SWEEP_INTERVAL_MS = 15_000;\nconst DELAYQ_INTERVAL_MS = 1_000;\n\nclass RedisStreamsSubscription implements ISubscription {\n readonly id = randomUUID();\n private active = true;\n private receivedCount = 0;\n private processedCount = 0;\n private failedCount = 0;\n private lastActivity = new Date().toISOString();\n\n constructor(\n readonly subject: string,\n private readonly unsubscribeFn: () => Promise<void>\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) return;\n this.active = false;\n await this.unsubscribeFn();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.receivedCount,\n messagesProcessed: this.processedCount,\n messagesFailed: this.failedCount,\n lastActivity: this.lastActivity,\n };\n }\n\n recordReceived(): void {\n this.receivedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordProcessed(): void {\n this.processedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordFailed(): void {\n this.failedCount++;\n this.lastActivity = new Date().toISOString();\n }\n}\n\nexport interface RedisStreamsConsumerConfig extends ConsumerConfig {\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventConsumer implements IEventConsumer {\n private readonly connection: RedisStreamsConnection;\n private subscriptions: RedisStreamsSubscription[] = [];\n private readonly subscriptionLoops: Set<() => Promise<void>> = new Set();\n private readonly keyPrefix: string;\n private readonly consumerName: string;\n private readonly group: string;\n private readonly maxDeliver: number;\n private readonly ackWaitMs: number;\n private readonly maxConcurrent: number;\n private consumedCount = 0;\n private failedCount = 0;\n private lastActivity: Date | null = null;\n private stopped = false;\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private delayqTimer: ReturnType<typeof setInterval> | null = null;\n private knownStreams: Map<string, string> = new Map(); // streamKey -> subject\n\n constructor(config: RedisStreamsConsumerConfig) {\n this.connection = new RedisStreamsConnection({\n type: 'redis-streams',\n url: config.url ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n user: config.user,\n password: config.password,\n name: config.name,\n connectionTimeout: config.connectionTimeout,\n });\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.group = config.consumer || config.name || 'default-consumer';\n this.consumerName = `${this.group}:${hostname()}:${process.pid}`;\n this.maxDeliver = config.maxDeliver ?? DEFAULT_MAX_DELIVER;\n this.ackWaitMs = config.ackWait\n ? Math.max(1000, Math.round(config.ackWait / 1_000_000))\n : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n if (!this.sweepTimer) {\n const t = setInterval(() => {\n void this.sweepPending().catch((err) => {\n logger.debug('[RedisStreamsEventConsumer] sweep error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, SWEEP_INTERVAL_MS);\n t.unref?.();\n this.sweepTimer = t;\n }\n if (!this.delayqTimer) {\n const t = setInterval(() => {\n void this.drainDelayQueues().catch(() => undefined);\n }, DELAYQ_INTERVAL_MS);\n t.unref?.();\n this.delayqTimer = t;\n }\n }\n\n async disconnect(): Promise<void> {\n this.stopped = true;\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n if (this.delayqTimer) clearInterval(this.delayqTimer);\n await this.unsubscribeAll();\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: {\n type: 'redis-streams',\n subscriptions: this.subscriptions.length,\n },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return Promise.resolve({\n messagesConsumed: this.consumedCount,\n messagesFailed: this.failedCount,\n messagesPublished: 0,\n activeConsumers: this.subscriptions.length,\n lastActivity: this.lastActivity?.toISOString() ?? null,\n details: { type: 'redis-streams', group: this.group },\n });\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async ensureConsumer(_config: ConsumerConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async subscribe<T = unknown>(opts: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n await this.connect();\n const sub = new RedisStreamsSubscription(opts.subject, async () => {\n this.subscriptions = this.subscriptions.filter((s) => s !== sub);\n });\n this.subscriptions.push(sub);\n\n const startId = this.resolveStartId(opts.options?.deliverPolicy);\n const wildcard = isWildcard(opts.subject);\n const handlerFn = opts.handler as EventHandler<unknown>;\n\n if (!wildcard) {\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n this.spawnLoop(sub, stream, opts.subject, handlerFn);\n } else {\n const boundary = boundaryOf(opts.subject);\n const refresh = async (): Promise<void> => {\n const client = this.connection.getClient();\n const subjects = await client.smembers(registryKey(boundary));\n for (const s of subjects) {\n if (!matchSubject(opts.subject, s)) continue;\n const stream = streamKey(s, { prefix: this.keyPrefix });\n if (this.knownStreams.has(stream)) continue;\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, s);\n this.spawnLoop(sub, stream, s, handlerFn);\n }\n };\n await refresh();\n const t = setInterval(() => {\n if (this.stopped || !sub.isActive()) {\n clearInterval(t);\n return;\n }\n void refresh().catch(() => undefined);\n }, REGISTRY_REFRESH_MS);\n t.unref?.();\n }\n\n return sub;\n }\n\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const out: ISubscription[] = [];\n for (const subject of subjects) {\n out.push(await this.subscribe({ subject, handler, options }));\n }\n return out;\n }\n\n async pull<T = unknown>(opts: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n await this.connect();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, '$');\n const client = this.connection.getClient();\n const raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n opts.batch ?? DEFAULT_BATCH,\n 'BLOCK',\n opts.timeout ?? DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!raw) return [];\n const out: AcknowledgeableEvent<T>[] = [];\n for (const [streamName, entries] of raw) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(streamName, id, rawFields);\n out.push(this.toAcknowledgeable(streamName, id, parsed));\n }\n }\n return out;\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of [...this.subscriptions]) {\n await sub.unsubscribe();\n }\n this.subscriptions = [];\n this.subscriptionLoops.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return [...this.subscriptions];\n }\n\n async processDLQ<T = unknown>(handler: EventHandler<T>): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const dlqGroup = `${this.group}-dlq`;\n for (const [stream] of this.knownStreams) {\n const dlq = dlqKey(stream);\n try {\n await client.xgroup('CREATE', dlq, dlqGroup, '0', 'MKSTREAM');\n } catch {\n /* already exists */\n }\n const res = (await client.xreadgroup(\n 'GROUP',\n dlqGroup,\n this.consumerName,\n 'COUNT',\n 50,\n 'BLOCK',\n 100,\n 'STREAMS',\n dlq,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!res) continue;\n for (const [, entries] of res) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(dlq, id, rawFields);\n const evt = this.toAcknowledgeable<T>(dlq, id, parsed, dlqGroup);\n try {\n await handler(evt);\n } catch (err) {\n logger.error('[RedisStreamsEventConsumer] DLQ handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n }\n }\n\n async listSubjects(_stream?: string): Promise<string[]> {\n await this.connect();\n const client = this.connection.getClient();\n const seen = new Set<string>();\n for (const subject of this.knownStreams.values()) {\n const members = await client.smembers(registryKey(boundaryOf(subject)));\n for (const m of members) seen.add(m);\n }\n return [...seen];\n }\n\n // ---- internals ----\n\n private resolveStartId(policy: SubscriptionOptions['deliverPolicy'] | undefined): string {\n switch (policy) {\n case 'all':\n return '0';\n case 'new':\n return '$';\n case 'last':\n return '$';\n default:\n return '$';\n }\n }\n\n private async ensureGroup(stream: string, startId: string): Promise<void> {\n const client = this.connection.getClient();\n try {\n await client.xgroup('CREATE', stream, this.group, startId, 'MKSTREAM');\n logger.debug('[RedisStreamsEventConsumer] group created', {\n stream,\n group: this.group,\n startId,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('BUSYGROUP')) {\n throw err;\n }\n }\n }\n\n private spawnLoop(\n sub: RedisStreamsSubscription,\n stream: string,\n subject: string,\n handler: EventHandler<unknown>\n ): void {\n const loop = async (): Promise<void> => {\n const client = await this.connection.makeBlockingClient();\n try {\n while (!this.stopped && sub.isActive()) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n this.maxConcurrent,\n 'BLOCK',\n DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) {\n await this.ensureGroup(stream, '$');\n continue;\n }\n logger.warn('[RedisStreamsEventConsumer] read error', { stream, error: msg });\n await new Promise((res) => setTimeout(res, 1000));\n continue;\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n sub.recordReceived();\n this.consumedCount++;\n this.lastActivity = new Date();\n const parsed = this.parseEntry(stream, id, rawFields);\n const evt = this.toAcknowledgeable(stream, id, parsed);\n try {\n await runWithConsumerSpan(subject, parsed.fields, () => handler(evt));\n sub.recordProcessed();\n } catch (err) {\n sub.recordFailed();\n this.failedCount++;\n logger.error('[RedisStreamsEventConsumer] handler error', {\n subject,\n id,\n error: err instanceof Error ? err.message : String(err),\n });\n // Auto-nak on uncaught throw (re-deliver after ackWait).\n try {\n await evt.nak();\n } catch {\n /* ignore */\n }\n }\n }\n }\n }\n } finally {\n try {\n client.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventConsumer] loop crashed', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n private parseEntry<T>(stream: string, id: string, rawFields: string[]): ParsedEntry<T> {\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const key = rawFields[i];\n const val = rawFields[i + 1];\n if (key === undefined || val === undefined) continue;\n fields[key] = val;\n }\n let data: T;\n try {\n data = JSON.parse(fields['payload'] ?? 'null') as T;\n } catch {\n data = fields['payload'] as unknown as T;\n }\n let metadata: EventMetadata;\n try {\n metadata = JSON.parse(fields['metadata'] ?? '{}') as EventMetadata;\n } catch {\n metadata = { correlationId: fields['correlation-id'] ?? '' };\n }\n if (!metadata.correlationId) metadata.correlationId = fields['correlation-id'] ?? '';\n return {\n id,\n stream,\n subject: fields['subject'] ?? '',\n data,\n metadata,\n timestamp: fields['timestamp'] ?? new Date().toISOString(),\n fields,\n deliveryCount: 1,\n };\n }\n\n private toAcknowledgeable<T>(\n stream: string,\n id: string,\n parsed: ParsedEntry<T>,\n group: string = this.group\n ): AcknowledgeableEvent<T> {\n const connection = this.connection;\n let acked = false;\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n async ack(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n async nak(delay = 0): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n if (delay > 0) {\n // Park in delay queue; worker will re-XADD and ACK original.\n const score = Date.now() + delay;\n const payload = JSON.stringify(parsed.fields);\n await client.zadd(delayQueueKey(stream), score, `${id}|${payload}`);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n }\n // delay=0: do nothing — XAUTOCLAIM will reclaim after ackWait.\n },\n async term(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n const dlq = dlqKey(stream);\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n await client.xadd(dlq, 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private async sweepPending(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n try {\n const claimed = (await client.xautoclaim(\n stream,\n this.group,\n this.consumerName,\n this.ackWaitMs,\n '0',\n 'COUNT',\n 50\n )) as [string, Array<[string, string[]]>, string[]] | null;\n if (!claimed) continue;\n const entries = claimed[1] ?? [];\n for (const [id, rawFields] of entries) {\n const pending = (await client.xpending(\n stream,\n this.group,\n 'IDLE',\n 0,\n '-',\n '+',\n 1,\n this.consumerName\n )) as Array<[string, string, number, number]>;\n const deliveryCount = Array.isArray(pending) && pending[0] ? pending[0][3] : 1;\n if (deliveryCount > this.maxDeliver) {\n const flat: string[] = [];\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n flat.push(rawFields[i]!, rawFields[i + 1]!);\n }\n flat.push('dlq-reason', 'max-deliver-exceeded');\n flat.push('dlq-deliveries', String(deliveryCount));\n await client.xadd(dlqKey(stream), 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, this.group, id);\n await client.xdel(stream, id).catch(() => undefined);\n logger.warn('[RedisStreamsEventConsumer] message moved to DLQ', {\n stream,\n id,\n deliveryCount,\n });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) continue;\n logger.debug('[RedisStreamsEventConsumer] sweep iteration error', { stream, error: msg });\n }\n }\n }\n\n private async drainDelayQueues(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n const lockKey = delayLockKey(stream);\n const got = await client.set(lockKey, this.consumerName, 'NX', 'EX', 30).catch(() => null);\n if (got !== 'OK') continue;\n try {\n const due = await client.zrangebyscore(\n delayQueueKey(stream),\n 0,\n Date.now(),\n 'LIMIT',\n 0,\n 50\n );\n for (const member of due) {\n const split = member.indexOf('|');\n if (split < 0) continue;\n const payload = member.slice(split + 1);\n let fields: Record<string, string> = {};\n try {\n fields = JSON.parse(payload) as Record<string, string>;\n } catch {\n continue;\n }\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) flat.push(k, v);\n await client.xadd(stream, 'MAXLEN', '~', 100_000, '*', ...flat);\n await client.zrem(delayQueueKey(stream), member);\n }\n } finally {\n await client.del(lockKey).catch(() => undefined);\n }\n }\n }\n}\n\nexport type { IoRedis };\n","/**\n * Redis Streams implementation of IEventPublisher.\n *\n * Each subject is its own stream (`boff:events:<subject-with-colons>`); MAXLEN\n * trimming keeps each stream bounded; dedup is enforced by `SET NX EX` on a\n * per-message-id key before XADD.\n */\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type { EventMetadata, StreamConfig } from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n dedupKey,\n registryKey,\n replyKey,\n streamKey,\n} from './keyspace.js';\nimport { injectTraceFields } from './trace-context.js';\n\nexport interface RedisStreamsPublisherConfig extends PublisherConfig {\n /** Approximate MAXLEN trim threshold per stream. Default 100_000. */\n maxLen?: number;\n /** Dedup TTL window in seconds. Default 120. */\n dedupTtlSeconds?: number;\n /** Key namespace override. Default `boff:events`. */\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventPublisher implements IEventPublisher {\n private connection: RedisStreamsConnection;\n private publishCount = 0;\n private lastPublishTime: Date | null = null;\n private readonly maxLen: number;\n private readonly dedupTtl: number;\n private readonly keyPrefix: string;\n\n constructor(private config: RedisStreamsPublisherConfig) {\n this.connection = new RedisStreamsConnection(config);\n this.maxLen = config.maxLen ?? parseInt(process.env['REDIS_STREAMS_MAXLEN'] ?? '100000', 10);\n this.dedupTtl = config.dedupTtlSeconds ?? parseInt(process.env['REDIS_STREAMS_DEDUP_TTL'] ?? '120', 10);\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: { type: 'redis-streams', url: this.config.url },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesFailed: 0,\n activePublishers: 1,\n activeConsumers: 0,\n lastActivity: this.lastPublishTime?.toISOString() ?? null,\n details: { type: 'redis-streams' },\n };\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n // Streams are created lazily by XADD; no-op here.\n return Promise.resolve();\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n return this.publishInternal(options);\n }\n\n private async publishInternal<T>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<string> {\n await this.connect();\n const client = this.connection.getClient();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup =\n this.config.enableDeduplication === true || opts.options?.messageId !== undefined;\n\n if (enableDedup) {\n const ok = await client.set(dedupKey(stream, msgId), '1', 'NX', 'EX', this.dedupTtl);\n if (ok !== 'OK') {\n logger.debug('[RedisStreamsEventPublisher] dedup hit; skipping publish', {\n subject: opts.subject,\n msgId,\n });\n return msgId;\n }\n }\n\n const trace = await injectTraceFields();\n const fields: Record<string, string> = {\n 'msg-id': msgId,\n subject: opts.subject,\n 'correlation-id': correlationId,\n timestamp: new Date().toISOString(),\n priority: opts.options?.priority ?? this.config.defaultPriority ?? 'normal',\n source: opts.metadata?.source ?? this.config.name ?? 'unknown',\n payload: JSON.stringify(opts.data ?? null),\n metadata: JSON.stringify(opts.metadata ?? {}),\n ...trace,\n };\n if (opts.metadata?.userId) fields['user-id'] = String(opts.metadata.userId);\n if (opts.metadata?.workspaceId) fields['workspace-id'] = String(opts.metadata.workspaceId);\n if (opts.metadata?.tenantId) fields['tenant-id'] = String(opts.metadata.tenantId);\n\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n flat.push(k, v);\n }\n\n const id = await client.xadd(stream, 'MAXLEN', '~', this.maxLen, '*', ...flat);\n\n // Async fire-and-forget registry update\n void client.sadd(registryKey(boundaryOf(opts.subject)), opts.subject).catch(() => undefined);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n logger.debug('[RedisStreamsEventPublisher] published', {\n subject: opts.subject,\n stream,\n id,\n });\n return id;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const out: string[] = [];\n for (const e of events) {\n out.push(await this.publishInternal(e));\n }\n return out;\n }\n\n /**\n * Emulated request/response: writer XADDs onto its own subject, then\n * blocks on a one-shot reply stream keyed by correlationId.\n */\n async publishWithAck<T = unknown, R = unknown>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n await this.connect();\n const client = this.connection.getClient();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const reply = replyKey(correlationId);\n await this.publishInternal({\n subject: opts.subject,\n data: opts.data,\n metadata: { ...opts.metadata, correlationId, replyTo: reply },\n });\n\n const timeoutMs = opts.timeout ?? 5000;\n const t0 = Date.now();\n while (Date.now() - t0 < timeoutMs) {\n const entries = (await client.xrange(reply, '-', '+')) as Array<[string, string[]]>;\n if (Array.isArray(entries) && entries.length > 0) {\n const last = entries[entries.length - 1];\n if (!last) break;\n const rawFields = last[1];\n const payloadIdx = rawFields.indexOf('payload');\n const payload = payloadIdx >= 0 ? rawFields[payloadIdx + 1] : '{}';\n await client.del(reply);\n return JSON.parse(payload ?? '{}') as R;\n }\n await new Promise((res) => setTimeout(res, 50));\n }\n await client.del(reply).catch(() => undefined);\n throw new Error(`[RedisStreamsEventPublisher] publishWithAck timed out for subject=${opts.subject}`);\n }\n\n /** Internal helper used by the consumer's reply path. */\n async sendReply(correlationId: string, data: unknown): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const key = replyKey(correlationId);\n await client.xadd(key, '*', 'payload', JSON.stringify(data ?? null));\n await client.expire(key, 60);\n }\n}\n\nexport type { IoRedis };\n","/**\n * Event Queue Factory\n * Creates appropriate event queue instances based on configuration\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\nimport { DEFAULT_LAYER_RESOURCES } from '../../types/layer.js';\n\nimport { NatsEventConsumer } from '../implementations/nats/NatsEventConsumer.js';\nimport { NatsEventPublisher } from '../implementations/nats/NatsEventPublisher.js';\nimport { RedisStreamsEventConsumer } from '../implementations/redis-streams/RedisStreamsEventConsumer.js';\nimport { RedisStreamsEventPublisher } from '../implementations/redis-streams/RedisStreamsEventPublisher.js';\nimport type { IEventConsumer } from '../interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from '../interfaces/IEventPublisher.js';\nimport { type ConsumerConfig, type PublisherConfig, QueueType } from '../types/config.js';\n\nfunction resolveQueueType(): QueueType {\n const raw = (process.env['EVENT_QUEUE_TYPE'] ?? process.env['QUEUE_TYPE'] ?? '').toLowerCase();\n if (raw === 'redis-streams' || raw === 'redis' || raw === 'streams') return QueueType.REDIS_STREAMS;\n if (raw === 'nats') return QueueType.NATS;\n // Default: if REDIS_URL is set and NATS is not, prefer redis-streams.\n if (!process.env['NATS_URL'] && !process.env['NATS_SERVERS'] && process.env['REDIS_URL']) {\n return QueueType.REDIS_STREAMS;\n }\n return QueueType.NATS;\n}\n\n/**\n * Factory for creating event queue instances\n */\nexport class EventQueueFactory {\n /**\n * Create an event publisher based on configuration\n */\n static createPublisher(config: PublisherConfig): IEventPublisher {\n logger.info('[EventQueueFactory] Creating event publisher', {\n type: config.type,\n url: config.url,\n });\n\n if (config.type === QueueType.NATS) {\n return new NatsEventPublisher(config);\n }\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n // Future implementations can be added here\n // if (config.type === QueueType.RABBITMQ) {\n // return new RabbitMQEventPublisher(config);\n // }\n // if (config.type === QueueType.KAFKA) {\n // return new KafkaEventPublisher(config);\n // }\n // if (config.type === QueueType.SQS) {\n // return new SQSEventPublisher(config);\n // }\n\n throw new Error(`Unsupported queue type: ${config.type}`);\n }\n\n /**\n * Create an event consumer based on configuration\n */\n static createConsumer(config: ConsumerConfig): IEventConsumer {\n logger.info('[EventQueueFactory] Creating event consumer', {\n type: config.type,\n url: config.url,\n stream: config.stream,\n consumer: config.consumer,\n });\n\n if (config.type === QueueType.NATS) {\n return new NatsEventConsumer(config);\n }\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n // Future implementations can be added here\n // if (config.type === QueueType.RABBITMQ) {\n // return new RabbitMQEventConsumer(config);\n // }\n // if (config.type === QueueType.KAFKA) {\n // return new KafkaEventConsumer(config);\n // }\n // if (config.type === QueueType.SQS) {\n // return new SQSEventConsumer(config);\n // }\n\n throw new Error(`Unsupported queue type: ${config.type}`);\n }\n\n /**\n * Create a publisher from environment variables\n */\n static createPublisherFromEnv(): IEventPublisher {\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createPublisher({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'be-sdk-publisher',\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n const config: PublisherConfig = {\n type,\n url: process.env['NATS_URL'] || 'nats://localhost:4222',\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: process.env['QUEUE_CLIENT_NAME'] || 'workspaces-backend-publisher',\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n defaultTTL: process.env['QUEUE_DEFAULT_TTL'] ? parseInt(process.env['QUEUE_DEFAULT_TTL'], 10) : undefined,\n };\n\n return EventQueueFactory.createPublisher(config);\n }\n\n /**\n * Create a consumer from environment variables\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createConsumer({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? consumer,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT']\n ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10)\n : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n const config: ConsumerConfig = {\n type,\n url: process.env['NATS_URL'] || 'nats://localhost:4222',\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: process.env['QUEUE_CLIENT_NAME'] || 'workspaces-workers-consumer',\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000 // Convert seconds to nanoseconds\n : 30_000_000_000,\n };\n\n return EventQueueFactory.createConsumer(config);\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @returns Publisher configured for the layer\n *\n * @example\n * ```typescript\n * const publisher = EventQueueFactory.createPublisherForLayer('wspace', 'wspace-tags-svc');\n * await publisher.connect();\n * await publisher.publish({ subject: 'wspace.tags.created', data: { id: '123' } });\n * ```\n */\n static createPublisherForLayer(layer: ServiceLayer, serviceName: string): IEventPublisher {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createPublisher({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n });\n }\n\n const config: PublisherConfig = {\n type,\n url: process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || defaults.natsUrl,\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: serviceName,\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') || 'normal',\n defaultTTL: process.env['QUEUE_DEFAULT_TTL'] ? parseInt(process.env['QUEUE_DEFAULT_TTL'], 10) : undefined,\n };\n\n logger.info('[EventQueueFactory] Creating layer publisher', {\n layer,\n serviceName,\n url: config.url,\n });\n\n return EventQueueFactory.createPublisher(config);\n }\n\n /**\n * Create a consumer for a specific layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param serviceName - Service name for identification\n * @param stream - NATS stream name\n * @param consumer - Consumer name\n * @returns Consumer configured for the layer\n *\n * @example\n * ```typescript\n * const consumer = EventQueueFactory.createConsumerForLayer(\n * 'wspace', 'wspace-tags-svc', 'WSPACE_EVENTS', 'tags-consumer'\n * );\n * await consumer.connect();\n * await consumer.consume(async (msg) => { console.log(msg); });\n * ```\n */\n static createConsumerForLayer(\n layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n const envPrefix = layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[layer];\n const type = resolveQueueType();\n if (type === QueueType.REDIS_STREAMS) {\n return EventQueueFactory.createConsumer({\n type,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n\n const config: ConsumerConfig = {\n type,\n url: process.env[`${envPrefix}_NATS_URL`] || process.env['NATS_URL'] || defaults.natsUrl,\n user: process.env['NATS_USER'],\n password: process.env['NATS_PASSWORD'],\n token: process.env['NATS_TOKEN'],\n creds: process.env['NATS_CREDS'],\n credsFile: process.env['NATS_CREDS_FILE'],\n name: serviceName,\n maxReconnectAttempts: process.env['NATS_MAX_RECONNECT_ATTEMPTS']\n ? parseInt(process.env['NATS_MAX_RECONNECT_ATTEMPTS'], 10)\n : -1,\n reconnectTimeWait: process.env['NATS_RECONNECT_TIME_WAIT']\n ? parseInt(process.env['NATS_RECONNECT_TIME_WAIT'], 10)\n : 2000,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n };\n\n logger.info('[EventQueueFactory] Creating layer consumer', {\n layer,\n serviceName,\n stream,\n consumer,\n url: config.url,\n });\n\n return EventQueueFactory.createConsumer(config);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/notifications/tenant-notifications.ts","../src/notifications/index.ts"],"names":["NotificationChannel","NotificationPriority","NotificationType","TenantNotificationsModule","client","context","send","input","validateSendInput","logger","info","channel","type","priority","mutation","variables","recipient","subject","body","htmlBody","data","metadata","scheduledFor","toISOString","expiresAt","trackOpens","trackClicks","response","tenantQuery","notificationId","sendNotification","sendWithTemplate","templateSlug","trim","length","ValidationError","Object","keys","email","userId","channelId","platform","timezone","triggerNotificationWithTemplate","id","status","sendBatch","notifications","count","batchSize","map","n","delayBetweenBatches","batchId","sendBatchNotifications","queued","totalQueued","failed","totalFailed","getNotification","query","notification","getNotifications","filter","startDate","endDate","undefined","limit","offset","getTemplate","slug","locale","notificationTemplate","getTemplates","notificationTemplates","getStats","notificationStats","markAsRead","notificationIds","markAllAsRead","deleteNotifications","deleteAllReadNotifications","phoneNumber","pushToken","NotificationsModule","options","title","message","userIds","userCount","redirectUrl","appName","sms","result","successCount","createNotification","failureCount","errors","sendToUser","debug","search","markMultipleAsRead","markNotificationsAsRead","markAllMyNotificationsAsRead","deleteNotification","deleteMultiple","getUnreadCount","unreadCount","sendChannelNotification","recipients","includeInApp","recipientCount","inAppUserCount","results","Promise","allSettled","forEach","index","value","push","triggerNotification","reason","Error","error","sendTemplateNotification"],"mappings":";;;;;AAAA,IAAA,4BAAA,GAAA;;;;;;;AAcO,IAAKA,mBAAAA,6BAAAA,oBAAAA,EAAAA;;;;;;;;;;;AAAAA,EAAAA,OAAAA,oBAAAA;;AAaL,IAAKC,oBAAAA,6BAAAA,qBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,qBAAAA;;AAOL,IAAKC,gBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAsIL,IAAMC,4BAAN,MAAMA;EAxKb;;;;;AAyKE,EAAA,WAAA,CACUC,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,KAAKC,KAAAA,EAA+C;AAE/D,IAAA,IAAA,CAAKC,kBAAkBD,KAAAA,CAAAA;AAEvBE,IAAAA,MAAAA,CAAOC,KAAK,4CAAA,EAA8C;AACxDC,MAAAA,OAAAA,EAASJ,KAAAA,CAAMI,OAAAA;AACfC,MAAAA,IAAAA,EAAML,MAAMK,IAAAA,IAAI,eAAA;AAChBC,MAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ;KAC1B,CAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLS,QAAAA,SAAAA,EAAWT,KAAAA,CAAMS,SAAAA;AACjBL,QAAAA,OAAAA,EAASJ,KAAAA,CAAMI,OAAAA;AACfC,QAAAA,IAAAA,EAAML,MAAMK,IAAAA,IAAI,eAAA;AAChBC,QAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ,QAAA;AACxBI,QAAAA,OAAAA,EAASV,KAAAA,CAAMU,OAAAA;AACfC,QAAAA,IAAAA,EAAMX,KAAAA,CAAMW,IAAAA;AACZC,QAAAA,QAAAA,EAAUZ,KAAAA,CAAMY,QAAAA;AAChBC,QAAAA,IAAAA,EAAMb,KAAAA,CAAMa,IAAAA;AACZC,QAAAA,QAAAA,EAAUd,KAAAA,CAAMc,QAAAA;QAChBC,YAAAA,EAAcf,KAAAA,CAAMe,cAAcC,WAAAA,EAAAA;QAClCC,SAAAA,EAAWjB,KAAAA,CAAMiB,WAAWD,WAAAA,EAAAA;AAC5BE,QAAAA,UAAAA,EAAYlB,KAAAA,CAAMkB,UAAAA;AAClBC,QAAAA,WAAAA,EAAanB,KAAAA,CAAMmB;AACrB;AACF,KAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpCI,IAAAA,MAAAA,CAAOC,KAAK,yCAAA,EAA2C;AACrDmB,MAAAA,cAAAA,EAAgBF,QAAAA,CAASG;KAC3B,CAAA;AAEA,IAAA,OAAOH,QAAAA,CAASG,gBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,iBAAiBxB,KAAAA,EAA+C;AAE3E,IAAA,IAAI,CAACA,MAAMyB,YAAAA,IAAgBzB,KAAAA,CAAMyB,aAAaC,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACjE,MAAA,MAAM,IAAIC,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMQ,SAAAA,IAAaqB,MAAAA,CAAOC,KAAK9B,KAAAA,CAAMQ,SAAS,CAAA,CAAEmB,MAAAA,KAAW,CAAA,EAAG;AACjE,MAAA,MAAM,IAAIC,gBAAgB,iCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,KAAAA,CAAMS,SAAAA,IAAc,CAACT,KAAAA,CAAMS,UAAUsB,KAAAA,IAAS,CAAC/B,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,EAAS;AAC3E,MAAA,MAAM,IAAIJ,gBAAgB,uCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,0DAAA,EAA4D;AACtEsB,MAAAA,YAAAA,EAAczB,KAAAA,CAAMyB,YAAAA;AACpBnB,MAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ;KAC1B,CAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLyB,QAAAA,YAAAA,EAAczB,KAAAA,CAAMyB,YAAAA;AACpBjB,QAAAA,SAAAA,EAAWR,KAAAA,CAAMQ,SAAAA;AACjBC,QAAAA,SAAAA,EAAWT,KAAAA,CAAMS,SAAAA;AACjBH,QAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ,QAAA;QACxBS,YAAAA,EAAcf,KAAAA,CAAMe,cAAcC,WAAAA,EAAAA;QAClCC,SAAAA,EAAWjB,KAAAA,CAAMiB,WAAWD,WAAAA,EAAAA;AAC5BE,QAAAA,UAAAA,EAAYlB,KAAAA,CAAMkB,UAAAA;AAClBC,QAAAA,WAAAA,EAAanB,KAAAA,CAAMmB,WAAAA;;;AAGnBc,QAAAA,SAAAA,EAAWjC,KAAAA,CAAMiC,SAAAA;AACjBC,QAAAA,QAAAA,EAAUlC,MAAMkC,QAAAA,IAAQ,OAAA;AACxBC,QAAAA,QAAAA,EAAUnC,KAAAA,CAAMmC;AAClB;AACF,KAAA;AAEA,IAAA,MAAMf,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpCI,IAAAA,MAAAA,CAAOC,KAAK,uDAAA,EAAyD;AACnEmB,MAAAA,cAAAA,EAAgBF,SAASgB,+BAAAA,CAAgCC,EAAAA;AACzDC,MAAAA,MAAAA,EAAQlB,SAASgB,+BAAAA,CAAgCE;KACnD,CAAA;AAEA,IAAA,OAAOlB,SAASgB,+BAAAA,CAAgCC,EAAAA;AAClD,EAAA;;;;AAKA,EAAA,MAAaE,UAAUvC,KAAAA,EAKpB;AACD,IAAA,IAAI,CAACA,KAAAA,CAAMwC,aAAAA,IAAiBxC,KAAAA,CAAMwC,aAAAA,CAAcb,WAAW,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAIC,gBAAgB,uCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,mDAAA,EAAqD;AAC/DsC,MAAAA,KAAAA,EAAOzC,MAAMwC,aAAAA,CAAcb,MAAAA;AAC3Be,MAAAA,SAAAA,EAAW1C,KAAAA,CAAM0C;KACnB,CAAA;AAEA,IAAA,MAAMnC,QAAAA,GAAW;;;;;;;;;;AAWjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLwC,QAAAA,aAAAA,EAAexC,KAAAA,CAAMwC,aAAAA,CAAcG,GAAAA,CAAI,CAACC,CAAAA,MAAO;AAC7CnC,UAAAA,SAAAA,EAAWmC,CAAAA,CAAEnC,SAAAA;AACbL,UAAAA,OAAAA,EAASwC,CAAAA,CAAExC,OAAAA;AACXC,UAAAA,IAAAA,EAAMuC,EAAEvC,IAAAA,IAAI,eAAA;AACZC,UAAAA,QAAAA,EAAUsC,EAAEtC,QAAAA,IAAQ,QAAA;AACpBI,UAAAA,OAAAA,EAASkC,CAAAA,CAAElC,OAAAA;AACXC,UAAAA,IAAAA,EAAMiC,CAAAA,CAAEjC,IAAAA;AACRC,UAAAA,QAAAA,EAAUgC,CAAAA,CAAEhC,QAAAA;AACZC,UAAAA,IAAAA,EAAM+B,CAAAA,CAAE/B,IAAAA;AACRC,UAAAA,QAAAA,EAAU8B,CAAAA,CAAE9B,QAAAA;UACZC,YAAAA,EAAc6B,CAAAA,CAAE7B,cAAcC,WAAAA,EAAAA;UAC9BC,SAAAA,EAAW2B,CAAAA,CAAE3B,WAAWD,WAAAA,EAAAA;AACxBE,UAAAA,UAAAA,EAAY0B,CAAAA,CAAE1B,UAAAA;AACdC,UAAAA,WAAAA,EAAayB,CAAAA,CAAEzB;SACjB,CAAA,CAAA;AACAuB,QAAAA,SAAAA,EAAW1C,KAAAA,CAAM0C,SAAAA;AACjBG,QAAAA,mBAAAA,EAAqB7C,KAAAA,CAAM6C,mBAAAA;AAC3BvC,QAAAA,QAAAA,EAAUN,KAAAA,CAAMM;AAClB;AACF,KAAA;AAEA,IAAA,MAAMc,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAOhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpCI,IAAAA,MAAAA,CAAOC,KAAK,gDAAA,EAAkD;AAC5D2C,MAAAA,OAAAA,EAAS1B,SAAS2B,sBAAAA,CAAuBD,OAAAA;AACzCE,MAAAA,MAAAA,EAAQ5B,SAAS2B,sBAAAA,CAAuBE,WAAAA;AACxCC,MAAAA,MAAAA,EAAQ9B,SAAS2B,sBAAAA,CAAuBI;KAC1C,CAAA;AAEA,IAAA,OAAO/B,QAAAA,CAAS2B,sBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaK,gBAAgBf,EAAAA,EAA0C;AACrE,IAAA,MAAMgB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4Bd,IAAA,MAAMjC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCgC,KAAAA,EAAO;AAAEhB,MAAAA;AAAG,KAAA,EAAG,KAAKvC,OAAO,CAAA;AAE9B,IAAA,OAAOsB,QAAAA,CAASkC,YAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,iBAAiBC,MAAAA,EAUF;AAC1B,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0Bd,IAAA,MAAM7C,SAAAA,GAAY;AAChBgD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACExB,QAAAA,MAAAA,EAAQwB,MAAAA,CAAOxB,MAAAA;AACf5B,QAAAA,OAAAA,EAASoD,MAAAA,CAAOpD,OAAAA;AAChBC,QAAAA,IAAAA,EAAMmD,MAAAA,CAAOnD,IAAAA;AACbiC,QAAAA,MAAAA,EAAQkB,MAAAA,CAAOlB,MAAAA;AACfhC,QAAAA,QAAAA,EAAUkD,MAAAA,CAAOlD,QAAAA;QACjBmD,SAAAA,EAAWD,MAAAA,CAAOC,WAAWzC,WAAAA,EAAAA;QAC7B0C,OAAAA,EAASF,MAAAA,CAAOE,SAAS1C,WAAAA;OAC3B,GACA2C,MAAAA;AACJC,MAAAA,KAAAA,EAAOJ,QAAQI,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQL,QAAQK,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAMzC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCgC,KAAAA,EAAO7C,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASoB,aAAAA;AAClB,EAAA;;;;EAKA,MAAasB,WAAAA,CAAYC,MAAcC,MAAAA,EAAuD;AAC5F,IAAA,MAAMX,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMjC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCgC,KAAAA,EAAO;AAAEU,MAAAA,IAAAA;AAAMC,MAAAA;AAAO,KAAA,EAAG,KAAKlE,OAAO,CAAA;AAExC,IAAA,OAAOsB,QAAAA,CAAS6C,oBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,aAAaV,MAAAA,EAIU;AAClC,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMjC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCgC,KAAAA,EAAO;AAAEG,MAAAA;AAAO,KAAA,EAAG,KAAK1D,OAAO,CAAA;AAElC,IAAA,OAAOsB,QAAAA,CAAS+C,qBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,SAASZ,MAAAA,EAA4F;AAChH,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;AAgBd,IAAA,MAAM7C,SAAAA,GAAY;AAChBgD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACExB,QAAAA,MAAAA,EAAQwB,MAAAA,CAAOxB,MAAAA;QACfyB,SAAAA,EAAWD,MAAAA,CAAOC,WAAWzC,WAAAA,EAAAA;QAC7B0C,OAAAA,EAASF,MAAAA,CAAOE,SAAS1C,WAAAA;OAC3B,GACA2C;AACN,KAAA;AAEA,IAAA,MAAMvC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCgC,KAAAA,EAAO7C,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASiD,iBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,WAAWC,eAAAA,EAA6C;AACnE,IAAA,MAAMhE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEgE,MAAAA;AAAgB,KAAA,EAAG,KAAKzE,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,oDAAA,EAAsD;AAChEsC,MAAAA,KAAAA,EAAO8B,eAAAA,CAAgB5C;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa6C,aAAAA,GAAkC;AAC7C,IAAA,MAAMjE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,KAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,UAAU,EAAC,EAAG,KAAKT,OAAO,CAAA;AAExDI,IAAAA,MAAAA,CAAOC,KAAK,wDAAA,CAAA;AAEZ,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAasE,oBAAoBF,eAAAA,EAA6C;AAC5E,IAAA,MAAMhE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEgE,MAAAA;AAAgB,KAAA,EAAG,KAAKzE,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,6CAAA,EAA+C;AACzDsC,MAAAA,KAAAA,EAAO8B,eAAAA,CAAgB5C;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa+C,0BAAAA,GAA+C;AAC1D,IAAA,MAAMnE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,KAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,UAAU,EAAC,EAAG,KAAKT,OAAO,CAAA;AAExDI,IAAAA,MAAAA,CAAOC,KAAK,sDAAA,CAAA;AAEZ,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKQF,EAAAA,iBAAAA,CAAkBD,KAAAA,EAAoC;AAC5D,IAAA,IAAI,CAACA,KAAAA,CAAMS,SAAAA,IAAc,CAACT,MAAMS,SAAAA,CAAUsB,KAAAA,IAAS,CAAC/B,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,IAAU,CAAChC,KAAAA,CAAMS,UAAUkE,WAAAA,EAAc;AAC3G,MAAA,MAAM,IAAI/C,gBAAgB,qDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMI,OAAAA,EAAS;AAClB,MAAA,MAAM,IAAIwB,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMW,IAAAA,IAAQX,KAAAA,CAAMW,KAAKe,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACjD,MAAA,MAAM,IAAIC,gBAAgB,+BAAA,CAAA;AAC5B,IAAA;AAGA,IAAA,IAAI5B,MAAMI,OAAAA,KAAO,OAAA,IAAkC,CAACJ,KAAAA,CAAMS,UAAUsB,KAAAA,EAAO;AACzE,MAAA,MAAM,IAAIH,gBAAgB,+CAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI5B,MAAMI,OAAAA,KAAO,KAAA,IAAgC,CAACJ,KAAAA,CAAMS,UAAUkE,WAAAA,EAAa;AAC7E,MAAA,MAAM,IAAI/C,gBAAgB,oDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI5B,KAAAA,CAAMI,OAAAA,KAAO,MAAA,IAAiC,CAACJ,KAAAA,CAAMS,UAAUmE,SAAAA,IAAa,CAAC5E,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,EAAQ;AACvG,MAAA,MAAM,IAAIJ,gBAAgB,6DAAA,CAAA;AAC5B,IAAA;AACF,EAAA;AACF;;;AC9oBO,IAAKjC,iBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAOL,IAAKF,oBAAAA,6BAAAA,oBAAAA,EAAAA;;;;;;;;AAAAA,EAAAA,OAAAA,oBAAAA;;AA4JL,IAAMoF,sBAAN,MAAMA;EA7Kb;;;;;AA8KE,EAAA,WAAA,CACUhF,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,KAAK+E,OAAAA,EAAiE;AAEjF,IAAA,IAAI,CAACA,QAAQC,KAAAA,IAASD,OAAAA,CAAQC,MAAMrD,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAIC,gBAAgB,gCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACkD,QAAQE,OAAAA,IAAWF,OAAAA,CAAQE,QAAQtD,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AAC3D,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACkD,OAAAA,CAAQG,OAAAA,IAAWH,OAAAA,CAAQG,OAAAA,CAAQtD,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,sCAAA,EAAwC;AAClD4E,MAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfG,MAAAA,SAAAA,EAAWJ,QAAQG,OAAAA,CAAQtD,MAAAA;AAC3BtB,MAAAA,IAAAA,EAAMyE,QAAQzE,IAAAA,IAAI;KACpB,CAAA;AAEA,IAAA,MAAME,QAAAA,GAAW;;;;;;;;;;;;AAajB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACL+E,QAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfC,QAAAA,OAAAA,EAASF,OAAAA,CAAQE,OAAAA;AACjB3E,QAAAA,IAAAA,EAAMyE,QAAQzE,IAAAA,IAAI,MAAA;AAClB4E,QAAAA,OAAAA,EAASH,OAAAA,CAAQG,OAAAA;AACjBE,QAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;AACpCC,QAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBrD,QAAAA,KAAAA,EAAO+C,QAAQ/C,KAAAA,IAAS,KAAA;AACxBsD,QAAAA,GAAAA,EAAKP,QAAQO,GAAAA,IAAO;AACtB;AACF,KAAA;AAEA,IAAA,MAAMjE,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,IAAA,MAAMwF,MAAAA,GAAS;AACbC,MAAAA,YAAAA,EAAcnE,SAASoE,kBAAAA,CAAmBD,YAAAA;AAC1CE,MAAAA,YAAAA,EAAcrE,SAASoE,kBAAAA,CAAmBC,YAAAA;AAC1CC,MAAAA,MAAAA,EAAQtE,SAASoE,kBAAAA,CAAmBE,MAAAA;AACpCnB,MAAAA,eAAAA,EAAiBnD,SAASoE,kBAAAA,CAAmBhD,aAAAA,CAAcG,IAAI,CAACC,CAAAA,KAAMA,EAAEP,EAAE;AAC5E,KAAA;AAEAnC,IAAAA,MAAAA,CAAOC,KAAK,mCAAA,EAAqC;AAC/CoF,MAAAA,YAAAA,EAAcD,MAAAA,CAAOC,YAAAA;AACrBE,MAAAA,YAAAA,EAAcH,MAAAA,CAAOG;KACvB,CAAA;AAEA,IAAA,OAAOH,MAAAA;AACT,EAAA;;;;AAKA,EAAA,MAAaK,UAAAA,CACX3D,MAAAA,EACA+C,KAAAA,EACAC,OAAAA,EACAF,OAAAA,EAC+B;AAC/B,IAAA,OAAO,KAAK/E,IAAAA,CAAK;AACfgF,MAAAA,KAAAA;AACAC,MAAAA,OAAAA;MACAC,OAAAA,EAAS;AAACjD,QAAAA;;MACV,GAAG8C;KACL,CAAA;AACF,EAAA;;;;AAKA,EAAA,MAAavB,iBAAiBuB,OAAAA,EAI3B;AACD5E,IAAAA,MAAAA,CAAO0F,MAAM,uCAAA,EAAyC;AAAE5D,MAAAA,MAAAA,EAAQ8C,OAAAA,CAAQ9C;KAAO,CAAA;AAE/E,IAAA,MAAMqB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCd,IAAA,MAAM7C,SAAAA,GAAY;AAChBwB,MAAAA,MAAAA,EAAQ8C,OAAAA,CAAQ9C,MAAAA;AAChBM,MAAAA,MAAAA,EAAQwC,OAAAA,CAAQxC,MAAAA;AAChBjC,MAAAA,IAAAA,EAAMyE,OAAAA,CAAQzE,IAAAA;AACd+E,MAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBS,MAAAA,MAAAA,EAAQf,OAAAA,CAAQe,MAAAA;AAChBjC,MAAAA,KAAAA,EAAOkB,QAAQlB,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQiB,QAAQjB,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAMzC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAMhCA,KAAAA,EAAO7C,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASmC,gBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAae,WAAWhD,cAAAA,EAA0C;AAChEpB,IAAAA,MAAAA,CAAO0F,MAAM,8CAAA,EAAgD;AAAEtE,MAAAA;KAAe,CAAA;AAE9E,IAAA,MAAMf,QAAAA,GAAW;;;;;;;;AASjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwD,KAAAA,CAAM9C,QAAAA,EAAU;AAAEe,MAAAA;AAAe,KAAA,EAAG,KAAKxB,OAAO,CAAA;AAElEI,IAAAA,MAAAA,CAAOC,KAAK,6CAAA,EAA+C;AAAEmB,MAAAA;KAAe,CAAA;AAE5E,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAawE,mBAAmBvB,eAAAA,EAA4C;AAC1ErE,IAAAA,MAAAA,CAAO0F,MAAM,wDAAA,EAA0D;AACrEnD,MAAAA,KAAAA,EAAO8B,eAAAA,CAAgB5C;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAU;AAAEgE,MAAAA;AAAgB,KAAA,EAAG,KAAKzE,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1DsC,MAAAA,KAAAA,EAAOrB,SAAS2E,uBAAAA,CAAwBtD;KAC1C,CAAA;AAEA,IAAA,OAAOrB,SAAS2E,uBAAAA,CAAwBtD,KAAAA;AAC1C,EAAA;;;;AAKA,EAAA,MAAa+B,aAAAA,GAAiC;AAC5CtE,IAAAA,MAAAA,CAAO0F,MAAM,mDAAA,CAAA;AAEb,IAAA,MAAMrF,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAU,EAAC,EAAG,IAAA,CAAKT,OAAO,CAAA;AAE7BI,IAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9DsC,MAAAA,KAAAA,EAAOrB,SAAS4E,4BAAAA,CAA6BvD;KAC/C,CAAA;AAEA,IAAA,OAAOrB,SAAS4E,4BAAAA,CAA6BvD,KAAAA;AAC/C,EAAA;;;;AAKA,EAAA,MAAawD,mBAAmB3E,cAAAA,EAA0C;AACxEpB,IAAAA,MAAAA,CAAO0F,MAAM,uCAAA,EAAyC;AAAEtE,MAAAA;KAAe,CAAA;AAEvE,IAAA,MAAMf,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwD,KAAAA,CAAM9C,QAAAA,EAAU;AAAEe,MAAAA;AAAe,KAAA,EAAG,KAAKxB,OAAO,CAAA;AAElEI,IAAAA,MAAAA,CAAOC,KAAK,sCAAA,EAAwC;AAAEmB,MAAAA;KAAe,CAAA;AAErE,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa4E,eAAe3B,eAAAA,EAA4C;AACtErE,IAAAA,MAAAA,CAAO0F,MAAM,iDAAA,EAAmD;AAC9DnD,MAAAA,KAAAA,EAAO8B,eAAAA,CAAgB5C;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAU;AAAEgE,MAAAA;AAAgB,KAAA,EAAG,KAAKzE,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,uCAAA,EAAyC;AACnDsC,MAAAA,KAAAA,EAAOrB,SAASqD,mBAAAA,CAAoBhC;KACtC,CAAA;AAEA,IAAA,OAAOrB,SAASqD,mBAAAA,CAAoBhC,KAAAA;AACtC,EAAA;;;;AAKA,EAAA,MAAa0D,eAAenE,MAAAA,EAAiC;AAC3D,IAAA,MAAMsD,MAAAA,GAAS,MAAM,IAAA,CAAK/B,gBAAAA,CAAiB;AACzCvB,MAAAA,MAAAA;MACAM,MAAAA,EAAQ,QAAA;MACRsB,KAAAA,EAAO;KACT,CAAA;AAEA,IAAA,OAAO0B,MAAAA,CAAOc,WAAAA;AAChB,EAAA;;;;;AAMA,EAAA,MAAaC,wBAAwBvB,OAAAA,EAAwE;AAE3G,IAAA,IAAI,CAACA,QAAQnE,IAAAA,IAAQmE,OAAAA,CAAQnE,KAAKe,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,IAAIC,gBAAgB,+BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACkD,OAAAA,CAAQrE,SAAAA,IAAa,CAACqE,QAAQwB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI1E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIkD,OAAAA,CAAQyB,iBAAiB,CAACzB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQtD,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1D+B,MAAAA,QAAAA,EAAU4C,OAAAA,CAAQ5C,QAAAA;AAClBsE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQwB,UAAAA,GAAaxB,OAAAA,CAAQwB,UAAAA,CAAW3E,MAAAA,GAAS,CAAA;AACjE4E,MAAAA,YAAAA,EAAczB,OAAAA,CAAQyB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB3B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQtD,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAU4C,OAAAA,CAAQ5C,QAAAA;AAClBD,QAAAA,SAAAA,EAAW6C,OAAAA,CAAQ7C,SAAAA;AACnBsE,QAAAA,YAAAA,EAAczB,QAAQyB,YAAAA,IAAgB,KAAA;QACtCtB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;QAC5B3B,YAAAA,EAAc;AACZ5C,UAAAA,OAAAA,EAASoE,QAAQpE,OAAAA,IAAW,EAAA;AAC5BC,UAAAA,IAAAA,EAAMmE,OAAAA,CAAQnE,IAAAA;AACdC,UAAAA,QAAAA,EAAUkE,QAAQlE,QAAAA,IAAY,EAAA;AAC9BR,UAAAA,OAAAA,EAAS0E,OAAAA,CAAQ5C,QAAAA;AACjB7B,UAAAA,IAAAA,EAAMyE,QAAQzE,IAAAA,IAAI,MAAA;AAClBI,UAAAA,SAAAA,EAAWqE,OAAAA,CAAQrE,SAAAA;AACnB2E,UAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBD,UAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;UACpCrE,QAAAA,EAAUgE,OAAAA,CAAQhE,YAAY,EAAC;AAC/BI,UAAAA,UAAAA,EAAY4D,QAAQ5D,UAAAA,IAAc,KAAA;AAClCC,UAAAA,WAAAA,EAAa2D,QAAQ3D,WAAAA,IAAe,KAAA;UACpCF,SAAAA,EAAW6D,OAAAA,CAAQ7D,WAAWD,WAAAA;AAChC;AACF;AACF,KAAA;AAGA,IAAA,IAAI8D,OAAAA,CAAQwB,UAAAA,IAAcxB,OAAAA,CAAQwB,UAAAA,CAAW3E,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM+E,OAAAA,GAAU,MAAMC,OAAAA,CAAQC,UAAAA,CAC5B9B,OAAAA,CAAQwB,UAAAA,CAAW3D,GAAAA,CAAI,CAAClC,SAAAA,KACtB,IAAA,CAAKZ,MAAAA,CAAOwD,KAAAA,CACV9C,QAAAA,EACA;QACEP,KAAAA,EAAO;AACL,UAAA,GAAGQ,SAAAA,CAAUR,KAAAA;UACbsD,YAAAA,EAAc;AACZ,YAAA,GAAG9C,UAAUR,KAAAA,CAAMsD,YAAAA;AACnB7C,YAAAA;AACF;AACF;OACF,EACA,IAAA,CAAKX,OAAO,CAAA,CAAA,CAAA;AAKlB,MAAA,IAAIyF,YAAAA,GAAe,CAAA;AACnB,MAAA,IAAIE,YAAAA,GAAe,CAAA;AACnB,MAAA,MAAMC,SAAmB,EAAA;AACzB,MAAA,MAAMnB,kBAA4B,EAAA;AAElCmC,MAAAA,OAAAA,CAAQG,OAAAA,CAAQ,CAACvB,MAAAA,EAAQwB,KAAAA,KAAAA;AACvB,QAAA,IAAIxB,MAAAA,CAAOhD,WAAW,WAAA,EAAa;AACjCiD,UAAAA,YAAAA,EAAAA;AACA,UAAA,MAAMnE,YAAWkE,MAAAA,CAAOyB,KAAAA;AACxBxC,UAAAA,eAAAA,CAAgByC,IAAAA,CAAK5F,SAAAA,CAAS6F,mBAAAA,CAAoB5E,EAAE,CAAA;QACtD,CAAA,MAAO;AACLoD,UAAAA,YAAAA,EAAAA;AACAC,UAAAA,MAAAA,CAAOsB,IAAAA,CACL,CAAA,UAAA,EAAaF,KAAAA,GAAQ,CAAA,CAAA,EAAA,EAAMxB,MAAAA,CAAO4B,MAAAA,YAAkBC,KAAAA,GAAQ7B,MAAAA,CAAO4B,MAAAA,CAAOlC,OAAAA,GAAU,eAAA,CAAA,CAAiB,CAAA;AAEzG,QAAA;MACF,CAAA,CAAA;AAEA,MAAA,MAAM5D,QAAAA,GAAiC;AACrCmE,QAAAA,YAAAA;AACAE,QAAAA,YAAAA;AACAC,QAAAA,MAAAA;AACAnB,QAAAA;AACF,OAAA;AAEArE,MAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9DoF,QAAAA,YAAAA;AACAE,QAAAA;OACF,CAAA;AAEA,MAAA,OAAOrE,QAAAA;IACT,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAAMA,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,QAAA,MAAMwF,MAAAA,GAA+B;UACnCC,YAAAA,EAAc,CAAA;UACdE,YAAAA,EAAc,CAAA;AACdC,UAAAA,MAAAA,EAAQ,EAAA;UACRnB,eAAAA,EAAiB;AAACnD,YAAAA,QAAAA,CAAS6F,mBAAAA,CAAoB5E;;AACjD,SAAA;AAEAnC,QAAAA,MAAAA,CAAOC,KAAK,2CAAA,EAA6C;AACvDmB,UAAAA,cAAAA,EAAgBF,SAAS6F,mBAAAA,CAAoB5E,EAAAA;AAC7CC,UAAAA,MAAAA,EAAQlB,SAAS6F,mBAAAA,CAAoB3E;SACvC,CAAA;AAEA,QAAA,OAAOgD,MAAAA;AACT,MAAA,CAAA,CAAA,OAAS8B,KAAAA,EAAO;AACdlH,QAAAA,MAAAA,CAAOkH,MAAM,qDAAA,EAAuD;AAAEA,UAAAA;SAAM,CAAA;AAE5E,QAAA,OAAO;UACL7B,YAAAA,EAAc,CAAA;UACdE,YAAAA,EAAc,CAAA;UACdC,MAAAA,EAAQ;YAAC0B,KAAAA,YAAiBD,KAAAA,GAAQC,MAAMpC,OAAAA,GAAU;;AAClDT,UAAAA,eAAAA,EAAiB;AACnB,SAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa8C,yBAAyBvC,OAAAA,EAAyE;AAE7G,IAAA,IAAI,CAACA,QAAQrD,YAAAA,IAAgBqD,OAAAA,CAAQrD,aAAaC,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrE,MAAA,MAAM,IAAIC,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACkD,OAAAA,CAAQtE,SAAAA,IAAa,OAAOsE,OAAAA,CAAQtE,cAAc,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAIoB,gBAAgB,iCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACkD,OAAAA,CAAQrE,SAAAA,IAAa,CAACqE,QAAQwB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI1E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIkD,OAAAA,CAAQyB,iBAAiB,CAACzB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQtD,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,+CAAA,EAAiD;AAC3DsB,MAAAA,YAAAA,EAAcqD,OAAAA,CAAQrD,YAAAA;AACtBS,MAAAA,QAAAA,EAAU4C,OAAAA,CAAQ5C,QAAAA;AAClBsE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQwB,UAAAA,GAAaxB,OAAAA,CAAQwB,UAAAA,CAAW3E,MAAAA,GAAS,CAAA;AACjE4E,MAAAA,YAAAA,EAAczB,OAAAA,CAAQyB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB3B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQtD,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAU4C,OAAAA,CAAQ5C,QAAAA;AAClBD,QAAAA,SAAAA,EAAW6C,OAAAA,CAAQ7C,SAAAA;AACnBsE,QAAAA,YAAAA,EAAczB,QAAQyB,YAAAA,IAAgB,KAAA;QACtCtB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;AAC5BxD,QAAAA,YAAAA,EAAcqD,OAAAA,CAAQrD,YAAAA;AACtBjB,QAAAA,SAAAA,EAAWsE,OAAAA,CAAQtE,SAAAA;AACnBC,QAAAA,SAAAA,EAAWqE,OAAAA,CAAQrE,SAAAA;AACnB6F,QAAAA,UAAAA,EAAYxB,OAAAA,CAAQwB,UAAAA;AACpBpF,QAAAA,UAAAA,EAAY4D,QAAQ5D,UAAAA,IAAc,KAAA;AAClCC,QAAAA,WAAAA,EAAa2D,QAAQ3D,WAAAA,IAAe,KAAA;QACpCF,SAAAA,EAAW6D,OAAAA,CAAQ7D,WAAWD,WAAAA,EAAAA;QAC9BD,YAAAA,EAAc+D,OAAAA,CAAQ/D,cAAcC,WAAAA,EAAAA;AACpCmB,QAAAA,QAAAA,EAAU2C,OAAAA,CAAQ3C;AACpB;AACF,KAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMf,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwD,MAEhC9C,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,MAAA,MAAMwF,MAAAA,GAA+B;QACnCC,YAAAA,EAAc,CAAA;QACdE,YAAAA,EAAc,CAAA;AACdC,QAAAA,MAAAA,EAAQ,EAAA;QACRnB,eAAAA,EAAiB;AAACnD,UAAAA,QAAAA,CAASgB,+BAAAA,CAAgCC;;AAC7D,OAAA;AAEAnC,MAAAA,MAAAA,CAAOC,KAAK,4CAAA,EAA8C;AACxDmB,QAAAA,cAAAA,EAAgBF,SAASgB,+BAAAA,CAAgCC,EAAAA;AACzDC,QAAAA,MAAAA,EAAQlB,SAASgB,+BAAAA,CAAgCE;OACnD,CAAA;AAEA,MAAA,OAAOgD,MAAAA;AACT,IAAA,CAAA,CAAA,OAAS8B,KAAAA,EAAO;AACdlH,MAAAA,MAAAA,CAAOkH,MAAM,sDAAA,EAAwD;AAAEA,QAAAA;OAAM,CAAA;AAE7E,MAAA,OAAO;QACL7B,YAAAA,EAAc,CAAA;QACdE,YAAAA,EAAc,CAAA;QACdC,MAAAA,EAAQ;UAAC0B,KAAAA,YAAiBD,KAAAA,GAAQC,MAAMpC,OAAAA,GAAU;;AAClDT,QAAAA,eAAAA,EAAiB;AACnB,OAAA;AACF,IAAA;AACF,EAAA;AACF","file":"chunk-I43B35CP.js","sourcesContent":["/**\n * Tenant-Backend Notifications Module\n * Comprehensive notification system supporting 10+ channels via tenant-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\n// ========================================\n// Enums\n// ========================================\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n PUSH = 'PUSH',\n IN_APP = 'IN_APP',\n WEBHOOK = 'WEBHOOK',\n WHATSAPP = 'WHATSAPP',\n TEAMS = 'TEAMS',\n SLACK = 'SLACK',\n TELEGRAM = 'TELEGRAM',\n DISCORD = 'DISCORD',\n}\n\nexport enum NotificationPriority {\n LOW = 'LOW',\n MEDIUM = 'MEDIUM',\n HIGH = 'HIGH',\n URGENT = 'URGENT',\n}\n\nexport enum NotificationType {\n TRANSACTIONAL = 'TRANSACTIONAL',\n MARKETING = 'MARKETING',\n SYSTEM = 'SYSTEM',\n ALERT = 'ALERT',\n}\n\n// ========================================\n// Types & Interfaces\n// ========================================\n\nexport interface RecipientInput {\n userId?: string;\n email?: string;\n phoneNumber?: string;\n pushToken?: string;\n whatsappNumber?: string;\n teamsUserId?: string;\n slackUserId?: string;\n webhookUrl?: string;\n name?: string;\n locale?: string;\n timezone?: string;\n}\n\nexport interface SendNotificationInput {\n recipient: RecipientInput;\n channel: NotificationChannel;\n type?: NotificationType;\n priority?: NotificationPriority;\n subject?: string;\n body: string;\n htmlBody?: string;\n data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n}\n\nexport interface SendWithTemplateInput {\n templateSlug: string;\n variables: Record<string, unknown>;\n recipient: RecipientInput;\n priority?: NotificationPriority;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n /** Specific channel instance ID from channel service (takes precedence) */\n channelId?: string;\n /** Platform type for auto-failover (EMAIL, SMS, etc.) - used if channelId not provided */\n platform?: NotificationChannel;\n /** Timezone for scheduling */\n timezone?: string;\n}\n\nexport interface BatchNotificationInput {\n notifications: SendNotificationInput[];\n batchSize?: number;\n delayBetweenBatches?: number;\n priority?: NotificationPriority;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n channel: NotificationChannel;\n type: NotificationType;\n priority: NotificationPriority;\n status: string;\n deliveryStatus?: string;\n title: string;\n message: string;\n htmlMessage?: string;\n subject?: string;\n recipientEmail?: string;\n recipientPhone?: string;\n trackOpens: boolean;\n trackClicks: boolean;\n openedAt?: string;\n clickedAt?: string;\n sentAt?: string;\n deliveredAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationTemplate {\n id: string;\n name: string;\n slug: string;\n description?: string;\n channel: NotificationChannel;\n type: NotificationType;\n locale: string;\n subject?: string;\n bodyTemplate: string;\n htmlTemplate?: string;\n variables: Array<{\n name: string;\n type: string;\n required: boolean;\n defaultValue?: unknown;\n description?: string;\n example?: unknown;\n }>;\n enabled: boolean;\n version: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationStats {\n total: number;\n pending: number;\n queued: number;\n processing: number;\n sent: number;\n delivered: number;\n failed: number;\n byChannel: Record<string, number>;\n byType: Record<string, number>;\n}\n\n// ========================================\n// Tenant Notifications Module\n// ========================================\n\n/**\n * Tenant-Backend Notifications Module\n * Provides access to the centralized notification system\n */\nexport class TenantNotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send a single notification\n */\n public async send(input: SendNotificationInput): Promise<string> {\n // Validate inputs\n this.validateSendInput(input);\n\n logger.info('[TenantNotifications] Sending notification', {\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation SendNotification($input: SendNotificationInput!) {\n sendNotification(input: $input)\n }\n `;\n\n const variables = {\n input: {\n recipient: input.recipient,\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n subject: input.subject,\n body: input.body,\n htmlBody: input.htmlBody,\n data: input.data,\n metadata: input.metadata,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendNotification: string;\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Notification sent', {\n notificationId: response.sendNotification,\n });\n\n return response.sendNotification;\n }\n\n /**\n * Send notification using a template\n */\n public async sendWithTemplate(input: SendWithTemplateInput): Promise<string> {\n // Validate inputs\n if (!input.templateSlug || input.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!input.variables || Object.keys(input.variables).length === 0) {\n throw new ValidationError('Template variables are required');\n }\n\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId)) {\n throw new ValidationError('Recipient email or userId is required');\n }\n\n logger.info('[TenantNotifications] Sending notification with template', {\n templateSlug: input.templateSlug,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n id\n status\n deliveryStatus\n }\n }\n `;\n\n const variables = {\n input: {\n templateSlug: input.templateSlug,\n variables: input.variables,\n recipient: input.recipient,\n priority: input.priority || NotificationPriority.MEDIUM,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n // Platform is required for notification delivery routing\n // If channelId is specified, it takes precedence; otherwise platform determines delivery\n channelId: input.channelId,\n platform: input.platform || NotificationChannel.EMAIL,\n timezone: input.timezone,\n },\n };\n\n const response = await this.client.tenantQuery<{\n triggerNotificationWithTemplate: { id: string; status: string; deliveryStatus?: string };\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Notification sent with template', {\n notificationId: response.triggerNotificationWithTemplate.id,\n status: response.triggerNotificationWithTemplate.status,\n });\n\n return response.triggerNotificationWithTemplate.id;\n }\n\n /**\n * Send batch notifications\n */\n public async sendBatch(input: BatchNotificationInput): Promise<{\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n }> {\n if (!input.notifications || input.notifications.length === 0) {\n throw new ValidationError('At least one notification is required');\n }\n\n logger.info('[TenantNotifications] Sending batch notifications', {\n count: input.notifications.length,\n batchSize: input.batchSize,\n });\n\n const mutation = `\n mutation SendBatchNotifications($input: BatchNotificationInput!) {\n sendBatchNotifications(input: $input) {\n totalRequested\n totalQueued\n totalFailed\n batchId\n }\n }\n `;\n\n const variables = {\n input: {\n notifications: input.notifications.map((n) => ({\n recipient: n.recipient,\n channel: n.channel,\n type: n.type || NotificationType.TRANSACTIONAL,\n priority: n.priority || NotificationPriority.MEDIUM,\n subject: n.subject,\n body: n.body,\n htmlBody: n.htmlBody,\n data: n.data,\n metadata: n.metadata,\n scheduledFor: n.scheduledFor?.toISOString(),\n expiresAt: n.expiresAt?.toISOString(),\n trackOpens: n.trackOpens,\n trackClicks: n.trackClicks,\n })),\n batchSize: input.batchSize,\n delayBetweenBatches: input.delayBetweenBatches,\n priority: input.priority,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendBatchNotifications: {\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n };\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Batch notifications sent', {\n batchId: response.sendBatchNotifications.batchId,\n queued: response.sendBatchNotifications.totalQueued,\n failed: response.sendBatchNotifications.totalFailed,\n });\n\n return response.sendBatchNotifications;\n }\n\n /**\n * Get a notification by ID\n */\n public async getNotification(id: string): Promise<Notification | null> {\n const query = `\n query GetNotification($id: ID!) {\n notification(id: $id) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n htmlMessage\n subject\n recipientEmail\n recipientPhone\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notification: Notification | null;\n }>(query, { id }, this.context);\n\n return response.notification;\n }\n\n /**\n * Get notifications with filters\n */\n public async getNotifications(filter?: {\n userId?: string;\n channel?: NotificationChannel;\n type?: NotificationType;\n status?: string;\n priority?: NotificationPriority;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n }): Promise<Notification[]> {\n const query = `\n query GetNotifications($filter: NotificationFilterInput, $limit: Int, $offset: Int) {\n notifications(filter: $filter, limit: $limit, offset: $offset) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n subject\n recipientEmail\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n channel: filter.channel,\n type: filter.type,\n status: filter.status,\n priority: filter.priority,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n limit: filter?.limit || 50,\n offset: filter?.offset || 0,\n };\n\n const response = await this.client.tenantQuery<{\n notifications: Notification[];\n }>(query, variables, this.context);\n\n return response.notifications;\n }\n\n /**\n * Get notification template\n */\n public async getTemplate(slug: string, locale?: string): Promise<NotificationTemplate | null> {\n const query = `\n query GetNotificationTemplate($slug: String!, $locale: String) {\n notificationTemplate(slug: $slug, locale: $locale) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplate: NotificationTemplate | null;\n }>(query, { slug, locale }, this.context);\n\n return response.notificationTemplate;\n }\n\n /**\n * Get all notification templates\n */\n public async getTemplates(filter?: {\n channel?: NotificationChannel;\n type?: NotificationType;\n enabled?: boolean;\n }): Promise<NotificationTemplate[]> {\n const query = `\n query GetNotificationTemplates($filter: TemplateFilterInput) {\n notificationTemplates(filter: $filter) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplates: NotificationTemplate[];\n }>(query, { filter }, this.context);\n\n return response.notificationTemplates;\n }\n\n /**\n * Get notification statistics\n */\n public async getStats(filter?: { userId?: string; startDate?: Date; endDate?: Date }): Promise<NotificationStats> {\n const query = `\n query GetNotificationStats($filter: NotificationFilterInput) {\n notificationStats(filter: $filter) {\n total\n pending\n queued\n processing\n sent\n delivered\n failed\n byChannel\n byType\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n };\n\n const response = await this.client.tenantQuery<{\n notificationStats: NotificationStats;\n }>(query, variables, this.context);\n\n return response.notificationStats;\n }\n\n /**\n * Mark notifications as read\n */\n public async markAsRead(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications marked as read', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<boolean> {\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All notifications marked as read');\n\n return true;\n }\n\n /**\n * Delete notifications\n */\n public async deleteNotifications(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications deleted', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Delete all read notifications for the current user\n */\n public async deleteAllReadNotifications(): Promise<boolean> {\n const mutation = `\n mutation DeleteMyReadNotifications {\n deleteMyReadNotifications\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All read notifications deleted');\n\n return true;\n }\n\n /**\n * Validate send notification input\n */\n private validateSendInput(input: SendNotificationInput): void {\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId && !input.recipient.phoneNumber)) {\n throw new ValidationError('Recipient email, userId, or phoneNumber is required');\n }\n\n if (!input.channel) {\n throw new ValidationError('Notification channel is required');\n }\n\n if (!input.body || input.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n // Channel-specific validation\n if (input.channel === NotificationChannel.EMAIL && !input.recipient.email) {\n throw new ValidationError('Recipient email is required for EMAIL channel');\n }\n\n if (input.channel === NotificationChannel.SMS && !input.recipient.phoneNumber) {\n throw new ValidationError('Recipient phone number is required for SMS channel');\n }\n\n if (input.channel === NotificationChannel.PUSH && !input.recipient.pushToken && !input.recipient.userId) {\n throw new ValidationError('Recipient push token or userId is required for PUSH channel');\n }\n }\n}\n","/**\n * Notifications Module\n * Send in-app, email, SMS, and push notifications via workspaces-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum NotificationType {\n INFO = 'info',\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n WHATSAPP = 'WHATSAPP',\n PUSH = 'PUSH',\n SLACK = 'SLACK',\n TEAMS = 'TEAMS',\n WEBHOOK = 'WEBHOOK',\n}\n\n// Re-export from tenant-notifications\nexport { NotificationPriority, TenantNotificationsModule } from './tenant-notifications.js';\n\nexport interface SendNotificationOptions {\n /** Notification title */\n title: string;\n /** Notification message */\n message: string;\n /** Notification type */\n type?: NotificationType;\n /** Target user IDs */\n userIds: string[];\n /** Optional redirect URL */\n redirectUrl?: string;\n /** Application name */\n appName?: string;\n /** Send email notification */\n email?: boolean;\n /** Send SMS notification */\n sms?: boolean;\n}\n\nexport interface NotificationResponse {\n /** Number of successful notifications */\n successCount: number;\n /** Number of failed notifications */\n failureCount: number;\n /** Error messages if any */\n errors: string[];\n /** Created notification IDs */\n notificationIds?: string[];\n}\n\nexport interface GetNotificationsOptions {\n /** User ID to get notifications for */\n userId: string;\n /** Filter by status */\n status?: 'unread' | 'read' | 'all';\n /** Filter by type */\n type?: NotificationType;\n /** Filter by app name */\n appName?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n title: string;\n message: string;\n type: NotificationType;\n status: 'unread' | 'read';\n redirectUrl?: string;\n appName?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface RecipientInput {\n email?: string;\n locale?: string;\n name?: string;\n phoneNumber?: string;\n pushToken?: string;\n slackUserId?: string;\n teamsUserId?: string;\n timezone?: string;\n userId?: string;\n webhookUrl?: string;\n whatsappNumber?: string;\n}\n\nexport interface SendChannelNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Recipient information for primary channel */\n recipient: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Notification subject (for EMAIL) */\n subject?: string;\n /** Notification body/message */\n body: string;\n /** HTML body (for EMAIL) */\n htmlBody?: string;\n /** Notification type */\n type?: NotificationType;\n /** Application name */\n appName?: string;\n /** Redirect URL */\n redirectUrl?: string;\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\nexport interface SendTemplateNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Template slug to use */\n templateSlug: string;\n /** Template variables */\n variables: Record<string, unknown>;\n /** Recipient information for primary channel */\n recipient?: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Application name */\n appName?: string;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Scheduled delivery time */\n scheduledFor?: Date;\n /** Timezone for scheduling */\n timezone?: string;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\n/**\n * Notifications Module\n */\nexport class NotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send notification to users\n */\n public async send(options: SendNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.title || options.title.trim().length === 0) {\n throw new ValidationError('Notification title is required');\n }\n\n if (!options.message || options.message.trim().length === 0) {\n throw new ValidationError('Notification message is required');\n }\n\n if (!options.userIds || options.userIds.length === 0) {\n throw new ValidationError('At least one user ID is required');\n }\n\n logger.info('[Notifications] Sending notification', {\n title: options.title,\n userCount: options.userIds.length,\n type: options.type || NotificationType.INFO,\n });\n\n const mutation = `\n mutation CreateNotification($input: CreateNotificationInput!) {\n createNotification(input: $input) {\n successCount\n failureCount\n errors\n notifications {\n id\n }\n }\n }\n `;\n\n const variables = {\n input: {\n title: options.title,\n message: options.message,\n type: options.type || NotificationType.INFO,\n userIds: options.userIds,\n redirectUrl: options.redirectUrl || '',\n appName: options.appName,\n email: options.email || false,\n sms: options.sms || false,\n },\n };\n\n const response = await this.client.query<{\n createNotification: NotificationResponse & { notifications: Array<{ id: string }> };\n }>(mutation, variables, this.context);\n\n const result = {\n successCount: response.createNotification.successCount,\n failureCount: response.createNotification.failureCount,\n errors: response.createNotification.errors,\n notificationIds: response.createNotification.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Notification sent', {\n successCount: result.successCount,\n failureCount: result.failureCount,\n });\n\n return result;\n }\n\n /**\n * Send notification to a single user (convenience method)\n */\n public async sendToUser(\n userId: string,\n title: string,\n message: string,\n options?: Omit<SendNotificationOptions, 'userIds' | 'title' | 'message'>\n ): Promise<NotificationResponse> {\n return this.send({\n title,\n message,\n userIds: [userId],\n ...options,\n });\n }\n\n /**\n * Get notifications for a user\n */\n public async getNotifications(options: GetNotificationsOptions): Promise<{\n notifications: Notification[];\n total: number;\n unreadCount: number;\n }> {\n logger.debug('[Notifications] Getting notifications', { userId: options.userId });\n\n const query = `\n query GetNotifications(\n $userId: ID!\n $status: NotificationStatus\n $type: NotificationType\n $appName: String\n $search: String\n $limit: Int\n $offset: Int\n ) {\n getNotifications(\n userId: $userId\n status: $status\n type: $type\n appName: $appName\n search: $search\n limit: $limit\n offset: $offset\n ) {\n notifications {\n id\n userId\n title\n message\n type\n status\n redirectUrl\n appName\n createdAt\n updatedAt\n }\n total\n unreadCount\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n status: options.status,\n type: options.type,\n appName: options.appName,\n search: options.search,\n limit: options.limit || 20,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getNotifications: {\n notifications: Notification[];\n total: number;\n unreadCount: number;\n };\n }>(query, variables, this.context);\n\n return response.getNotifications;\n }\n\n /**\n * Mark notification as read\n */\n public async markAsRead(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Marking notification as read', { notificationId });\n\n const mutation = `\n mutation MarkNotificationAsRead($notificationId: ID!) {\n markNotificationAsRead(notificationId: $notificationId) {\n id\n status\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification marked as read', { notificationId });\n\n return true;\n }\n\n /**\n * Mark multiple notifications as read\n */\n public async markMultipleAsRead(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Marking multiple notifications as read', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markNotificationsAsRead: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications marked as read', {\n count: response.markNotificationsAsRead.count,\n });\n\n return response.markNotificationsAsRead.count;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<number> {\n logger.debug('[Notifications] Marking all notifications as read');\n\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markAllMyNotificationsAsRead: { count: number };\n }>(mutation, {}, this.context);\n\n logger.info('[Notifications] All notifications marked as read', {\n count: response.markAllMyNotificationsAsRead.count,\n });\n\n return response.markAllMyNotificationsAsRead.count;\n }\n\n /**\n * Delete notification\n */\n public async deleteNotification(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Deleting notification', { notificationId });\n\n const mutation = `\n mutation DeleteNotification($notificationId: ID!) {\n deleteNotification(notificationId: $notificationId) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification deleted', { notificationId });\n\n return true;\n }\n\n /**\n * Delete multiple notifications\n */\n public async deleteMultiple(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Deleting multiple notifications', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n deleteNotifications: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications deleted', {\n count: response.deleteNotifications.count,\n });\n\n return response.deleteNotifications.count;\n }\n\n /**\n * Get unread notification count for a user\n */\n public async getUnreadCount(userId: string): Promise<number> {\n const result = await this.getNotifications({\n userId,\n status: 'unread',\n limit: 0,\n });\n\n return result.unreadCount;\n }\n\n /**\n * Send notification via specific channel (EMAIL, SMS, WHATSAPP, etc.)\n * with optional in-app notification\n */\n public async sendChannelNotification(options: SendChannelNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.body || options.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending channel notification', {\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotification($input: TriggerNotificationInput!) {\n triggerNotification(input: $input) {\n id\n status\n deliveryStatus\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n notification: {\n subject: options.subject || '',\n body: options.body,\n htmlBody: options.htmlBody || '',\n channel: options.platform,\n type: options.type || NotificationType.INFO,\n recipient: options.recipient,\n appName: options.appName,\n redirectUrl: options.redirectUrl || '',\n metadata: options.metadata || {},\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n },\n },\n };\n\n // Handle bulk recipients\n if (options.recipients && options.recipients.length > 1) {\n const results = await Promise.allSettled(\n options.recipients.map((recipient) =>\n this.client.query(\n mutation,\n {\n input: {\n ...variables.input,\n notification: {\n ...variables.input.notification,\n recipient,\n },\n },\n },\n this.context\n )\n )\n );\n\n let successCount = 0;\n let failureCount = 0;\n const errors: string[] = [];\n const notificationIds: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n successCount++;\n const response = result.value as { triggerNotification: { id: string } };\n notificationIds.push(response.triggerNotification.id);\n } else {\n failureCount++;\n errors.push(\n `Recipient ${index + 1}: ${result.reason instanceof Error ? result.reason.message : 'Unknown error'}`\n );\n }\n });\n\n const response: NotificationResponse = {\n successCount,\n failureCount,\n errors,\n notificationIds,\n };\n\n logger.info('[Notifications] Channel notification sent (bulk)', {\n successCount,\n failureCount,\n });\n\n return response;\n } else {\n // Single recipient\n try {\n const response = await this.client.query<{\n triggerNotification: { id: string; status: string; deliveryStatus: string };\n }>(mutation, variables, this.context);\n\n const result: NotificationResponse = {\n successCount: 1,\n failureCount: 0,\n errors: [],\n notificationIds: [response.triggerNotification.id],\n };\n\n logger.info('[Notifications] Channel notification sent', {\n notificationId: response.triggerNotification.id,\n status: response.triggerNotification.status,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send channel notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n }\n\n /**\n * Send notification using a template with optional in-app notification\n */\n public async sendTemplateNotification(options: SendTemplateNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.templateSlug || options.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!options.variables || typeof options.variables !== 'object') {\n throw new ValidationError('Template variables are required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending template notification', {\n templateSlug: options.templateSlug,\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n id\n status\n deliveryStatus\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n templateSlug: options.templateSlug,\n variables: options.variables,\n recipient: options.recipient,\n recipients: options.recipients,\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n scheduledFor: options.scheduledFor?.toISOString(),\n timezone: options.timezone,\n },\n };\n\n try {\n const response = await this.client.query<{\n triggerNotificationWithTemplate: { id: string; status: string; deliveryStatus: string };\n }>(mutation, variables, this.context);\n\n const result: NotificationResponse = {\n successCount: 1,\n failureCount: 0,\n errors: [],\n notificationIds: [response.triggerNotificationWithTemplate.id],\n };\n\n logger.info('[Notifications] Template notification sent', {\n notificationId: response.triggerNotificationWithTemplate.id,\n status: response.triggerNotificationWithTemplate.status,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send template notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n}\n"]}