@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,270 @@
|
|
|
1
|
+
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
2
|
+
|
|
3
|
+
// src/dataloader/index.ts
|
|
4
|
+
var dataloader_exports = {};
|
|
5
|
+
__export(dataloader_exports, {
|
|
6
|
+
DataLoaderFactory: () => DataLoaderFactory,
|
|
7
|
+
SimpleDataLoader: () => SimpleDataLoader,
|
|
8
|
+
createCompositeKeyLoader: () => createCompositeKeyLoader,
|
|
9
|
+
createDataLoaderFactory: () => createDataLoaderFactory,
|
|
10
|
+
createEntityLoader: () => createEntityLoader,
|
|
11
|
+
createRelationLoader: () => createRelationLoader
|
|
12
|
+
});
|
|
13
|
+
var SimpleDataLoader = class {
|
|
14
|
+
static {
|
|
15
|
+
__name(this, "SimpleDataLoader");
|
|
16
|
+
}
|
|
17
|
+
config;
|
|
18
|
+
cache = /* @__PURE__ */ new Map();
|
|
19
|
+
pendingBatch = [];
|
|
20
|
+
pendingPromises = /* @__PURE__ */ new Map();
|
|
21
|
+
batchScheduled = false;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load a single value by key
|
|
27
|
+
*/
|
|
28
|
+
async load(key) {
|
|
29
|
+
const cacheKey = this.getCacheKey(key);
|
|
30
|
+
if (this.config.cache !== false && this.cache.has(cacheKey)) {
|
|
31
|
+
const cached = this.cache.get(cacheKey);
|
|
32
|
+
if (cached instanceof Error) {
|
|
33
|
+
throw cached;
|
|
34
|
+
}
|
|
35
|
+
return cached;
|
|
36
|
+
}
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
this.pendingBatch.push(key);
|
|
39
|
+
const promises = this.pendingPromises.get(cacheKey) || [];
|
|
40
|
+
promises.push({
|
|
41
|
+
resolve,
|
|
42
|
+
reject
|
|
43
|
+
});
|
|
44
|
+
this.pendingPromises.set(cacheKey, promises);
|
|
45
|
+
this.scheduleBatch();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load multiple values by keys
|
|
50
|
+
*/
|
|
51
|
+
async loadMany(keys) {
|
|
52
|
+
return Promise.all(keys.map((key) => this.load(key)));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear a specific key from cache
|
|
56
|
+
*/
|
|
57
|
+
clear(key) {
|
|
58
|
+
const cacheKey = this.getCacheKey(key);
|
|
59
|
+
this.cache.delete(cacheKey);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Clear all cached values
|
|
64
|
+
*/
|
|
65
|
+
clearAll() {
|
|
66
|
+
this.cache.clear();
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Prime the cache with a value
|
|
71
|
+
*/
|
|
72
|
+
prime(key, value) {
|
|
73
|
+
const cacheKey = this.getCacheKey(key);
|
|
74
|
+
if (!this.cache.has(cacheKey)) {
|
|
75
|
+
this.cache.set(cacheKey, value);
|
|
76
|
+
}
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
getCacheKey(key) {
|
|
80
|
+
if (this.config.cacheKeyFn) {
|
|
81
|
+
return this.config.cacheKeyFn(key);
|
|
82
|
+
}
|
|
83
|
+
return String(key);
|
|
84
|
+
}
|
|
85
|
+
scheduleBatch() {
|
|
86
|
+
if (this.batchScheduled) return;
|
|
87
|
+
this.batchScheduled = true;
|
|
88
|
+
queueMicrotask(() => {
|
|
89
|
+
void this.executeBatch();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Deduplicate batch keys to avoid redundant loads
|
|
94
|
+
*/
|
|
95
|
+
deduplicateKeys(batch) {
|
|
96
|
+
const uniqueKeys = [];
|
|
97
|
+
const keySet = /* @__PURE__ */ new Set();
|
|
98
|
+
for (const key of batch) {
|
|
99
|
+
const cacheKey = this.getCacheKey(key);
|
|
100
|
+
if (!keySet.has(cacheKey)) {
|
|
101
|
+
keySet.add(cacheKey);
|
|
102
|
+
uniqueKeys.push(key);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return uniqueKeys;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve promises for a single result
|
|
109
|
+
*/
|
|
110
|
+
resolvePromisesForKey(cacheKey, result, promisesMap) {
|
|
111
|
+
const promises = promisesMap.get(cacheKey);
|
|
112
|
+
if (!promises) return;
|
|
113
|
+
for (const { resolve, reject } of promises) {
|
|
114
|
+
if (result instanceof Error) {
|
|
115
|
+
reject(result);
|
|
116
|
+
} else {
|
|
117
|
+
resolve(result);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Cache and resolve results for all keys
|
|
123
|
+
*/
|
|
124
|
+
processResults(uniqueKeys, results, promisesMap) {
|
|
125
|
+
for (let i = 0; i < uniqueKeys.length; i++) {
|
|
126
|
+
const key = uniqueKeys[i];
|
|
127
|
+
const cacheKey = this.getCacheKey(key);
|
|
128
|
+
const result = results[i] ?? null;
|
|
129
|
+
if (this.config.cache !== false) {
|
|
130
|
+
this.cache.set(cacheKey, result);
|
|
131
|
+
}
|
|
132
|
+
this.resolvePromisesForKey(cacheKey, result, promisesMap);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Reject all pending promises with an error
|
|
137
|
+
*/
|
|
138
|
+
rejectAllPromises(promisesMap, error) {
|
|
139
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
140
|
+
for (const [, promises] of promisesMap) {
|
|
141
|
+
for (const { reject } of promises) {
|
|
142
|
+
reject(errorObj);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async executeBatch() {
|
|
147
|
+
const batch = this.pendingBatch;
|
|
148
|
+
const promisesMap = new Map(this.pendingPromises);
|
|
149
|
+
this.pendingBatch = [];
|
|
150
|
+
this.pendingPromises.clear();
|
|
151
|
+
this.batchScheduled = false;
|
|
152
|
+
if (batch.length === 0) return;
|
|
153
|
+
try {
|
|
154
|
+
const uniqueKeys = this.deduplicateKeys(batch);
|
|
155
|
+
const results = await this.config.batchLoadFn(uniqueKeys);
|
|
156
|
+
this.processResults(uniqueKeys, results, promisesMap);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
this.rejectAllPromises(promisesMap, error);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
function createEntityLoader(options) {
|
|
163
|
+
return new SimpleDataLoader({
|
|
164
|
+
batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
|
|
165
|
+
const items = await options.batchFn(keys);
|
|
166
|
+
const itemMap = /* @__PURE__ */ new Map();
|
|
167
|
+
for (const item of items) {
|
|
168
|
+
const key = options.getKey(item);
|
|
169
|
+
itemMap.set(key, item);
|
|
170
|
+
}
|
|
171
|
+
return keys.map((key) => itemMap.get(key) || null);
|
|
172
|
+
}, "batchLoadFn"),
|
|
173
|
+
cacheKeyFn: options.cacheKeyFn
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
__name(createEntityLoader, "createEntityLoader");
|
|
177
|
+
function createRelationLoader(options) {
|
|
178
|
+
return new SimpleDataLoader({
|
|
179
|
+
batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
|
|
180
|
+
const items = await options.batchFn(keys);
|
|
181
|
+
const itemMap = /* @__PURE__ */ new Map();
|
|
182
|
+
for (const key of keys) {
|
|
183
|
+
itemMap.set(key, []);
|
|
184
|
+
}
|
|
185
|
+
for (const item of items) {
|
|
186
|
+
const key = options.getKey(item);
|
|
187
|
+
if (key != null) {
|
|
188
|
+
const existing = itemMap.get(key) || [];
|
|
189
|
+
existing.push(item);
|
|
190
|
+
itemMap.set(key, existing);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return keys.map((key) => itemMap.get(key) || []);
|
|
194
|
+
}, "batchLoadFn"),
|
|
195
|
+
cacheKeyFn: options.cacheKeyFn
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
__name(createRelationLoader, "createRelationLoader");
|
|
199
|
+
function createCompositeKeyLoader(options) {
|
|
200
|
+
return new SimpleDataLoader({
|
|
201
|
+
batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
|
|
202
|
+
const items = await options.batchFn(keys);
|
|
203
|
+
const itemMap = /* @__PURE__ */ new Map();
|
|
204
|
+
for (const key of keys) {
|
|
205
|
+
itemMap.set(key, []);
|
|
206
|
+
}
|
|
207
|
+
for (const item of items) {
|
|
208
|
+
const key = options.getKey(item);
|
|
209
|
+
const existing = itemMap.get(key) || [];
|
|
210
|
+
existing.push(item);
|
|
211
|
+
itemMap.set(key, existing);
|
|
212
|
+
}
|
|
213
|
+
return keys.map((key) => itemMap.get(key) || []);
|
|
214
|
+
}, "batchLoadFn"),
|
|
215
|
+
cacheKeyFn: options.cacheKeyFn
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
__name(createCompositeKeyLoader, "createCompositeKeyLoader");
|
|
219
|
+
var DataLoaderFactory = class {
|
|
220
|
+
static {
|
|
221
|
+
__name(this, "DataLoaderFactory");
|
|
222
|
+
}
|
|
223
|
+
loaders = /* @__PURE__ */ new Map();
|
|
224
|
+
/**
|
|
225
|
+
* Register an entity loader
|
|
226
|
+
*/
|
|
227
|
+
registerEntityLoader(name, options) {
|
|
228
|
+
const loader = createEntityLoader(options);
|
|
229
|
+
this.loaders.set(name, loader);
|
|
230
|
+
return loader;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Register a relation loader
|
|
234
|
+
*/
|
|
235
|
+
registerRelationLoader(name, options) {
|
|
236
|
+
const loader = createRelationLoader(options);
|
|
237
|
+
this.loaders.set(name, loader);
|
|
238
|
+
return loader;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Register a composite key loader
|
|
242
|
+
*/
|
|
243
|
+
registerCompositeKeyLoader(name, options) {
|
|
244
|
+
const loader = createCompositeKeyLoader(options);
|
|
245
|
+
this.loaders.set(name, loader);
|
|
246
|
+
return loader;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get a registered loader
|
|
250
|
+
*/
|
|
251
|
+
get(name) {
|
|
252
|
+
return this.loaders.get(name);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Clear all loader caches
|
|
256
|
+
*/
|
|
257
|
+
clearAll() {
|
|
258
|
+
for (const loader of this.loaders.values()) {
|
|
259
|
+
loader.clearAll();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
function createDataLoaderFactory() {
|
|
264
|
+
return new DataLoaderFactory();
|
|
265
|
+
}
|
|
266
|
+
__name(createDataLoaderFactory, "createDataLoaderFactory");
|
|
267
|
+
|
|
268
|
+
export { DataLoaderFactory, SimpleDataLoader, createCompositeKeyLoader, createDataLoaderFactory, createEntityLoader, createRelationLoader, dataloader_exports };
|
|
269
|
+
//# sourceMappingURL=chunk-NUB5GQTU.js.map
|
|
270
|
+
//# sourceMappingURL=chunk-NUB5GQTU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dataloader/index.ts"],"names":["SimpleDataLoader","cache","Map","pendingBatch","pendingPromises","batchScheduled","config","load","key","cacheKey","getCacheKey","has","cached","get","Error","Promise","resolve","reject","push","promises","set","scheduleBatch","loadMany","keys","all","map","clear","delete","clearAll","prime","value","cacheKeyFn","String","queueMicrotask","executeBatch","deduplicateKeys","batch","uniqueKeys","keySet","Set","add","resolvePromisesForKey","result","promisesMap","processResults","results","i","length","rejectAllPromises","error","errorObj","batchLoadFn","createEntityLoader","options","items","batchFn","itemMap","item","getKey","createRelationLoader","existing","createCompositeKeyLoader","DataLoaderFactory","loaders","registerEntityLoader","name","loader","registerRelationLoader","registerCompositeKeyLoader","values","createDataLoaderFactory"],"mappings":"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","file":"chunk-NUB5GQTU.js","sourcesContent":["/**\n * DataLoader Module\n *\n * Provides utilities for creating DataLoaders with common patterns\n * used across Burdenoff microservices.\n *\n * @module dataloader\n * @category Data\n *\n * @example\n * ```typescript\n * import {\n * createEntityLoader,\n * createRelationLoader,\n * createCompositeKeyLoader,\n * DataLoaderFactory,\n * } from '@burdenoff/be-sdk/dataloader';\n *\n * // Create a simple entity loader\n * const tagLoader = createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * // Create a relation loader (one-to-many)\n * const tagChildrenLoader = createRelationLoader<Tag, string>({\n * batchFn: async (parentIds) => db.tag.findMany({ where: { parentId: { in: [...parentIds] } } }),\n * getKey: (tag) => tag.parentId,\n * });\n *\n * // Create a composite key loader (e.g., entityType:entityId)\n * const entityTagsLoader = createCompositeKeyLoader<TagAssignment>({\n * batchFn: async (keys) => {\n * const parsed = keys.map(parseKey);\n * return db.tagAssignment.findMany({ where: { OR: parsed } });\n * },\n * getKey: (assignment) => `${assignment.entityType}:${assignment.entityId}`,\n * });\n * ```\n */\n\n/**\n * DataLoader-like batch function type\n */\nexport type BatchFunction<K, V> = (keys: readonly K[]) => Promise<(V | Error | null)[]>;\n\n/**\n * Simple batch function that returns items\n */\nexport type SimpleBatchFunction<K, V> = (keys: readonly K[]) => Promise<V[]>;\n\n/**\n * Options for creating an entity loader\n */\nexport interface EntityLoaderOptions<T, K extends string | number = string> {\n /** Batch function to fetch entities by keys */\n batchFn: SimpleBatchFunction<K, T>;\n /** Function to extract the key from an entity */\n getKey: (entity: T) => K;\n /** Cache key normalization function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Options for creating a relation loader (one-to-many)\n */\nexport interface RelationLoaderOptions<T, K extends string | number = string> {\n /** Batch function to fetch related entities by foreign keys */\n batchFn: SimpleBatchFunction<K, T>;\n /** Function to extract the foreign key from an entity */\n getKey: (entity: T) => K | null | undefined;\n /** Cache key normalization function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Options for creating a composite key loader\n */\nexport interface CompositeKeyLoaderOptions<T> {\n /** Batch function to fetch entities by composite keys */\n batchFn: SimpleBatchFunction<string, T>;\n /** Function to extract the composite key from an entity */\n getKey: (entity: T) => string;\n /** Cache key normalization function */\n cacheKeyFn?: (key: string) => string;\n}\n\n/**\n * Internal cache value type - can be a value, null, or an error\n */\ntype CacheValue<V> = V | null | Error;\n\n/**\n * Internal promise handlers type - array of resolve/reject functions\n */\ntype PromiseHandlers<V> = Array<{\n resolve: (value: V | null) => void;\n reject: (error: Error) => void;\n}>;\n\n/**\n * DataLoader configuration\n */\nexport interface DataLoaderConfig<K, V> {\n /** Batch function */\n batchLoadFn: BatchFunction<K, V>;\n /** Maximum batch size */\n maxBatchSize?: number;\n /** Whether to cache results */\n cache?: boolean;\n /** Cache key function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Simple DataLoader implementation\n *\n * Note: For production use, consider using the 'dataloader' npm package.\n * This is a simplified implementation for basic use cases.\n */\nexport class SimpleDataLoader<K, V> {\n private cache: Map<string, CacheValue<V>> = new Map();\n private pendingBatch: K[] = [];\n private pendingPromises: Map<string, PromiseHandlers<V>> = new Map();\n private batchScheduled = false;\n\n constructor(private config: DataLoaderConfig<K, V>) {}\n\n /**\n * Load a single value by key\n */\n async load(key: K): Promise<V | null> {\n const cacheKey = this.getCacheKey(key);\n\n // Check cache\n if (this.config.cache !== false && this.cache.has(cacheKey)) {\n const cached = this.cache.get(cacheKey);\n if (cached instanceof Error) {\n throw cached;\n }\n return cached as V | null;\n }\n\n // Add to pending batch\n return new Promise<V | null>((resolve, reject) => {\n this.pendingBatch.push(key);\n\n const promises = this.pendingPromises.get(cacheKey) || [];\n promises.push({ resolve, reject });\n this.pendingPromises.set(cacheKey, promises);\n\n this.scheduleBatch();\n });\n }\n\n /**\n * Load multiple values by keys\n */\n async loadMany(keys: K[]): Promise<(V | null)[]> {\n return Promise.all(keys.map((key) => this.load(key)));\n }\n\n /**\n * Clear a specific key from cache\n */\n clear(key: K): this {\n const cacheKey = this.getCacheKey(key);\n this.cache.delete(cacheKey);\n return this;\n }\n\n /**\n * Clear all cached values\n */\n clearAll(): this {\n this.cache.clear();\n return this;\n }\n\n /**\n * Prime the cache with a value\n */\n prime(key: K, value: V | Error | null): this {\n const cacheKey = this.getCacheKey(key);\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, value);\n }\n return this;\n }\n\n private getCacheKey(key: K): string {\n if (this.config.cacheKeyFn) {\n return this.config.cacheKeyFn(key);\n }\n return String(key);\n }\n\n private scheduleBatch(): void {\n if (this.batchScheduled) return;\n this.batchScheduled = true;\n\n // Use queueMicrotask for batching\n queueMicrotask(() => {\n void this.executeBatch();\n });\n }\n\n /**\n * Deduplicate batch keys to avoid redundant loads\n */\n private deduplicateKeys(batch: K[]): K[] {\n const uniqueKeys: K[] = [];\n const keySet = new Set<string>();\n\n for (const key of batch) {\n const cacheKey = this.getCacheKey(key);\n if (!keySet.has(cacheKey)) {\n keySet.add(cacheKey);\n uniqueKeys.push(key);\n }\n }\n\n return uniqueKeys;\n }\n\n /**\n * Resolve promises for a single result\n */\n private resolvePromisesForKey(\n cacheKey: string,\n result: CacheValue<V>,\n promisesMap: Map<string, PromiseHandlers<V>>\n ): void {\n const promises = promisesMap.get(cacheKey);\n if (!promises) return;\n\n for (const { resolve, reject } of promises) {\n if (result instanceof Error) {\n reject(result);\n } else {\n // Type assertion removed - TypeScript infers V | null from the else branch\n resolve(result);\n }\n }\n }\n\n /**\n * Cache and resolve results for all keys\n */\n private processResults(\n uniqueKeys: K[],\n results: readonly CacheValue<V>[],\n promisesMap: Map<string, PromiseHandlers<V>>\n ): void {\n for (let i = 0; i < uniqueKeys.length; i++) {\n const key = uniqueKeys[i]!;\n const cacheKey = this.getCacheKey(key);\n const result = results[i] ?? null;\n\n // Cache result if caching is enabled\n if (this.config.cache !== false) {\n this.cache.set(cacheKey, result);\n }\n\n // Resolve promises for this key\n this.resolvePromisesForKey(cacheKey, result, promisesMap);\n }\n }\n\n /**\n * Reject all pending promises with an error\n */\n private rejectAllPromises(promisesMap: Map<string, PromiseHandlers<V>>, error: unknown): void {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n for (const [, promises] of promisesMap) {\n for (const { reject } of promises) {\n reject(errorObj);\n }\n }\n }\n\n private async executeBatch(): Promise<void> {\n const batch = this.pendingBatch;\n const promisesMap = new Map(this.pendingPromises);\n\n this.pendingBatch = [];\n this.pendingPromises.clear();\n this.batchScheduled = false;\n\n if (batch.length === 0) return;\n\n try {\n const uniqueKeys = this.deduplicateKeys(batch);\n const results = await this.config.batchLoadFn(uniqueKeys);\n this.processResults(uniqueKeys, results, promisesMap);\n } catch (error) {\n this.rejectAllPromises(promisesMap, error);\n }\n }\n}\n\n/**\n * Create an entity loader (many entities by primary key)\n *\n * @example\n * ```typescript\n * const tagLoader = createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * const tag = await tagLoader.load('tag-123');\n * ```\n */\nexport function createEntityLoader<T, K extends string | number = string>(\n options: EntityLoaderOptions<T, K>\n): SimpleDataLoader<K, T> {\n return new SimpleDataLoader<K, T>({\n batchLoadFn: async (keys: readonly K[]): Promise<(T | null)[]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<K, T>();\n\n for (const item of items) {\n const key = options.getKey(item);\n itemMap.set(key, item);\n }\n\n return keys.map((key) => itemMap.get(key) || null);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * Create a relation loader (one-to-many relationships)\n *\n * @example\n * ```typescript\n * const tagChildrenLoader = createRelationLoader<Tag, string>({\n * batchFn: async (parentIds) => db.tag.findMany({\n * where: { parentId: { in: [...parentIds] } }\n * }),\n * getKey: (tag) => tag.parentId,\n * });\n *\n * const children = await tagChildrenLoader.load('parent-123');\n * ```\n */\nexport function createRelationLoader<T, K extends string | number = string>(\n options: RelationLoaderOptions<T, K>\n): SimpleDataLoader<K, T[]> {\n return new SimpleDataLoader<K, T[]>({\n batchLoadFn: async (keys: readonly K[]): Promise<T[][]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<K, T[]>();\n\n // Initialize with empty arrays\n for (const key of keys) {\n itemMap.set(key, []);\n }\n\n // Group items by foreign key\n for (const item of items) {\n const key = options.getKey(item);\n if (key != null) {\n const existing = itemMap.get(key) || [];\n existing.push(item);\n itemMap.set(key, existing);\n }\n }\n\n return keys.map((key) => itemMap.get(key) || []);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * Create a composite key loader\n *\n * @example\n * ```typescript\n * const entityTagsLoader = createCompositeKeyLoader<TagAssignment>({\n * batchFn: async (keys) => {\n * const parsed = keys.map((k) => {\n * const [entityType, entityId] = k.split(':');\n * return { entityType, entityId };\n * });\n * return db.tagAssignment.findMany({ where: { OR: parsed } });\n * },\n * getKey: (assignment) => `${assignment.entityType}:${assignment.entityId}`,\n * });\n *\n * const tags = await entityTagsLoader.load('User:user-123');\n * ```\n */\nexport function createCompositeKeyLoader<T>(options: CompositeKeyLoaderOptions<T>): SimpleDataLoader<string, T[]> {\n return new SimpleDataLoader<string, T[]>({\n batchLoadFn: async (keys: readonly string[]): Promise<T[][]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<string, T[]>();\n\n // Initialize with empty arrays\n for (const key of keys) {\n itemMap.set(key, []);\n }\n\n // Group items by composite key\n for (const item of items) {\n const key = options.getKey(item);\n const existing = itemMap.get(key) || [];\n existing.push(item);\n itemMap.set(key, existing);\n }\n\n return keys.map((key) => itemMap.get(key) || []);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * DataLoader factory for creating multiple loaders with shared configuration\n */\nexport class DataLoaderFactory {\n private loaders: Map<string, SimpleDataLoader<unknown, unknown>> = new Map();\n\n /**\n * Register an entity loader\n */\n registerEntityLoader<T, K extends string | number = string>(\n name: string,\n options: EntityLoaderOptions<T, K>\n ): SimpleDataLoader<K, T> {\n const loader = createEntityLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Register a relation loader\n */\n registerRelationLoader<T, K extends string | number = string>(\n name: string,\n options: RelationLoaderOptions<T, K>\n ): SimpleDataLoader<K, T[]> {\n const loader = createRelationLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Register a composite key loader\n */\n registerCompositeKeyLoader<T>(name: string, options: CompositeKeyLoaderOptions<T>): SimpleDataLoader<string, T[]> {\n const loader = createCompositeKeyLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Get a registered loader\n */\n get<K, V>(name: string): SimpleDataLoader<K, V> | undefined {\n return this.loaders.get(name) as SimpleDataLoader<K, V> | undefined;\n }\n\n /**\n * Clear all loader caches\n */\n clearAll(): void {\n for (const loader of this.loaders.values()) {\n loader.clearAll();\n }\n }\n}\n\n/**\n * Create a new DataLoader factory\n */\nexport function createDataLoaderFactory(): DataLoaderFactory {\n return new DataLoaderFactory();\n}\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { logger } from './chunk-CBZNP6RF.js';
|
|
2
|
+
import { __name } from './chunk-XE4OXN2W.js';
|
|
3
|
+
import { connect } from 'nats';
|
|
4
|
+
|
|
5
|
+
var NatsConnectionManager = class {
|
|
6
|
+
static {
|
|
7
|
+
__name(this, "NatsConnectionManager");
|
|
8
|
+
}
|
|
9
|
+
config;
|
|
10
|
+
nc = null;
|
|
11
|
+
js = null;
|
|
12
|
+
jsm = null;
|
|
13
|
+
connected = false;
|
|
14
|
+
connectionPromise = null;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Connect to NATS server
|
|
20
|
+
*/
|
|
21
|
+
async connect() {
|
|
22
|
+
if (this.connectionPromise) {
|
|
23
|
+
return this.connectionPromise;
|
|
24
|
+
}
|
|
25
|
+
if (this.connected) {
|
|
26
|
+
logger.debug("[NatsConnection] Already connected");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.connectionPromise = this._doConnect();
|
|
30
|
+
try {
|
|
31
|
+
await this.connectionPromise;
|
|
32
|
+
} finally {
|
|
33
|
+
this.connectionPromise = null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Internal connection logic
|
|
38
|
+
*/
|
|
39
|
+
async _doConnect() {
|
|
40
|
+
try {
|
|
41
|
+
const connectionOptions = {
|
|
42
|
+
servers: this.config.url,
|
|
43
|
+
name: this.config.name,
|
|
44
|
+
user: this.config.user,
|
|
45
|
+
pass: this.config.password,
|
|
46
|
+
token: this.config.token,
|
|
47
|
+
maxReconnectAttempts: this.config.maxReconnectAttempts ?? -1,
|
|
48
|
+
reconnectTimeWait: this.config.reconnectTimeWait ?? 2e3
|
|
49
|
+
};
|
|
50
|
+
this.nc = await connect(connectionOptions);
|
|
51
|
+
this.js = this.nc.jetstream();
|
|
52
|
+
this.jsm = await this.nc.jetstreamManager();
|
|
53
|
+
this.connected = true;
|
|
54
|
+
logger.info("[NatsConnection] Connected to NATS", {
|
|
55
|
+
url: this.config.url,
|
|
56
|
+
name: this.config.name
|
|
57
|
+
});
|
|
58
|
+
this.setupEventHandlers();
|
|
59
|
+
} catch (error) {
|
|
60
|
+
logger.error("[NatsConnection] Failed to connect to NATS", {
|
|
61
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
62
|
+
url: this.config.url
|
|
63
|
+
});
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Setup connection event handlers
|
|
69
|
+
*/
|
|
70
|
+
setupEventHandlers() {
|
|
71
|
+
if (!this.nc) return;
|
|
72
|
+
(async () => {
|
|
73
|
+
if (!this.nc) return;
|
|
74
|
+
for await (const status of this.nc.status()) {
|
|
75
|
+
if (status.type === "disconnect") {
|
|
76
|
+
this.connected = false;
|
|
77
|
+
} else if (status.type === "reconnect") {
|
|
78
|
+
this.connected = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})().catch((error) => {
|
|
82
|
+
logger.error("[NatsConnection] Error handling connection events", {
|
|
83
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Disconnect from NATS
|
|
89
|
+
*/
|
|
90
|
+
async disconnect() {
|
|
91
|
+
if (!this.connected || !this.nc) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await this.nc.drain();
|
|
96
|
+
await this.nc.close();
|
|
97
|
+
this.connected = false;
|
|
98
|
+
this.nc = null;
|
|
99
|
+
this.js = null;
|
|
100
|
+
this.jsm = null;
|
|
101
|
+
logger.info("[NatsConnection] Disconnected from NATS");
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logger.error("[NatsConnection] Error disconnecting from NATS", {
|
|
104
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if connected
|
|
110
|
+
*/
|
|
111
|
+
isConnected() {
|
|
112
|
+
return this.connected && this.nc !== null && !this.nc.isClosed();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get JetStream client
|
|
116
|
+
*/
|
|
117
|
+
getJetStream() {
|
|
118
|
+
if (!this.js) {
|
|
119
|
+
throw new Error("NATS not connected - call connect() first");
|
|
120
|
+
}
|
|
121
|
+
return this.js;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get JetStream Manager
|
|
125
|
+
*/
|
|
126
|
+
getJetStreamManager() {
|
|
127
|
+
if (!this.jsm) {
|
|
128
|
+
throw new Error("NATS not connected - call connect() first");
|
|
129
|
+
}
|
|
130
|
+
return this.jsm;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get NATS connection
|
|
134
|
+
*/
|
|
135
|
+
getNatsConnection() {
|
|
136
|
+
if (!this.nc) {
|
|
137
|
+
throw new Error("NATS not connected - call connect() first");
|
|
138
|
+
}
|
|
139
|
+
return this.nc;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export { NatsConnectionManager };
|
|
144
|
+
//# sourceMappingURL=chunk-OVSYMNCI.js.map
|
|
145
|
+
//# sourceMappingURL=chunk-OVSYMNCI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event-queue/implementations/nats/NatsConnection.ts"],"names":["NatsConnectionManager","nc","js","jsm","connected","connectionPromise","config","connect","logger","debug","_doConnect","connectionOptions","servers","url","name","user","pass","password","token","maxReconnectAttempts","reconnectTimeWait","jetstream","jetstreamManager","info","setupEventHandlers","error","Error","message","status","type","catch","disconnect","drain","close","isConnected","isClosed","getJetStream","getJetStreamManager","getNatsConnection"],"mappings":"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","file":"chunk-OVSYMNCI.js","sourcesContent":["/**\n * NATS JetStream Connection Manager\n * Handles connection lifecycle and provides access to NATS clients\n */\nimport { logger } from '../../../logger/index.js';\nimport {\n type ConnectionOptions,\n type JetStreamClient,\n type JetStreamManager,\n type NatsConnection,\n connect,\n} from 'nats';\n\nimport type { BaseQueueConfig } from '../../types/config.js';\n\n/**\n * Internal connection manager for NATS JetStream\n * Shared between NatsEventPublisher and NatsEventConsumer\n */\nexport class NatsConnectionManager {\n private nc: NatsConnection | null = null;\n private js: JetStreamClient | null = null;\n private jsm: JetStreamManager | null = null;\n private connected: boolean = false;\n private connectionPromise: Promise<void> | null = null;\n\n constructor(private config: BaseQueueConfig) {}\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n // Prevent multiple concurrent connections\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n if (this.connected) {\n logger.debug('[NatsConnection] Already connected');\n return;\n }\n\n this.connectionPromise = this._doConnect();\n try {\n await this.connectionPromise;\n } finally {\n this.connectionPromise = null;\n }\n }\n\n /**\n * Internal connection logic\n */\n private async _doConnect(): Promise<void> {\n try {\n const connectionOptions: ConnectionOptions = {\n servers: this.config.url,\n name: this.config.name,\n user: this.config.user,\n pass: this.config.password,\n token: this.config.token,\n maxReconnectAttempts: this.config.maxReconnectAttempts ?? -1,\n reconnectTimeWait: this.config.reconnectTimeWait ?? 2000,\n };\n\n this.nc = await connect(connectionOptions);\n this.js = this.nc.jetstream();\n this.jsm = await this.nc.jetstreamManager();\n this.connected = true;\n\n logger.info('[NatsConnection] Connected to NATS', {\n url: this.config.url,\n name: this.config.name,\n });\n\n // Handle connection events\n this.setupEventHandlers();\n } catch (error) {\n logger.error('[NatsConnection] Failed to connect to NATS', {\n error: error instanceof Error ? error.message : 'Unknown error',\n url: this.config.url,\n });\n throw error;\n }\n }\n\n /**\n * Setup connection event handlers\n */\n private setupEventHandlers(): void {\n if (!this.nc) return;\n\n (async (): Promise<void> => {\n if (!this.nc) return;\n\n for await (const status of this.nc.status()) {\n if (status.type === 'disconnect') {\n this.connected = false;\n } else if (status.type === 'reconnect') {\n this.connected = true;\n }\n }\n })().catch((error) => {\n logger.error('[NatsConnection] Error handling connection events', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n });\n }\n\n /**\n * Disconnect from NATS\n */\n async disconnect(): Promise<void> {\n if (!this.connected || !this.nc) {\n return;\n }\n\n try {\n await this.nc.drain();\n await this.nc.close();\n this.connected = false;\n this.nc = null;\n this.js = null;\n this.jsm = null;\n\n logger.info('[NatsConnection] Disconnected from NATS');\n } catch (error) {\n logger.error('[NatsConnection] Error disconnecting from NATS', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.nc !== null && !this.nc.isClosed();\n }\n\n /**\n * Get JetStream client\n */\n getJetStream(): JetStreamClient {\n if (!this.js) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.js;\n }\n\n /**\n * Get JetStream Manager\n */\n getJetStreamManager(): JetStreamManager {\n if (!this.jsm) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.jsm;\n }\n\n /**\n * Get NATS connection\n */\n getNatsConnection(): NatsConnection {\n if (!this.nc) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.nc;\n }\n}\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { logger } from './chunk-CBZNP6RF.js';
|
|
2
|
+
import { __name } from './chunk-XE4OXN2W.js';
|
|
3
|
+
|
|
4
|
+
// src/graphql/services/Logger.ts
|
|
5
|
+
var Logger = class {
|
|
6
|
+
static {
|
|
7
|
+
__name(this, "Logger");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Log a message at INFO level
|
|
11
|
+
*/
|
|
12
|
+
log(message, ...args) {
|
|
13
|
+
logger.info(message, ...args);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Log a message at INFO level
|
|
17
|
+
*/
|
|
18
|
+
info(message, ...args) {
|
|
19
|
+
logger.info(message, ...args);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Log a message at WARN level
|
|
23
|
+
*/
|
|
24
|
+
warn(message, ...args) {
|
|
25
|
+
logger.warn(message, ...args);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log a message at ERROR level
|
|
29
|
+
*/
|
|
30
|
+
error(message, error, ...args) {
|
|
31
|
+
logger.error(message, error, ...args);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Log a message at DEBUG level
|
|
35
|
+
*/
|
|
36
|
+
debug(message, ...args) {
|
|
37
|
+
logger.debug(message, ...args);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Log a message at TRACE level
|
|
41
|
+
*/
|
|
42
|
+
trace(message, ...args) {
|
|
43
|
+
if ("trace" in logger && typeof logger.trace === "function") {
|
|
44
|
+
logger.trace(message, ...args);
|
|
45
|
+
} else {
|
|
46
|
+
logger.debug(message, ...args);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/graphql/services/Database.ts
|
|
52
|
+
function createDatabaseService(prismaClient) {
|
|
53
|
+
let Database = class Database {
|
|
54
|
+
static {
|
|
55
|
+
__name(this, "Database");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get the Prisma client instance
|
|
59
|
+
*/
|
|
60
|
+
get client() {
|
|
61
|
+
return prismaClient;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Execute a transaction
|
|
65
|
+
*
|
|
66
|
+
* @param fn - Transaction callback function
|
|
67
|
+
* @returns Promise resolving to transaction result
|
|
68
|
+
*/
|
|
69
|
+
async transaction(fn) {
|
|
70
|
+
return prismaClient.$transaction(fn);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if database is connected
|
|
74
|
+
*
|
|
75
|
+
* @returns Promise resolving to true if connected, false otherwise
|
|
76
|
+
*/
|
|
77
|
+
async isConnected() {
|
|
78
|
+
try {
|
|
79
|
+
if ("$queryRaw" in prismaClient && typeof prismaClient.$queryRaw === "function") {
|
|
80
|
+
await prismaClient.$queryRaw`SELECT 1`;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
return Database;
|
|
89
|
+
}
|
|
90
|
+
__name(createDatabaseService, "createDatabaseService");
|
|
91
|
+
|
|
92
|
+
export { Logger, createDatabaseService };
|
|
93
|
+
//# sourceMappingURL=chunk-QLVKMWFA.js.map
|
|
94
|
+
//# sourceMappingURL=chunk-QLVKMWFA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graphql/services/Logger.ts","../src/graphql/services/Database.ts"],"names":["Logger","log","message","args","sdkLogger","info","warn","error","debug","trace","createDatabaseService","prismaClient","Database","client","transaction","fn","$transaction","isConnected","$queryRaw"],"mappings":";;;;AAmBO,IAAMA,SAAN,MAAMA;EAnBb;;;;;;AAuBEC,EAAAA,GAAAA,CAAIC,YAAoBC,IAAAA,EAAuB;AAC7CC,IAAAA,MAAAA,CAAUC,IAAAA,CAAKH,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;AAKAE,EAAAA,IAAAA,CAAKH,YAAoBC,IAAAA,EAAuB;AAC9CC,IAAAA,MAAAA,CAAUC,IAAAA,CAAKH,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;AAKAG,EAAAA,IAAAA,CAAKJ,YAAoBC,IAAAA,EAAuB;AAC9CC,IAAAA,MAAAA,CAAUE,IAAAA,CAAKJ,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;EAKAI,KAAAA,CAAML,OAAAA,EAAiBK,UAA4BJ,IAAAA,EAAuB;AACxEC,IAAAA,MAAAA,CAAUG,KAAAA,CAAML,OAAAA,EAASK,KAAAA,EAAAA,GAAUJ,IAAAA,CAAAA;AACrC,EAAA;;;;AAKAK,EAAAA,KAAAA,CAAMN,YAAoBC,IAAAA,EAAuB;AAC/CC,IAAAA,MAAAA,CAAUI,KAAAA,CAAMN,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC9B,EAAA;;;;AAKAM,EAAAA,KAAAA,CAAMP,YAAoBC,IAAAA,EAAuB;AAC/C,IAAA,IAAI,OAAA,IAAWC,MAAAA,IAAa,OAAOA,MAAAA,CAAUK,UAAU,UAAA,EAAY;AACjEL,MAAAA,MAAAA,CAAUK,KAAAA,CAAMP,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;IAC9B,CAAA,MAAO;AACLC,MAAAA,MAAAA,CAAUI,KAAAA,CAAMN,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC9B,IAAA;AACF,EAAA;AACF;;;ACzBO,SAASO,sBACdC,YAAAA,EAA2B;AAQ3B,EAAA,IAAMC,QAAAA,GAAN,MAAMA,QAAAA,CAAAA;IAjDR;;;;;;AAqDI,IAAA,IAAIC,MAAAA,GAAwB;AAC1B,MAAA,OAAOF,YAAAA;AACT,IAAA;;;;;;;AAQA,IAAA,MAAMG,YAAeC,EAAAA,EAA4E;AAC/F,MAAA,OAAOJ,YAAAA,CAAaK,aAAaD,EAAAA,CAAAA;AACnC,IAAA;;;;;;AAOA,IAAA,MAAME,WAAAA,GAAgC;AACpC,MAAA,IAAI;AAEF,QAAA,IAAI,WAAA,IAAeN,YAAAA,IAAgB,OAAOA,YAAAA,CAAaO,cAAc,UAAA,EAAY;AAC/E,UAAA,MAAOP,YAAAA,CAAaO,SAAAA,CAAAA,QAAAA,CAAAA;AACtB,QAAA;AACA,QAAA,OAAO,IAAA;MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AACT,MAAA;AACF,IAAA;AACF,GAAA;AAEA,EAAA,OAAON,QAAAA;AACT;AA9CgBF,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA","file":"chunk-QLVKMWFA.js","sourcesContent":["/**\n * Logger Service - Utility class for logging\n *\n * Provides structured logging functionality.\n * Wrap this class with decorators in your microservice for DI.\n *\n * @example\n * ```typescript\n * import { Logger } from '@burdenoff/be-sdk/graphql/services';\n * import { Injectable, Scope } from 'graphql-modules';\n *\n * // In your microservice\n * @Injectable({ scope: Scope.Singleton, global: true })\n * export class LoggerProvider extends Logger {}\n * ```\n */\n\nimport { logger as sdkLogger } from '../../logger/index.js';\n\nexport class Logger {\n /**\n * Log a message at INFO level\n */\n log(message: string, ...args: unknown[]): void {\n sdkLogger.info(message, ...args);\n }\n\n /**\n * Log a message at INFO level\n */\n info(message: string, ...args: unknown[]): void {\n sdkLogger.info(message, ...args);\n }\n\n /**\n * Log a message at WARN level\n */\n warn(message: string, ...args: unknown[]): void {\n sdkLogger.warn(message, ...args);\n }\n\n /**\n * Log a message at ERROR level\n */\n error(message: string, error?: Error | unknown, ...args: unknown[]): void {\n sdkLogger.error(message, error, ...args);\n }\n\n /**\n * Log a message at DEBUG level\n */\n debug(message: string, ...args: unknown[]): void {\n sdkLogger.debug(message, ...args);\n }\n\n /**\n * Log a message at TRACE level\n */\n trace(message: string, ...args: unknown[]): void {\n if ('trace' in sdkLogger && typeof sdkLogger.trace === 'function') {\n sdkLogger.trace(message, ...args);\n } else {\n sdkLogger.debug(message, ...args);\n }\n }\n}\n","/**\n * Database Service - Utility class for database operations\n *\n * Provides access to Prisma client for database operations.\n * Each microservice creates its own Database instance with its Prisma client.\n * Wrap the returned class with decorators in your microservice for DI.\n *\n * @example\n * ```typescript\n * // In your module definition:\n * import { createDatabaseService } from '@burdenoff/be-sdk/graphql/services';\n * import { prisma } from './utils/prisma.js';\n *\n * // Create base Database class from SDK\n * const BaseDatabaseService = createDatabaseService(prisma);\n *\n * // Wrap with decorators in your microservice\n * @Injectable({ scope: Scope.Singleton, global: true })\n * class DatabaseProvider extends BaseDatabaseService {}\n *\n * export const myModule = createModule({\n * providers: [DatabaseProvider, MyProvider, ...],\n * });\n * ```\n */\n\n/**\n * Type for Prisma client transaction\n */\nexport type PrismaTransactionClient<TPrismaClient> = Omit<\n TPrismaClient,\n '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'\n>;\n\n/**\n * Create a Database service class with the provided Prisma client\n *\n * @param prismaClient - The Prisma client instance for this microservice\n * @returns Database service class (without decorators - add them in your microservice)\n */\nexport function createDatabaseService<TPrismaClient extends { $transaction: (...args: unknown[]) => Promise<unknown> }>(\n prismaClient: TPrismaClient\n): {\n new (): {\n readonly client: TPrismaClient;\n transaction<T>(fn: (tx: PrismaTransactionClient<TPrismaClient>) => Promise<T>): Promise<T>;\n isConnected(): Promise<boolean>;\n };\n} {\n class Database {\n /**\n * Get the Prisma client instance\n */\n get client(): TPrismaClient {\n return prismaClient;\n }\n\n /**\n * Execute a transaction\n *\n * @param fn - Transaction callback function\n * @returns Promise resolving to transaction result\n */\n async transaction<T>(fn: (tx: PrismaTransactionClient<TPrismaClient>) => Promise<T>): Promise<T> {\n return prismaClient.$transaction(fn) as Promise<T>;\n }\n\n /**\n * Check if database is connected\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\n async isConnected(): Promise<boolean> {\n try {\n // Use $queryRaw if available, otherwise assume connected\n if ('$queryRaw' in prismaClient && typeof prismaClient.$queryRaw === 'function') {\n await (prismaClient.$queryRaw as (query: TemplateStringsArray) => Promise<unknown>)`SELECT 1`;\n }\n return true;\n } catch {\n return false;\n }\n }\n }\n\n return Database;\n}\n\n/**\n * Type helper to extract Database service type\n */\nexport type DatabaseService<TPrismaClient extends { $transaction: (...args: unknown[]) => Promise<unknown> }> =\n InstanceType<ReturnType<typeof createDatabaseService<TPrismaClient>>>;\n"]}
|