@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.
- package/README.md +173 -0
- package/configs/eslint/index.js +492 -0
- package/configs/tsconfig/tsconfig.json +53 -0
- package/dist/EventQueueFactory-6NMSGECR.js +8 -0
- package/dist/EventQueueFactory-6NMSGECR.js.map +1 -0
- package/dist/auth/index.d.ts +66 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/captcha/index.d.ts +1 -0
- package/dist/captcha/index.js +4 -0
- package/dist/captcha/index.js.map +1 -0
- package/dist/chunk-2HANKZZM.js +245 -0
- package/dist/chunk-2HANKZZM.js.map +1 -0
- package/dist/chunk-2SD5L2F2.js +816 -0
- package/dist/chunk-2SD5L2F2.js.map +1 -0
- package/dist/chunk-3O2RQOPV.js +1068 -0
- package/dist/chunk-3O2RQOPV.js.map +1 -0
- package/dist/chunk-4B43DZIS.js +560 -0
- package/dist/chunk-4B43DZIS.js.map +1 -0
- package/dist/chunk-4XAEES25.js +2444 -0
- package/dist/chunk-4XAEES25.js.map +1 -0
- package/dist/chunk-4XGGWW36.js +1405 -0
- package/dist/chunk-4XGGWW36.js.map +1 -0
- package/dist/chunk-5LXDPGDH.js +245 -0
- package/dist/chunk-5LXDPGDH.js.map +1 -0
- package/dist/chunk-AI7L22ZJ.js +472 -0
- package/dist/chunk-AI7L22ZJ.js.map +1 -0
- package/dist/chunk-CBZNP6RF.js +286 -0
- package/dist/chunk-CBZNP6RF.js.map +1 -0
- package/dist/chunk-ELLX3K54.js +613 -0
- package/dist/chunk-ELLX3K54.js.map +1 -0
- package/dist/chunk-F5XEAGHQ.js +1875 -0
- package/dist/chunk-F5XEAGHQ.js.map +1 -0
- package/dist/chunk-FNZEQOJY.js +628 -0
- package/dist/chunk-FNZEQOJY.js.map +1 -0
- package/dist/chunk-GTEMQXCA.js +516 -0
- package/dist/chunk-GTEMQXCA.js.map +1 -0
- package/dist/chunk-HIWTWIGQ.js +226 -0
- package/dist/chunk-HIWTWIGQ.js.map +1 -0
- package/dist/chunk-IYE2NTRX.js +764 -0
- package/dist/chunk-IYE2NTRX.js.map +1 -0
- package/dist/chunk-J26YGR2U.js +1484 -0
- package/dist/chunk-J26YGR2U.js.map +1 -0
- package/dist/chunk-JG2FTZPI.js +509 -0
- package/dist/chunk-JG2FTZPI.js.map +1 -0
- package/dist/chunk-JVBTNSPG.js +1551 -0
- package/dist/chunk-JVBTNSPG.js.map +1 -0
- package/dist/chunk-L7ZMN2FJ.js +12 -0
- package/dist/chunk-L7ZMN2FJ.js.map +1 -0
- package/dist/chunk-M5IMU3US.js +473 -0
- package/dist/chunk-M5IMU3US.js.map +1 -0
- package/dist/chunk-MLW2HPS5.js +1267 -0
- package/dist/chunk-MLW2HPS5.js.map +1 -0
- package/dist/chunk-MNCGUYLJ.js +269 -0
- package/dist/chunk-MNCGUYLJ.js.map +1 -0
- package/dist/chunk-MOCUBSTW.js +373 -0
- package/dist/chunk-MOCUBSTW.js.map +1 -0
- package/dist/chunk-NGMEI42S.js +103 -0
- package/dist/chunk-NGMEI42S.js.map +1 -0
- package/dist/chunk-NUB5GQTU.js +270 -0
- package/dist/chunk-NUB5GQTU.js.map +1 -0
- package/dist/chunk-OVSYMNCI.js +145 -0
- package/dist/chunk-OVSYMNCI.js.map +1 -0
- package/dist/chunk-QLVKMWFA.js +94 -0
- package/dist/chunk-QLVKMWFA.js.map +1 -0
- package/dist/chunk-SAG6ZYWQ.js +89 -0
- package/dist/chunk-SAG6ZYWQ.js.map +1 -0
- package/dist/chunk-SAK2JCA7.js +198 -0
- package/dist/chunk-SAK2JCA7.js.map +1 -0
- package/dist/chunk-SBS4S2PJ.js +100 -0
- package/dist/chunk-SBS4S2PJ.js.map +1 -0
- package/dist/chunk-SNEOLWXT.js +148 -0
- package/dist/chunk-SNEOLWXT.js.map +1 -0
- package/dist/chunk-TKBD2ONF.js +564 -0
- package/dist/chunk-TKBD2ONF.js.map +1 -0
- package/dist/chunk-UBXFIIAW.js +127 -0
- package/dist/chunk-UBXFIIAW.js.map +1 -0
- package/dist/chunk-VI4VSNTI.js +57 -0
- package/dist/chunk-VI4VSNTI.js.map +1 -0
- package/dist/chunk-VWCN5PMD.js +268 -0
- package/dist/chunk-VWCN5PMD.js.map +1 -0
- package/dist/chunk-XC2YD6CF.js +913 -0
- package/dist/chunk-XC2YD6CF.js.map +1 -0
- package/dist/chunk-XE4OXN2W.js +10 -0
- package/dist/chunk-XE4OXN2W.js.map +1 -0
- package/dist/chunk-YMZEUTD2.js +110 -0
- package/dist/chunk-YMZEUTD2.js.map +1 -0
- package/dist/chunk-Z4IRLBWO.js +758 -0
- package/dist/chunk-Z4IRLBWO.js.map +1 -0
- package/dist/client/internal-client.d.ts +7 -0
- package/dist/client/internal-client.js +5 -0
- package/dist/client/internal-client.js.map +1 -0
- package/dist/client-CSjIrYKS.d.ts +77 -0
- package/dist/config-UKE2E3BW.js +4 -0
- package/dist/config-UKE2E3BW.js.map +1 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +4 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/database/index.d.ts +117 -0
- package/dist/database/index.js +7 -0
- package/dist/database/index.js.map +1 -0
- package/dist/dataloader/index.d.ts +1 -0
- package/dist/dataloader/index.js +4 -0
- package/dist/dataloader/index.js.map +1 -0
- package/dist/esm-K6H7EIWK.js +1450 -0
- package/dist/esm-K6H7EIWK.js.map +1 -0
- package/dist/event-queue/index.d.ts +6 -0
- package/dist/event-queue/index.js +10 -0
- package/dist/event-queue/index.js.map +1 -0
- package/dist/export/index.d.ts +2 -0
- package/dist/export/index.js +9 -0
- package/dist/export/index.js.map +1 -0
- package/dist/feature-flags/index.d.ts +1 -0
- package/dist/feature-flags/index.js +4 -0
- package/dist/feature-flags/index.js.map +1 -0
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.js +8 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/security/index.d.ts +2 -0
- package/dist/gateway/security/index.js +5 -0
- package/dist/gateway/security/index.js.map +1 -0
- package/dist/graph/index.d.ts +9 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph-emitter-Bk0FqD53.d.ts +47 -0
- package/dist/graphql/index.d.ts +2 -0
- package/dist/graphql/index.js +7 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/services/index.d.ts +24 -0
- package/dist/graphql/services/index.js +5 -0
- package/dist/graphql/services/index.js.map +1 -0
- package/dist/graphql-BAVrUgBF.d.ts +22 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +5 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n-DA6IPnYy.d.ts +101 -0
- package/dist/index-4gKQKZ2B.d.ts +71 -0
- package/dist/index-B18rrFru.d.ts +42 -0
- package/dist/index-B70b5mYS.d.ts +33 -0
- package/dist/index-BMq3lFjj.d.ts +247 -0
- package/dist/index-BODgvRtL.d.ts +316 -0
- package/dist/index-BS2idbnr.d.ts +874 -0
- package/dist/index-BV3G48cH.d.ts +124 -0
- package/dist/index-CHbVw5M7.d.ts +73 -0
- package/dist/index-Cq_xNjcv.d.ts +602 -0
- package/dist/index-CrQgidpx.d.ts +77 -0
- package/dist/index-CyVEg86m.d.ts +309 -0
- package/dist/index-DOcBnmMe.d.ts +166 -0
- package/dist/index-DSOpj8DI.d.ts +17 -0
- package/dist/index-DW9q22GH.d.ts +75 -0
- package/dist/index-DlFDFyWD.d.ts +55 -0
- package/dist/index-DoK0bjhH.d.ts +607 -0
- package/dist/index-Dtf6FBaD.d.ts +199 -0
- package/dist/index-KVWGHMbS.d.ts +415 -0
- package/dist/index-PaojfSdd.d.ts +71 -0
- package/dist/index-RU_M5c74.d.ts +163 -0
- package/dist/index-UhkH2eaB.d.ts +192 -0
- package/dist/index-e_18DzAg.d.ts +18 -0
- package/dist/index-jOuh_TKn.d.ts +59 -0
- package/dist/index.d.ts +584 -0
- package/dist/index.js +2626 -0
- package/dist/index.js.map +1 -0
- package/dist/init/index.d.ts +2 -0
- package/dist/init/index.js +12 -0
- package/dist/init/index.js.map +1 -0
- package/dist/instrumentation/index.d.ts +3 -0
- package/dist/instrumentation/index.js +5 -0
- package/dist/instrumentation/index.js.map +1 -0
- package/dist/layer/index.d.ts +2 -0
- package/dist/layer/index.js +6 -0
- package/dist/layer/index.js.map +1 -0
- package/dist/layer-DDip18KY.d.ts +67 -0
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.js +4 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/notifications/index.d.ts +4 -0
- package/dist/notifications/index.js +7 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/pino-logger-RYLGXPHZ.js +5 -0
- package/dist/pino-logger-RYLGXPHZ.js.map +1 -0
- package/dist/prisma/generator/index.d.ts +1 -0
- package/dist/prisma/generator/index.js +228 -0
- package/dist/prisma/generator/index.js.map +1 -0
- package/dist/prisma/index.d.ts +5 -0
- package/dist/prisma/index.js +12 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma-extension-krXnYnrN.d.ts +30 -0
- package/dist/rbac/index.d.ts +116 -0
- package/dist/rbac/index.js +7 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/sdk-THO3IWEE.js +136 -0
- package/dist/sdk-THO3IWEE.js.map +1 -0
- package/dist/server/index.d.ts +359 -0
- package/dist/server/index.js +884 -0
- package/dist/server/index.js.map +1 -0
- package/dist/telemetry/index.d.ts +83 -0
- package/dist/telemetry/index.js +209 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/temporal/index.d.ts +148 -0
- package/dist/temporal/index.js +6 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/tracker/index.d.ts +5 -0
- package/dist/tracker/index.js +9 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/types-Bo2wkjSP.d.ts +35 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/workspace-guard-LHBNK4TG.js +5 -0
- package/dist/workspace-guard-LHBNK4TG.js.map +1 -0
- 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
|