@burdenoff/be-sdk 2026.510.79

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 (220) hide show
  1. package/README.md +173 -0
  2. package/configs/eslint/index.js +492 -0
  3. package/configs/tsconfig/tsconfig.json +53 -0
  4. package/dist/EventQueueFactory-6NMSGECR.js +8 -0
  5. package/dist/EventQueueFactory-6NMSGECR.js.map +1 -0
  6. package/dist/auth/index.d.ts +66 -0
  7. package/dist/auth/index.js +8 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/cache/index.d.ts +2 -0
  10. package/dist/cache/index.js +6 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/captcha/index.d.ts +1 -0
  13. package/dist/captcha/index.js +4 -0
  14. package/dist/captcha/index.js.map +1 -0
  15. package/dist/chunk-2HANKZZM.js +245 -0
  16. package/dist/chunk-2HANKZZM.js.map +1 -0
  17. package/dist/chunk-2SD5L2F2.js +816 -0
  18. package/dist/chunk-2SD5L2F2.js.map +1 -0
  19. package/dist/chunk-3O2RQOPV.js +1068 -0
  20. package/dist/chunk-3O2RQOPV.js.map +1 -0
  21. package/dist/chunk-4B43DZIS.js +560 -0
  22. package/dist/chunk-4B43DZIS.js.map +1 -0
  23. package/dist/chunk-4XAEES25.js +2444 -0
  24. package/dist/chunk-4XAEES25.js.map +1 -0
  25. package/dist/chunk-4XGGWW36.js +1405 -0
  26. package/dist/chunk-4XGGWW36.js.map +1 -0
  27. package/dist/chunk-5LXDPGDH.js +245 -0
  28. package/dist/chunk-5LXDPGDH.js.map +1 -0
  29. package/dist/chunk-AI7L22ZJ.js +472 -0
  30. package/dist/chunk-AI7L22ZJ.js.map +1 -0
  31. package/dist/chunk-CBZNP6RF.js +286 -0
  32. package/dist/chunk-CBZNP6RF.js.map +1 -0
  33. package/dist/chunk-ELLX3K54.js +613 -0
  34. package/dist/chunk-ELLX3K54.js.map +1 -0
  35. package/dist/chunk-F5XEAGHQ.js +1875 -0
  36. package/dist/chunk-F5XEAGHQ.js.map +1 -0
  37. package/dist/chunk-FNZEQOJY.js +628 -0
  38. package/dist/chunk-FNZEQOJY.js.map +1 -0
  39. package/dist/chunk-GTEMQXCA.js +516 -0
  40. package/dist/chunk-GTEMQXCA.js.map +1 -0
  41. package/dist/chunk-HIWTWIGQ.js +226 -0
  42. package/dist/chunk-HIWTWIGQ.js.map +1 -0
  43. package/dist/chunk-IYE2NTRX.js +764 -0
  44. package/dist/chunk-IYE2NTRX.js.map +1 -0
  45. package/dist/chunk-J26YGR2U.js +1484 -0
  46. package/dist/chunk-J26YGR2U.js.map +1 -0
  47. package/dist/chunk-JG2FTZPI.js +509 -0
  48. package/dist/chunk-JG2FTZPI.js.map +1 -0
  49. package/dist/chunk-JVBTNSPG.js +1551 -0
  50. package/dist/chunk-JVBTNSPG.js.map +1 -0
  51. package/dist/chunk-L7ZMN2FJ.js +12 -0
  52. package/dist/chunk-L7ZMN2FJ.js.map +1 -0
  53. package/dist/chunk-M5IMU3US.js +473 -0
  54. package/dist/chunk-M5IMU3US.js.map +1 -0
  55. package/dist/chunk-MLW2HPS5.js +1267 -0
  56. package/dist/chunk-MLW2HPS5.js.map +1 -0
  57. package/dist/chunk-MNCGUYLJ.js +269 -0
  58. package/dist/chunk-MNCGUYLJ.js.map +1 -0
  59. package/dist/chunk-MOCUBSTW.js +373 -0
  60. package/dist/chunk-MOCUBSTW.js.map +1 -0
  61. package/dist/chunk-NGMEI42S.js +103 -0
  62. package/dist/chunk-NGMEI42S.js.map +1 -0
  63. package/dist/chunk-NUB5GQTU.js +270 -0
  64. package/dist/chunk-NUB5GQTU.js.map +1 -0
  65. package/dist/chunk-OVSYMNCI.js +145 -0
  66. package/dist/chunk-OVSYMNCI.js.map +1 -0
  67. package/dist/chunk-QLVKMWFA.js +94 -0
  68. package/dist/chunk-QLVKMWFA.js.map +1 -0
  69. package/dist/chunk-SAG6ZYWQ.js +89 -0
  70. package/dist/chunk-SAG6ZYWQ.js.map +1 -0
  71. package/dist/chunk-SAK2JCA7.js +198 -0
  72. package/dist/chunk-SAK2JCA7.js.map +1 -0
  73. package/dist/chunk-SBS4S2PJ.js +100 -0
  74. package/dist/chunk-SBS4S2PJ.js.map +1 -0
  75. package/dist/chunk-SNEOLWXT.js +148 -0
  76. package/dist/chunk-SNEOLWXT.js.map +1 -0
  77. package/dist/chunk-TKBD2ONF.js +564 -0
  78. package/dist/chunk-TKBD2ONF.js.map +1 -0
  79. package/dist/chunk-UBXFIIAW.js +127 -0
  80. package/dist/chunk-UBXFIIAW.js.map +1 -0
  81. package/dist/chunk-VI4VSNTI.js +57 -0
  82. package/dist/chunk-VI4VSNTI.js.map +1 -0
  83. package/dist/chunk-VWCN5PMD.js +268 -0
  84. package/dist/chunk-VWCN5PMD.js.map +1 -0
  85. package/dist/chunk-XC2YD6CF.js +913 -0
  86. package/dist/chunk-XC2YD6CF.js.map +1 -0
  87. package/dist/chunk-XE4OXN2W.js +10 -0
  88. package/dist/chunk-XE4OXN2W.js.map +1 -0
  89. package/dist/chunk-YMZEUTD2.js +110 -0
  90. package/dist/chunk-YMZEUTD2.js.map +1 -0
  91. package/dist/chunk-Z4IRLBWO.js +758 -0
  92. package/dist/chunk-Z4IRLBWO.js.map +1 -0
  93. package/dist/client/internal-client.d.ts +7 -0
  94. package/dist/client/internal-client.js +5 -0
  95. package/dist/client/internal-client.js.map +1 -0
  96. package/dist/client-CSjIrYKS.d.ts +77 -0
  97. package/dist/config-UKE2E3BW.js +4 -0
  98. package/dist/config-UKE2E3BW.js.map +1 -0
  99. package/dist/crypto/index.d.ts +1 -0
  100. package/dist/crypto/index.js +4 -0
  101. package/dist/crypto/index.js.map +1 -0
  102. package/dist/database/index.d.ts +117 -0
  103. package/dist/database/index.js +7 -0
  104. package/dist/database/index.js.map +1 -0
  105. package/dist/dataloader/index.d.ts +1 -0
  106. package/dist/dataloader/index.js +4 -0
  107. package/dist/dataloader/index.js.map +1 -0
  108. package/dist/esm-K6H7EIWK.js +1450 -0
  109. package/dist/esm-K6H7EIWK.js.map +1 -0
  110. package/dist/event-queue/index.d.ts +6 -0
  111. package/dist/event-queue/index.js +10 -0
  112. package/dist/event-queue/index.js.map +1 -0
  113. package/dist/export/index.d.ts +2 -0
  114. package/dist/export/index.js +9 -0
  115. package/dist/export/index.js.map +1 -0
  116. package/dist/feature-flags/index.d.ts +1 -0
  117. package/dist/feature-flags/index.js +4 -0
  118. package/dist/feature-flags/index.js.map +1 -0
  119. package/dist/gateway/index.d.ts +4 -0
  120. package/dist/gateway/index.js +8 -0
  121. package/dist/gateway/index.js.map +1 -0
  122. package/dist/gateway/security/index.d.ts +2 -0
  123. package/dist/gateway/security/index.js +5 -0
  124. package/dist/gateway/security/index.js.map +1 -0
  125. package/dist/graph/index.d.ts +9 -0
  126. package/dist/graph/index.js +13 -0
  127. package/dist/graph/index.js.map +1 -0
  128. package/dist/graph-emitter-Bk0FqD53.d.ts +47 -0
  129. package/dist/graphql/index.d.ts +2 -0
  130. package/dist/graphql/index.js +7 -0
  131. package/dist/graphql/index.js.map +1 -0
  132. package/dist/graphql/services/index.d.ts +24 -0
  133. package/dist/graphql/services/index.js +5 -0
  134. package/dist/graphql/services/index.js.map +1 -0
  135. package/dist/graphql-BAVrUgBF.d.ts +22 -0
  136. package/dist/i18n/index.d.ts +2 -0
  137. package/dist/i18n/index.js +5 -0
  138. package/dist/i18n/index.js.map +1 -0
  139. package/dist/i18n-DA6IPnYy.d.ts +101 -0
  140. package/dist/index-4gKQKZ2B.d.ts +71 -0
  141. package/dist/index-B18rrFru.d.ts +42 -0
  142. package/dist/index-B70b5mYS.d.ts +33 -0
  143. package/dist/index-BMq3lFjj.d.ts +247 -0
  144. package/dist/index-BODgvRtL.d.ts +316 -0
  145. package/dist/index-BS2idbnr.d.ts +874 -0
  146. package/dist/index-BV3G48cH.d.ts +124 -0
  147. package/dist/index-CHbVw5M7.d.ts +73 -0
  148. package/dist/index-Cq_xNjcv.d.ts +602 -0
  149. package/dist/index-CrQgidpx.d.ts +77 -0
  150. package/dist/index-CyVEg86m.d.ts +309 -0
  151. package/dist/index-DOcBnmMe.d.ts +166 -0
  152. package/dist/index-DSOpj8DI.d.ts +17 -0
  153. package/dist/index-DW9q22GH.d.ts +75 -0
  154. package/dist/index-DlFDFyWD.d.ts +55 -0
  155. package/dist/index-DoK0bjhH.d.ts +607 -0
  156. package/dist/index-Dtf6FBaD.d.ts +199 -0
  157. package/dist/index-KVWGHMbS.d.ts +415 -0
  158. package/dist/index-PaojfSdd.d.ts +71 -0
  159. package/dist/index-RU_M5c74.d.ts +163 -0
  160. package/dist/index-UhkH2eaB.d.ts +192 -0
  161. package/dist/index-e_18DzAg.d.ts +18 -0
  162. package/dist/index-jOuh_TKn.d.ts +59 -0
  163. package/dist/index.d.ts +584 -0
  164. package/dist/index.js +2626 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/init/index.d.ts +2 -0
  167. package/dist/init/index.js +12 -0
  168. package/dist/init/index.js.map +1 -0
  169. package/dist/instrumentation/index.d.ts +3 -0
  170. package/dist/instrumentation/index.js +5 -0
  171. package/dist/instrumentation/index.js.map +1 -0
  172. package/dist/layer/index.d.ts +2 -0
  173. package/dist/layer/index.js +6 -0
  174. package/dist/layer/index.js.map +1 -0
  175. package/dist/layer-DDip18KY.d.ts +67 -0
  176. package/dist/logger/index.d.ts +2 -0
  177. package/dist/logger/index.js +4 -0
  178. package/dist/logger/index.js.map +1 -0
  179. package/dist/middleware/index.d.ts +3 -0
  180. package/dist/middleware/index.js +5 -0
  181. package/dist/middleware/index.js.map +1 -0
  182. package/dist/notifications/index.d.ts +4 -0
  183. package/dist/notifications/index.js +7 -0
  184. package/dist/notifications/index.js.map +1 -0
  185. package/dist/observability/index.d.ts +3 -0
  186. package/dist/observability/index.js +5 -0
  187. package/dist/observability/index.js.map +1 -0
  188. package/dist/pino-logger-RYLGXPHZ.js +5 -0
  189. package/dist/pino-logger-RYLGXPHZ.js.map +1 -0
  190. package/dist/prisma/generator/index.d.ts +1 -0
  191. package/dist/prisma/generator/index.js +228 -0
  192. package/dist/prisma/generator/index.js.map +1 -0
  193. package/dist/prisma/index.d.ts +5 -0
  194. package/dist/prisma/index.js +12 -0
  195. package/dist/prisma/index.js.map +1 -0
  196. package/dist/prisma-extension-krXnYnrN.d.ts +30 -0
  197. package/dist/rbac/index.d.ts +116 -0
  198. package/dist/rbac/index.js +7 -0
  199. package/dist/rbac/index.js.map +1 -0
  200. package/dist/sdk-THO3IWEE.js +136 -0
  201. package/dist/sdk-THO3IWEE.js.map +1 -0
  202. package/dist/server/index.d.ts +359 -0
  203. package/dist/server/index.js +884 -0
  204. package/dist/server/index.js.map +1 -0
  205. package/dist/telemetry/index.d.ts +83 -0
  206. package/dist/telemetry/index.js +209 -0
  207. package/dist/telemetry/index.js.map +1 -0
  208. package/dist/temporal/index.d.ts +148 -0
  209. package/dist/temporal/index.js +6 -0
  210. package/dist/temporal/index.js.map +1 -0
  211. package/dist/tracker/index.d.ts +5 -0
  212. package/dist/tracker/index.js +9 -0
  213. package/dist/tracker/index.js.map +1 -0
  214. package/dist/types-Bo2wkjSP.d.ts +35 -0
  215. package/dist/utils/index.d.ts +1 -0
  216. package/dist/utils/index.js +4 -0
  217. package/dist/utils/index.js.map +1 -0
  218. package/dist/workspace-guard-LHBNK4TG.js +5 -0
  219. package/dist/workspace-guard-LHBNK4TG.js.map +1 -0
  220. package/package.json +241 -0
