@kuckit/infrastructure 1.0.2 → 2.0.0
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/dist/apply-decorators-CW23qWy7.d.ts +23 -0
- package/dist/apply-decorators-CaHIAL5X.js +29 -0
- package/dist/apply-decorators-CaHIAL5X.js.map +1 -0
- package/dist/cache/in-memory-cache-store.d.ts +2 -0
- package/dist/cache/in-memory-cache-store.js +3 -0
- package/dist/cache/index.d.ts +3 -0
- package/dist/cache/index.js +4 -0
- package/dist/cache-BjdZ-Ye4.js +1 -0
- package/dist/core.module-B1TdC0yX.d.ts +17 -0
- package/dist/core.module-DMtIkTcz.js +48 -0
- package/dist/core.module-DMtIkTcz.js.map +1 -0
- package/dist/db/drizzle/db.d.ts +2 -0
- package/dist/db/drizzle/db.js +3 -0
- package/dist/db/drizzle/repositories/index.d.ts +3 -0
- package/dist/db/drizzle/repositories/index.js +4 -0
- package/dist/db/drizzle/repositories/user.drizzle.d.ts +2 -0
- package/dist/db/drizzle/repositories/user.drizzle.js +3 -0
- package/dist/db/transaction.d.ts +2 -0
- package/dist/db/transaction.js +4 -0
- package/dist/db-C4IcCT04.js +25 -0
- package/dist/db-C4IcCT04.js.map +1 -0
- package/dist/db-tAPHBDyL.d.ts +17 -0
- package/dist/decorators/apply-decorators.d.ts +2 -0
- package/dist/decorators/apply-decorators.js +5 -0
- package/dist/decorators/index.d.ts +8 -0
- package/dist/decorators/index.js +9 -0
- package/dist/decorators/use-case-decorator.d.ts +3 -0
- package/dist/decorators/use-case-decorator.js +4 -0
- package/dist/decorators/with-caching.d.ts +2 -0
- package/dist/decorators/with-caching.js +3 -0
- package/dist/decorators/with-rate-limit.d.ts +2 -0
- package/dist/decorators/with-rate-limit.js +3 -0
- package/dist/decorators/with-retry.d.ts +2 -0
- package/dist/decorators/with-retry.js +3 -0
- package/dist/decorators-CqyPE9AQ.js +1 -0
- package/dist/error-handler-BDid7SIZ.d.ts +47 -0
- package/dist/error-handler-D4s_TTI1.js +80 -0
- package/dist/error-handler-D4s_TTI1.js.map +1 -0
- package/dist/errors/error-handler.d.ts +3 -0
- package/dist/errors/error-handler.js +4 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.js +5 -0
- package/dist/errors-BB_jeye8.js +43 -0
- package/dist/errors-BB_jeye8.js.map +1 -0
- package/dist/errors-DfkerzdO.js +1 -0
- package/dist/event-publisher-adapter-B02oKEmP.js +46 -0
- package/dist/event-publisher-adapter-B02oKEmP.js.map +1 -0
- package/dist/event-publisher-adapter-CpxK0OJ3.d.ts +12 -0
- package/dist/events/event-publisher-adapter.d.ts +2 -0
- package/dist/events/event-publisher-adapter.js +3 -0
- package/dist/events/in-memory-event-bus.d.ts +2 -0
- package/dist/events/in-memory-event-bus.js +3 -0
- package/dist/events/in-memory-event-publisher.d.ts +2 -0
- package/dist/events/in-memory-event-publisher.js +3 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.js +6 -0
- package/dist/events-Dqynhuj2.js +1 -0
- package/dist/in-memory-cache-store-BaRxM--K.d.ts +31 -0
- package/dist/in-memory-cache-store-oClww-8m.js +72 -0
- package/dist/in-memory-cache-store-oClww-8m.js.map +1 -0
- package/dist/in-memory-event-bus-BCyPrNAE.js +60 -0
- package/dist/in-memory-event-bus-BCyPrNAE.js.map +1 -0
- package/dist/in-memory-event-bus-CqIBLRze.d.ts +21 -0
- package/dist/in-memory-event-publisher-BdOlxfkx.js +28 -0
- package/dist/in-memory-event-publisher-BdOlxfkx.js.map +1 -0
- package/dist/in-memory-event-publisher-CxOQ-hnq.d.ts +12 -0
- package/dist/in-memory-rate-limiter-BDSHZXxf.js +72 -0
- package/dist/in-memory-rate-limiter-BDSHZXxf.js.map +1 -0
- package/dist/in-memory-rate-limiter-DJsxdZZR.d.ts +34 -0
- package/dist/index-B5F3AfVc.d.ts +1 -0
- package/dist/index-B7z6dpFd.d.ts +1 -0
- package/dist/index-BH67NKRs.d.ts +2 -0
- package/dist/index-C0yeuOwC.d.ts +1 -0
- package/dist/index-C6nYd7xV.d.ts +2 -0
- package/dist/index-DVGDAddE.d.ts +1 -0
- package/dist/index-DXJbbtWQ.d.ts +1 -0
- package/dist/index-LKrIp3Oo.d.ts +1 -0
- package/dist/index.d.ts +29 -506
- package/dist/index.js +27 -969
- package/dist/logger-Bl10drB8.d.ts +23 -0
- package/dist/logging/index.d.ts +5 -0
- package/dist/logging/index.js +5 -0
- package/dist/logging/request-logger.d.ts +2 -0
- package/dist/logging/request-logger.js +3 -0
- package/dist/logging/structured-logger.d.ts +3 -0
- package/dist/logging/structured-logger.js +3 -0
- package/dist/logging-4mLSrMc6.js +1 -0
- package/dist/modules/core.module.d.ts +10 -0
- package/dist/modules/core.module.js +13 -0
- package/dist/modules/index.d.ts +12 -0
- package/dist/modules/index.js +16 -0
- package/dist/modules/types.d.ts +9 -0
- package/dist/modules/types.js +6 -0
- package/dist/modules/user.module.d.ts +10 -0
- package/dist/modules/user.module.js +4 -0
- package/dist/modules-C_2SF3he.js +1 -0
- package/dist/rate-limiter/in-memory-rate-limiter.d.ts +2 -0
- package/dist/rate-limiter/in-memory-rate-limiter.js +3 -0
- package/dist/rate-limiter/index.d.ts +3 -0
- package/dist/rate-limiter/index.js +4 -0
- package/dist/rate-limiter-BnvPGJOK.js +1 -0
- package/dist/repositories-nTfSJyvW.js +1 -0
- package/dist/request-logger-CK3SOnoz.d.ts +23 -0
- package/dist/request-logger-Cw1XQWTV.js +49 -0
- package/dist/request-logger-Cw1XQWTV.js.map +1 -0
- package/dist/structured-logger-BsxDI9zX.js +119 -0
- package/dist/structured-logger-BsxDI9zX.js.map +1 -0
- package/dist/structured-logger-Dz06Uz-u.d.ts +47 -0
- package/dist/transaction-akuz5Fch.d.ts +22 -0
- package/dist/transaction-r4Sy3eC-.js +35 -0
- package/dist/transaction-r4Sy3eC-.js.map +1 -0
- package/dist/types-65aFqB5L.d.ts +62 -0
- package/dist/use-case-decorator-DzPSPSv5.d.ts +52 -0
- package/dist/use-case-decorator-GmDeYViz.js +118 -0
- package/dist/use-case-decorator-GmDeYViz.js.map +1 -0
- package/dist/user.drizzle-9kkstnkV.d.ts +12 -0
- package/dist/user.drizzle-CgKIqqb3.js +57 -0
- package/dist/user.drizzle-CgKIqqb3.js.map +1 -0
- package/dist/user.module-BEpCbKsU.js +17 -0
- package/dist/user.module-BEpCbKsU.js.map +1 -0
- package/dist/user.module-D3lVJ98T.d.ts +15 -0
- package/dist/with-caching-BniS1aZd.d.ts +39 -0
- package/dist/with-caching-NmBxu7vJ.js +37 -0
- package/dist/with-caching-NmBxu7vJ.js.map +1 -0
- package/dist/with-rate-limit-Cp2V1RHn.js +48 -0
- package/dist/with-rate-limit-Cp2V1RHn.js.map +1 -0
- package/dist/with-rate-limit-DK4ZF-Qg.d.ts +45 -0
- package/dist/with-retry-B9-hUj7I.d.ts +40 -0
- package/dist/with-retry-coyYPiX1.js +49 -0
- package/dist/with-retry-coyYPiX1.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { t as makeEventPublisherAdapter } from "../event-publisher-adapter-CpxK0OJ3.js";
|
|
2
|
+
import { t as InMemoryEventBus } from "../in-memory-event-bus-CqIBLRze.js";
|
|
3
|
+
import { t as makeInMemoryEventPublisher } from "../in-memory-event-publisher-CxOQ-hnq.js";
|
|
4
|
+
import "../index-C0yeuOwC.js";
|
|
5
|
+
export { InMemoryEventBus, makeEventPublisherAdapter, makeInMemoryEventPublisher };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { t as InMemoryEventBus } from "../in-memory-event-bus-BCyPrNAE.js";
|
|
2
|
+
import { t as makeEventPublisherAdapter } from "../event-publisher-adapter-B02oKEmP.js";
|
|
3
|
+
import { t as makeInMemoryEventPublisher } from "../in-memory-event-publisher-BdOlxfkx.js";
|
|
4
|
+
import "../events-Dqynhuj2.js";
|
|
5
|
+
|
|
6
|
+
export { InMemoryEventBus, makeEventPublisherAdapter, makeInMemoryEventPublisher };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CacheStore } from "@kuckit/domain";
|
|
2
|
+
|
|
3
|
+
//#region src/cache/in-memory-cache-store.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory cache store implementation
|
|
7
|
+
* Suitable for single-process applications or development
|
|
8
|
+
* For distributed systems, use Redis adapter
|
|
9
|
+
*/
|
|
10
|
+
declare class InMemoryCacheStore implements CacheStore {
|
|
11
|
+
private cleanupIntervalMs;
|
|
12
|
+
private cache;
|
|
13
|
+
private cleanupTimer;
|
|
14
|
+
constructor(cleanupIntervalMs?: number);
|
|
15
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
16
|
+
set<T>(key: string, value: T, ttlMs?: number): Promise<void>;
|
|
17
|
+
del(key: string): Promise<void>;
|
|
18
|
+
clear(): Promise<void>;
|
|
19
|
+
has(key: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Start background cleanup of expired entries
|
|
22
|
+
*/
|
|
23
|
+
private startCleanup;
|
|
24
|
+
/**
|
|
25
|
+
* Stop cleanup timer
|
|
26
|
+
*/
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { InMemoryCacheStore as t };
|
|
31
|
+
//# sourceMappingURL=in-memory-cache-store-BaRxM--K.d.ts.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/cache/in-memory-cache-store.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory cache store implementation
|
|
4
|
+
* Suitable for single-process applications or development
|
|
5
|
+
* For distributed systems, use Redis adapter
|
|
6
|
+
*/
|
|
7
|
+
var InMemoryCacheStore = class {
|
|
8
|
+
cache = /* @__PURE__ */ new Map();
|
|
9
|
+
cleanupTimer = null;
|
|
10
|
+
constructor(cleanupIntervalMs = 6e4) {
|
|
11
|
+
this.cleanupIntervalMs = cleanupIntervalMs;
|
|
12
|
+
this.startCleanup();
|
|
13
|
+
}
|
|
14
|
+
async get(key) {
|
|
15
|
+
const entry = this.cache.get(key);
|
|
16
|
+
if (!entry) return;
|
|
17
|
+
if (entry.expiresAt && entry.expiresAt < Date.now()) {
|
|
18
|
+
this.cache.delete(key);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
return entry.value;
|
|
22
|
+
}
|
|
23
|
+
async set(key, value, ttlMs) {
|
|
24
|
+
const entry = {
|
|
25
|
+
value,
|
|
26
|
+
expiresAt: ttlMs ? Date.now() + ttlMs : void 0
|
|
27
|
+
};
|
|
28
|
+
this.cache.set(key, entry);
|
|
29
|
+
}
|
|
30
|
+
async del(key) {
|
|
31
|
+
this.cache.delete(key);
|
|
32
|
+
}
|
|
33
|
+
async clear() {
|
|
34
|
+
this.cache.clear();
|
|
35
|
+
}
|
|
36
|
+
async has(key) {
|
|
37
|
+
const entry = this.cache.get(key);
|
|
38
|
+
if (!entry) return false;
|
|
39
|
+
if (entry.expiresAt && entry.expiresAt < Date.now()) {
|
|
40
|
+
this.cache.delete(key);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Start background cleanup of expired entries
|
|
47
|
+
*/
|
|
48
|
+
startCleanup() {
|
|
49
|
+
this.cleanupTimer = setInterval(() => {
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
let expired = 0;
|
|
52
|
+
for (const [key, entry] of this.cache.entries()) if (entry.expiresAt && entry.expiresAt < now) {
|
|
53
|
+
this.cache.delete(key);
|
|
54
|
+
expired++;
|
|
55
|
+
}
|
|
56
|
+
if (expired > 0) {}
|
|
57
|
+
}, this.cleanupIntervalMs);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stop cleanup timer
|
|
61
|
+
*/
|
|
62
|
+
destroy() {
|
|
63
|
+
if (this.cleanupTimer) {
|
|
64
|
+
clearInterval(this.cleanupTimer);
|
|
65
|
+
this.cleanupTimer = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { InMemoryCacheStore as t };
|
|
72
|
+
//# sourceMappingURL=in-memory-cache-store-oClww-8m.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-cache-store-oClww-8m.js","names":["cleanupIntervalMs: number","entry: CacheEntry<T>"],"sources":["../src/cache/in-memory-cache-store.ts"],"sourcesContent":["import type { CacheStore } from '@kuckit/domain'\n\ninterface CacheEntry<T> {\n\tvalue: T\n\texpiresAt?: number\n}\n\n/**\n * In-memory cache store implementation\n * Suitable for single-process applications or development\n * For distributed systems, use Redis adapter\n */\nexport class InMemoryCacheStore implements CacheStore {\n\tprivate cache = new Map<string, CacheEntry<any>>()\n\tprivate cleanupTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private cleanupIntervalMs: number = 60000) {\n\t\tthis.startCleanup()\n\t}\n\n\tasync get<T>(key: string): Promise<T | undefined> {\n\t\tconst entry = this.cache.get(key)\n\n\t\tif (!entry) {\n\t\t\treturn undefined\n\t\t}\n\n\t\t// Check if expired\n\t\tif (entry.expiresAt && entry.expiresAt < Date.now()) {\n\t\t\tthis.cache.delete(key)\n\t\t\treturn undefined\n\t\t}\n\n\t\treturn entry.value as T\n\t}\n\n\tasync set<T>(key: string, value: T, ttlMs?: number): Promise<void> {\n\t\tconst entry: CacheEntry<T> = {\n\t\t\tvalue,\n\t\t\texpiresAt: ttlMs ? Date.now() + ttlMs : undefined,\n\t\t}\n\n\t\tthis.cache.set(key, entry)\n\t}\n\n\tasync del(key: string): Promise<void> {\n\t\tthis.cache.delete(key)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.cache.clear()\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst entry = this.cache.get(key)\n\n\t\tif (!entry) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if expired\n\t\tif (entry.expiresAt && entry.expiresAt < Date.now()) {\n\t\t\tthis.cache.delete(key)\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\t/**\n\t * Start background cleanup of expired entries\n\t */\n\tprivate startCleanup(): void {\n\t\tthis.cleanupTimer = setInterval(() => {\n\t\t\tconst now = Date.now()\n\t\t\tlet expired = 0\n\n\t\t\tfor (const [key, entry] of this.cache.entries()) {\n\t\t\t\tif (entry.expiresAt && entry.expiresAt < now) {\n\t\t\t\t\tthis.cache.delete(key)\n\t\t\t\t\texpired++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Optionally log cleanup metrics\n\t\t\tif (expired > 0) {\n\t\t\t\t// console.debug(`Cache cleanup: removed ${expired} expired entries`)\n\t\t\t}\n\t\t}, this.cleanupIntervalMs)\n\t}\n\n\t/**\n\t * Stop cleanup timer\n\t */\n\tdestroy(): void {\n\t\tif (this.cleanupTimer) {\n\t\t\tclearInterval(this.cleanupTimer)\n\t\t\tthis.cleanupTimer = null\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;AAYA,IAAa,qBAAb,MAAsD;CACrD,AAAQ,wBAAQ,IAAI,KAA8B;CAClD,AAAQ,eAAsC;CAE9C,YAAY,AAAQA,oBAA4B,KAAO;EAAnC;AACnB,OAAK,cAAc;;CAGpB,MAAM,IAAO,KAAqC;EACjD,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAEjC,MAAI,CAAC,MACJ;AAID,MAAI,MAAM,aAAa,MAAM,YAAY,KAAK,KAAK,EAAE;AACpD,QAAK,MAAM,OAAO,IAAI;AACtB;;AAGD,SAAO,MAAM;;CAGd,MAAM,IAAO,KAAa,OAAU,OAA+B;EAClE,MAAMC,QAAuB;GAC5B;GACA,WAAW,QAAQ,KAAK,KAAK,GAAG,QAAQ;GACxC;AAED,OAAK,MAAM,IAAI,KAAK,MAAM;;CAG3B,MAAM,IAAI,KAA4B;AACrC,OAAK,MAAM,OAAO,IAAI;;CAGvB,MAAM,QAAuB;AAC5B,OAAK,MAAM,OAAO;;CAGnB,MAAM,IAAI,KAA+B;EACxC,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAEjC,MAAI,CAAC,MACJ,QAAO;AAIR,MAAI,MAAM,aAAa,MAAM,YAAY,KAAK,KAAK,EAAE;AACpD,QAAK,MAAM,OAAO,IAAI;AACtB,UAAO;;AAGR,SAAO;;;;;CAMR,AAAQ,eAAqB;AAC5B,OAAK,eAAe,kBAAkB;GACrC,MAAM,MAAM,KAAK,KAAK;GACtB,IAAI,UAAU;AAEd,QAAK,MAAM,CAAC,KAAK,UAAU,KAAK,MAAM,SAAS,CAC9C,KAAI,MAAM,aAAa,MAAM,YAAY,KAAK;AAC7C,SAAK,MAAM,OAAO,IAAI;AACtB;;AAKF,OAAI,UAAU,GAAG;KAGf,KAAK,kBAAkB;;;;;CAM3B,UAAgB;AACf,MAAI,KAAK,cAAc;AACtB,iBAAc,KAAK,aAAa;AAChC,QAAK,eAAe"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//#region src/events/in-memory-event-bus.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory event bus
|
|
4
|
+
* Stores handlers in Sets, executes synchronously or asynchronously
|
|
5
|
+
*/
|
|
6
|
+
var InMemoryEventBus = class {
|
|
7
|
+
handlers = /* @__PURE__ */ new Map();
|
|
8
|
+
allHandlers = /* @__PURE__ */ new Set();
|
|
9
|
+
constructor(logger) {
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
async publish(event) {
|
|
13
|
+
const eventName = String(event.name);
|
|
14
|
+
const handlers = this.handlers.get(eventName) ?? /* @__PURE__ */ new Set();
|
|
15
|
+
const allHandlers = Array.from(this.allHandlers);
|
|
16
|
+
const eventHandlers = [...handlers, ...allHandlers];
|
|
17
|
+
const failed = (await Promise.allSettled(eventHandlers.map((handler) => Promise.resolve(handler(event)).catch((error) => {
|
|
18
|
+
this.logger.error("Error in event handler", {
|
|
19
|
+
eventName,
|
|
20
|
+
eventId: event.meta.eventId,
|
|
21
|
+
error
|
|
22
|
+
});
|
|
23
|
+
})))).filter((r) => r.status === "rejected").length;
|
|
24
|
+
if (failed > 0) this.logger.warn(`Event published with ${failed} handler errors`, {
|
|
25
|
+
eventName,
|
|
26
|
+
eventId: event.meta.eventId
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
publishAsync(event) {
|
|
30
|
+
queueMicrotask(() => {
|
|
31
|
+
this.publish(event).catch((error) => {
|
|
32
|
+
this.logger.error("Unhandled error in async event publishing", {
|
|
33
|
+
eventName: event.name,
|
|
34
|
+
eventId: event.meta.eventId,
|
|
35
|
+
error
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
subscribe(eventName, handler) {
|
|
41
|
+
const eventNameStr = String(eventName);
|
|
42
|
+
if (!this.handlers.has(eventNameStr)) this.handlers.set(eventNameStr, /* @__PURE__ */ new Set());
|
|
43
|
+
const handlerSet = this.handlers.get(eventNameStr);
|
|
44
|
+
handlerSet.add(handler);
|
|
45
|
+
return () => {
|
|
46
|
+
handlerSet.delete(handler);
|
|
47
|
+
if (handlerSet.size === 0) this.handlers.delete(eventNameStr);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
subscribeAll(handler) {
|
|
51
|
+
this.allHandlers.add(handler);
|
|
52
|
+
return () => {
|
|
53
|
+
this.allHandlers.delete(handler);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { InMemoryEventBus as t };
|
|
60
|
+
//# sourceMappingURL=in-memory-event-bus-BCyPrNAE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-bus-BCyPrNAE.js","names":["logger: Logger"],"sources":["../src/events/in-memory-event-bus.ts"],"sourcesContent":["/**\n * In-memory event bus implementation\n * Suitable for single-process applications\n *\n * For distributed systems, implement EventBus with:\n * - Redis Pub/Sub\n * - RabbitMQ\n * - AWS SNS/SQS\n * - Apache Kafka\n */\n\nimport type { EventBus, EventHandler, EventName, TypedDomainEvent } from '@kuckit/domain'\nimport type { Logger } from '@kuckit/domain'\n\n/**\n * In-memory event bus\n * Stores handlers in Sets, executes synchronously or asynchronously\n */\nexport class InMemoryEventBus implements EventBus {\n\tprivate handlers: Map<string, Set<EventHandler>> = new Map()\n\tprivate allHandlers: Set<EventHandler> = new Set()\n\n\tconstructor(private logger: Logger) {}\n\n\tasync publish<TName extends EventName>(event: TypedDomainEvent<TName>): Promise<void> {\n\t\tconst eventName = String(event.name)\n\t\tconst handlers = this.handlers.get(eventName) ?? new Set()\n\t\tconst allHandlers = Array.from(this.allHandlers)\n\t\tconst eventHandlers = [...handlers, ...allHandlers]\n\n\t\t// Execute all handlers, catching errors\n\t\tconst results = await Promise.allSettled(\n\t\t\teventHandlers.map((handler) =>\n\t\t\t\tPromise.resolve(handler(event as any)).catch((error) => {\n\t\t\t\t\tthis.logger.error('Error in event handler', {\n\t\t\t\t\t\teventName,\n\t\t\t\t\t\teventId: event.meta.eventId,\n\t\t\t\t\t\terror,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t)\n\t\t)\n\n\t\t// Log summary\n\t\tconst failed = results.filter((r) => r.status === 'rejected').length\n\t\tif (failed > 0) {\n\t\t\tthis.logger.warn(`Event published with ${failed} handler errors`, {\n\t\t\t\teventName,\n\t\t\t\teventId: event.meta.eventId,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublishAsync<TName extends EventName>(event: TypedDomainEvent<TName>): void {\n\t\tqueueMicrotask(() => {\n\t\t\tthis.publish(event).catch((error) => {\n\t\t\t\tthis.logger.error('Unhandled error in async event publishing', {\n\t\t\t\t\teventName: event.name,\n\t\t\t\t\teventId: event.meta.eventId,\n\t\t\t\t\terror,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\tsubscribe<TName extends EventName>(eventName: TName, handler: EventHandler<TName>): () => void {\n\t\tconst eventNameStr = String(eventName)\n\t\tif (!this.handlers.has(eventNameStr)) {\n\t\t\tthis.handlers.set(eventNameStr, new Set())\n\t\t}\n\n\t\tconst handlerSet = this.handlers.get(eventNameStr)!\n\t\thandlerSet.add(handler as EventHandler)\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\thandlerSet.delete(handler as EventHandler)\n\t\t\tif (handlerSet.size === 0) {\n\t\t\t\tthis.handlers.delete(eventNameStr)\n\t\t\t}\n\t\t}\n\t}\n\n\tsubscribeAll(handler: EventHandler): () => void {\n\t\tthis.allHandlers.add(handler)\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.allHandlers.delete(handler)\n\t\t}\n\t}\n}\n"],"mappings":";;;;;AAkBA,IAAa,mBAAb,MAAkD;CACjD,AAAQ,2BAA2C,IAAI,KAAK;CAC5D,AAAQ,8BAAiC,IAAI,KAAK;CAElD,YAAY,AAAQA,QAAgB;EAAhB;;CAEpB,MAAM,QAAiC,OAA+C;EACrF,MAAM,YAAY,OAAO,MAAM,KAAK;EACpC,MAAM,WAAW,KAAK,SAAS,IAAI,UAAU,oBAAI,IAAI,KAAK;EAC1D,MAAM,cAAc,MAAM,KAAK,KAAK,YAAY;EAChD,MAAM,gBAAgB,CAAC,GAAG,UAAU,GAAG,YAAY;EAgBnD,MAAM,UAbU,MAAM,QAAQ,WAC7B,cAAc,KAAK,YAClB,QAAQ,QAAQ,QAAQ,MAAa,CAAC,CAAC,OAAO,UAAU;AACvD,QAAK,OAAO,MAAM,0BAA0B;IAC3C;IACA,SAAS,MAAM,KAAK;IACpB;IACA,CAAC;IACD,CACF,CACD,EAGsB,QAAQ,MAAM,EAAE,WAAW,WAAW,CAAC;AAC9D,MAAI,SAAS,EACZ,MAAK,OAAO,KAAK,wBAAwB,OAAO,kBAAkB;GACjE;GACA,SAAS,MAAM,KAAK;GACpB,CAAC;;CAIJ,aAAsC,OAAsC;AAC3E,uBAAqB;AACpB,QAAK,QAAQ,MAAM,CAAC,OAAO,UAAU;AACpC,SAAK,OAAO,MAAM,6CAA6C;KAC9D,WAAW,MAAM;KACjB,SAAS,MAAM,KAAK;KACpB;KACA,CAAC;KACD;IACD;;CAGH,UAAmC,WAAkB,SAA0C;EAC9F,MAAM,eAAe,OAAO,UAAU;AACtC,MAAI,CAAC,KAAK,SAAS,IAAI,aAAa,CACnC,MAAK,SAAS,IAAI,8BAAc,IAAI,KAAK,CAAC;EAG3C,MAAM,aAAa,KAAK,SAAS,IAAI,aAAa;AAClD,aAAW,IAAI,QAAwB;AAGvC,eAAa;AACZ,cAAW,OAAO,QAAwB;AAC1C,OAAI,WAAW,SAAS,EACvB,MAAK,SAAS,OAAO,aAAa;;;CAKrC,aAAa,SAAmC;AAC/C,OAAK,YAAY,IAAI,QAAQ;AAG7B,eAAa;AACZ,QAAK,YAAY,OAAO,QAAQ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { EventBus, EventHandler, EventName, Logger, TypedDomainEvent } from "@kuckit/domain";
|
|
2
|
+
|
|
3
|
+
//#region src/events/in-memory-event-bus.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory event bus
|
|
7
|
+
* Stores handlers in Sets, executes synchronously or asynchronously
|
|
8
|
+
*/
|
|
9
|
+
declare class InMemoryEventBus implements EventBus {
|
|
10
|
+
private logger;
|
|
11
|
+
private handlers;
|
|
12
|
+
private allHandlers;
|
|
13
|
+
constructor(logger: Logger);
|
|
14
|
+
publish<TName extends EventName>(event: TypedDomainEvent<TName>): Promise<void>;
|
|
15
|
+
publishAsync<TName extends EventName>(event: TypedDomainEvent<TName>): void;
|
|
16
|
+
subscribe<TName extends EventName>(eventName: TName, handler: EventHandler<TName>): () => void;
|
|
17
|
+
subscribeAll(handler: EventHandler): () => void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { InMemoryEventBus as t };
|
|
21
|
+
//# sourceMappingURL=in-memory-event-bus-CqIBLRze.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/events/in-memory-event-publisher.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory event publisher implementation
|
|
4
|
+
* Suitable for development and testing
|
|
5
|
+
*/
|
|
6
|
+
const makeInMemoryEventPublisher = () => {
|
|
7
|
+
const subscribers = /* @__PURE__ */ new Map();
|
|
8
|
+
return {
|
|
9
|
+
async publish(eventName, payload, _aggregateId) {
|
|
10
|
+
const handlers = subscribers.get(eventName);
|
|
11
|
+
if (!handlers) return;
|
|
12
|
+
await Promise.all(Array.from(handlers).map((handler) => Promise.resolve(handler(payload))));
|
|
13
|
+
},
|
|
14
|
+
subscribe(eventName, handler) {
|
|
15
|
+
if (!subscribers.has(eventName)) subscribers.set(eventName, /* @__PURE__ */ new Set());
|
|
16
|
+
const handlers = subscribers.get(eventName);
|
|
17
|
+
handlers.add(handler);
|
|
18
|
+
return () => {
|
|
19
|
+
handlers.delete(handler);
|
|
20
|
+
if (handlers.size === 0) subscribers.delete(eventName);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { makeInMemoryEventPublisher as t };
|
|
28
|
+
//# sourceMappingURL=in-memory-event-publisher-BdOlxfkx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-publisher-BdOlxfkx.js","names":[],"sources":["../src/events/in-memory-event-publisher.ts"],"sourcesContent":["import type { EventPublisher } from '@kuckit/domain'\n\n/**\n * In-memory event publisher implementation\n * Suitable for development and testing\n */\nexport const makeInMemoryEventPublisher = (): EventPublisher => {\n\tconst subscribers = new Map<string, Set<(payload: Record<string, any>) => Promise<void> | void>>()\n\n\treturn {\n\t\tasync publish(\n\t\t\teventName: string,\n\t\t\tpayload: Record<string, any>,\n\t\t\t_aggregateId: string\n\t\t): Promise<void> {\n\t\t\tconst handlers = subscribers.get(eventName)\n\t\t\tif (!handlers) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Execute all handlers concurrently\n\t\t\tawait Promise.all(Array.from(handlers).map((handler) => Promise.resolve(handler(payload))))\n\t\t},\n\n\t\tsubscribe(\n\t\t\teventName: string,\n\t\t\thandler: (payload: Record<string, any>) => Promise<void> | void\n\t\t): () => void {\n\t\t\tif (!subscribers.has(eventName)) {\n\t\t\t\tsubscribers.set(eventName, new Set())\n\t\t\t}\n\n\t\t\tconst handlers = subscribers.get(eventName)!\n\t\t\thandlers.add(handler)\n\n\t\t\t// Return unsubscribe function\n\t\t\treturn () => {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\tsubscribers.delete(eventName)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n"],"mappings":";;;;;AAMA,MAAa,mCAAmD;CAC/D,MAAM,8BAAc,IAAI,KAA0E;AAElG,QAAO;EACN,MAAM,QACL,WACA,SACA,cACgB;GAChB,MAAM,WAAW,YAAY,IAAI,UAAU;AAC3C,OAAI,CAAC,SACJ;AAID,SAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CAAC;;EAG5F,UACC,WACA,SACa;AACb,OAAI,CAAC,YAAY,IAAI,UAAU,CAC9B,aAAY,IAAI,2BAAW,IAAI,KAAK,CAAC;GAGtC,MAAM,WAAW,YAAY,IAAI,UAAU;AAC3C,YAAS,IAAI,QAAQ;AAGrB,gBAAa;AACZ,aAAS,OAAO,QAAQ;AACxB,QAAI,SAAS,SAAS,EACrB,aAAY,OAAO,UAAU;;;EAIhC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EventPublisher } from "@kuckit/domain";
|
|
2
|
+
|
|
3
|
+
//#region src/events/in-memory-event-publisher.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory event publisher implementation
|
|
7
|
+
* Suitable for development and testing
|
|
8
|
+
*/
|
|
9
|
+
declare const makeInMemoryEventPublisher: () => EventPublisher;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { makeInMemoryEventPublisher as t };
|
|
12
|
+
//# sourceMappingURL=in-memory-event-publisher-CxOQ-hnq.d.ts.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/rate-limiter/in-memory-rate-limiter.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory rate limiter using token bucket algorithm
|
|
4
|
+
* Suitable for single-process applications or development
|
|
5
|
+
* For distributed systems, use Redis adapter
|
|
6
|
+
*/
|
|
7
|
+
var InMemoryRateLimiterStore = class {
|
|
8
|
+
buckets = /* @__PURE__ */ new Map();
|
|
9
|
+
cleanupTimer = null;
|
|
10
|
+
constructor(cleanupIntervalMs = 6e4) {
|
|
11
|
+
this.cleanupIntervalMs = cleanupIntervalMs;
|
|
12
|
+
this.startCleanup();
|
|
13
|
+
}
|
|
14
|
+
async checkLimit(key, capacity, refillPerSecond) {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
let bucket = this.buckets.get(key);
|
|
17
|
+
if (!bucket) {
|
|
18
|
+
bucket = {
|
|
19
|
+
tokens: capacity,
|
|
20
|
+
lastRefillAt: now
|
|
21
|
+
};
|
|
22
|
+
this.buckets.set(key, bucket);
|
|
23
|
+
}
|
|
24
|
+
const tokensToAdd = (now - bucket.lastRefillAt) / 1e3 * refillPerSecond;
|
|
25
|
+
bucket.tokens = Math.min(capacity, bucket.tokens + tokensToAdd);
|
|
26
|
+
bucket.lastRefillAt = now;
|
|
27
|
+
const allowed = bucket.tokens >= 1;
|
|
28
|
+
if (allowed) bucket.tokens -= 1;
|
|
29
|
+
const secondsToReset = Math.max(0, 1 - bucket.tokens) / refillPerSecond;
|
|
30
|
+
const resetAt = new Date(now + secondsToReset * 1e3);
|
|
31
|
+
return {
|
|
32
|
+
allowed,
|
|
33
|
+
tokensRemaining: Math.floor(bucket.tokens),
|
|
34
|
+
resetAt
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async reset(key) {
|
|
38
|
+
this.buckets.delete(key);
|
|
39
|
+
}
|
|
40
|
+
async clear() {
|
|
41
|
+
this.buckets.clear();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start background cleanup of old buckets
|
|
45
|
+
* Removes buckets that haven't been used in a long time
|
|
46
|
+
*/
|
|
47
|
+
startCleanup() {
|
|
48
|
+
this.cleanupTimer = setInterval(() => {
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const maxAgeMs = 36e5;
|
|
51
|
+
let removed = 0;
|
|
52
|
+
for (const [key, bucket] of this.buckets.entries()) if (now - bucket.lastRefillAt > maxAgeMs) {
|
|
53
|
+
this.buckets.delete(key);
|
|
54
|
+
removed++;
|
|
55
|
+
}
|
|
56
|
+
if (removed > 0) {}
|
|
57
|
+
}, this.cleanupIntervalMs);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stop cleanup timer
|
|
61
|
+
*/
|
|
62
|
+
destroy() {
|
|
63
|
+
if (this.cleanupTimer) {
|
|
64
|
+
clearInterval(this.cleanupTimer);
|
|
65
|
+
this.cleanupTimer = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { InMemoryRateLimiterStore as t };
|
|
72
|
+
//# sourceMappingURL=in-memory-rate-limiter-BDSHZXxf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-rate-limiter-BDSHZXxf.js","names":["cleanupIntervalMs: number"],"sources":["../src/rate-limiter/in-memory-rate-limiter.ts"],"sourcesContent":["import type { RateLimiterStore } from '@kuckit/domain'\n\ninterface TokenBucket {\n\ttokens: number\n\tlastRefillAt: number\n}\n\n/**\n * In-memory rate limiter using token bucket algorithm\n * Suitable for single-process applications or development\n * For distributed systems, use Redis adapter\n */\nexport class InMemoryRateLimiterStore implements RateLimiterStore {\n\tprivate buckets = new Map<string, TokenBucket>()\n\tprivate cleanupTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private cleanupIntervalMs: number = 60000) {\n\t\tthis.startCleanup()\n\t}\n\n\tasync checkLimit(\n\t\tkey: string,\n\t\tcapacity: number,\n\t\trefillPerSecond: number\n\t): Promise<{\n\t\tallowed: boolean\n\t\ttokensRemaining: number\n\t\tresetAt: Date\n\t}> {\n\t\tconst now = Date.now()\n\t\tlet bucket = this.buckets.get(key)\n\n\t\t// Initialize bucket if not exists\n\t\tif (!bucket) {\n\t\t\tbucket = {\n\t\t\t\ttokens: capacity,\n\t\t\t\tlastRefillAt: now,\n\t\t\t}\n\t\t\tthis.buckets.set(key, bucket)\n\t\t}\n\n\t\t// Calculate refill amount based on time passed\n\t\tconst timeSinceRefillMs = now - bucket.lastRefillAt\n\t\tconst timeSinceRefillSec = timeSinceRefillMs / 1000\n\t\tconst tokensToAdd = timeSinceRefillSec * refillPerSecond\n\n\t\t// Refill tokens (capped at capacity)\n\t\tbucket.tokens = Math.min(capacity, bucket.tokens + tokensToAdd)\n\t\tbucket.lastRefillAt = now\n\n\t\t// Check if request is allowed\n\t\tconst allowed = bucket.tokens >= 1\n\n\t\tif (allowed) {\n\t\t\tbucket.tokens -= 1\n\t\t}\n\n\t\t// Calculate reset time (when we'll have 1 token again)\n\t\tconst tokensNeeded = Math.max(0, 1 - bucket.tokens)\n\t\tconst secondsToReset = tokensNeeded / refillPerSecond\n\t\tconst resetAt = new Date(now + secondsToReset * 1000)\n\n\t\treturn {\n\t\t\tallowed,\n\t\t\ttokensRemaining: Math.floor(bucket.tokens),\n\t\t\tresetAt,\n\t\t}\n\t}\n\n\tasync reset(key: string): Promise<void> {\n\t\tthis.buckets.delete(key)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.buckets.clear()\n\t}\n\n\t/**\n\t * Start background cleanup of old buckets\n\t * Removes buckets that haven't been used in a long time\n\t */\n\tprivate startCleanup(): void {\n\t\tthis.cleanupTimer = setInterval(() => {\n\t\t\tconst now = Date.now()\n\t\t\tconst maxAgeMs = 3600000 // 1 hour\n\t\t\tlet removed = 0\n\n\t\t\tfor (const [key, bucket] of this.buckets.entries()) {\n\t\t\t\tif (now - bucket.lastRefillAt > maxAgeMs) {\n\t\t\t\t\tthis.buckets.delete(key)\n\t\t\t\t\tremoved++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Optionally log cleanup metrics\n\t\t\tif (removed > 0) {\n\t\t\t\t// console.debug(`RateLimiter cleanup: removed ${removed} old buckets`)\n\t\t\t}\n\t\t}, this.cleanupIntervalMs)\n\t}\n\n\t/**\n\t * Stop cleanup timer\n\t */\n\tdestroy(): void {\n\t\tif (this.cleanupTimer) {\n\t\t\tclearInterval(this.cleanupTimer)\n\t\t\tthis.cleanupTimer = null\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;AAYA,IAAa,2BAAb,MAAkE;CACjE,AAAQ,0BAAU,IAAI,KAA0B;CAChD,AAAQ,eAAsC;CAE9C,YAAY,AAAQA,oBAA4B,KAAO;EAAnC;AACnB,OAAK,cAAc;;CAGpB,MAAM,WACL,KACA,UACA,iBAKE;EACF,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,SAAS,KAAK,QAAQ,IAAI,IAAI;AAGlC,MAAI,CAAC,QAAQ;AACZ,YAAS;IACR,QAAQ;IACR,cAAc;IACd;AACD,QAAK,QAAQ,IAAI,KAAK,OAAO;;EAM9B,MAAM,eAFoB,MAAM,OAAO,gBACQ,MACN;AAGzC,SAAO,SAAS,KAAK,IAAI,UAAU,OAAO,SAAS,YAAY;AAC/D,SAAO,eAAe;EAGtB,MAAM,UAAU,OAAO,UAAU;AAEjC,MAAI,QACH,QAAO,UAAU;EAKlB,MAAM,iBADe,KAAK,IAAI,GAAG,IAAI,OAAO,OAAO,GACb;EACtC,MAAM,UAAU,IAAI,KAAK,MAAM,iBAAiB,IAAK;AAErD,SAAO;GACN;GACA,iBAAiB,KAAK,MAAM,OAAO,OAAO;GAC1C;GACA;;CAGF,MAAM,MAAM,KAA4B;AACvC,OAAK,QAAQ,OAAO,IAAI;;CAGzB,MAAM,QAAuB;AAC5B,OAAK,QAAQ,OAAO;;;;;;CAOrB,AAAQ,eAAqB;AAC5B,OAAK,eAAe,kBAAkB;GACrC,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,WAAW;GACjB,IAAI,UAAU;AAEd,QAAK,MAAM,CAAC,KAAK,WAAW,KAAK,QAAQ,SAAS,CACjD,KAAI,MAAM,OAAO,eAAe,UAAU;AACzC,SAAK,QAAQ,OAAO,IAAI;AACxB;;AAKF,OAAI,UAAU,GAAG;KAGf,KAAK,kBAAkB;;;;;CAM3B,UAAgB;AACf,MAAI,KAAK,cAAc;AACtB,iBAAc,KAAK,aAAa;AAChC,QAAK,eAAe"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RateLimiterStore } from "@kuckit/domain";
|
|
2
|
+
|
|
3
|
+
//#region src/rate-limiter/in-memory-rate-limiter.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory rate limiter using token bucket algorithm
|
|
7
|
+
* Suitable for single-process applications or development
|
|
8
|
+
* For distributed systems, use Redis adapter
|
|
9
|
+
*/
|
|
10
|
+
declare class InMemoryRateLimiterStore implements RateLimiterStore {
|
|
11
|
+
private cleanupIntervalMs;
|
|
12
|
+
private buckets;
|
|
13
|
+
private cleanupTimer;
|
|
14
|
+
constructor(cleanupIntervalMs?: number);
|
|
15
|
+
checkLimit(key: string, capacity: number, refillPerSecond: number): Promise<{
|
|
16
|
+
allowed: boolean;
|
|
17
|
+
tokensRemaining: number;
|
|
18
|
+
resetAt: Date;
|
|
19
|
+
}>;
|
|
20
|
+
reset(key: string): Promise<void>;
|
|
21
|
+
clear(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Start background cleanup of old buckets
|
|
24
|
+
* Removes buckets that haven't been used in a long time
|
|
25
|
+
*/
|
|
26
|
+
private startCleanup;
|
|
27
|
+
/**
|
|
28
|
+
* Stop cleanup timer
|
|
29
|
+
*/
|
|
30
|
+
destroy(): void;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { InMemoryRateLimiterStore as t };
|
|
34
|
+
//# sourceMappingURL=in-memory-rate-limiter-DJsxdZZR.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|