@burdenoff/be-sdk 2026.825.8 → 2026.828.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/EventQueueFactory-J2XXPYXH.js +7 -0
  2. package/dist/{EventQueueFactory-ELT7NDXK.js.map → EventQueueFactory-J2XXPYXH.js.map} +1 -1
  3. package/dist/auth/index.js +2 -2
  4. package/dist/cache/index.js +3 -3
  5. package/dist/{chunk-AW6JUXCU.js → chunk-3UQMAUX4.js} +4 -4
  6. package/dist/{chunk-AW6JUXCU.js.map → chunk-3UQMAUX4.js.map} +1 -1
  7. package/dist/{chunk-N3YN6ZII.js → chunk-5JNHVKHG.js} +3 -3
  8. package/dist/{chunk-N3YN6ZII.js.map → chunk-5JNHVKHG.js.map} +1 -1
  9. package/dist/{chunk-7UJXIX4I.js → chunk-5NT2OEDQ.js} +3 -3
  10. package/dist/{chunk-7UJXIX4I.js.map → chunk-5NT2OEDQ.js.map} +1 -1
  11. package/dist/{chunk-OQLDXOZ3.js → chunk-6GL4SLU7.js} +3 -3
  12. package/dist/{chunk-OQLDXOZ3.js.map → chunk-6GL4SLU7.js.map} +1 -1
  13. package/dist/{chunk-L3QCRJOA.js → chunk-74Y5YD3U.js} +7 -7
  14. package/dist/{chunk-L3QCRJOA.js.map → chunk-74Y5YD3U.js.map} +1 -1
  15. package/dist/{chunk-NVVWSOY7.js → chunk-AX3UF33H.js} +3 -3
  16. package/dist/{chunk-NVVWSOY7.js.map → chunk-AX3UF33H.js.map} +1 -1
  17. package/dist/{chunk-Z3O32BW6.js → chunk-CPLFP5JK.js} +3 -3
  18. package/dist/{chunk-Z3O32BW6.js.map → chunk-CPLFP5JK.js.map} +1 -1
  19. package/dist/{chunk-XD5ZK727.js → chunk-DS3YMJ4X.js} +3 -3
  20. package/dist/{chunk-XD5ZK727.js.map → chunk-DS3YMJ4X.js.map} +1 -1
  21. package/dist/{chunk-2HANKZZM.js → chunk-ELU7VL3E.js} +3 -3
  22. package/dist/{chunk-2HANKZZM.js.map → chunk-ELU7VL3E.js.map} +1 -1
  23. package/dist/{chunk-KESVEZB2.js → chunk-FA5ROGTS.js} +3 -3
  24. package/dist/{chunk-KESVEZB2.js.map → chunk-FA5ROGTS.js.map} +1 -1
  25. package/dist/{chunk-WFVLQELZ.js → chunk-FYH5IAPR.js} +6 -6
  26. package/dist/{chunk-WFVLQELZ.js.map → chunk-FYH5IAPR.js.map} +1 -1
  27. package/dist/{chunk-RXMOV3YE.js → chunk-GJWQK3IU.js} +3 -3
  28. package/dist/{chunk-RXMOV3YE.js.map → chunk-GJWQK3IU.js.map} +1 -1
  29. package/dist/{chunk-TORD32GS.js → chunk-INAZ3PKF.js} +3 -3
  30. package/dist/{chunk-TORD32GS.js.map → chunk-INAZ3PKF.js.map} +1 -1
  31. package/dist/{chunk-UJG32VIP.js → chunk-IUJSIXMM.js} +3 -3
  32. package/dist/{chunk-UJG32VIP.js.map → chunk-IUJSIXMM.js.map} +1 -1
  33. package/dist/{chunk-VI4VSNTI.js → chunk-KJOSPVB2.js} +3 -3
  34. package/dist/{chunk-VI4VSNTI.js.map → chunk-KJOSPVB2.js.map} +1 -1
  35. package/dist/{chunk-UM32ZA3G.js → chunk-KMNSVLDS.js} +5 -5
  36. package/dist/{chunk-UM32ZA3G.js.map → chunk-KMNSVLDS.js.map} +1 -1
  37. package/dist/{chunk-VBXPFYZ5.js → chunk-KO2ZXZ7W.js} +3 -3
  38. package/dist/{chunk-VBXPFYZ5.js.map → chunk-KO2ZXZ7W.js.map} +1 -1
  39. package/dist/{chunk-VDYBUTFI.js → chunk-KW55Q6TA.js} +5 -5
  40. package/dist/{chunk-VDYBUTFI.js.map → chunk-KW55Q6TA.js.map} +1 -1
  41. package/dist/{chunk-OCYZEBOL.js → chunk-L5TDUAFN.js} +3 -3
  42. package/dist/{chunk-OCYZEBOL.js.map → chunk-L5TDUAFN.js.map} +1 -1
  43. package/dist/{chunk-S7LWYERE.js → chunk-LKCBI6B2.js} +3 -3
  44. package/dist/{chunk-S7LWYERE.js.map → chunk-LKCBI6B2.js.map} +1 -1
  45. package/dist/{chunk-LGTQ26Z2.js → chunk-MEA4BQNA.js} +3 -3
  46. package/dist/{chunk-LGTQ26Z2.js.map → chunk-MEA4BQNA.js.map} +1 -1
  47. package/dist/{chunk-QLVKMWFA.js → chunk-MWPYA2HD.js} +3 -3
  48. package/dist/{chunk-QLVKMWFA.js.map → chunk-MWPYA2HD.js.map} +1 -1
  49. package/dist/{chunk-XWVP4MC6.js → chunk-MZCBEJ67.js} +3 -3
  50. package/dist/{chunk-XWVP4MC6.js.map → chunk-MZCBEJ67.js.map} +1 -1
  51. package/dist/{chunk-URDYOM2L.js → chunk-QJN4K7LD.js} +4 -4
  52. package/dist/{chunk-URDYOM2L.js.map → chunk-QJN4K7LD.js.map} +1 -1
  53. package/dist/{chunk-CBZNP6RF.js → chunk-RU266375.js} +48 -7
  54. package/dist/chunk-RU266375.js.map +1 -0
  55. package/dist/{chunk-A6DGEZJ4.js → chunk-UD5PPGVU.js} +3 -3
  56. package/dist/{chunk-A6DGEZJ4.js.map → chunk-UD5PPGVU.js.map} +1 -1
  57. package/dist/{chunk-JNJSSBKO.js → chunk-UFXHLQ2T.js} +5 -5
  58. package/dist/{chunk-JNJSSBKO.js.map → chunk-UFXHLQ2T.js.map} +1 -1
  59. package/dist/{chunk-F5SGJ6VS.js → chunk-UNASM5VJ.js} +3 -3
  60. package/dist/{chunk-F5SGJ6VS.js.map → chunk-UNASM5VJ.js.map} +1 -1
  61. package/dist/{chunk-5LXDPGDH.js → chunk-VAT66FJA.js} +3 -3
  62. package/dist/{chunk-5LXDPGDH.js.map → chunk-VAT66FJA.js.map} +1 -1
  63. package/dist/{chunk-WROR2NMB.js → chunk-XCQN6GH7.js} +5 -5
  64. package/dist/{chunk-WROR2NMB.js.map → chunk-XCQN6GH7.js.map} +1 -1
  65. package/dist/{chunk-4X5WL6I3.js → chunk-XYWLCNJH.js} +5 -5
  66. package/dist/{chunk-4X5WL6I3.js.map → chunk-XYWLCNJH.js.map} +1 -1
  67. package/dist/{chunk-MX4AHK3E.js → chunk-YAQ7GNAC.js} +6 -6
  68. package/dist/{chunk-MX4AHK3E.js.map → chunk-YAQ7GNAC.js.map} +1 -1
  69. package/dist/{chunk-RNR45JQH.js → chunk-YK7C5DU6.js} +3 -3
  70. package/dist/{chunk-RNR45JQH.js.map → chunk-YK7C5DU6.js.map} +1 -1
  71. package/dist/{chunk-IC7YDBGE.js → chunk-YNDJQRI3.js} +3 -3
  72. package/dist/{chunk-IC7YDBGE.js.map → chunk-YNDJQRI3.js.map} +1 -1
  73. package/dist/{chunk-WCJIZR5Q.js → chunk-Z5BURBFZ.js} +3 -3
  74. package/dist/{chunk-WCJIZR5Q.js.map → chunk-Z5BURBFZ.js.map} +1 -1
  75. package/dist/client/internal-client.js +2 -2
  76. package/dist/database/index.js +2 -2
  77. package/dist/event-queue/index.js +6 -6
  78. package/dist/export/index.js +5 -5
  79. package/dist/feature-flags/index.js +2 -2
  80. package/dist/gateway/index.js +4 -4
  81. package/dist/gateway/security/index.js +2 -2
  82. package/dist/graph/index.js +8 -8
  83. package/dist/graphql/index.js +4 -4
  84. package/dist/graphql/services/index.js +2 -2
  85. package/dist/i18n/index.js +2 -2
  86. package/dist/{index-BtpoFSLa.d.ts → index-BLWIKXin.d.ts} +1 -1
  87. package/dist/{index-C0qWSC_Q.d.ts → index-hWpL68Vx.d.ts} +4 -2
  88. package/dist/index.d.ts +3 -3
  89. package/dist/index.js +43 -43
  90. package/dist/init/index.js +6 -6
  91. package/dist/instrumentation/index.d.ts +2 -2
  92. package/dist/instrumentation/index.js +2 -2
  93. package/dist/layer/index.js +2 -2
  94. package/dist/lifecycle/index.js +2 -2
  95. package/dist/logger/index.d.ts +1 -1
  96. package/dist/logger/index.js +1 -1
  97. package/dist/middleware/index.js +2 -2
  98. package/dist/notifications/index.js +2 -2
  99. package/dist/observability/index.js +2 -2
  100. package/dist/pino-logger-GJ2CYLD5.js +5 -0
  101. package/dist/{pino-logger-XF275Y5C.js.map → pino-logger-GJ2CYLD5.js.map} +1 -1
  102. package/dist/platform/index.js +2 -2
  103. package/dist/prisma/index.js +8 -8
  104. package/dist/rbac/index.js +2 -2
  105. package/dist/resource-caps/index.js +2 -2
  106. package/dist/server/index.js +6 -6
  107. package/dist/sharding/index.js +1 -1
  108. package/dist/sharing/index.js +2 -2
  109. package/dist/telemetry/index.d.ts +3 -3
  110. package/dist/telemetry/index.js +5 -5
  111. package/dist/temporal/index.js +2 -2
  112. package/dist/tracker/index.js +4 -4
  113. package/dist/workspace-guard-7PEZT3ZJ.js +5 -0
  114. package/dist/{workspace-guard-4BUG4ZP2.js.map → workspace-guard-7PEZT3ZJ.js.map} +1 -1
  115. package/package.json +1 -1
  116. package/dist/EventQueueFactory-ELT7NDXK.js +0 -7
  117. package/dist/chunk-CBZNP6RF.js.map +0 -1
  118. package/dist/pino-logger-XF275Y5C.js +0 -5
  119. package/dist/workspace-guard-4BUG4ZP2.js +0 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-WFVLQELZ.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n ConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export Graph Event Emitter (Redis Streams-backed).\nexport {\n GraphEventEmitterImpl,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `REDIS_URL` set → Redis Streams (the only supported backend since\n * the NATS retirement on 2026-05-16).\n * - `REDIS_URL` unset → in-memory (dev/test fallback).\n */\nexport function createPublisher(): IEventPublisher {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an event consumer from environment configuration.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n return new MemoryEventConsumer(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n if (process.env['REDIS_URL']) {\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using Redis Streams publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (REDIS_URL not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] Publisher disconnected`);\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to the Redis Streams event queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-FYH5IAPR.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n ConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export Graph Event Emitter (Redis Streams-backed).\nexport {\n GraphEventEmitterImpl,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `REDIS_URL` set → Redis Streams (the only supported backend since\n * the NATS retirement on 2026-05-16).\n * - `REDIS_URL` unset → in-memory (dev/test fallback).\n */\nexport function createPublisher(): IEventPublisher {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an event consumer from environment configuration.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n return new MemoryEventConsumer(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n if (process.env['REDIS_URL']) {\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using Redis Streams publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (REDIS_URL not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] Publisher disconnected`);\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to the Redis Streams event queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { isTokenExpired, parseJWT } from './chunk-B7I4TABG.js';
2
2
  import { AuthenticationError } from './chunk-QGBXVNRM.js';
3
- import { logger } from './chunk-CBZNP6RF.js';
3
+ import { logger } from './chunk-RU266375.js';
4
4
  import { __name } from './chunk-XE4OXN2W.js';
5
5
 
6
6
  // src/auth/cookie-helper.ts
@@ -272,5 +272,5 @@ var AuthModule = class {
272
272
  };
273
273
 
274
274
  export { AuthCookieHelper, AuthModule };
275
- //# sourceMappingURL=chunk-RXMOV3YE.js.map
276
- //# sourceMappingURL=chunk-RXMOV3YE.js.map
275
+ //# sourceMappingURL=chunk-GJWQK3IU.js.map
276
+ //# sourceMappingURL=chunk-GJWQK3IU.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":";;;;;;AAoBO,IAAMA,mBAAN,MAAMA;EApBb;;;AAqBE,EAAA,OAAwBC,mBAAAA,GAAsB,OAAA;AAC9C,EAAA,OAAwBC,oBAAAA,GAAuB,OAAA;AAC/C,EAAA,OAAwBC,iBAAAA,GAAoB,QAAA;;;;AAK5C,EAAA,OAAcC,cAAAA,CACZC,OAAAA,EACAC,MAAAA,EACAC,OAAAA,GAAwD,EAAC,EACnD;AACN,IAAA,MAAMC,MAAAA,GAASC,OAAAA,CAAQC,GAAAA,CAAI,UAAA,CAAA,KAAgB,YAAA;AAC3C,IAAA,MAAMC,MAAAA,GAASF,OAAAA,CAAQC,GAAAA,CAAI,eAAA,CAAA;AAG3B,IAAA,IAAA,CAAKE,UAAUP,OAAAA,EAAS;AACtBQ,MAAAA,IAAAA,EAAM,IAAA,CAAKZ,mBAAAA;AACXa,MAAAA,KAAAA,EAAOR,MAAAA,CAAOS,WAAAA;AACdC,MAAAA,MAAAA,EAAQ,EAAA,GAAK,EAAA;MACbC,QAAAA,EAAU,IAAA;MACVC,MAAAA,EAAQV,MAAAA;MACRW,QAAAA,EAAU,KAAA;AACVR,MAAAA,MAAAA;MACAS,IAAAA,EAAM;KACR,CAAA;AAGA,IAAA,IAAId,OAAOe,YAAAA,EAAc;AACvB,MAAA,IAAA,CAAKT,UAAUP,OAAAA,EAAS;AACtBQ,QAAAA,IAAAA,EAAM,IAAA,CAAKX,oBAAAA;AACXY,QAAAA,KAAAA,EAAOR,MAAAA,CAAOe,YAAAA;QACdL,MAAAA,EAAQT,OAAAA,CAAQe,aAAa,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;QAC/DL,QAAAA,EAAU,IAAA;QACVC,MAAAA,EAAQV,MAAAA;QACRW,QAAAA,EAAU,KAAA;AACVR,QAAAA,MAAAA;QACAS,IAAAA,EAAM;OACR,CAAA;AACF,IAAA;AAGA,IAAA,IAAIb,QAAQgB,SAAAA,EAAW;AACrB,MAAA,IAAA,CAAKX,UAAUP,OAAAA,EAAS;AACtBQ,QAAAA,IAAAA,EAAM,IAAA,CAAKV,iBAAAA;AACXW,QAAAA,KAAAA,EAAOP,OAAAA,CAAQgB,SAAAA;QACfP,MAAAA,EAAQ,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;QACvBC,QAAAA,EAAU,KAAA;QACVC,MAAAA,EAAQV,MAAAA;QACRW,QAAAA,EAAU,KAAA;AACVR,QAAAA,MAAAA;QACAS,IAAAA,EAAM;OACR,CAAA;AACF,IAAA;AACF,EAAA;;;;AAKA,EAAA,OAAcI,iBAAiBnB,OAAAA,EAA+B;AAC5D,IAAA,MAAMM,MAAAA,GAASF,OAAAA,CAAQC,GAAAA,CAAI,eAAA,CAAA;AAC3B,IAAA,MAAMF,MAAAA,GAASC,OAAAA,CAAQC,GAAAA,CAAI,UAAA,CAAA,KAAgB,YAAA;AAE3C,IAAA,MAAMe,YAAAA,GAAe;MACnBX,KAAAA,EAAO,EAAA;MACPE,MAAAA,EAAQ,CAAA;AACRL,MAAAA,MAAAA;MACAS,IAAAA,EAAM,GAAA;MACNF,MAAAA,EAAQV,MAAAA;MACRW,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,IAAA,CAAKP,UAAUP,OAAAA,EAAS;MAAE,GAAGoB,YAAAA;AAAcZ,MAAAA,IAAAA,EAAM,IAAA,CAAKZ,mBAAAA;MAAqBgB,QAAAA,EAAU;KAAK,CAAA;AAC1F,IAAA,IAAA,CAAKL,UAAUP,OAAAA,EAAS;MACtB,GAAGoB,YAAAA;AACHZ,MAAAA,IAAAA,EAAM,IAAA,CAAKX,oBAAAA;MACXe,QAAAA,EAAU,IAAA;MACVG,IAAAA,EAAM;KACR,CAAA;AACA,IAAA,IAAA,CAAKR,UAAUP,OAAAA,EAAS;MAAE,GAAGoB,YAAAA;AAAcZ,MAAAA,IAAAA,EAAM,IAAA,CAAKV,iBAAAA;MAAmBc,QAAAA,EAAU;KAAM,CAAA;AAC3F,EAAA;;;;EAKA,OAAeL,SAAAA,CAAUP,SAAyBE,OAAAA,EAA8B;AAC9E,IAAA,IAAImB,SAAS,CAAA,EAAGnB,OAAAA,CAAQM,IAAI,CAAA,CAAA,EAAIN,QAAQO,KAAK,CAAA,CAAA;AAE7C,IAAA,IAAIP,OAAAA,CAAQS,WAAWW,MAAAA,EAAW;AAChCD,MAAAA,MAAAA,IAAU,CAAA,UAAA,EAAanB,QAAQS,MAAM,CAAA,CAAA;AACvC,IAAA;AAEA,IAAA,IAAIT,QAAQI,MAAAA,EAAQ;AAClBe,MAAAA,MAAAA,IAAU,CAAA,SAAA,EAAYnB,QAAQI,MAAM,CAAA,CAAA;AACtC,IAAA;AAEA,IAAA,IAAIJ,QAAQa,IAAAA,EAAM;AAChBM,MAAAA,MAAAA,IAAU,CAAA,OAAA,EAAUnB,QAAQa,IAAI,CAAA,CAAA;AAClC,IAAA;AAEA,IAAA,IAAIb,QAAQU,QAAAA,EAAU;AACpBS,MAAAA,MAAAA,IAAU,YAAA;AACZ,IAAA;AAEA,IAAA,IAAInB,QAAQW,MAAAA,EAAQ;AAClBQ,MAAAA,MAAAA,IAAU,UAAA;AACZ,IAAA;AAEA,IAAA,IAAInB,QAAQY,QAAAA,EAAU;AACpBO,MAAAA,MAAAA,IAAU,CAAA,WAAA,EAAcnB,QAAQY,QAAQ,CAAA,CAAA;AAC1C,IAAA;AAEAd,IAAAA,OAAAA,CAAQuB,eAAAA,CAAgBC,MAAAA,CAAO,YAAA,EAAcH,MAAAA,CAAAA;AAC/C,EAAA;AACF;;;AC7FO,IAAMI,aAAN,MAAMA;EA1Cb;;;;;AA2CE,EAAA,WAAA,CACUC,QACA1B,OAAAA,EACR;SAFQ0B,MAAAA,GAAAA,MAAAA;SACA1B,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAa2B,YAAYC,KAAAA,EAA2C;AAClEC,IAAAA,MAAAA,CAAOC,MAAM,wBAAA,CAAA;AAGb,IAAA,IAAIC,cAAAA,CAAeH,KAAAA,CAAAA,EAAQ;AACzB,MAAA,OAAO;QACLI,KAAAA,EAAO,KAAA;QACPC,KAAAA,EAAO;AACT,OAAA;AACF,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQ;;;;;;;;;AAUd,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKT,MAAAA,CAAOQ,MAA0CA,KAAAA,EAAO;AAAEN,QAAAA;AAAM,OAAA,EAAG,KAAK5B,OAAO,CAAA;AAE3G6B,MAAAA,MAAAA,CAAOC,MAAM,kCAAA,EAAoC;AAAEE,QAAAA,KAAAA,EAAOG,SAASR,WAAAA,CAAYK;OAAM,CAAA;AAErF,MAAA,OAAOG,QAAAA,CAASR,WAAAA;AAClB,IAAA,CAAA,CAAA,OAASM,KAAAA,EAAO;AACdJ,MAAAA,MAAAA,CAAOI,MAAM,kCAAA,EAAoC;AAAEA,QAAAA;OAAM,CAAA;AACzD,MAAA,OAAO;QACLD,KAAAA,EAAO,KAAA;QACPC,KAAAA,EAAOA,KAAAA,YAAiBG,KAAAA,GAAQH,KAAAA,CAAMI,OAAAA,GAAU;AAClD,OAAA;AACF,IAAA;AACF,EAAA;;;;AAKOC,EAAAA,WAAAA,CAAYV,KAAAA,EAAoC;AACrD,IAAA,MAAMW,OAAAA,GAAUC,SAASZ,KAAAA,CAAAA;AACzB,IAAA,IAAI,CAACW,OAAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,OAAOA,OAAAA;AACT,EAAA;;;;AAKA,EAAA,MAAavB,aAAaA,YAAAA,EAAmD;AAC3Ea,IAAAA,MAAAA,CAAOC,MAAM,yBAAA,CAAA;AAEb,IAAA,MAAMW,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,IAAI;AACF,MAAA,MAAMN,QAAAA,GAAW,MAAM,IAAA,CAAKT,MAAAA,CAAOQ,MACjCO,QAAAA,EACA;AAAEzB,QAAAA;AAAa,OAAA,EACf,KAAKhB,OAAO,CAAA;AAGd6B,MAAAA,MAAAA,CAAOa,KAAK,qCAAA,CAAA;AAEZ,MAAA,OAAOP,QAAAA,CAASnB,YAAAA;AAClB,IAAA,CAAA,CAAA,OAASiB,KAAAA,EAAO;AACdJ,MAAAA,MAAAA,CAAOI,MAAM,6BAAA,EAA+B;AAAEA,QAAAA;OAAM,CAAA;AACpD,MAAA,MAAM,IAAIU,oBAAoB,yBAAA,EAA2B;QACvDV,KAAAA,EAAOA,KAAAA,YAAiBG,KAAAA,GAAQH,KAAAA,CAAMI,OAAAA,GAAU;OAClD,CAAA;AACF,IAAA;AACF,EAAA;;;;EAKA,MAAaO,kBAAAA,CAAmBC,MAAAA,EAAgBC,UAAAA,EAAoBC,UAAAA,EAAuC;AACzGlB,IAAAA,MAAAA,CAAOC,MAAM,8BAAA,EAAgC;AAAEe,MAAAA,MAAAA;AAAQC,MAAAA,UAAAA;AAAYC,MAAAA;KAAW,CAAA;AAE9E,IAAA,MAAMb,KAAAA,GAAQ;;;;;;;AAQd,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKT,MAAAA,CAAOQ,MAEhCA,KAAAA,EAAO;AAAEW,QAAAA,MAAAA;AAAQC,QAAAA,UAAAA;AAAYC,QAAAA;AAAW,OAAA,EAAG,KAAK/C,OAAO,CAAA;AAE1D6B,MAAAA,MAAAA,CAAOC,MAAM,qCAAA,EAAuC;AAClDkB,QAAAA,OAAAA,EAASb,SAASS,kBAAAA,CAAmBI;OACvC,CAAA;AAEA,MAAA,OAAOb,SAASS,kBAAAA,CAAmBI,OAAAA;AACrC,IAAA,CAAA,CAAA,OAASf,KAAAA,EAAO;AACdJ,MAAAA,MAAAA,CAAOI,MAAM,qCAAA,EAAuC;AAAEA,QAAAA;OAAM,CAAA;AAC5D,MAAA,OAAO,KAAA;AACT,IAAA;AACF,EAAA;;;;AAKOgB,EAAAA,YAAAA,CAAarB,KAAAA,EAAwB;AAC1C,IAAA,OAAO,CAACG,eAAeH,KAAAA,CAAAA;AACzB,EAAA;;;;AAKOsB,EAAAA,kBAAAA,CAAmBtB,KAAAA,EAA8B;AACtD,IAAA,MAAMW,OAAAA,GAAU,IAAA,CAAKD,WAAAA,CAAYV,KAAAA,CAAAA;AACjC,IAAA,OAAOW,SAASY,OAAAA,IAAW,IAAA;AAC7B,EAAA;;;;AAKOC,EAAAA,uBAAAA,CAAwBxB,KAAAA,EAA8B;AAC3D,IAAA,MAAMW,OAAAA,GAAU,IAAA,CAAKD,WAAAA,CAAYV,KAAAA,CAAAA;AACjC,IAAA,OAAOW,SAASc,YAAAA,IAAgB,IAAA;AAClC,EAAA;;;;AAKOC,EAAAA,cAAAA,CAAe1B,KAAAA,EAA+C;AACnE,IAAA,MAAMW,OAAAA,GAAUC,SAASZ,KAAAA,CAAAA;AACzB,IAAA,OAAOW,OAAAA;AACT,EAAA;;;;EAKOgB,cAAAA,CAAe3B,KAAAA,EAAe4B,gBAAwB,GAAA,EAAc;AACzE,IAAA,MAAMjB,OAAAA,GAAU,IAAA,CAAKD,WAAAA,CAAYV,KAAAA,CAAAA;AACjC,IAAA,IAAI,CAACW,OAAAA,IAAW,OAAOA,OAAAA,CAAQkB,QAAQ,QAAA,EAAU;AAC/C,MAAA,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,MAAMC,IAAAA,CAAKC,KAAAA,CAAMC,IAAAA,CAAKH,GAAAA,KAAQ,GAAA,CAAA;AACpC,IAAA,OAAOnB,OAAAA,CAAQkB,MAAMC,GAAAA,GAAMF,aAAAA;AAC7B,EAAA;AACF","file":"chunk-RXMOV3YE.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-GJWQK3IU.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,5 +1,5 @@
1
1
  import { ValidationError } from './chunk-QGBXVNRM.js';
2
- import { logger } from './chunk-CBZNP6RF.js';
2
+ import { logger } from './chunk-RU266375.js';
3
3
  import { __export, __name } from './chunk-XE4OXN2W.js';
4
4
 
5
5
  // src/notifications/tenant-notifications.ts
@@ -962,5 +962,5 @@ var NotificationsModule = class {
962
962
  };
963
963
 
964
964
  export { NotificationChannel2 as NotificationChannel, NotificationPriority, NotificationType2 as NotificationType, NotificationsModule, TenantNotificationsModule, tenant_notifications_exports };
965
- //# sourceMappingURL=chunk-TORD32GS.js.map
966
- //# sourceMappingURL=chunk-TORD32GS.js.map
965
+ //# sourceMappingURL=chunk-INAZ3PKF.js.map
966
+ //# sourceMappingURL=chunk-INAZ3PKF.js.map