@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,1068 @@
1
+ import { QueueType } from './chunk-L7ZMN2FJ.js';
2
+ import { NatsConnectionManager } from './chunk-OVSYMNCI.js';
3
+ import { DEFAULT_LAYER_RESOURCES } from './chunk-NGMEI42S.js';
4
+ import { logger } from './chunk-CBZNP6RF.js';
5
+ import { __name } from './chunk-XE4OXN2W.js';
6
+ import { RetentionPolicy, StorageType, AckPolicy, DeliverPolicy, headers } from 'nats';
7
+
8
+ // src/event-queue/implementations/nats/trace-context.ts
9
+ var otelApiPromise = null;
10
+ async function loadOtelApi() {
11
+ if (otelApiPromise) {
12
+ return otelApiPromise;
13
+ }
14
+ otelApiPromise = (async () => {
15
+ try {
16
+ const mod = await import('./esm-K6H7EIWK.js');
17
+ return mod;
18
+ } catch {
19
+ logger.debug("[trace-context] @opentelemetry/api not available; NATS traces disabled");
20
+ return null;
21
+ }
22
+ })();
23
+ return otelApiPromise;
24
+ }
25
+ __name(loadOtelApi, "loadOtelApi");
26
+ var setter = {
27
+ set(carrier, key, value) {
28
+ carrier[key] = value;
29
+ }
30
+ };
31
+ var getter = {
32
+ get(carrier, key) {
33
+ return carrier[key];
34
+ },
35
+ keys(carrier) {
36
+ return Object.keys(carrier);
37
+ }
38
+ };
39
+ async function injectW3CTraceContext(hdrs) {
40
+ const api = await loadOtelApi();
41
+ if (!api) return;
42
+ try {
43
+ const carrier = {};
44
+ api.propagation.inject(api.context.active(), carrier, setter);
45
+ for (const [key, value] of Object.entries(carrier)) {
46
+ if (value) hdrs.set(key, value);
47
+ }
48
+ } catch (err) {
49
+ logger.debug("[trace-context] injection failed", {
50
+ error: err instanceof Error ? err.message : String(err)
51
+ });
52
+ }
53
+ }
54
+ __name(injectW3CTraceContext, "injectW3CTraceContext");
55
+ async function extractW3CTraceContext(hdrs) {
56
+ const api = await loadOtelApi();
57
+ if (!api || !hdrs) return void 0;
58
+ try {
59
+ const carrier = {};
60
+ for (const key of [
61
+ "traceparent",
62
+ "tracestate",
63
+ "baggage"
64
+ ]) {
65
+ const value = hdrs.get(key);
66
+ if (value) carrier[key] = value;
67
+ }
68
+ return api.propagation.extract(api.context.active(), carrier, getter);
69
+ } catch (err) {
70
+ logger.debug("[trace-context] extraction failed", {
71
+ error: err instanceof Error ? err.message : String(err)
72
+ });
73
+ return void 0;
74
+ }
75
+ }
76
+ __name(extractW3CTraceContext, "extractW3CTraceContext");
77
+ async function runWithConsumerSpan(subject, hdrs, handler) {
78
+ const api = await loadOtelApi();
79
+ if (!api) return handler();
80
+ try {
81
+ const parentCtx = await extractW3CTraceContext(hdrs);
82
+ const tracer = api.trace.getTracer("@burdenoff/be-sdk/nats");
83
+ return await new Promise((resolve, reject) => {
84
+ tracer.startActiveSpan(`nats.consume ${subject}`, {
85
+ kind: 5,
86
+ attributes: {
87
+ "messaging.system": "nats",
88
+ "messaging.destination.name": subject
89
+ }
90
+ }, parentCtx, async (span) => {
91
+ try {
92
+ const result = await handler();
93
+ span.setStatus({
94
+ code: 1
95
+ });
96
+ span.end();
97
+ resolve(result);
98
+ } catch (err) {
99
+ span.recordException(err);
100
+ span.setStatus({
101
+ code: 2,
102
+ message: err instanceof Error ? err.message : String(err)
103
+ });
104
+ span.end();
105
+ reject(err);
106
+ }
107
+ });
108
+ });
109
+ } catch (err) {
110
+ logger.debug("[trace-context] consumer span failed to start; running without span", {
111
+ error: err instanceof Error ? err.message : String(err)
112
+ });
113
+ return handler();
114
+ }
115
+ }
116
+ __name(runWithConsumerSpan, "runWithConsumerSpan");
117
+ var NatsSubscription = class NatsSubscription2 {
118
+ static {
119
+ __name(this, "NatsSubscription");
120
+ }
121
+ id;
122
+ subject;
123
+ stopFn;
124
+ active = true;
125
+ stats = {
126
+ messagesReceived: 0,
127
+ messagesProcessed: 0,
128
+ messagesFailed: 0,
129
+ lastActivity: (/* @__PURE__ */ new Date()).toISOString()
130
+ };
131
+ constructor(id, subject, stopFn) {
132
+ this.id = id;
133
+ this.subject = subject;
134
+ this.stopFn = stopFn;
135
+ }
136
+ async unsubscribe() {
137
+ if (!this.active) {
138
+ return Promise.resolve();
139
+ }
140
+ this.active = false;
141
+ this.stopFn();
142
+ return Promise.resolve();
143
+ }
144
+ isActive() {
145
+ return this.active;
146
+ }
147
+ getStats() {
148
+ return {
149
+ messagesReceived: this.stats.messagesReceived,
150
+ messagesProcessed: this.stats.messagesProcessed,
151
+ messagesFailed: this.stats.messagesFailed,
152
+ lastActivity: this.stats.lastActivity
153
+ };
154
+ }
155
+ incrementReceived() {
156
+ this.stats.messagesReceived++;
157
+ this.stats.lastActivity = (/* @__PURE__ */ new Date()).toISOString();
158
+ }
159
+ incrementProcessed() {
160
+ this.stats.messagesProcessed++;
161
+ this.stats.lastActivity = (/* @__PURE__ */ new Date()).toISOString();
162
+ }
163
+ incrementFailed() {
164
+ this.stats.messagesFailed++;
165
+ this.stats.lastActivity = (/* @__PURE__ */ new Date()).toISOString();
166
+ }
167
+ };
168
+ var NatsEventConsumer = class {
169
+ static {
170
+ __name(this, "NatsEventConsumer");
171
+ }
172
+ config;
173
+ connectionManager;
174
+ subscriptions = /* @__PURE__ */ new Map();
175
+ constructor(config) {
176
+ this.config = config;
177
+ const baseConfig = {
178
+ type: config.type || "nats",
179
+ url: config.url || "nats://localhost:4222",
180
+ user: config.user,
181
+ password: config.password,
182
+ token: config.token,
183
+ maxReconnectAttempts: config.maxReconnectAttempts,
184
+ reconnectTimeWait: config.reconnectTimeWait,
185
+ connectionTimeout: config.connectionTimeout,
186
+ name: config.name
187
+ };
188
+ this.connectionManager = new NatsConnectionManager(baseConfig);
189
+ }
190
+ /**
191
+ * Connect to NATS server
192
+ */
193
+ async connect() {
194
+ await this.connectionManager.connect();
195
+ }
196
+ /**
197
+ * Disconnect from NATS server
198
+ */
199
+ async disconnect() {
200
+ await this.unsubscribeAll();
201
+ await this.connectionManager.disconnect();
202
+ }
203
+ /**
204
+ * Check if connected
205
+ */
206
+ isConnected() {
207
+ return this.connectionManager.isConnected();
208
+ }
209
+ /**
210
+ * Health check
211
+ */
212
+ async healthCheck() {
213
+ await Promise.resolve();
214
+ const isConnected = this.isConnected();
215
+ return {
216
+ status: isConnected ? "healthy" : "unhealthy",
217
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
218
+ connected: isConnected,
219
+ details: {
220
+ type: "nats",
221
+ url: this.config.url,
222
+ activeSubscriptions: this.subscriptions.size
223
+ }
224
+ };
225
+ }
226
+ /**
227
+ * Get queue statistics
228
+ */
229
+ async getStatistics() {
230
+ await Promise.resolve();
231
+ let totalReceived = 0;
232
+ let totalProcessed = 0;
233
+ let totalFailed = 0;
234
+ let lastActivity = null;
235
+ for (const subscription of this.subscriptions.values()) {
236
+ const stats = subscription.getStats();
237
+ totalReceived += stats.messagesReceived;
238
+ totalProcessed += stats.messagesProcessed;
239
+ totalFailed += stats.messagesFailed;
240
+ if (stats.lastActivity && (!lastActivity || stats.lastActivity > lastActivity)) {
241
+ lastActivity = stats.lastActivity;
242
+ }
243
+ }
244
+ return {
245
+ messagesPublished: 0,
246
+ messagesConsumed: totalProcessed,
247
+ messagesFailed: totalFailed,
248
+ activeConsumers: this.subscriptions.size,
249
+ activePublishers: 0,
250
+ queueSize: 0,
251
+ lastActivity,
252
+ details: {
253
+ totalReceived,
254
+ type: "nats"
255
+ }
256
+ };
257
+ }
258
+ /**
259
+ * Ensure a stream exists
260
+ */
261
+ async ensureStream(config) {
262
+ const jsm = this.connectionManager.getJetStreamManager();
263
+ try {
264
+ try {
265
+ await jsm.streams.info(config.name);
266
+ logger.debug("[NatsEventConsumer] Stream already exists", {
267
+ stream: config.name
268
+ });
269
+ return;
270
+ } catch {
271
+ }
272
+ const streamConfig = {
273
+ name: config.name,
274
+ subjects: config.subjects,
275
+ retention: this.mapRetentionPolicy(config.retention),
276
+ storage: this.mapStorageType(config.storage),
277
+ max_consumers: config.maxConsumers,
278
+ max_msgs: config.maxMsgs,
279
+ max_bytes: config.maxBytes,
280
+ max_age: config.maxAge,
281
+ duplicate_window: config.duplicateWindow
282
+ };
283
+ await jsm.streams.add(streamConfig);
284
+ logger.info("[NatsEventConsumer] Stream created successfully", {
285
+ stream: config.name,
286
+ subjects: config.subjects
287
+ });
288
+ } catch (error) {
289
+ logger.error("[NatsEventConsumer] Failed to ensure stream", {
290
+ stream: config.name,
291
+ error: error instanceof Error ? error.message : "Unknown error"
292
+ });
293
+ throw error;
294
+ }
295
+ }
296
+ /**
297
+ * Ensure a consumer exists
298
+ */
299
+ async ensureConsumer(config) {
300
+ const jsm = this.connectionManager.getJetStreamManager();
301
+ try {
302
+ await jsm.consumers.add(config.stream, {
303
+ name: config.consumer,
304
+ durable_name: config.consumer,
305
+ filter_subject: config.filterSubject,
306
+ ack_policy: this.mapAckPolicy(config.ackPolicy),
307
+ deliver_policy: this.mapDeliverPolicy(config.deliverPolicy),
308
+ max_deliver: config.maxDeliver || 3,
309
+ ack_wait: config.ackWait || 3e10,
310
+ max_ack_pending: config.maxAckPending || 100
311
+ });
312
+ logger.info("[NatsEventConsumer] Consumer created successfully", {
313
+ stream: config.stream,
314
+ consumer: config.consumer
315
+ });
316
+ } catch (error) {
317
+ if (error instanceof Error && error.message?.includes("already exists")) {
318
+ logger.debug("[NatsEventConsumer] Consumer already exists", {
319
+ stream: config.stream,
320
+ consumer: config.consumer
321
+ });
322
+ } else {
323
+ logger.error("[NatsEventConsumer] Failed to ensure consumer", {
324
+ stream: config.stream,
325
+ consumer: config.consumer,
326
+ error: error instanceof Error ? error.message : "Unknown error"
327
+ });
328
+ throw error;
329
+ }
330
+ }
331
+ }
332
+ /**
333
+ * Derive stream subject pattern from subscription subject
334
+ * Examples:
335
+ * - "channel.conversation.message" → ["channel.>"]
336
+ * - "wspace.tags.created" → ["wspace.>"]
337
+ * - "global.auth.login" → ["global.>"]
338
+ */
339
+ deriveStreamSubjects(subject) {
340
+ const firstSegment = subject.split(".")[0];
341
+ if (firstSegment) {
342
+ return [
343
+ `${firstSegment}.>`
344
+ ];
345
+ }
346
+ return [
347
+ `${subject.replace(/\.[^.]+$/, ".>")}`
348
+ ];
349
+ }
350
+ /**
351
+ * Subscribe to a subject
352
+ */
353
+ async subscribe(options) {
354
+ const js = this.connectionManager.getJetStream();
355
+ try {
356
+ const streamName = options.options?.stream || this.config.stream;
357
+ const consumerName = options.options?.consumer || `${this.config.consumer}-${options.subject.replace(/\./g, "-")}`;
358
+ const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);
359
+ await this.ensureStream({
360
+ name: streamName,
361
+ subjects: streamSubjects,
362
+ retention: options.options?.retention || "limits",
363
+ storage: options.options?.storage || "file"
364
+ });
365
+ await this.ensureConsumer({
366
+ type: this.config.type,
367
+ url: this.config.url,
368
+ consumer: consumerName,
369
+ stream: streamName,
370
+ filterSubject: options.subject,
371
+ ackPolicy: options.options?.ackPolicy,
372
+ deliverPolicy: options.options?.deliverPolicy,
373
+ maxDeliver: options.options?.maxDeliver || this.config.maxDeliver,
374
+ ackWait: options.options?.ackWait || this.config.ackWait,
375
+ maxAckPending: options.options?.maxAckPending
376
+ });
377
+ const consumer = await js.consumers.get(streamName, consumerName);
378
+ const subscriptionId = `sub_${Date.now()}_${crypto.randomUUID().substring(0, 7)}`;
379
+ let stopRequested = false;
380
+ const stopFn = /* @__PURE__ */ __name(() => {
381
+ stopRequested = true;
382
+ }, "stopFn");
383
+ const subscription = new NatsSubscription(subscriptionId, options.subject, stopFn);
384
+ this.subscriptions.set(subscriptionId, subscription);
385
+ this.consumeMessages(consumer, subscription, options.handler, options.options?.maxConcurrent || this.config.maxConcurrent || 1, () => stopRequested).catch((error) => {
386
+ logger.error("[NatsEventConsumer] Error in message consumption loop", {
387
+ subject: options.subject,
388
+ error: error instanceof Error ? error.message : "Unknown error"
389
+ });
390
+ });
391
+ logger.info("[NatsEventConsumer] Subscription created", {
392
+ subscriptionId,
393
+ subject: options.subject
394
+ });
395
+ return subscription;
396
+ } catch (error) {
397
+ logger.error("[NatsEventConsumer] Failed to subscribe", {
398
+ subject: options.subject,
399
+ error: error instanceof Error ? error.message : "Unknown error"
400
+ });
401
+ throw error;
402
+ }
403
+ }
404
+ /**
405
+ * Subscribe to multiple subjects
406
+ */
407
+ async subscribeMultiple(subjects, handler, options) {
408
+ const subscriptions = [];
409
+ for (const subject of subjects) {
410
+ const subscription = await this.subscribe({
411
+ subject,
412
+ handler,
413
+ options
414
+ });
415
+ subscriptions.push(subscription);
416
+ }
417
+ return subscriptions;
418
+ }
419
+ /**
420
+ * Pull messages manually
421
+ */
422
+ async pull(options) {
423
+ const js = this.connectionManager.getJetStream();
424
+ try {
425
+ const consumer = await js.consumers.get(this.config.stream, this.config.consumer);
426
+ const messages = await consumer.fetch({
427
+ max_messages: options.batch || 10,
428
+ expires: options.timeout || 3e4
429
+ });
430
+ const events = [];
431
+ for await (const msg of messages) {
432
+ const event = this.wrapMessage(msg);
433
+ events.push(event);
434
+ }
435
+ return events;
436
+ } catch (error) {
437
+ logger.error("[NatsEventConsumer] Failed to pull messages", {
438
+ subject: options.subject,
439
+ error: error instanceof Error ? error.message : "Unknown error"
440
+ });
441
+ throw error;
442
+ }
443
+ }
444
+ /**
445
+ * Unsubscribe from all active subscriptions
446
+ */
447
+ async unsubscribeAll() {
448
+ const unsubscribePromises = Array.from(this.subscriptions.values()).map(async (subscription) => subscription.unsubscribe());
449
+ await Promise.all(unsubscribePromises);
450
+ this.subscriptions.clear();
451
+ logger.info("[NatsEventConsumer] All subscriptions unsubscribed");
452
+ }
453
+ /**
454
+ * Get all active subscriptions
455
+ */
456
+ getSubscriptions() {
457
+ return Array.from(this.subscriptions.values());
458
+ }
459
+ /**
460
+ * Process pending messages in dead letter queue
461
+ */
462
+ async processDLQ(_handler) {
463
+ await Promise.resolve();
464
+ logger.warn("[NatsEventConsumer] DLQ processing not yet implemented");
465
+ }
466
+ /**
467
+ * List subjects for the configured stream
468
+ */
469
+ async listSubjects(streamName) {
470
+ const jsm = this.connectionManager.getJetStreamManager();
471
+ const info = await jsm.streams.info(streamName || this.config.stream);
472
+ return info.config.subjects || [];
473
+ }
474
+ /**
475
+ * Consume messages from consumer
476
+ */
477
+ async consumeMessages(consumer, subscription, handler, maxConcurrent, stopRequested) {
478
+ try {
479
+ const messages = await consumer.consume({
480
+ max_messages: maxConcurrent,
481
+ expires: 3e4
482
+ });
483
+ for await (const msg of messages) {
484
+ if (stopRequested()) {
485
+ break;
486
+ }
487
+ subscription.incrementReceived();
488
+ try {
489
+ const event = this.wrapMessage(msg);
490
+ await runWithConsumerSpan(msg.subject, msg.headers, async () => handler(event));
491
+ subscription.incrementProcessed();
492
+ } catch (error) {
493
+ subscription.incrementFailed();
494
+ logger.error("[NatsEventConsumer] Error processing message", {
495
+ subject: msg.subject,
496
+ error: error instanceof Error ? error.message : "Unknown error"
497
+ });
498
+ msg.nak();
499
+ }
500
+ }
501
+ } catch (error) {
502
+ logger.error("[NatsEventConsumer] Error consuming messages", {
503
+ error: error instanceof Error ? error.message : "Unknown error"
504
+ });
505
+ }
506
+ }
507
+ /**
508
+ * Wrap NATS message in AcknowledgeableEvent
509
+ */
510
+ wrapMessage(msg) {
511
+ const eventMessage = JSON.parse(msg.data.toString());
512
+ return {
513
+ ...eventMessage,
514
+ sequence: msg.seq,
515
+ ack: /* @__PURE__ */ __name(async () => {
516
+ await Promise.resolve();
517
+ msg.ack();
518
+ }, "ack"),
519
+ nak: /* @__PURE__ */ __name(async (delay) => {
520
+ await Promise.resolve();
521
+ if (delay) {
522
+ msg.nak(delay);
523
+ } else {
524
+ msg.nak();
525
+ }
526
+ }, "nak"),
527
+ term: /* @__PURE__ */ __name(async () => {
528
+ await Promise.resolve();
529
+ msg.term();
530
+ }, "term"),
531
+ isRedelivered: /* @__PURE__ */ __name(() => {
532
+ return msg.redelivered;
533
+ }, "isRedelivered"),
534
+ getDeliveryAttempt: /* @__PURE__ */ __name(() => {
535
+ return msg.info.deliveryCount;
536
+ }, "getDeliveryAttempt")
537
+ };
538
+ }
539
+ /**
540
+ * Map retention policy string to NATS enum
541
+ */
542
+ mapRetentionPolicy(policy) {
543
+ switch (policy?.toLowerCase()) {
544
+ case "limits":
545
+ return RetentionPolicy.Limits;
546
+ case "interest":
547
+ return RetentionPolicy.Interest;
548
+ case "workqueue":
549
+ default:
550
+ return RetentionPolicy.Workqueue;
551
+ }
552
+ }
553
+ /**
554
+ * Map storage type string to NATS enum
555
+ */
556
+ mapStorageType(storage) {
557
+ switch (storage?.toLowerCase()) {
558
+ case "memory":
559
+ return StorageType.Memory;
560
+ case "file":
561
+ default:
562
+ return StorageType.File;
563
+ }
564
+ }
565
+ /**
566
+ * Map ack policy string to NATS enum
567
+ */
568
+ mapAckPolicy(policy) {
569
+ switch (policy?.toLowerCase()) {
570
+ case "none":
571
+ return AckPolicy.None;
572
+ case "all":
573
+ return AckPolicy.All;
574
+ case "explicit":
575
+ default:
576
+ return AckPolicy.Explicit;
577
+ }
578
+ }
579
+ /**
580
+ * Map deliver policy string to NATS enum
581
+ */
582
+ mapDeliverPolicy(policy) {
583
+ switch (policy?.toLowerCase()) {
584
+ case "new":
585
+ return DeliverPolicy.New;
586
+ case "last":
587
+ return DeliverPolicy.Last;
588
+ case "lastpersubject":
589
+ return DeliverPolicy.LastPerSubject;
590
+ case "all":
591
+ default:
592
+ return DeliverPolicy.All;
593
+ }
594
+ }
595
+ };
596
+ var NatsEventPublisher = class {
597
+ static {
598
+ __name(this, "NatsEventPublisher");
599
+ }
600
+ config;
601
+ connectionManager;
602
+ publishCount = 0;
603
+ lastPublishTime = null;
604
+ constructor(config) {
605
+ this.config = config;
606
+ this.connectionManager = new NatsConnectionManager(config);
607
+ }
608
+ /**
609
+ * Connect to NATS server
610
+ */
611
+ async connect() {
612
+ await this.connectionManager.connect();
613
+ }
614
+ /**
615
+ * Disconnect from NATS server
616
+ */
617
+ async disconnect() {
618
+ await this.connectionManager.disconnect();
619
+ }
620
+ /**
621
+ * Check if connected
622
+ */
623
+ isConnected() {
624
+ return this.connectionManager.isConnected();
625
+ }
626
+ /**
627
+ * Health check
628
+ */
629
+ async healthCheck() {
630
+ await Promise.resolve();
631
+ const isConnected = this.isConnected();
632
+ return {
633
+ status: isConnected ? "healthy" : "unhealthy",
634
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
635
+ details: {
636
+ connected: isConnected,
637
+ type: "nats",
638
+ url: this.config.url
639
+ }
640
+ };
641
+ }
642
+ /**
643
+ * Get queue statistics
644
+ */
645
+ async getStatistics() {
646
+ const jsm = this.connectionManager.getJetStreamManager();
647
+ try {
648
+ const streams = await jsm.streams.list().next();
649
+ const streamCount = streams.length;
650
+ return {
651
+ messagesPublished: this.publishCount,
652
+ messagesConsumed: 0,
653
+ messagesFailed: 0,
654
+ activeConsumers: 0,
655
+ activePublishers: 1,
656
+ queueSize: 0,
657
+ lastActivity: this.lastPublishTime?.toISOString() || null,
658
+ details: {
659
+ streamCount,
660
+ type: "nats"
661
+ }
662
+ };
663
+ } catch (error) {
664
+ logger.error("[NatsEventPublisher] Failed to get statistics", {
665
+ error: error instanceof Error ? error.message : "Unknown error"
666
+ });
667
+ throw error;
668
+ }
669
+ }
670
+ /**
671
+ * Ensure a stream exists
672
+ */
673
+ async ensureStream(config) {
674
+ const jsm = this.connectionManager.getJetStreamManager();
675
+ try {
676
+ try {
677
+ await jsm.streams.info(config.name);
678
+ logger.debug("[NatsEventPublisher] Stream already exists", {
679
+ stream: config.name
680
+ });
681
+ return;
682
+ } catch {
683
+ }
684
+ const streamConfig = {
685
+ name: config.name,
686
+ subjects: config.subjects,
687
+ retention: this.mapRetentionPolicy(config.retention),
688
+ storage: this.mapStorageType(config.storage),
689
+ max_consumers: config.maxConsumers,
690
+ max_msgs: config.maxMsgs,
691
+ max_bytes: config.maxBytes,
692
+ max_age: config.maxAge,
693
+ duplicate_window: config.duplicateWindow
694
+ };
695
+ await jsm.streams.add(streamConfig);
696
+ logger.info("[NatsEventPublisher] Stream created successfully", {
697
+ stream: config.name,
698
+ subjects: config.subjects
699
+ });
700
+ } catch (error) {
701
+ logger.error("[NatsEventPublisher] Failed to ensure stream", {
702
+ stream: config.name,
703
+ error: error instanceof Error ? error.message : "Unknown error"
704
+ });
705
+ throw error;
706
+ }
707
+ }
708
+ /**
709
+ * Derive stream subject pattern from subscription subject
710
+ * Examples:
711
+ * - "channel.conversation.message" → ["channel.>"]
712
+ * - "wspace.tags.created" → ["wspace.>"]
713
+ * - "global.auth.login" → ["global.>"]
714
+ */
715
+ deriveStreamSubjects(subject) {
716
+ const firstSegment = subject.split(".")[0];
717
+ if (firstSegment) {
718
+ return [
719
+ `${firstSegment}.>`
720
+ ];
721
+ }
722
+ return [
723
+ `${subject.replace(/\.[^.]+$/, ".>")}`
724
+ ];
725
+ }
726
+ /**
727
+ * Derive stream name from subject
728
+ * Examples:
729
+ * - "channel.conversation.message" → "CHANNEL_EVENTS"
730
+ * - "wspace.tags.created" → "WSPACE_EVENTS"
731
+ * - "global.auth.login" → "GLOBAL_EVENTS"
732
+ */
733
+ deriveStreamName(subject) {
734
+ const firstSegment = subject.split(".")[0];
735
+ if (firstSegment) {
736
+ return `${firstSegment.toUpperCase()}_EVENTS`;
737
+ }
738
+ return "EVENTS";
739
+ }
740
+ /**
741
+ * Publish an event to a subject
742
+ */
743
+ async publish(options) {
744
+ const js = this.connectionManager.getJetStream();
745
+ try {
746
+ const streamName = options.options?.stream || this.deriveStreamName(options.subject);
747
+ const streamSubjects = options.options?.streamSubjects || this.deriveStreamSubjects(options.subject);
748
+ await this.ensureStream({
749
+ name: streamName,
750
+ subjects: streamSubjects,
751
+ retention: options.options?.retention || "limits",
752
+ storage: options.options?.storage || "file"
753
+ });
754
+ const message = {
755
+ id: options.options?.messageId || this.generateMessageId(),
756
+ subject: options.subject,
757
+ data: options.data,
758
+ metadata: {
759
+ source: options.metadata?.source || "workspaces-backend",
760
+ correlationId: options.metadata?.correlationId || this.generateCorrelationId(),
761
+ userId: options.metadata?.userId,
762
+ workspaceId: options.metadata?.workspaceId,
763
+ priority: options.options?.priority || this.config.defaultPriority || "normal",
764
+ ...options.metadata
765
+ },
766
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
767
+ };
768
+ const hdrs = headers();
769
+ hdrs.set("message-id", message.id);
770
+ hdrs.set("correlation-id", message.metadata.correlationId);
771
+ if (message.metadata.source) {
772
+ hdrs.set("source", message.metadata.source);
773
+ }
774
+ if (message.metadata["priority"] && typeof message.metadata["priority"] === "string") {
775
+ hdrs.set("priority", message.metadata["priority"]);
776
+ }
777
+ if (message.metadata.userId) {
778
+ hdrs.set("user-id", message.metadata.userId);
779
+ }
780
+ if (message.metadata.workspaceId) {
781
+ hdrs.set("workspace-id", message.metadata.workspaceId);
782
+ }
783
+ await injectW3CTraceContext(hdrs);
784
+ const publishOpts = {
785
+ msgID: this.config.enableDeduplication ? message.id : void 0,
786
+ headers: hdrs
787
+ };
788
+ if (options.options?.ttl) {
789
+ logger.warn("[NatsEventPublisher] Per-message TTL not supported in NATS", {
790
+ subject: options.subject,
791
+ ttl: options.options.ttl
792
+ });
793
+ }
794
+ if (options.options?.delay) {
795
+ logger.warn("[NatsEventPublisher] Message delay not supported in NATS", {
796
+ subject: options.subject,
797
+ delay: options.options.delay
798
+ });
799
+ }
800
+ const ack = await js.publish(options.subject, JSON.stringify(message), publishOpts);
801
+ this.publishCount++;
802
+ this.lastPublishTime = /* @__PURE__ */ new Date();
803
+ logger.debug("[NatsEventPublisher] Event published", {
804
+ subject: options.subject,
805
+ messageId: message.id,
806
+ sequence: ack.seq
807
+ });
808
+ return ack.seq;
809
+ } catch (error) {
810
+ logger.error("[NatsEventPublisher] Failed to publish event", {
811
+ subject: options.subject,
812
+ error: error instanceof Error ? error.message : "Unknown error"
813
+ });
814
+ throw error;
815
+ }
816
+ }
817
+ /**
818
+ * Publish multiple events in a batch
819
+ */
820
+ async publishBatch(events) {
821
+ const results = [];
822
+ for (const event of events) {
823
+ const seq = await this.publish(event);
824
+ results.push(seq);
825
+ }
826
+ return results;
827
+ }
828
+ /**
829
+ * Publish an event and wait for acknowledgment
830
+ * Note: This is not natively supported by NATS JetStream
831
+ * Would require implementing request-reply pattern
832
+ */
833
+ async publishWithAck(options) {
834
+ const nc = this.connectionManager.getNatsConnection();
835
+ try {
836
+ const message = {
837
+ id: this.generateMessageId(),
838
+ subject: options.subject,
839
+ data: options.data,
840
+ metadata: {
841
+ source: options.metadata?.source || "workspaces-backend",
842
+ correlationId: options.metadata?.correlationId || this.generateCorrelationId(),
843
+ userId: options.metadata?.userId,
844
+ workspaceId: options.metadata?.workspaceId,
845
+ ...options.metadata
846
+ },
847
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
848
+ };
849
+ const response = await nc.request(options.subject, JSON.stringify(message), {
850
+ timeout: options.timeout || 3e4
851
+ });
852
+ const result = JSON.parse(response.data.toString());
853
+ logger.debug("[NatsEventPublisher] Event published with ack", {
854
+ subject: options.subject,
855
+ messageId: message.id
856
+ });
857
+ return result;
858
+ } catch (error) {
859
+ logger.error("[NatsEventPublisher] Failed to publish event with ack", {
860
+ subject: options.subject,
861
+ error: error instanceof Error ? error.message : "Unknown error"
862
+ });
863
+ throw error;
864
+ }
865
+ }
866
+ /**
867
+ * Map retention policy string to NATS enum
868
+ */
869
+ mapRetentionPolicy(policy) {
870
+ switch (policy?.toLowerCase()) {
871
+ case "limits":
872
+ return RetentionPolicy.Limits;
873
+ case "interest":
874
+ return RetentionPolicy.Interest;
875
+ case "workqueue":
876
+ default:
877
+ return RetentionPolicy.Workqueue;
878
+ }
879
+ }
880
+ /**
881
+ * Map storage type string to NATS enum
882
+ */
883
+ mapStorageType(storage) {
884
+ switch (storage?.toLowerCase()) {
885
+ case "memory":
886
+ return StorageType.Memory;
887
+ case "file":
888
+ default:
889
+ return StorageType.File;
890
+ }
891
+ }
892
+ /**
893
+ * Generate unique message ID
894
+ */
895
+ generateMessageId() {
896
+ return `msg_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;
897
+ }
898
+ /**
899
+ * Generate correlation ID
900
+ */
901
+ generateCorrelationId() {
902
+ return `corr_${Date.now()}_${crypto.randomUUID().substring(0, 13)}`;
903
+ }
904
+ };
905
+
906
+ // src/event-queue/factory/EventQueueFactory.ts
907
+ var EventQueueFactory = class _EventQueueFactory {
908
+ static {
909
+ __name(this, "EventQueueFactory");
910
+ }
911
+ /**
912
+ * Create an event publisher based on configuration
913
+ */
914
+ static createPublisher(config) {
915
+ logger.info("[EventQueueFactory] Creating event publisher", {
916
+ type: config.type,
917
+ url: config.url
918
+ });
919
+ if (config.type === QueueType.NATS) {
920
+ return new NatsEventPublisher(config);
921
+ }
922
+ throw new Error(`Unsupported queue type: ${config.type}`);
923
+ }
924
+ /**
925
+ * Create an event consumer based on configuration
926
+ */
927
+ static createConsumer(config) {
928
+ logger.info("[EventQueueFactory] Creating event consumer", {
929
+ type: config.type,
930
+ url: config.url,
931
+ stream: config.stream,
932
+ consumer: config.consumer
933
+ });
934
+ if (config.type === QueueType.NATS) {
935
+ return new NatsEventConsumer(config);
936
+ }
937
+ throw new Error(`Unsupported queue type: ${config.type}`);
938
+ }
939
+ /**
940
+ * Create a publisher from environment variables
941
+ */
942
+ static createPublisherFromEnv() {
943
+ const config = {
944
+ type: process.env["QUEUE_TYPE"] || QueueType.NATS,
945
+ url: process.env["NATS_URL"] || "nats://localhost:4222",
946
+ user: process.env["NATS_USER"],
947
+ password: process.env["NATS_PASSWORD"],
948
+ token: process.env["NATS_TOKEN"],
949
+ name: process.env["QUEUE_CLIENT_NAME"] || "workspaces-backend-publisher",
950
+ maxReconnectAttempts: process.env["NATS_MAX_RECONNECT_ATTEMPTS"] ? parseInt(process.env["NATS_MAX_RECONNECT_ATTEMPTS"], 10) : -1,
951
+ reconnectTimeWait: process.env["NATS_RECONNECT_TIME_WAIT"] ? parseInt(process.env["NATS_RECONNECT_TIME_WAIT"], 10) : 2e3,
952
+ enableDeduplication: process.env["QUEUE_ENABLE_DEDUPLICATION"] === "true",
953
+ defaultPriority: process.env["QUEUE_DEFAULT_PRIORITY"] || "normal",
954
+ defaultTTL: process.env["QUEUE_DEFAULT_TTL"] ? parseInt(process.env["QUEUE_DEFAULT_TTL"], 10) : void 0
955
+ };
956
+ return _EventQueueFactory.createPublisher(config);
957
+ }
958
+ /**
959
+ * Create a consumer from environment variables
960
+ */
961
+ static createConsumerFromEnv(stream, consumer) {
962
+ const config = {
963
+ type: process.env["QUEUE_TYPE"] || QueueType.NATS,
964
+ url: process.env["NATS_URL"] || "nats://localhost:4222",
965
+ user: process.env["NATS_USER"],
966
+ password: process.env["NATS_PASSWORD"],
967
+ token: process.env["NATS_TOKEN"],
968
+ name: process.env["QUEUE_CLIENT_NAME"] || "workspaces-workers-consumer",
969
+ maxReconnectAttempts: process.env["NATS_MAX_RECONNECT_ATTEMPTS"] ? parseInt(process.env["NATS_MAX_RECONNECT_ATTEMPTS"], 10) : -1,
970
+ reconnectTimeWait: process.env["NATS_RECONNECT_TIME_WAIT"] ? parseInt(process.env["NATS_RECONNECT_TIME_WAIT"], 10) : 2e3,
971
+ stream,
972
+ consumer,
973
+ maxConcurrent: process.env["QUEUE_MAX_CONCURRENT"] ? parseInt(process.env["QUEUE_MAX_CONCURRENT"], 10) : 5,
974
+ maxDeliver: process.env["QUEUE_MAX_DELIVER"] ? parseInt(process.env["QUEUE_MAX_DELIVER"], 10) : 3,
975
+ ackWait: process.env["QUEUE_ACK_WAIT"] ? parseInt(process.env["QUEUE_ACK_WAIT"], 10) * 1e9 : 3e10
976
+ };
977
+ return _EventQueueFactory.createConsumer(config);
978
+ }
979
+ // ========================================================================
980
+ // Layer-Aware Factory Methods
981
+ // ========================================================================
982
+ /**
983
+ * Create a publisher for a specific layer
984
+ *
985
+ * @param layer - Service layer ('wspace' or 'global')
986
+ * @param serviceName - Service name for identification
987
+ * @returns Publisher configured for the layer
988
+ *
989
+ * @example
990
+ * ```typescript
991
+ * const publisher = EventQueueFactory.createPublisherForLayer('wspace', 'wspace-tags-svc');
992
+ * await publisher.connect();
993
+ * await publisher.publish({ subject: 'wspace.tags.created', data: { id: '123' } });
994
+ * ```
995
+ */
996
+ static createPublisherForLayer(layer, serviceName) {
997
+ const envPrefix = layer.toUpperCase();
998
+ const defaults = DEFAULT_LAYER_RESOURCES[layer];
999
+ const config = {
1000
+ type: QueueType.NATS,
1001
+ url: process.env[`${envPrefix}_NATS_URL`] || process.env["NATS_URL"] || defaults.natsUrl,
1002
+ user: process.env["NATS_USER"],
1003
+ password: process.env["NATS_PASSWORD"],
1004
+ token: process.env["NATS_TOKEN"],
1005
+ name: serviceName,
1006
+ maxReconnectAttempts: process.env["NATS_MAX_RECONNECT_ATTEMPTS"] ? parseInt(process.env["NATS_MAX_RECONNECT_ATTEMPTS"], 10) : -1,
1007
+ reconnectTimeWait: process.env["NATS_RECONNECT_TIME_WAIT"] ? parseInt(process.env["NATS_RECONNECT_TIME_WAIT"], 10) : 2e3,
1008
+ enableDeduplication: process.env["QUEUE_ENABLE_DEDUPLICATION"] === "true",
1009
+ defaultPriority: process.env["QUEUE_DEFAULT_PRIORITY"] || "normal",
1010
+ defaultTTL: process.env["QUEUE_DEFAULT_TTL"] ? parseInt(process.env["QUEUE_DEFAULT_TTL"], 10) : void 0
1011
+ };
1012
+ logger.info("[EventQueueFactory] Creating layer publisher", {
1013
+ layer,
1014
+ serviceName,
1015
+ url: config.url
1016
+ });
1017
+ return _EventQueueFactory.createPublisher(config);
1018
+ }
1019
+ /**
1020
+ * Create a consumer for a specific layer
1021
+ *
1022
+ * @param layer - Service layer ('wspace' or 'global')
1023
+ * @param serviceName - Service name for identification
1024
+ * @param stream - NATS stream name
1025
+ * @param consumer - Consumer name
1026
+ * @returns Consumer configured for the layer
1027
+ *
1028
+ * @example
1029
+ * ```typescript
1030
+ * const consumer = EventQueueFactory.createConsumerForLayer(
1031
+ * 'wspace', 'wspace-tags-svc', 'WSPACE_EVENTS', 'tags-consumer'
1032
+ * );
1033
+ * await consumer.connect();
1034
+ * await consumer.consume(async (msg) => { console.log(msg); });
1035
+ * ```
1036
+ */
1037
+ static createConsumerForLayer(layer, serviceName, stream, consumer) {
1038
+ const envPrefix = layer.toUpperCase();
1039
+ const defaults = DEFAULT_LAYER_RESOURCES[layer];
1040
+ const config = {
1041
+ type: QueueType.NATS,
1042
+ url: process.env[`${envPrefix}_NATS_URL`] || process.env["NATS_URL"] || defaults.natsUrl,
1043
+ user: process.env["NATS_USER"],
1044
+ password: process.env["NATS_PASSWORD"],
1045
+ token: process.env["NATS_TOKEN"],
1046
+ name: serviceName,
1047
+ maxReconnectAttempts: process.env["NATS_MAX_RECONNECT_ATTEMPTS"] ? parseInt(process.env["NATS_MAX_RECONNECT_ATTEMPTS"], 10) : -1,
1048
+ reconnectTimeWait: process.env["NATS_RECONNECT_TIME_WAIT"] ? parseInt(process.env["NATS_RECONNECT_TIME_WAIT"], 10) : 2e3,
1049
+ stream,
1050
+ consumer,
1051
+ maxConcurrent: process.env["QUEUE_MAX_CONCURRENT"] ? parseInt(process.env["QUEUE_MAX_CONCURRENT"], 10) : 5,
1052
+ maxDeliver: process.env["QUEUE_MAX_DELIVER"] ? parseInt(process.env["QUEUE_MAX_DELIVER"], 10) : 3,
1053
+ ackWait: process.env["QUEUE_ACK_WAIT"] ? parseInt(process.env["QUEUE_ACK_WAIT"], 10) * 1e9 : 3e10
1054
+ };
1055
+ logger.info("[EventQueueFactory] Creating layer consumer", {
1056
+ layer,
1057
+ serviceName,
1058
+ stream,
1059
+ consumer,
1060
+ url: config.url
1061
+ });
1062
+ return _EventQueueFactory.createConsumer(config);
1063
+ }
1064
+ };
1065
+
1066
+ export { EventQueueFactory, NatsEventConsumer, NatsEventPublisher };
1067
+ //# sourceMappingURL=chunk-3O2RQOPV.js.map
1068
+ //# sourceMappingURL=chunk-3O2RQOPV.js.map