@@ -0,0 +1,613 @@
1
+ import { EventQueueFactory } from './chunk-3O2RQOPV.js';
2
+ import { logger } from './chunk-CBZNP6RF.js';
3
+ import { __name } from './chunk-XE4OXN2W.js';
4
+ import { randomUUID } from 'crypto';
5
+
6
+ var MemoryEventBus = class {
7
+ static {
8
+ __name(this, "MemoryEventBus");
9
+ }
10
+ handlers = /* @__PURE__ */ new Map();
11
+ /**
12
+ * Emit an event to all handlers
13
+ */
14
+ emit(event, data) {
15
+ const eventHandlers = this.handlers.get(event);
16
+ if (eventHandlers) {
17
+ eventHandlers.forEach((handler) => {
18
+ void Promise.resolve(handler(data));
19
+ });
20
+ }
21
+ for (const [pattern, handlers] of this.handlers) {
22
+ if (this.matchesPattern(event, pattern)) {
23
+ handlers.forEach((handler) => {
24
+ void Promise.resolve(handler(data));
25
+ });
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Register a handler for an event
31
+ */
32
+ on(event, handler) {
33
+ if (!this.handlers.has(event)) {
34
+ this.handlers.set(event, /* @__PURE__ */ new Set());
35
+ }
36
+ this.handlers.get(event).add(handler);
37
+ }
38
+ /**
39
+ * Remove a handler for an event
40
+ */
41
+ off(event, handler) {
42
+ const eventHandlers = this.handlers.get(event);
43
+ if (eventHandlers) {
44
+ eventHandlers.delete(handler);
45
+ }
46
+ }
47
+ /**
48
+ * Check if pattern matches event (supports wildcards)
49
+ */
50
+ matchesPattern(event, pattern) {
51
+ if (pattern === event) return false;
52
+ if (pattern.endsWith(".*")) {
53
+ const prefix = pattern.slice(0, -2);
54
+ return event.startsWith(prefix + ".");
55
+ }
56
+ if (pattern.endsWith(".>")) {
57
+ const prefix = pattern.slice(0, -2);
58
+ return event.startsWith(prefix + ".");
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * Clear all handlers
64
+ */
65
+ clear() {
66
+ this.handlers.clear();
67
+ }
68
+ };
69
+ var MemoryEventQueue = class {
70
+ static {
71
+ __name(this, "MemoryEventQueue");
72
+ }
73
+ queue = [];
74
+ processing = false;
75
+ handlers = /* @__PURE__ */ new Map();
76
+ maxRetries;
77
+ retryDelay;
78
+ constructor(options) {
79
+ this.maxRetries = options?.maxRetries ?? 3;
80
+ this.retryDelay = options?.retryDelay ?? 1e3;
81
+ }
82
+ /**
83
+ * Publish entity event (implements GraphEventEmitter)
84
+ */
85
+ async publishEntityEvent(eventType, entity, context) {
86
+ const subject = `graph.${context.productName}.${entity.type}.${eventType.split(".")[1]}`;
87
+ logger.debug("[MemoryEventQueue] Publishing entity event", {
88
+ eventType,
89
+ entityId: entity.id,
90
+ entityType: entity.type,
91
+ subject
92
+ });
93
+ this.enqueue(subject, {
94
+ eventType,
95
+ entity,
96
+ context
97
+ });
98
+ }
99
+ /**
100
+ * Add an event to the queue
101
+ */
102
+ enqueue(subject, data, metadata = {}) {
103
+ const id = `evt_${Date.now()}_${randomUUID().slice(0, 8)}`;
104
+ const event = {
105
+ id,
106
+ subject,
107
+ data,
108
+ metadata,
109
+ timestamp: /* @__PURE__ */ new Date(),
110
+ retries: 0,
111
+ maxRetries: this.maxRetries
112
+ };
113
+ this.queue.push(event);
114
+ void this.processQueue();
115
+ return id;
116
+ }
117
+ /**
118
+ * Register a handler for a subject
119
+ */
120
+ registerHandler(subject, handler) {
121
+ this.handlers.set(subject, handler);
122
+ }
123
+ /**
124
+ * Process the queue
125
+ */
126
+ async processQueue() {
127
+ if (this.processing || this.queue.length === 0) {
128
+ return;
129
+ }
130
+ this.processing = true;
131
+ while (this.queue.length > 0) {
132
+ const event = this.queue.shift();
133
+ if (!event) continue;
134
+ const handler = this.handlers.get(event.subject);
135
+ if (handler) {
136
+ try {
137
+ const ackEvent = {
138
+ id: event.id,
139
+ subject: event.subject,
140
+ data: event.data,
141
+ metadata: {
142
+ correlationId: event.id,
143
+ ...event.metadata
144
+ },
145
+ timestamp: event.timestamp.toISOString(),
146
+ ack: /* @__PURE__ */ __name(async () => {
147
+ logger.debug("[MemoryEventQueue] Event acknowledged", {
148
+ id: event.id
149
+ });
150
+ }, "ack"),
151
+ nak: /* @__PURE__ */ __name(async () => {
152
+ logger.debug("[MemoryEventQueue] Event negatively acknowledged", {
153
+ id: event.id
154
+ });
155
+ if (event.retries < event.maxRetries) {
156
+ event.retries++;
157
+ this.queue.push(event);
158
+ }
159
+ }, "nak"),
160
+ term: /* @__PURE__ */ __name(async () => {
161
+ logger.debug("[MemoryEventQueue] Event terminated", {
162
+ id: event.id
163
+ });
164
+ }, "term"),
165
+ isRedelivered: /* @__PURE__ */ __name(() => event.retries > 0, "isRedelivered"),
166
+ getDeliveryAttempt: /* @__PURE__ */ __name(() => event.retries + 1, "getDeliveryAttempt")
167
+ };
168
+ await handler(ackEvent);
169
+ } catch {
170
+ if (event.retries < event.maxRetries) {
171
+ event.retries++;
172
+ await new Promise((resolve) => setTimeout(resolve, this.retryDelay));
173
+ this.queue.push(event);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ this.processing = false;
179
+ }
180
+ /**
181
+ * Get queue length
182
+ */
183
+ get length() {
184
+ return this.queue.length;
185
+ }
186
+ /**
187
+ * Clear the queue
188
+ */
189
+ clear() {
190
+ this.queue = [];
191
+ }
192
+ /**
193
+ * Publish an event (fire-and-forget)
194
+ */
195
+ async publish(subject, data, metadata = {}) {
196
+ this.enqueue(subject, data, metadata);
197
+ logger.debug("[MemoryEventQueue] Published event", {
198
+ subject
199
+ });
200
+ }
201
+ /**
202
+ * Close the event queue
203
+ */
204
+ async close() {
205
+ this.clear();
206
+ this.handlers.clear();
207
+ logger.debug("[MemoryEventQueue] Event queue closed");
208
+ }
209
+ };
210
+ var MemoryEventPublisher = class {
211
+ static {
212
+ __name(this, "MemoryEventPublisher");
213
+ }
214
+ queue;
215
+ _connected = false;
216
+ publishCount = 0;
217
+ constructor() {
218
+ this.queue = new MemoryEventQueue();
219
+ }
220
+ async connect() {
221
+ this._connected = true;
222
+ logger.info("[MemoryEventPublisher] Connected (in-memory mode)");
223
+ }
224
+ async disconnect() {
225
+ await this.queue.close();
226
+ this._connected = false;
227
+ logger.info("[MemoryEventPublisher] Disconnected");
228
+ }
229
+ isConnected() {
230
+ return this._connected;
231
+ }
232
+ async ensureStream() {
233
+ logger.debug("[MemoryEventPublisher] ensureStream called (no-op for in-memory)");
234
+ }
235
+ async publish(options) {
236
+ if (!this._connected) {
237
+ throw new Error("Publisher not connected");
238
+ }
239
+ const messageId = this.queue.enqueue(options.subject, options.data, options.metadata);
240
+ this.publishCount++;
241
+ logger.debug("[MemoryEventPublisher] Published", {
242
+ subject: options.subject,
243
+ messageId
244
+ });
245
+ return messageId;
246
+ }
247
+ async publishBatch(events) {
248
+ const messageIds = [];
249
+ for (const event of events) {
250
+ const id = await this.publish(event);
251
+ messageIds.push(id);
252
+ }
253
+ return messageIds;
254
+ }
255
+ async publishWithAck(options) {
256
+ await this.publish({
257
+ subject: options.subject,
258
+ data: options.data,
259
+ metadata: options.metadata
260
+ });
261
+ return {};
262
+ }
263
+ async healthCheck() {
264
+ return {
265
+ status: this._connected ? "healthy" : "unhealthy",
266
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
267
+ connected: this._connected,
268
+ latencyMs: 0
269
+ };
270
+ }
271
+ async getStatistics() {
272
+ return {
273
+ messagesPublished: this.publishCount,
274
+ messagesConsumed: 0,
275
+ messagesPending: this.queue.length,
276
+ messagesFailed: 0
277
+ };
278
+ }
279
+ /**
280
+ * Get the underlying queue (for testing/debugging)
281
+ */
282
+ getQueue() {
283
+ return this.queue;
284
+ }
285
+ };
286
+ var MemoryEventConsumer = class {
287
+ static {
288
+ __name(this, "MemoryEventConsumer");
289
+ }
290
+ streamName;
291
+ consumerName;
292
+ queue;
293
+ bus;
294
+ _connected = false;
295
+ _subscriptions = /* @__PURE__ */ new Map();
296
+ consumeCount = 0;
297
+ subIdCounter = 0;
298
+ constructor(streamName, consumerName) {
299
+ this.streamName = streamName;
300
+ this.consumerName = consumerName;
301
+ this.queue = new MemoryEventQueue();
302
+ this.bus = new MemoryEventBus();
303
+ }
304
+ async connect() {
305
+ this._connected = true;
306
+ logger.info("[MemoryEventConsumer] Connected (in-memory mode)", {
307
+ stream: this.streamName,
308
+ consumer: this.consumerName
309
+ });
310
+ }
311
+ async disconnect() {
312
+ for (const sub of this._subscriptions.values()) {
313
+ await sub.unsubscribe();
314
+ }
315
+ this._subscriptions.clear();
316
+ await this.queue.close();
317
+ this.bus.clear();
318
+ this._connected = false;
319
+ logger.info("[MemoryEventConsumer] Disconnected");
320
+ }
321
+ isConnected() {
322
+ return this._connected;
323
+ }
324
+ async ensureStream() {
325
+ logger.debug("[MemoryEventConsumer] ensureStream called (no-op for in-memory)");
326
+ }
327
+ async ensureConsumer() {
328
+ logger.debug("[MemoryEventConsumer] ensureConsumer called (no-op for in-memory)");
329
+ }
330
+ async subscribe(options) {
331
+ if (!this._connected) {
332
+ throw new Error("Consumer not connected");
333
+ }
334
+ const { subject, handler } = options;
335
+ const subId = `sub_${++this.subIdCounter}`;
336
+ let messagesReceived = 0;
337
+ let messagesProcessed = 0;
338
+ let messagesFailed = 0;
339
+ let lastActivity = (/* @__PURE__ */ new Date()).toISOString();
340
+ let active = true;
341
+ this.queue.registerHandler(subject, async (event) => {
342
+ messagesReceived++;
343
+ lastActivity = (/* @__PURE__ */ new Date()).toISOString();
344
+ try {
345
+ this.consumeCount++;
346
+ await handler(event);
347
+ messagesProcessed++;
348
+ } catch {
349
+ messagesFailed++;
350
+ }
351
+ });
352
+ this.bus.on(subject, async (data) => {
353
+ messagesReceived++;
354
+ lastActivity = (/* @__PURE__ */ new Date()).toISOString();
355
+ try {
356
+ this.consumeCount++;
357
+ await handler(data);
358
+ messagesProcessed++;
359
+ } catch {
360
+ messagesFailed++;
361
+ }
362
+ });
363
+ const subscription = {
364
+ id: subId,
365
+ subject,
366
+ unsubscribe: /* @__PURE__ */ __name(async () => {
367
+ active = false;
368
+ this._subscriptions.delete(subId);
369
+ logger.debug("[MemoryEventConsumer] Unsubscribed", {
370
+ subject
371
+ });
372
+ }, "unsubscribe"),
373
+ isActive: /* @__PURE__ */ __name(() => active, "isActive"),
374
+ getStats: /* @__PURE__ */ __name(() => ({
375
+ messagesReceived,
376
+ messagesProcessed,
377
+ messagesFailed,
378
+ lastActivity
379
+ }), "getStats")
380
+ };
381
+ this._subscriptions.set(subId, subscription);
382
+ logger.info("[MemoryEventConsumer] Subscribed", {
383
+ subject,
384
+ subscriptionId: subId
385
+ });
386
+ return subscription;
387
+ }
388
+ async subscribeMultiple(subjects, handler) {
389
+ const subscriptions = [];
390
+ for (const subject of subjects) {
391
+ const sub = await this.subscribe({
392
+ subject,
393
+ handler
394
+ });
395
+ subscriptions.push(sub);
396
+ }
397
+ return subscriptions;
398
+ }
399
+ async pull() {
400
+ logger.debug("[MemoryEventConsumer] pull called (returning empty for in-memory)");
401
+ return [];
402
+ }
403
+ async unsubscribeAll() {
404
+ for (const sub of this._subscriptions.values()) {
405
+ await sub.unsubscribe();
406
+ }
407
+ this._subscriptions.clear();
408
+ }
409
+ getSubscriptions() {
410
+ return Array.from(this._subscriptions.values());
411
+ }
412
+ async processDLQ(_handler) {
413
+ logger.debug("[MemoryEventConsumer] processDLQ called (no-op for in-memory)");
414
+ }
415
+ // eslint-disable-next-line sonarjs/no-identical-functions -- Same implementation needed for both Publisher and Consumer
416
+ async healthCheck() {
417
+ return {
418
+ status: this._connected ? "healthy" : "unhealthy",
419
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
420
+ connected: this._connected,
421
+ latencyMs: 0
422
+ };
423
+ }
424
+ async getStatistics() {
425
+ return {
426
+ messagesPublished: 0,
427
+ messagesConsumed: this.consumeCount,
428
+ messagesPending: this.queue.length,
429
+ messagesFailed: 0
430
+ };
431
+ }
432
+ /**
433
+ * Get the underlying bus (for testing/debugging)
434
+ */
435
+ getBus() {
436
+ return this.bus;
437
+ }
438
+ /**
439
+ * Get the underlying queue (for testing/debugging)
440
+ */
441
+ getQueue() {
442
+ return this.queue;
443
+ }
444
+ };
445
+ function createMemoryPublisher() {
446
+ return new MemoryEventPublisher();
447
+ }
448
+ __name(createMemoryPublisher, "createMemoryPublisher");
449
+ function createMemoryConsumer(stream, consumer) {
450
+ return new MemoryEventConsumer(stream, consumer);
451
+ }
452
+ __name(createMemoryConsumer, "createMemoryConsumer");
453
+ function createGraphEventEmitter() {
454
+ return new MemoryEventQueue();
455
+ }
456
+ __name(createGraphEventEmitter, "createGraphEventEmitter");
457
+
458
+ // src/event-queue/graph-emitter.ts
459
+ var uuidv4 = /* @__PURE__ */ __name(() => crypto.randomUUID(), "uuidv4");
460
+ var NatsGraphEventEmitter = class {
461
+ static {
462
+ __name(this, "NatsGraphEventEmitter");
463
+ }
464
+ publisher;
465
+ connected = false;
466
+ connecting = null;
467
+ constructor() {
468
+ const graphNatsUrl = process.env["GRAPH_NATS_URL"];
469
+ const natsServers = graphNatsUrl || process.env["NATS_SERVERS"] || process.env["NATS_URL"];
470
+ if (natsServers) {
471
+ const originalNatsServers = process.env["NATS_SERVERS"];
472
+ if (graphNatsUrl) {
473
+ process.env["NATS_SERVERS"] = graphNatsUrl;
474
+ logger.info("[NatsGraphEventEmitter] Using GRAPH_NATS_URL for graph events", {
475
+ url: graphNatsUrl
476
+ });
477
+ } else if (!process.env["NATS_SERVERS"] && process.env["NATS_URL"]) {
478
+ process.env["NATS_SERVERS"] = process.env["NATS_URL"];
479
+ }
480
+ this.publisher = EventQueueFactory.createPublisherFromEnv();
481
+ if (graphNatsUrl && originalNatsServers !== void 0) {
482
+ process.env["NATS_SERVERS"] = originalNatsServers;
483
+ } else if (graphNatsUrl) {
484
+ delete process.env["NATS_SERVERS"];
485
+ }
486
+ logger.info("[NatsGraphEventEmitter] Using NATS publisher");
487
+ } else {
488
+ this.publisher = new MemoryEventPublisher();
489
+ logger.info("[NatsGraphEventEmitter] Using in-memory publisher (NATS not configured)");
490
+ }
491
+ }
492
+ /**
493
+ * Ensure publisher is connected
494
+ */
495
+ async ensureConnected() {
496
+ if (this.connected) {
497
+ return;
498
+ }
499
+ if (this.connecting) {
500
+ await this.connecting;
501
+ return;
502
+ }
503
+ this.connecting = this.publisher.connect().then(() => {
504
+ this.connected = true;
505
+ this.connecting = null;
506
+ logger.info("[NatsGraphEventEmitter] Publisher connected");
507
+ });
508
+ await this.connecting;
509
+ }
510
+ /**
511
+ * Publish entity event to graph queue
512
+ *
513
+ * @param eventType - The lifecycle event type
514
+ * @param entity - Entity data (id, type, data)
515
+ * @param context - Event context (product, org, user, workspace)
516
+ * @param rbac - Optional RBAC metadata. When present, the RBAC consumer will
517
+ * create/update/delete resources. When absent, only graph consumer processes.
518
+ */
519
+ async publishEntityEvent(eventType, entity, context, rbac) {
520
+ await this.ensureConnected();
521
+ const eventId = uuidv4();
522
+ const action = eventType.split(".")[1];
523
+ const subject = `graph.${context.productName}.${entity.type}.${action}`;
524
+ logger.debug("[NatsGraphEventEmitter] Publishing entity event", {
525
+ eventId,
526
+ eventType,
527
+ entityId: entity.id,
528
+ entityType: entity.type,
529
+ subject,
530
+ hasRbac: !!rbac
531
+ });
532
+ const streamName = "WSPACE_GRAPH_EVENTS";
533
+ const streamSubjects = [
534
+ "graph.>"
535
+ ];
536
+ await this.publisher.publish({
537
+ subject,
538
+ data: {
539
+ eventId,
540
+ eventType,
541
+ productSource: context.productName,
542
+ organizationId: context.organizationId,
543
+ entity,
544
+ context: {
545
+ actorId: context.actorId,
546
+ workspaceId: context.workspaceId
547
+ },
548
+ // Include RBAC metadata when configured (consumed by rbac-entity-consumer)
549
+ ...rbac && {
550
+ rbac
551
+ },
552
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
553
+ },
554
+ metadata: {
555
+ eventId,
556
+ productName: context.productName,
557
+ organizationId: context.organizationId,
558
+ actorId: context.actorId,
559
+ workspaceId: context.workspaceId,
560
+ entityType: entity.type,
561
+ entityId: entity.id
562
+ },
563
+ options: {
564
+ stream: streamName,
565
+ streamSubjects
566
+ }
567
+ });
568
+ }
569
+ /**
570
+ * Disconnect the publisher
571
+ */
572
+ async disconnect() {
573
+ if (this.connected) {
574
+ await this.publisher.disconnect();
575
+ this.connected = false;
576
+ logger.info("[NatsGraphEventEmitter] Publisher disconnected");
577
+ }
578
+ }
579
+ /**
580
+ * Get health check status
581
+ */
582
+ async healthCheck() {
583
+ const result = await this.publisher.healthCheck();
584
+ const isHealthy = result.status === "healthy";
585
+ return {
586
+ healthy: isHealthy,
587
+ message: result.error || (isHealthy ? "Healthy" : "Unhealthy")
588
+ };
589
+ }
590
+ };
591
+ var _graphEventEmitter = null;
592
+ function getGraphEventEmitter() {
593
+ if (!_graphEventEmitter) {
594
+ _graphEventEmitter = new NatsGraphEventEmitter();
595
+ }
596
+ return _graphEventEmitter;
597
+ }
598
+ __name(getGraphEventEmitter, "getGraphEventEmitter");
599
+ function createGraphEventEmitter2() {
600
+ return new NatsGraphEventEmitter();
601
+ }
602
+ __name(createGraphEventEmitter2, "createGraphEventEmitter");
603
+ async function resetGraphEventEmitter() {
604
+ if (_graphEventEmitter) {
605
+ await _graphEventEmitter.disconnect();
606
+ _graphEventEmitter = null;
607
+ }
608
+ }
609
+ __name(resetGraphEventEmitter, "resetGraphEventEmitter");
610
+
611
+ export { MemoryEventBus, MemoryEventConsumer, MemoryEventPublisher, MemoryEventQueue, NatsGraphEventEmitter, createGraphEventEmitter, createGraphEventEmitter2, createMemoryConsumer, createMemoryPublisher, getGraphEventEmitter, resetGraphEventEmitter };
612
+ //# sourceMappingURL=chunk-ELLX3K54.js.map
613
+ //# sourceMappingURL=chunk-ELLX3K54.js.map