@kuckit/infrastructure 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/apply-decorators-CW23qWy7.d.ts +23 -0
  2. package/dist/apply-decorators-CaHIAL5X.js +29 -0
  3. package/dist/apply-decorators-CaHIAL5X.js.map +1 -0
  4. package/dist/cache/in-memory-cache-store.d.ts +2 -0
  5. package/dist/cache/in-memory-cache-store.js +3 -0
  6. package/dist/cache/index.d.ts +3 -0
  7. package/dist/cache/index.js +4 -0
  8. package/dist/cache-BjdZ-Ye4.js +1 -0
  9. package/dist/core.module-B1TdC0yX.d.ts +17 -0
  10. package/dist/core.module-DMtIkTcz.js +48 -0
  11. package/dist/core.module-DMtIkTcz.js.map +1 -0
  12. package/dist/db/drizzle/db.d.ts +2 -0
  13. package/dist/db/drizzle/db.js +3 -0
  14. package/dist/db/drizzle/repositories/index.d.ts +3 -0
  15. package/dist/db/drizzle/repositories/index.js +4 -0
  16. package/dist/db/drizzle/repositories/user.drizzle.d.ts +2 -0
  17. package/dist/db/drizzle/repositories/user.drizzle.js +3 -0
  18. package/dist/db/transaction.d.ts +2 -0
  19. package/dist/db/transaction.js +4 -0
  20. package/dist/db-C4IcCT04.js +25 -0
  21. package/dist/db-C4IcCT04.js.map +1 -0
  22. package/dist/db-tAPHBDyL.d.ts +17 -0
  23. package/dist/decorators/apply-decorators.d.ts +2 -0
  24. package/dist/decorators/apply-decorators.js +5 -0
  25. package/dist/decorators/index.d.ts +8 -0
  26. package/dist/decorators/index.js +9 -0
  27. package/dist/decorators/use-case-decorator.d.ts +3 -0
  28. package/dist/decorators/use-case-decorator.js +4 -0
  29. package/dist/decorators/with-caching.d.ts +2 -0
  30. package/dist/decorators/with-caching.js +3 -0
  31. package/dist/decorators/with-rate-limit.d.ts +2 -0
  32. package/dist/decorators/with-rate-limit.js +3 -0
  33. package/dist/decorators/with-retry.d.ts +2 -0
  34. package/dist/decorators/with-retry.js +3 -0
  35. package/dist/decorators-CqyPE9AQ.js +1 -0
  36. package/dist/error-handler-BDid7SIZ.d.ts +47 -0
  37. package/dist/error-handler-D4s_TTI1.js +80 -0
  38. package/dist/error-handler-D4s_TTI1.js.map +1 -0
  39. package/dist/errors/error-handler.d.ts +3 -0
  40. package/dist/errors/error-handler.js +4 -0
  41. package/dist/errors/index.d.ts +4 -0
  42. package/dist/errors/index.js +5 -0
  43. package/dist/errors-BB_jeye8.js +43 -0
  44. package/dist/errors-BB_jeye8.js.map +1 -0
  45. package/dist/errors-DfkerzdO.js +1 -0
  46. package/dist/event-publisher-adapter-B02oKEmP.js +46 -0
  47. package/dist/event-publisher-adapter-B02oKEmP.js.map +1 -0
  48. package/dist/event-publisher-adapter-CpxK0OJ3.d.ts +12 -0
  49. package/dist/events/event-publisher-adapter.d.ts +2 -0
  50. package/dist/events/event-publisher-adapter.js +3 -0
  51. package/dist/events/in-memory-event-bus.d.ts +2 -0
  52. package/dist/events/in-memory-event-bus.js +3 -0
  53. package/dist/events/in-memory-event-publisher.d.ts +2 -0
  54. package/dist/events/in-memory-event-publisher.js +3 -0
  55. package/dist/events/index.d.ts +5 -0
  56. package/dist/events/index.js +6 -0
  57. package/dist/events-Dqynhuj2.js +1 -0
  58. package/dist/in-memory-cache-store-BaRxM--K.d.ts +31 -0
  59. package/dist/in-memory-cache-store-oClww-8m.js +72 -0
  60. package/dist/in-memory-cache-store-oClww-8m.js.map +1 -0
  61. package/dist/in-memory-event-bus-BCyPrNAE.js +60 -0
  62. package/dist/in-memory-event-bus-BCyPrNAE.js.map +1 -0
  63. package/dist/in-memory-event-bus-CqIBLRze.d.ts +21 -0
  64. package/dist/in-memory-event-publisher-BdOlxfkx.js +28 -0
  65. package/dist/in-memory-event-publisher-BdOlxfkx.js.map +1 -0
  66. package/dist/in-memory-event-publisher-CxOQ-hnq.d.ts +12 -0
  67. package/dist/in-memory-rate-limiter-BDSHZXxf.js +72 -0
  68. package/dist/in-memory-rate-limiter-BDSHZXxf.js.map +1 -0
  69. package/dist/in-memory-rate-limiter-DJsxdZZR.d.ts +34 -0
  70. package/dist/index-B5F3AfVc.d.ts +1 -0
  71. package/dist/index-B7z6dpFd.d.ts +1 -0
  72. package/dist/index-BH67NKRs.d.ts +2 -0
  73. package/dist/index-C0yeuOwC.d.ts +1 -0
  74. package/dist/index-C6nYd7xV.d.ts +2 -0
  75. package/dist/index-DVGDAddE.d.ts +1 -0
  76. package/dist/index-DXJbbtWQ.d.ts +1 -0
  77. package/dist/index-LKrIp3Oo.d.ts +1 -0
  78. package/dist/index.d.ts +29 -506
  79. package/dist/index.js +27 -969
  80. package/dist/logger-Bl10drB8.d.ts +23 -0
  81. package/dist/logging/index.d.ts +5 -0
  82. package/dist/logging/index.js +5 -0
  83. package/dist/logging/request-logger.d.ts +2 -0
  84. package/dist/logging/request-logger.js +3 -0
  85. package/dist/logging/structured-logger.d.ts +3 -0
  86. package/dist/logging/structured-logger.js +3 -0
  87. package/dist/logging-4mLSrMc6.js +1 -0
  88. package/dist/modules/core.module.d.ts +10 -0
  89. package/dist/modules/core.module.js +13 -0
  90. package/dist/modules/index.d.ts +12 -0
  91. package/dist/modules/index.js +16 -0
  92. package/dist/modules/types.d.ts +9 -0
  93. package/dist/modules/types.js +6 -0
  94. package/dist/modules/user.module.d.ts +10 -0
  95. package/dist/modules/user.module.js +4 -0
  96. package/dist/modules-C_2SF3he.js +1 -0
  97. package/dist/rate-limiter/in-memory-rate-limiter.d.ts +2 -0
  98. package/dist/rate-limiter/in-memory-rate-limiter.js +3 -0
  99. package/dist/rate-limiter/index.d.ts +3 -0
  100. package/dist/rate-limiter/index.js +4 -0
  101. package/dist/rate-limiter-BnvPGJOK.js +1 -0
  102. package/dist/repositories-nTfSJyvW.js +1 -0
  103. package/dist/request-logger-CK3SOnoz.d.ts +23 -0
  104. package/dist/request-logger-Cw1XQWTV.js +49 -0
  105. package/dist/request-logger-Cw1XQWTV.js.map +1 -0
  106. package/dist/structured-logger-BsxDI9zX.js +119 -0
  107. package/dist/structured-logger-BsxDI9zX.js.map +1 -0
  108. package/dist/structured-logger-Dz06Uz-u.d.ts +47 -0
  109. package/dist/transaction-akuz5Fch.d.ts +22 -0
  110. package/dist/transaction-r4Sy3eC-.js +35 -0
  111. package/dist/transaction-r4Sy3eC-.js.map +1 -0
  112. package/dist/types-65aFqB5L.d.ts +62 -0
  113. package/dist/use-case-decorator-DzPSPSv5.d.ts +52 -0
  114. package/dist/use-case-decorator-GmDeYViz.js +118 -0
  115. package/dist/use-case-decorator-GmDeYViz.js.map +1 -0
  116. package/dist/user.drizzle-9kkstnkV.d.ts +12 -0
  117. package/dist/user.drizzle-CgKIqqb3.js +57 -0
  118. package/dist/user.drizzle-CgKIqqb3.js.map +1 -0
  119. package/dist/user.module-BEpCbKsU.js +17 -0
  120. package/dist/user.module-BEpCbKsU.js.map +1 -0
  121. package/dist/user.module-D3lVJ98T.d.ts +15 -0
  122. package/dist/with-caching-BniS1aZd.d.ts +39 -0
  123. package/dist/with-caching-NmBxu7vJ.js +37 -0
  124. package/dist/with-caching-NmBxu7vJ.js.map +1 -0
  125. package/dist/with-rate-limit-Cp2V1RHn.js +48 -0
  126. package/dist/with-rate-limit-Cp2V1RHn.js.map +1 -0
  127. package/dist/with-rate-limit-DK4ZF-Qg.d.ts +45 -0
  128. package/dist/with-retry-B9-hUj7I.d.ts +40 -0
  129. package/dist/with-retry-coyYPiX1.js +49 -0
  130. package/dist/with-retry-coyYPiX1.js.map +1 -0
  131. package/package.json +10 -24
  132. package/src/index.ts +0 -26
@@ -0,0 +1,3 @@
1
+ import { t as makeInMemoryEventPublisher } from "../in-memory-event-publisher-BdOlxfkx.js";
2
+
3
+ export { makeInMemoryEventPublisher };
@@ -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,2 @@
1
+ import { RateLimiterStore as RateLimiterStore$1 } from "@kuckit/domain";
2
+ export { RateLimiterStore$1 as t };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,2 @@
1
+ import { CacheStore as CacheStore$1 } from "@kuckit/domain";
2
+ export { CacheStore$1 as t };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };