@burdenoff/be-sdk 2026.618.1 → 2026.622.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.d.ts +3 -2
- package/dist/auth/index.js +2 -2
- package/dist/{chunk-N7UJFZQH.js → chunk-3H4TRD6E.js} +5 -46
- package/dist/chunk-3H4TRD6E.js.map +1 -0
- package/dist/{chunk-XNQUN3AE.js → chunk-4OQRBSHM.js} +3 -3
- package/dist/{chunk-XNQUN3AE.js.map → chunk-4OQRBSHM.js.map} +1 -1
- package/dist/{chunk-FTDQ6NY5.js → chunk-6NB7P6SR.js} +3 -3
- package/dist/{chunk-FTDQ6NY5.js.map → chunk-6NB7P6SR.js.map} +1 -1
- package/dist/{chunk-SMGTXYFR.js → chunk-EZ4PKRUK.js} +2 -2
- package/dist/chunk-EZ4PKRUK.js.map +1 -0
- package/dist/{chunk-ZHQUXD6S.js → chunk-IUL5TEKE.js} +3 -3
- package/dist/{chunk-ZHQUXD6S.js.map → chunk-IUL5TEKE.js.map} +1 -1
- package/dist/{chunk-FKSMQLIV.js → chunk-SS4XWRYR.js} +3 -3
- package/dist/{chunk-FKSMQLIV.js.map → chunk-SS4XWRYR.js.map} +1 -1
- package/dist/{chunk-ZPEDC5V3.js → chunk-TYXGWVRL.js} +5 -5
- package/dist/{chunk-ZPEDC5V3.js.map → chunk-TYXGWVRL.js.map} +1 -1
- package/dist/chunk-VFCMR5GX.js +49 -0
- package/dist/chunk-VFCMR5GX.js.map +1 -0
- package/dist/{chunk-X7QMT2P6.js → chunk-WD2TUTAS.js} +3 -3
- package/dist/{chunk-X7QMT2P6.js.map → chunk-WD2TUTAS.js.map} +1 -1
- package/dist/{chunk-5FEOFBQ4.js → chunk-Y7GCABRS.js} +3 -3
- package/dist/{chunk-5FEOFBQ4.js.map → chunk-Y7GCABRS.js.map} +1 -1
- package/dist/{chunk-HRCWJLCZ.js → chunk-YEA4BZOL.js} +8 -4
- package/dist/chunk-YEA4BZOL.js.map +1 -0
- package/dist/{chunk-XR3KUHJ5.js → chunk-Z2423JIB.js} +3 -3
- package/dist/{chunk-XR3KUHJ5.js.map → chunk-Z2423JIB.js.map} +1 -1
- package/dist/database/index.js +2 -2
- package/dist/event-queue/index.d.ts +3 -3
- package/dist/export/index.js +3 -2
- package/dist/feature-flags/index.d.ts +1 -1
- package/dist/feature-flags/index.js +2 -1
- package/dist/gateway/index.d.ts +1 -1
- package/dist/gateway/index.js +2 -1
- package/dist/graph/index.d.ts +4 -3
- package/dist/graph/index.js +2 -2
- package/dist/{graphql-CNhiZ89U.d.ts → graphql-BRj5KPOL.d.ts} +3 -2
- package/dist/{index-DraeealK.d.ts → index-1qCbBvKE.d.ts} +2 -2
- package/dist/{index-D7BJuXP3.d.ts → index-B3ECnOLp.d.ts} +2 -2
- package/dist/{index-CVFEyBvK.d.ts → index-BIhZJ1w7.d.ts} +1 -1
- package/dist/{index-DYQF_AIz.d.ts → index-BN_-AWdb.d.ts} +2 -2
- package/dist/{index-jOuh_TKn.d.ts → index-BdPnlJ8_.d.ts} +2 -0
- package/dist/{index-BKjt3X8L.d.ts → index-Bm6MYdqS.d.ts} +5 -2
- package/dist/{index-B-w7NWpD.d.ts → index-CNy4MwKc.d.ts} +1 -1
- package/dist/{index-D9RN6jp1.d.ts → index-DDCOGyYh.d.ts} +4 -0
- package/dist/{index-DohlGQGw.d.ts → index-DsBZRR82.d.ts} +3 -3
- package/dist/index.d.ts +15 -15
- package/dist/index.js +111 -30
- package/dist/index.js.map +1 -1
- package/dist/init/index.js +3 -2
- package/dist/instrumentation/index.d.ts +4 -3
- package/dist/logger/index.d.ts +3 -2
- package/dist/notifications/index.d.ts +4 -3
- package/dist/notifications/index.js +2 -2
- package/dist/rbac/index.d.ts +2 -2
- package/dist/rbac/index.js +2 -2
- package/dist/resource-caps/index.d.ts +3 -2
- package/dist/telemetry/index.d.ts +5 -4
- package/dist/tracker/index.d.ts +5 -4
- package/dist/tracker/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-HRCWJLCZ.js.map +0 -1
- package/dist/chunk-N7UJFZQH.js.map +0 -1
- package/dist/chunk-SMGTXYFR.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts"],"names":["SDKError","Error","message","code","details","name","Object","setPrototypeOf","prototype","PermissionDeniedError","AuthenticationError","APIError","ValidationError","QuotaExceededError","NetworkError","TimeoutError"],"mappings":"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","file":"chunk-EZ4PKRUK.js","sourcesContent":["/**\n * Core type definitions for Burdenoff Backend SDK\n */\n\nimport type { ServiceLayer } from './layer.js';\n\n/**\n * SDK Configuration\n */\nexport interface SDKConfig {\n /** Workspaces API GraphQL endpoint (should point to wspace-int-gateway for M2M calls) */\n workspacesApiUrl: string;\n /**\n * Tenant API GraphQL endpoint for cross-layer (wspace → global) M2M calls.\n * Cross-layer traffic must go through the **public** global gateway\n * (`GLOBAL_PUBLIC_GATEWAY_URL`), not the internal gateway — ACA internal\n * ingress is environment-scoped and does not route across the wspace/global\n * environment boundary.\n */\n tenantApiUrl?: string;\n /**\n * Calling service's layer (`wspace` | `global`). Used to construct the\n * cross-layer GatewayClient. Defaults to the `SERVICE_LAYER` env var, then\n * `wspace`.\n */\n serviceLayer?: ServiceLayer;\n /**\n * Calling service name. Used as the cross-layer GatewayClient service identity\n * and the `sub` of the minted service JWT. Defaults to the `SERVICE_NAME` env\n * var, then `burdenoff-be-sdk`.\n */\n serviceName?: string;\n /** Default timeout for API requests in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Logger configuration */\n logger?: LoggerConfig;\n /** Event queue configuration (Redis Streams). Reads `REDIS_URL` when present. */\n eventQueue?: EventQueueSDKConfig;\n /** Temporal module type (workspace or tenant) */\n temporalModuleType?: 'workspace' | 'tenant';\n /** Temporal server address */\n temporalAddress?: string;\n /** Temporal namespace */\n temporalNamespace?: string;\n /** Temporal task queue */\n temporalTaskQueue?: string;\n /** Auto-connect to Temporal (default: true) */\n temporalAutoConnect?: boolean;\n}\n\n/**\n * Retry configuration for API requests\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxAttempts: number;\n /** Initial retry delay in milliseconds */\n initialDelay: number;\n /** Maximum retry delay in milliseconds */\n maxDelay: number;\n /** Backoff multiplier */\n backoffMultiplier: number;\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Log level */\n level: 'debug' | 'info' | 'warn' | 'error';\n /** Enable console output */\n console: boolean;\n /** Custom logger transport */\n transport?: LoggerTransport;\n}\n\n/**\n * Custom logger transport interface\n */\nexport interface LoggerTransport {\n log(level: string, message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Actor type for RBAC authorization\n * - user: Direct user request (via frontend)\n * - app: OAuth app acting on behalf of user\n * - service: M2M service-to-service communication\n * - super_admin: Platform administration (bypasses all checks)\n */\nexport type ActorType = 'user' | 'app' | 'service' | 'super_admin';\n\n/**\n * Request context passed with every SDK operation\n */\nexport interface SDKContext {\n /** Actor ID - identifies the entity making the request */\n actorId?: string;\n /** Actor type - determines authorization behavior */\n actorType?: ActorType;\n /** Workspace ID */\n workspaceId?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Project ID */\n projectId?: string;\n /** App ID */\n appId?: string;\n /** JWT token for authentication */\n token?: string;\n /** Product ID */\n productId?: string;\n /**\n * Cloudflare Access service-token client id, captured from the inbound\n * `cf-access-client-id` header. Re-presented on cross-layer outbound calls so\n * the peer layer's CF-Access-gated public gateway admits the request.\n */\n cfAccessClientId?: string;\n /**\n * Cloudflare Access service-token client secret, from `cf-access-client-secret`.\n * Sensitive — redacted by the SDK logger's secret pattern; never log directly.\n */\n cfAccessClientSecret?: string;\n /** Additional custom context */\n [key: string]: unknown;\n}\n\n/**\n * SDK Error base class\n */\nexport class SDKError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'SDKError';\n Object.setPrototypeOf(this, SDKError.prototype);\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'PERMISSION_DENIED', details);\n this.name = 'PermissionDeniedError';\n Object.setPrototypeOf(this, PermissionDeniedError.prototype);\n }\n}\n\n/**\n * Authentication error\n */\nexport class AuthenticationError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'AUTHENTICATION_ERROR', details);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * API error from backend\n */\nexport class APIError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'API_ERROR', details);\n this.name = 'APIError';\n Object.setPrototypeOf(this, APIError.prototype);\n }\n}\n\n/**\n * Validation error\n */\nexport class ValidationError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Quota exceeded error\n */\nexport class QuotaExceededError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'QUOTA_EXCEEDED', details);\n this.name = 'QuotaExceededError';\n Object.setPrototypeOf(this, QuotaExceededError.prototype);\n }\n}\n\n/**\n * Network error\n */\nexport class NetworkError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'NETWORK_ERROR', details);\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'TIMEOUT_ERROR', details);\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\n/**\n * Event queue SDK configuration (Redis Streams backend).\n *\n * The publisher is created via `createPublisher()` from\n * `@burdenoff/be-sdk/event-queue` and reads `REDIS_URL` from the env.\n * The fields here are for client-name + reconnect tuning only.\n */\nexport interface EventQueueSDKConfig {\n /** Redis Streams server URL. Overrides `REDIS_URL` env if set. */\n url?: string;\n /** Optional password for TLS/auth */\n password?: string;\n /** Maximum reconnect attempts (default: -1 = infinite) */\n maxReconnectAttempts?: number;\n /** Reconnect time wait in milliseconds (default: 2000) */\n reconnectTimeWait?: number;\n /** Client name for logging (default: service name) */\n name?: string;\n /** Auto-connect on SDK initialization (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * Event queue health status\n */\nexport interface EventQueueHealthStatus {\n status: 'healthy' | 'unhealthy' | 'not_configured';\n connected: boolean;\n url?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Temporal health status\n */\nexport interface TemporalHealthStatus {\n status: 'healthy' | 'unhealthy' | 'not_configured';\n connected: boolean;\n address?: string;\n namespace?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Overall SDK health status\n */\nexport interface SDKHealthStatus {\n eventQueue: EventQueueHealthStatus;\n temporal: TemporalHealthStatus;\n}\n\n/**\n * SDK shutdown options\n */\nexport interface SDKShutdownOptions {\n /** Shutdown timeout in milliseconds (default: 5000) */\n timeout?: number;\n /** Force shutdown even if timeout is exceeded (default: true) */\n force?: boolean;\n}\n\n// ============================================================================\n// Layer Types Export\n// ============================================================================\n\n/**\n * Re-export all layer-related types for convenience\n */\nexport type {\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n CircuitBreakerConfig,\n GatewayRetryConfig,\n GatewayRequestHeaders,\n} from './layer.js';\n\nexport {\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n} from './layer.js';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ValidationError } from './chunk-
|
|
1
|
+
import { ValidationError } from './chunk-EZ4PKRUK.js';
|
|
2
2
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
3
3
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
4
4
|
|
|
@@ -927,5 +927,5 @@ var NotificationsModule = class {
|
|
|
927
927
|
};
|
|
928
928
|
|
|
929
929
|
export { NotificationChannel2 as NotificationChannel, NotificationPriority, NotificationType2 as NotificationType, NotificationsModule, TenantNotificationsModule, tenant_notifications_exports };
|
|
930
|
-
//# sourceMappingURL=chunk-
|
|
931
|
-
//# sourceMappingURL=chunk-
|
|
930
|
+
//# sourceMappingURL=chunk-IUL5TEKE.js.map
|
|
931
|
+
//# sourceMappingURL=chunk-IUL5TEKE.js.map
|
|
@@ -1 +1 @@
|
|
|
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","result","triggerNotificationWithTemplate","firstNotification","notifications","totalTriggered","totalRequested","totalFailed","id","status","sendBatch","count","batchSize","map","n","delayBetweenBatches","batchId","sendBatchNotifications","queued","totalQueued","failed","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","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":"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","file":"chunk-ZHQUXD6S.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 totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\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: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const result = response.triggerNotificationWithTemplate;\n const firstNotification = result.notifications[0];\n\n if (result.totalTriggered === 0 || !firstNotification) {\n throw new ValidationError(\n `Notification trigger failed: requested=${result.totalRequested}, triggered=${result.totalTriggered}, failed=${result.totalFailed}`\n );\n }\n\n logger.info('[TenantNotifications] Notification sent with template', {\n notificationId: firstNotification.id,\n status: firstNotification.status,\n totalTriggered: result.totalTriggered,\n totalFailed: result.totalFailed,\n });\n\n return firstNotification.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 totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\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: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const data = response.triggerNotificationWithTemplate;\n\n const result: NotificationResponse = {\n successCount: data.totalTriggered,\n failureCount: data.totalFailed,\n errors: [],\n notificationIds: data.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Template notification sent', {\n templateSlug: options.templateSlug,\n totalTriggered: data.totalTriggered,\n totalFailed: data.totalFailed,\n notificationIds: result.notificationIds,\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"]}
|
|
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","result","triggerNotificationWithTemplate","firstNotification","notifications","totalTriggered","totalRequested","totalFailed","id","status","sendBatch","count","batchSize","map","n","delayBetweenBatches","batchId","sendBatchNotifications","queued","totalQueued","failed","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","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;;;;;;;;;;;;;;AAejB,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,YAOhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,IAAA,MAAMsC,SAAShB,QAAAA,CAASiB,+BAAAA;AACxB,IAAA,MAAMC,iBAAAA,GAAoBF,MAAAA,CAAOG,aAAAA,CAAc,CAAA,CAAA;AAE/C,IAAA,IAAIH,MAAAA,CAAOI,cAAAA,KAAmB,CAAA,IAAK,CAACF,iBAAAA,EAAmB;AACrD,MAAA,MAAM,IAAIV,eAAAA,CACR,CAAA,uCAAA,EAA0CQ,MAAAA,CAAOK,cAAc,CAAA,YAAA,EAAeL,MAAAA,CAAOI,cAAc,CAAA,SAAA,EAAYJ,MAAAA,CAAOM,WAAW,CAAA,CAAE,CAAA;AAEvI,IAAA;AAEAxC,IAAAA,MAAAA,CAAOC,KAAK,uDAAA,EAAyD;AACnEmB,MAAAA,cAAAA,EAAgBgB,iBAAAA,CAAkBK,EAAAA;AAClCC,MAAAA,MAAAA,EAAQN,iBAAAA,CAAkBM,MAAAA;AAC1BJ,MAAAA,cAAAA,EAAgBJ,MAAAA,CAAOI,cAAAA;AACvBE,MAAAA,WAAAA,EAAaN,MAAAA,CAAOM;KACtB,CAAA;AAEA,IAAA,OAAOJ,iBAAAA,CAAkBK,EAAAA;AAC3B,EAAA;;;;AAKA,EAAA,MAAaE,UAAU7C,KAAAA,EAKpB;AACD,IAAA,IAAI,CAACA,KAAAA,CAAMuC,aAAAA,IAAiBvC,KAAAA,CAAMuC,aAAAA,CAAcZ,WAAW,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAIC,gBAAgB,uCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,mDAAA,EAAqD;AAC/D2C,MAAAA,KAAAA,EAAO9C,MAAMuC,aAAAA,CAAcZ,MAAAA;AAC3BoB,MAAAA,SAAAA,EAAW/C,KAAAA,CAAM+C;KACnB,CAAA;AAEA,IAAA,MAAMxC,QAAAA,GAAW;;;;;;;;;;AAWjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLuC,QAAAA,aAAAA,EAAevC,KAAAA,CAAMuC,aAAAA,CAAcS,GAAAA,CAAI,CAACC,CAAAA,MAAO;AAC7CxC,UAAAA,SAAAA,EAAWwC,CAAAA,CAAExC,SAAAA;AACbL,UAAAA,OAAAA,EAAS6C,CAAAA,CAAE7C,OAAAA;AACXC,UAAAA,IAAAA,EAAM4C,EAAE5C,IAAAA,IAAI,eAAA;AACZC,UAAAA,QAAAA,EAAU2C,EAAE3C,QAAAA,IAAQ,QAAA;AACpBI,UAAAA,OAAAA,EAASuC,CAAAA,CAAEvC,OAAAA;AACXC,UAAAA,IAAAA,EAAMsC,CAAAA,CAAEtC,IAAAA;AACRC,UAAAA,QAAAA,EAAUqC,CAAAA,CAAErC,QAAAA;AACZC,UAAAA,IAAAA,EAAMoC,CAAAA,CAAEpC,IAAAA;AACRC,UAAAA,QAAAA,EAAUmC,CAAAA,CAAEnC,QAAAA;UACZC,YAAAA,EAAckC,CAAAA,CAAElC,cAAcC,WAAAA,EAAAA;UAC9BC,SAAAA,EAAWgC,CAAAA,CAAEhC,WAAWD,WAAAA,EAAAA;AACxBE,UAAAA,UAAAA,EAAY+B,CAAAA,CAAE/B,UAAAA;AACdC,UAAAA,WAAAA,EAAa8B,CAAAA,CAAE9B;SACjB,CAAA,CAAA;AACA4B,QAAAA,SAAAA,EAAW/C,KAAAA,CAAM+C,SAAAA;AACjBG,QAAAA,mBAAAA,EAAqBlD,KAAAA,CAAMkD,mBAAAA;AAC3B5C,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;AAC5DgD,MAAAA,OAAAA,EAAS/B,SAASgC,sBAAAA,CAAuBD,OAAAA;AACzCE,MAAAA,MAAAA,EAAQjC,SAASgC,sBAAAA,CAAuBE,WAAAA;AACxCC,MAAAA,MAAAA,EAAQnC,SAASgC,sBAAAA,CAAuBV;KAC1C,CAAA;AAEA,IAAA,OAAOtB,QAAAA,CAASgC,sBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaI,gBAAgBb,EAAAA,EAA0C;AACrE,IAAA,MAAMc,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4Bd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEd,MAAAA;AAAG,KAAA,EAAG,KAAK7C,OAAO,CAAA;AAE9B,IAAA,OAAOsB,QAAAA,CAASsC,YAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,iBAAiBC,MAAAA,EAUF;AAC1B,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0Bd,IAAA,MAAMjD,SAAAA,GAAY;AAChBoD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACE5B,QAAAA,MAAAA,EAAQ4B,MAAAA,CAAO5B,MAAAA;AACf5B,QAAAA,OAAAA,EAASwD,MAAAA,CAAOxD,OAAAA;AAChBC,QAAAA,IAAAA,EAAMuD,MAAAA,CAAOvD,IAAAA;AACbuC,QAAAA,MAAAA,EAAQgB,MAAAA,CAAOhB,MAAAA;AACftC,QAAAA,QAAAA,EAAUsD,MAAAA,CAAOtD,QAAAA;QACjBuD,SAAAA,EAAWD,MAAAA,CAAOC,WAAW7C,WAAAA,EAAAA;QAC7B8C,OAAAA,EAASF,MAAAA,CAAOE,SAAS9C,WAAAA;OAC3B,GACA+C,MAAAA;AACJC,MAAAA,KAAAA,EAAOJ,QAAQI,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQL,QAAQK,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAM7C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASmB,aAAAA;AAClB,EAAA;;;;EAKA,MAAa2B,WAAAA,CAAYC,MAAcC,MAAAA,EAAuD;AAC5F,IAAA,MAAMX,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEU,MAAAA,IAAAA;AAAMC,MAAAA;AAAO,KAAA,EAAG,KAAKtE,OAAO,CAAA;AAExC,IAAA,OAAOsB,QAAAA,CAASiD,oBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,aAAaV,MAAAA,EAIU;AAClC,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEG,MAAAA;AAAO,KAAA,EAAG,KAAK9D,OAAO,CAAA;AAElC,IAAA,OAAOsB,QAAAA,CAASmD,qBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,SAASZ,MAAAA,EAA4F;AAChH,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;AAgBd,IAAA,MAAMjD,SAAAA,GAAY;AAChBoD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACE5B,QAAAA,MAAAA,EAAQ4B,MAAAA,CAAO5B,MAAAA;QACf6B,SAAAA,EAAWD,MAAAA,CAAOC,WAAW7C,WAAAA,EAAAA;QAC7B8C,OAAAA,EAASF,MAAAA,CAAOE,SAAS9C,WAAAA;OAC3B,GACA+C;AACN,KAAA;AAEA,IAAA,MAAM3C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASqD,iBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,WAAWC,eAAAA,EAA6C;AACnE,IAAA,MAAMpE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,oDAAA,EAAsD;AAChE2C,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAaiD,aAAAA,GAAkC;AAC7C,IAAA,MAAMrE,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,MAAa0E,oBAAoBF,eAAAA,EAA6C;AAC5E,IAAA,MAAMpE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,6CAAA,EAA+C;AACzD2C,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAamD,0BAAAA,GAA+C;AAC1D,IAAA,MAAMvE,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,UAAUsE,WAAAA,EAAc;AAC3G,MAAA,MAAM,IAAInD,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,UAAUsE,WAAAA,EAAa;AAC7E,MAAA,MAAM,IAAInD,gBAAgB,oDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI5B,KAAAA,CAAMI,OAAAA,KAAO,MAAA,IAAiC,CAACJ,KAAAA,CAAMS,UAAUuE,SAAAA,IAAa,CAAChF,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,EAAQ;AACvG,MAAA,MAAM,IAAIJ,gBAAgB,6DAAA,CAAA;AAC5B,IAAA;AACF,EAAA;AACF;;;ACnqBO,IAAKjC,iBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAOL,IAAKF,oBAAAA,6BAAAA,oBAAAA,EAAAA;;;;;;;;AAAAA,EAAAA,OAAAA,oBAAAA;;AA4JL,IAAMwF,sBAAN,MAAMA;EA7Kb;;;;;AA8KE,EAAA,WAAA,CACUpF,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,KAAKmF,OAAAA,EAAiE;AAEjF,IAAA,IAAI,CAACA,QAAQC,KAAAA,IAASD,OAAAA,CAAQC,MAAMzD,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAIC,gBAAgB,gCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,QAAQE,OAAAA,IAAWF,OAAAA,CAAQE,QAAQ1D,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AAC3D,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQG,OAAAA,IAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,sCAAA,EAAwC;AAClDgF,MAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfG,MAAAA,SAAAA,EAAWJ,QAAQG,OAAAA,CAAQ1D,MAAAA;AAC3BtB,MAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI;KACpB,CAAA;AAEA,IAAA,MAAME,QAAAA,GAAW;;;;;;;;;;;;AAajB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLmF,QAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfC,QAAAA,OAAAA,EAASF,OAAAA,CAAQE,OAAAA;AACjB/E,QAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI,MAAA;AAClBgF,QAAAA,OAAAA,EAASH,OAAAA,CAAQG,OAAAA;AACjBE,QAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;AACpCC,QAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBzD,QAAAA,KAAAA,EAAOmD,QAAQnD,KAAAA,IAAS,KAAA;AACxB0D,QAAAA,GAAAA,EAAKP,QAAQO,GAAAA,IAAO;AACtB;AACF,KAAA;AAEA,IAAA,MAAMrE,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,IAAA,MAAMsC,MAAAA,GAAS;AACbsD,MAAAA,YAAAA,EAActE,SAASuE,kBAAAA,CAAmBD,YAAAA;AAC1CE,MAAAA,YAAAA,EAAcxE,SAASuE,kBAAAA,CAAmBC,YAAAA;AAC1CC,MAAAA,MAAAA,EAAQzE,SAASuE,kBAAAA,CAAmBE,MAAAA;AACpClB,MAAAA,eAAAA,EAAiBvD,SAASuE,kBAAAA,CAAmBpD,aAAAA,CAAcS,IAAI,CAACC,CAAAA,KAAMA,EAAEN,EAAE;AAC5E,KAAA;AAEAzC,IAAAA,MAAAA,CAAOC,KAAK,mCAAA,EAAqC;AAC/CuF,MAAAA,YAAAA,EAActD,MAAAA,CAAOsD,YAAAA;AACrBE,MAAAA,YAAAA,EAAcxD,MAAAA,CAAOwD;KACvB,CAAA;AAEA,IAAA,OAAOxD,MAAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa0D,UAAAA,CACX9D,MAAAA,EACAmD,KAAAA,EACAC,OAAAA,EACAF,OAAAA,EAC+B;AAC/B,IAAA,OAAO,KAAKnF,IAAAA,CAAK;AACfoF,MAAAA,KAAAA;AACAC,MAAAA,OAAAA;MACAC,OAAAA,EAAS;AAACrD,QAAAA;;MACV,GAAGkD;KACL,CAAA;AACF,EAAA;;;;AAKA,EAAA,MAAavB,iBAAiBuB,OAAAA,EAI3B;AACDhF,IAAAA,MAAAA,CAAO6F,MAAM,uCAAA,EAAyC;AAAE/D,MAAAA,MAAAA,EAAQkD,OAAAA,CAAQlD;KAAO,CAAA;AAE/E,IAAA,MAAMyB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCd,IAAA,MAAMjD,SAAAA,GAAY;AAChBwB,MAAAA,MAAAA,EAAQkD,OAAAA,CAAQlD,MAAAA;AAChBY,MAAAA,MAAAA,EAAQsC,OAAAA,CAAQtC,MAAAA;AAChBvC,MAAAA,IAAAA,EAAM6E,OAAAA,CAAQ7E,IAAAA;AACdmF,MAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBQ,MAAAA,MAAAA,EAAQd,OAAAA,CAAQc,MAAAA;AAChBhC,MAAAA,KAAAA,EAAOkB,QAAQlB,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQiB,QAAQjB,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAM7C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAMhCA,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASuC,gBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAae,WAAWpD,cAAAA,EAA0C;AAChEpB,IAAAA,MAAAA,CAAO6F,MAAM,8CAAA,EAAgD;AAAEzE,MAAAA;KAAe,CAAA;AAE9E,IAAA,MAAMf,QAAAA,GAAW;;;;;;;;AASjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAO4D,KAAAA,CAAMlD,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,MAAa2E,mBAAmBtB,eAAAA,EAA4C;AAC1EzE,IAAAA,MAAAA,CAAO6F,MAAM,wDAAA,EAA0D;AACrEjD,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1D2C,MAAAA,KAAAA,EAAO1B,SAAS8E,uBAAAA,CAAwBpD;KAC1C,CAAA;AAEA,IAAA,OAAO1B,SAAS8E,uBAAAA,CAAwBpD,KAAAA;AAC1C,EAAA;;;;AAKA,EAAA,MAAa8B,aAAAA,GAAiC;AAC5C1E,IAAAA,MAAAA,CAAO6F,MAAM,mDAAA,CAAA;AAEb,IAAA,MAAMxF,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU,EAAC,EAAG,IAAA,CAAKT,OAAO,CAAA;AAE7BI,IAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9D2C,MAAAA,KAAAA,EAAO1B,SAAS+E,4BAAAA,CAA6BrD;KAC/C,CAAA;AAEA,IAAA,OAAO1B,SAAS+E,4BAAAA,CAA6BrD,KAAAA;AAC/C,EAAA;;;;AAKA,EAAA,MAAasD,mBAAmB9E,cAAAA,EAA0C;AACxEpB,IAAAA,MAAAA,CAAO6F,MAAM,uCAAA,EAAyC;AAAEzE,MAAAA;KAAe,CAAA;AAEvE,IAAA,MAAMf,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAO4D,KAAAA,CAAMlD,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,MAAa+E,eAAe1B,eAAAA,EAA4C;AACtEzE,IAAAA,MAAAA,CAAO6F,MAAM,iDAAA,EAAmD;AAC9DjD,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,uCAAA,EAAyC;AACnD2C,MAAAA,KAAAA,EAAO1B,SAASyD,mBAAAA,CAAoB/B;KACtC,CAAA;AAEA,IAAA,OAAO1B,SAASyD,mBAAAA,CAAoB/B,KAAAA;AACtC,EAAA;;;;AAKA,EAAA,MAAawD,eAAetE,MAAAA,EAAiC;AAC3D,IAAA,MAAMI,MAAAA,GAAS,MAAM,IAAA,CAAKuB,gBAAAA,CAAiB;AACzC3B,MAAAA,MAAAA;MACAY,MAAAA,EAAQ,QAAA;MACRoB,KAAAA,EAAO;KACT,CAAA;AAEA,IAAA,OAAO5B,MAAAA,CAAOmE,WAAAA;AAChB,EAAA;;;;;AAMA,EAAA,MAAaC,wBAAwBtB,OAAAA,EAAwE;AAE3G,IAAA,IAAI,CAACA,QAAQvE,IAAAA,IAAQuE,OAAAA,CAAQvE,KAAKe,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,IAAIC,gBAAgB,+BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQzE,SAAAA,IAAa,CAACyE,QAAQuB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI7E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIsD,OAAAA,CAAQwB,iBAAiB,CAACxB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1D+B,MAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClByE,MAAAA,cAAAA,EAAgBzB,OAAAA,CAAQuB,UAAAA,GAAavB,OAAAA,CAAQuB,UAAAA,CAAW9E,MAAAA,GAAS,CAAA;AACjE+E,MAAAA,YAAAA,EAAcxB,OAAAA,CAAQwB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQ1D,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClBD,QAAAA,SAAAA,EAAWiD,OAAAA,CAAQjD,SAAAA;AACnByE,QAAAA,YAAAA,EAAcxB,QAAQwB,YAAAA,IAAgB,KAAA;QACtCrB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;QAC5B3B,YAAAA,EAAc;AACZhD,UAAAA,OAAAA,EAASwE,QAAQxE,OAAAA,IAAW,EAAA;AAC5BC,UAAAA,IAAAA,EAAMuE,OAAAA,CAAQvE,IAAAA;AACdC,UAAAA,QAAAA,EAAUsE,QAAQtE,QAAAA,IAAY,EAAA;AAC9BR,UAAAA,OAAAA,EAAS8E,OAAAA,CAAQhD,QAAAA;AACjB7B,UAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI,MAAA;AAClBI,UAAAA,SAAAA,EAAWyE,OAAAA,CAAQzE,SAAAA;AACnB+E,UAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBD,UAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;UACpCzE,QAAAA,EAAUoE,OAAAA,CAAQpE,YAAY,EAAC;AAC/BI,UAAAA,UAAAA,EAAYgE,QAAQhE,UAAAA,IAAc,KAAA;AAClCC,UAAAA,WAAAA,EAAa+D,QAAQ/D,WAAAA,IAAe,KAAA;UACpCF,SAAAA,EAAWiE,OAAAA,CAAQjE,WAAWD,WAAAA;AAChC;AACF;AACF,KAAA;AAGA,IAAA,IAAIkE,OAAAA,CAAQuB,UAAAA,IAAcvB,OAAAA,CAAQuB,UAAAA,CAAW9E,SAAS,CAAA,EAAG;AACvD,MAAA,MAAMkF,OAAAA,GAAU,MAAMC,OAAAA,CAAQC,UAAAA,CAC5B7B,OAAAA,CAAQuB,UAAAA,CAAWzD,GAAAA,CAAI,CAACvC,SAAAA,KACtB,IAAA,CAAKZ,MAAAA,CAAO4D,KAAAA,CACVlD,QAAAA,EACA;QACEP,KAAAA,EAAO;AACL,UAAA,GAAGQ,SAAAA,CAAUR,KAAAA;UACb0D,YAAAA,EAAc;AACZ,YAAA,GAAGlD,UAAUR,KAAAA,CAAM0D,YAAAA;AACnBjD,YAAAA;AACF;AACF;OACF,EACA,IAAA,CAAKX,OAAO,CAAA,CAAA,CAAA;AAKlB,MAAA,IAAI4F,YAAAA,GAAe,CAAA;AACnB,MAAA,IAAIE,YAAAA,GAAe,CAAA;AACnB,MAAA,MAAMC,SAAmB,EAAA;AACzB,MAAA,MAAMlB,kBAA4B,EAAA;AAElCkC,MAAAA,OAAAA,CAAQG,OAAAA,CAAQ,CAAC5E,MAAAA,EAAQ6E,KAAAA,KAAAA;AACvB,QAAA,IAAI7E,MAAAA,CAAOQ,WAAW,WAAA,EAAa;AACjC8C,UAAAA,YAAAA,EAAAA;AACA,UAAA,MAAMtE,YAAWgB,MAAAA,CAAO8E,KAAAA;AACxBvC,UAAAA,eAAAA,CAAgBwC,IAAAA,CAAK/F,SAAAA,CAASgG,mBAAAA,CAAoBzE,EAAE,CAAA;QACtD,CAAA,MAAO;AACLiD,UAAAA,YAAAA,EAAAA;AACAC,UAAAA,MAAAA,CAAOsB,IAAAA,CACL,CAAA,UAAA,EAAaF,KAAAA,GAAQ,CAAA,CAAA,EAAA,EAAM7E,MAAAA,CAAOiF,MAAAA,YAAkBC,KAAAA,GAAQlF,MAAAA,CAAOiF,MAAAA,CAAOjC,OAAAA,GAAU,eAAA,CAAA,CAAiB,CAAA;AAEzG,QAAA;MACF,CAAA,CAAA;AAEA,MAAA,MAAMhE,QAAAA,GAAiC;AACrCsE,QAAAA,YAAAA;AACAE,QAAAA,YAAAA;AACAC,QAAAA,MAAAA;AACAlB,QAAAA;AACF,OAAA;AAEAzE,MAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9DuF,QAAAA,YAAAA;AACAE,QAAAA;OACF,CAAA;AAEA,MAAA,OAAOxE,QAAAA;IACT,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAAMA,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,QAAA,MAAMsC,MAAAA,GAA+B;UACnCsD,YAAAA,EAAc,CAAA;UACdE,YAAAA,EAAc,CAAA;AACdC,UAAAA,MAAAA,EAAQ,EAAA;UACRlB,eAAAA,EAAiB;AAACvD,YAAAA,QAAAA,CAASgG,mBAAAA,CAAoBzE;;AACjD,SAAA;AAEAzC,QAAAA,MAAAA,CAAOC,KAAK,2CAAA,EAA6C;AACvDmB,UAAAA,cAAAA,EAAgBF,SAASgG,mBAAAA,CAAoBzE,EAAAA;AAC7CC,UAAAA,MAAAA,EAAQxB,SAASgG,mBAAAA,CAAoBxE;SACvC,CAAA;AAEA,QAAA,OAAOR,MAAAA;AACT,MAAA,CAAA,CAAA,OAASmF,KAAAA,EAAO;AACdrH,QAAAA,MAAAA,CAAOqH,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,MAAMnC,OAAAA,GAAU;;AAClDT,UAAAA,eAAAA,EAAiB;AACnB,SAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa6C,yBAAyBtC,OAAAA,EAAyE;AAE7G,IAAA,IAAI,CAACA,QAAQzD,YAAAA,IAAgByD,OAAAA,CAAQzD,aAAaC,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrE,MAAA,MAAM,IAAIC,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQ1E,SAAAA,IAAa,OAAO0E,OAAAA,CAAQ1E,cAAc,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAIoB,gBAAgB,iCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQzE,SAAAA,IAAa,CAACyE,QAAQuB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI7E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIsD,OAAAA,CAAQwB,iBAAiB,CAACxB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,+CAAA,EAAiD;AAC3DsB,MAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBS,MAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClByE,MAAAA,cAAAA,EAAgBzB,OAAAA,CAAQuB,UAAAA,GAAavB,OAAAA,CAAQuB,UAAAA,CAAW9E,MAAAA,GAAS,CAAA;AACjE+E,MAAAA,YAAAA,EAAcxB,OAAAA,CAAQwB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQ1D,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;;;;;;AAejB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClBD,QAAAA,SAAAA,EAAWiD,OAAAA,CAAQjD,SAAAA;AACnByE,QAAAA,YAAAA,EAAcxB,QAAQwB,YAAAA,IAAgB,KAAA;QACtCrB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;AAC5B5D,QAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBjB,QAAAA,SAAAA,EAAW0E,OAAAA,CAAQ1E,SAAAA;AACnBC,QAAAA,SAAAA,EAAWyE,OAAAA,CAAQzE,SAAAA;AACnBgG,QAAAA,UAAAA,EAAYvB,OAAAA,CAAQuB,UAAAA;AACpBvF,QAAAA,UAAAA,EAAYgE,QAAQhE,UAAAA,IAAc,KAAA;AAClCC,QAAAA,WAAAA,EAAa+D,QAAQ/D,WAAAA,IAAe,KAAA;QACpCF,SAAAA,EAAWiE,OAAAA,CAAQjE,WAAWD,WAAAA,EAAAA;QAC9BD,YAAAA,EAAcmE,OAAAA,CAAQnE,cAAcC,WAAAA,EAAAA;AACpCmB,QAAAA,QAAAA,EAAU+C,OAAAA,CAAQ/C;AACpB;AACF,KAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMf,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAOhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,MAAA,MAAMe,OAAOO,QAAAA,CAASiB,+BAAAA;AAEtB,MAAA,MAAMD,MAAAA,GAA+B;AACnCsD,QAAAA,YAAAA,EAAc7E,IAAAA,CAAK2B,cAAAA;AACnBoD,QAAAA,YAAAA,EAAc/E,IAAAA,CAAK6B,WAAAA;AACnBmD,QAAAA,MAAAA,EAAQ,EAAA;AACRlB,QAAAA,eAAAA,EAAiB9D,KAAK0B,aAAAA,CAAcS,GAAAA,CAAI,CAACC,CAAAA,KAAMA,EAAEN,EAAE;AACrD,OAAA;AAEAzC,MAAAA,MAAAA,CAAOC,KAAK,4CAAA,EAA8C;AACxDsB,QAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBe,QAAAA,cAAAA,EAAgB3B,IAAAA,CAAK2B,cAAAA;AACrBE,QAAAA,WAAAA,EAAa7B,IAAAA,CAAK6B,WAAAA;AAClBiC,QAAAA,eAAAA,EAAiBvC,MAAAA,CAAOuC;OAC1B,CAAA;AAEA,MAAA,OAAOvC,MAAAA;AACT,IAAA,CAAA,CAAA,OAASmF,KAAAA,EAAO;AACdrH,MAAAA,MAAAA,CAAOqH,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,MAAMnC,OAAAA,GAAU;;AAClDT,QAAAA,eAAAA,EAAiB;AACnB,OAAA;AACF,IAAA;AACF,EAAA;AACF","file":"chunk-IUL5TEKE.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 totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\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: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const result = response.triggerNotificationWithTemplate;\n const firstNotification = result.notifications[0];\n\n if (result.totalTriggered === 0 || !firstNotification) {\n throw new ValidationError(\n `Notification trigger failed: requested=${result.totalRequested}, triggered=${result.totalTriggered}, failed=${result.totalFailed}`\n );\n }\n\n logger.info('[TenantNotifications] Notification sent with template', {\n notificationId: firstNotification.id,\n status: firstNotification.status,\n totalTriggered: result.totalTriggered,\n totalFailed: result.totalFailed,\n });\n\n return firstNotification.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 totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\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: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const data = response.triggerNotificationWithTemplate;\n\n const result: NotificationResponse = {\n successCount: data.totalTriggered,\n failureCount: data.totalFailed,\n errors: [],\n notificationIds: data.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Template notification sent', {\n templateSlug: options.templateSlug,\n totalTriggered: data.totalTriggered,\n totalFailed: data.totalFailed,\n notificationIds: result.notificationIds,\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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isTokenExpired, parseJWT } from './chunk-B7I4TABG.js';
|
|
2
|
-
import { AuthenticationError } from './chunk-
|
|
2
|
+
import { AuthenticationError } from './chunk-EZ4PKRUK.js';
|
|
3
3
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
4
4
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
5
5
|
|
|
@@ -272,5 +272,5 @@ var AuthModule = class {
|
|
|
272
272
|
};
|
|
273
273
|
|
|
274
274
|
export { AuthCookieHelper, AuthModule };
|
|
275
|
-
//# sourceMappingURL=chunk-
|
|
276
|
-
//# sourceMappingURL=chunk-
|
|
275
|
+
//# sourceMappingURL=chunk-SS4XWRYR.js.map
|
|
276
|
+
//# sourceMappingURL=chunk-SS4XWRYR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/cookie-helper.ts","../src/auth/index.ts"],"names":["AuthCookieHelper","ACCESS_TOKEN_COOKIE","REFRESH_TOKEN_COOKIE","PROFILE_ID_COOKIE","setAuthCookies","context","tokens","options","isProd","process","env","domain","setCookie","name","value","accessToken","maxAge","httpOnly","secure","sameSite","path","refreshToken","rememberMe","profileId","clearAuthCookies","clearOptions","cookie","undefined","responseHeaders","append","AuthModule","client","verifyToken","token","logger","debug","isTokenExpired","valid","error","query","response","Error","message","decodeToken","payload","parseJWT","mutation","info","AuthenticationError","validatePermission","userId","permission","resourceId","allowed","isTokenValid","getUserIdFromToken","user_id","getWorkspaceIdFromToken","workspace_id","getTokenClaims","willExpireSoon","withinSeconds","exp","now","Math","floor","Date"],"mappings":"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","file":"chunk-FKSMQLIV.js","sourcesContent":["/**\n * Auth Cookie Helper\n *\n * Utilities for setting secure, HttpOnly cookies for authentication.\n * Used by auth services to transition from localStorage to secure cookies.\n */\n\nimport type { GraphQLContext } from '../server/types.js';\n\nexport interface CookieOptions {\n name: string;\n value: string;\n maxAge?: number;\n domain?: string;\n path?: string;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'Strict' | 'Lax' | 'None';\n}\n\nexport class AuthCookieHelper {\n private static readonly ACCESS_TOKEN_COOKIE = 'bf_at';\n private static readonly REFRESH_TOKEN_COOKIE = 'bf_rt';\n private static readonly PROFILE_ID_COOKIE = 'bf_pid';\n\n /**\n * Set authentication cookies in the context response headers\n */\n public static setAuthCookies(\n context: GraphQLContext,\n tokens: { accessToken: string; refreshToken?: string },\n options: { profileId?: string; rememberMe?: boolean } = {}\n ): void {\n const isProd = process.env['NODE_ENV'] === 'production';\n const domain = process.env['COOKIE_DOMAIN'];\n\n // Access token cookie (short-lived, 15m)\n this.setCookie(context, {\n name: this.ACCESS_TOKEN_COOKIE,\n value: tokens.accessToken,\n maxAge: 15 * 60,\n httpOnly: true,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/',\n });\n\n // Refresh token cookie (long-lived, 7d or 30d)\n if (tokens.refreshToken) {\n this.setCookie(context, {\n name: this.REFRESH_TOKEN_COOKIE,\n value: tokens.refreshToken,\n maxAge: options.rememberMe ? 30 * 24 * 60 * 60 : 7 * 24 * 60 * 60,\n httpOnly: true,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/global/graphql', // Only send to global gateway for refresh\n });\n }\n\n // Profile ID cookie (not HttpOnly, needed for UI profile resolution)\n if (options.profileId) {\n this.setCookie(context, {\n name: this.PROFILE_ID_COOKIE,\n value: options.profileId,\n maxAge: 30 * 24 * 60 * 60,\n httpOnly: false,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/',\n });\n }\n }\n\n /**\n * Clear authentication cookies\n */\n public static clearAuthCookies(context: GraphQLContext): void {\n const domain = process.env['COOKIE_DOMAIN'];\n const isProd = process.env['NODE_ENV'] === 'production';\n\n const clearOptions = {\n value: '',\n maxAge: 0,\n domain,\n path: '/',\n secure: isProd,\n sameSite: 'Lax' as const,\n };\n\n this.setCookie(context, { ...clearOptions, name: this.ACCESS_TOKEN_COOKIE, httpOnly: true });\n this.setCookie(context, {\n ...clearOptions,\n name: this.REFRESH_TOKEN_COOKIE,\n httpOnly: true,\n path: '/global/graphql',\n });\n this.setCookie(context, { ...clearOptions, name: this.PROFILE_ID_COOKIE, httpOnly: false });\n }\n\n /**\n * Internal helper to set a cookie header\n */\n private static setCookie(context: GraphQLContext, options: CookieOptions): void {\n let cookie = `${options.name}=${options.value}`;\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`;\n }\n\n if (options.domain) {\n cookie += `; Domain=${options.domain}`;\n }\n\n if (options.path) {\n cookie += `; Path=${options.path}`;\n }\n\n if (options.httpOnly) {\n cookie += '; HttpOnly';\n }\n\n if (options.secure) {\n cookie += '; Secure';\n }\n\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`;\n }\n\n context.responseHeaders.append('Set-Cookie', cookie);\n }\n}\n","/**\n * Authentication Module\n * JWT verification, token management, and user authentication\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { AuthenticationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { parseJWT, isTokenExpired } from '../utils/index.js';\n\nexport { AuthCookieHelper } from './cookie-helper.js';\n\nexport interface TokenPayload {\n jti: string;\n sub: string;\n user_id: string;\n workspace_id?: string;\n org_id?: string;\n tenant_endpoint?: string;\n iat: number;\n exp: number;\n scope?: string;\n}\n\nexport interface VerifyTokenResult {\n valid: boolean;\n payload?: TokenPayload;\n error?: string;\n}\n\nexport interface RefreshTokenResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport * from './cookie-helper.js';\n\n/**\n * Authentication Module\n */\nexport class AuthModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Verify JWT token\n */\n public async verifyToken(token: string): Promise<VerifyTokenResult> {\n logger.debug('[Auth] Verifying token');\n\n // First check if token is expired locally\n if (isTokenExpired(token)) {\n return {\n valid: false,\n error: 'Token expired',\n };\n }\n\n const query = `\n query VerifyToken($token: String!) {\n verifyToken(token: $token) {\n valid\n payload\n error\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ verifyToken: VerifyTokenResult }>(query, { token }, this.context);\n\n logger.debug('[Auth] Token verification result', { valid: response.verifyToken.valid });\n\n return response.verifyToken;\n } catch (error) {\n logger.error('[Auth] Token verification failed', { error });\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Decode token without verification\n */\n public decodeToken(token: string): TokenPayload | null {\n const payload = parseJWT(token);\n if (!payload) {\n return null;\n }\n return payload as unknown as TokenPayload;\n }\n\n /**\n * Refresh access token using refresh token\n */\n public async refreshToken(refreshToken: string): Promise<RefreshTokenResult> {\n logger.debug('[Auth] Refreshing token');\n\n const mutation = `\n mutation RefreshToken($refreshToken: String!) {\n refreshToken(refreshToken: $refreshToken) {\n accessToken\n refreshToken\n expiresIn\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ refreshToken: RefreshTokenResult }>(\n mutation,\n { refreshToken },\n this.context\n );\n\n logger.info('[Auth] Token refreshed successfully');\n\n return response.refreshToken;\n } catch (error) {\n logger.error('[Auth] Token refresh failed', { error });\n throw new AuthenticationError('Failed to refresh token', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Validate user has specific permission\n */\n public async validatePermission(userId: string, permission: string, resourceId?: string): Promise<boolean> {\n logger.debug('[Auth] Validating permission', { userId, permission, resourceId });\n\n const query = `\n query ValidatePermission($userId: ID!, $permission: String!, $resourceId: ID) {\n validatePermission(userId: $userId, permission: $permission, resourceId: $resourceId) {\n allowed\n }\n }\n `;\n\n try {\n const response = await this.client.query<{\n validatePermission: { allowed: boolean };\n }>(query, { userId, permission, resourceId }, this.context);\n\n logger.debug('[Auth] Permission validation result', {\n allowed: response.validatePermission.allowed,\n });\n\n return response.validatePermission.allowed;\n } catch (error) {\n logger.error('[Auth] Permission validation failed', { error });\n return false;\n }\n }\n\n /**\n * Check if token is valid and not expired\n */\n public isTokenValid(token: string): boolean {\n return !isTokenExpired(token);\n }\n\n /**\n * Get user ID from token\n */\n public getUserIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.user_id || null;\n }\n\n /**\n * Get workspace ID from token\n */\n public getWorkspaceIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.workspace_id || null;\n }\n\n /**\n * Extract all claims from token\n */\n public getTokenClaims(token: string): Record<string, unknown> | null {\n const payload = parseJWT(token);\n return payload;\n }\n\n /**\n * Check if token will expire soon (within given seconds)\n */\n public willExpireSoon(token: string, withinSeconds: number = 300): boolean {\n const payload = this.decodeToken(token);\n if (!payload || typeof payload.exp !== 'number') {\n return true;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload.exp - now < withinSeconds;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/cookie-helper.ts","../src/auth/index.ts"],"names":["AuthCookieHelper","ACCESS_TOKEN_COOKIE","REFRESH_TOKEN_COOKIE","PROFILE_ID_COOKIE","setAuthCookies","context","tokens","options","isProd","process","env","domain","setCookie","name","value","accessToken","maxAge","httpOnly","secure","sameSite","path","refreshToken","rememberMe","profileId","clearAuthCookies","clearOptions","cookie","undefined","responseHeaders","append","AuthModule","client","verifyToken","token","logger","debug","isTokenExpired","valid","error","query","response","Error","message","decodeToken","payload","parseJWT","mutation","info","AuthenticationError","validatePermission","userId","permission","resourceId","allowed","isTokenValid","getUserIdFromToken","user_id","getWorkspaceIdFromToken","workspace_id","getTokenClaims","willExpireSoon","withinSeconds","exp","now","Math","floor","Date"],"mappings":"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","file":"chunk-SS4XWRYR.js","sourcesContent":["/**\n * Auth Cookie Helper\n *\n * Utilities for setting secure, HttpOnly cookies for authentication.\n * Used by auth services to transition from localStorage to secure cookies.\n */\n\nimport type { GraphQLContext } from '../server/types.js';\n\nexport interface CookieOptions {\n name: string;\n value: string;\n maxAge?: number;\n domain?: string;\n path?: string;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'Strict' | 'Lax' | 'None';\n}\n\nexport class AuthCookieHelper {\n private static readonly ACCESS_TOKEN_COOKIE = 'bf_at';\n private static readonly REFRESH_TOKEN_COOKIE = 'bf_rt';\n private static readonly PROFILE_ID_COOKIE = 'bf_pid';\n\n /**\n * Set authentication cookies in the context response headers\n */\n public static setAuthCookies(\n context: GraphQLContext,\n tokens: { accessToken: string; refreshToken?: string },\n options: { profileId?: string; rememberMe?: boolean } = {}\n ): void {\n const isProd = process.env['NODE_ENV'] === 'production';\n const domain = process.env['COOKIE_DOMAIN'];\n\n // Access token cookie (short-lived, 15m)\n this.setCookie(context, {\n name: this.ACCESS_TOKEN_COOKIE,\n value: tokens.accessToken,\n maxAge: 15 * 60,\n httpOnly: true,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/',\n });\n\n // Refresh token cookie (long-lived, 7d or 30d)\n if (tokens.refreshToken) {\n this.setCookie(context, {\n name: this.REFRESH_TOKEN_COOKIE,\n value: tokens.refreshToken,\n maxAge: options.rememberMe ? 30 * 24 * 60 * 60 : 7 * 24 * 60 * 60,\n httpOnly: true,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/global/graphql', // Only send to global gateway for refresh\n });\n }\n\n // Profile ID cookie (not HttpOnly, needed for UI profile resolution)\n if (options.profileId) {\n this.setCookie(context, {\n name: this.PROFILE_ID_COOKIE,\n value: options.profileId,\n maxAge: 30 * 24 * 60 * 60,\n httpOnly: false,\n secure: isProd,\n sameSite: 'Lax',\n domain,\n path: '/',\n });\n }\n }\n\n /**\n * Clear authentication cookies\n */\n public static clearAuthCookies(context: GraphQLContext): void {\n const domain = process.env['COOKIE_DOMAIN'];\n const isProd = process.env['NODE_ENV'] === 'production';\n\n const clearOptions = {\n value: '',\n maxAge: 0,\n domain,\n path: '/',\n secure: isProd,\n sameSite: 'Lax' as const,\n };\n\n this.setCookie(context, { ...clearOptions, name: this.ACCESS_TOKEN_COOKIE, httpOnly: true });\n this.setCookie(context, {\n ...clearOptions,\n name: this.REFRESH_TOKEN_COOKIE,\n httpOnly: true,\n path: '/global/graphql',\n });\n this.setCookie(context, { ...clearOptions, name: this.PROFILE_ID_COOKIE, httpOnly: false });\n }\n\n /**\n * Internal helper to set a cookie header\n */\n private static setCookie(context: GraphQLContext, options: CookieOptions): void {\n let cookie = `${options.name}=${options.value}`;\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`;\n }\n\n if (options.domain) {\n cookie += `; Domain=${options.domain}`;\n }\n\n if (options.path) {\n cookie += `; Path=${options.path}`;\n }\n\n if (options.httpOnly) {\n cookie += '; HttpOnly';\n }\n\n if (options.secure) {\n cookie += '; Secure';\n }\n\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite}`;\n }\n\n context.responseHeaders.append('Set-Cookie', cookie);\n }\n}\n","/**\n * Authentication Module\n * JWT verification, token management, and user authentication\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { AuthenticationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { parseJWT, isTokenExpired } from '../utils/index.js';\n\nexport { AuthCookieHelper } from './cookie-helper.js';\n\nexport interface TokenPayload {\n jti: string;\n sub: string;\n user_id: string;\n workspace_id?: string;\n org_id?: string;\n tenant_endpoint?: string;\n iat: number;\n exp: number;\n scope?: string;\n}\n\nexport interface VerifyTokenResult {\n valid: boolean;\n payload?: TokenPayload;\n error?: string;\n}\n\nexport interface RefreshTokenResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport * from './cookie-helper.js';\n\n/**\n * Authentication Module\n */\nexport class AuthModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Verify JWT token\n */\n public async verifyToken(token: string): Promise<VerifyTokenResult> {\n logger.debug('[Auth] Verifying token');\n\n // First check if token is expired locally\n if (isTokenExpired(token)) {\n return {\n valid: false,\n error: 'Token expired',\n };\n }\n\n const query = `\n query VerifyToken($token: String!) {\n verifyToken(token: $token) {\n valid\n payload\n error\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ verifyToken: VerifyTokenResult }>(query, { token }, this.context);\n\n logger.debug('[Auth] Token verification result', { valid: response.verifyToken.valid });\n\n return response.verifyToken;\n } catch (error) {\n logger.error('[Auth] Token verification failed', { error });\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Decode token without verification\n */\n public decodeToken(token: string): TokenPayload | null {\n const payload = parseJWT(token);\n if (!payload) {\n return null;\n }\n return payload as unknown as TokenPayload;\n }\n\n /**\n * Refresh access token using refresh token\n */\n public async refreshToken(refreshToken: string): Promise<RefreshTokenResult> {\n logger.debug('[Auth] Refreshing token');\n\n const mutation = `\n mutation RefreshToken($refreshToken: String!) {\n refreshToken(refreshToken: $refreshToken) {\n accessToken\n refreshToken\n expiresIn\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ refreshToken: RefreshTokenResult }>(\n mutation,\n { refreshToken },\n this.context\n );\n\n logger.info('[Auth] Token refreshed successfully');\n\n return response.refreshToken;\n } catch (error) {\n logger.error('[Auth] Token refresh failed', { error });\n throw new AuthenticationError('Failed to refresh token', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Validate user has specific permission\n */\n public async validatePermission(userId: string, permission: string, resourceId?: string): Promise<boolean> {\n logger.debug('[Auth] Validating permission', { userId, permission, resourceId });\n\n const query = `\n query ValidatePermission($userId: ID!, $permission: String!, $resourceId: ID) {\n validatePermission(userId: $userId, permission: $permission, resourceId: $resourceId) {\n allowed\n }\n }\n `;\n\n try {\n const response = await this.client.query<{\n validatePermission: { allowed: boolean };\n }>(query, { userId, permission, resourceId }, this.context);\n\n logger.debug('[Auth] Permission validation result', {\n allowed: response.validatePermission.allowed,\n });\n\n return response.validatePermission.allowed;\n } catch (error) {\n logger.error('[Auth] Permission validation failed', { error });\n return false;\n }\n }\n\n /**\n * Check if token is valid and not expired\n */\n public isTokenValid(token: string): boolean {\n return !isTokenExpired(token);\n }\n\n /**\n * Get user ID from token\n */\n public getUserIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.user_id || null;\n }\n\n /**\n * Get workspace ID from token\n */\n public getWorkspaceIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.workspace_id || null;\n }\n\n /**\n * Extract all claims from token\n */\n public getTokenClaims(token: string): Record<string, unknown> | null {\n const payload = parseJWT(token);\n return payload;\n }\n\n /**\n * Check if token will expire soon (within given seconds)\n */\n public willExpireSoon(token: string, withinSeconds: number = 300): boolean {\n const payload = this.decodeToken(token);\n if (!payload || typeof payload.exp !== 'number') {\n return true;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload.exp - now < withinSeconds;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RBACModule } from './chunk-
|
|
2
|
-
import { NotificationsModule, NotificationType } from './chunk-
|
|
3
|
-
import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-
|
|
1
|
+
import { RBACModule } from './chunk-6NB7P6SR.js';
|
|
2
|
+
import { NotificationsModule, NotificationType } from './chunk-IUL5TEKE.js';
|
|
3
|
+
import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-EZ4PKRUK.js';
|
|
4
4
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
5
5
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
6
6
|
|
|
@@ -1547,5 +1547,5 @@ var TrackerModule = class {
|
|
|
1547
1547
|
};
|
|
1548
1548
|
|
|
1549
1549
|
export { ActivityModule, TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, UsageModule, createProductTracker, trackOperation, trackerStub };
|
|
1550
|
-
//# sourceMappingURL=chunk-
|
|
1551
|
-
//# sourceMappingURL=chunk-
|
|
1550
|
+
//# sourceMappingURL=chunk-TYXGWVRL.js.map
|
|
1551
|
+
//# sourceMappingURL=chunk-TYXGWVRL.js.map
|