@bloomneo/appkit 1.2.9

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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. package/package.json +234 -0
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Memory event strategy with Node.js EventEmitter and cleanup management
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/strategies/memory.ts
5
+ *
6
+ * @llm-rule WHEN: No REDIS_URL environment variable - perfect for development and single-server apps
7
+ * @llm-rule AVOID: Production use across multiple servers - events don't work across processes
8
+ * @llm-rule NOTE: Fast local events, automatic cleanup, memory limits, great for development
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ /**
12
+ * Memory event strategy with intelligent cleanup and limits
13
+ */
14
+ export class MemoryStrategy {
15
+ config;
16
+ namespace;
17
+ emitter;
18
+ cleanupInterval = null;
19
+ listenerCounts = new Map();
20
+ /**
21
+ * Creates memory strategy with direct environment access (like auth pattern)
22
+ * @llm-rule WHEN: Event initialization without Redis URL - automatic fallback
23
+ * @llm-rule AVOID: Manual memory configuration - environment detection handles this
24
+ */
25
+ constructor(config, namespace) {
26
+ this.config = config;
27
+ this.namespace = namespace;
28
+ this.emitter = new EventEmitter();
29
+ // Set max listeners from config
30
+ this.emitter.setMaxListeners(config.memory?.maxListeners || 1000);
31
+ // Setup cleanup if garbage collection enabled
32
+ if (config.memory?.enableGC) {
33
+ this.setupCleanup();
34
+ }
35
+ if (this.config.environment.isDevelopment) {
36
+ console.log(`✅ [AppKit] Memory event strategy initialized (namespace: ${namespace}, maxListeners: ${this.emitter.getMaxListeners()})`);
37
+ }
38
+ }
39
+ /**
40
+ * Emits event via Node.js EventEmitter
41
+ * @llm-rule WHEN: Sending events within single process/server
42
+ * @llm-rule AVOID: Expecting cross-process delivery - memory events are local only
43
+ * @llm-rule NOTE: Instant delivery, no network latency, perfect for development
44
+ */
45
+ async emit(event, data) {
46
+ try {
47
+ // Emit via EventEmitter (synchronous but we return Promise for interface compatibility)
48
+ const result = this.emitter.emit(event, data);
49
+ // Update listener count tracking
50
+ this.updateListenerCount(event);
51
+ return result;
52
+ }
53
+ catch (error) {
54
+ console.error(`[AppKit] Memory emit error for event "${event}":`, error.message);
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Adds event listener with automatic cleanup tracking
60
+ * @llm-rule WHEN: Listening to events within single process
61
+ * @llm-rule AVOID: Adding too many listeners - respects maxListeners limit
62
+ */
63
+ on(event, handler) {
64
+ try {
65
+ // Check listener limit
66
+ this.checkListenerLimit(event);
67
+ // Add listener
68
+ this.emitter.on(event, handler);
69
+ // Track listener count
70
+ this.incrementListenerCount(event);
71
+ if (this.config.environment.isDevelopment) {
72
+ console.log(`📥 [AppKit] Memory listener added for: ${event} (total: ${this.emitter.listenerCount(event)})`);
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.error(`[AppKit] Memory on error for event "${event}":`, error.message);
77
+ }
78
+ }
79
+ /**
80
+ * Adds one-time event listener with automatic cleanup
81
+ * @llm-rule WHEN: Listening to events that should only fire once
82
+ * @llm-rule AVOID: Manual cleanup - this handles removal automatically
83
+ */
84
+ once(event, handler) {
85
+ try {
86
+ // Check listener limit
87
+ this.checkListenerLimit(event);
88
+ // Wrap handler to track cleanup
89
+ const onceWrapper = (data) => {
90
+ this.decrementListenerCount(event);
91
+ handler(data);
92
+ };
93
+ // Add one-time listener
94
+ this.emitter.once(event, onceWrapper);
95
+ // Track listener count
96
+ this.incrementListenerCount(event);
97
+ if (this.config.environment.isDevelopment) {
98
+ console.log(`📥 [AppKit] Memory once listener added for: ${event}`);
99
+ }
100
+ }
101
+ catch (error) {
102
+ console.error(`[AppKit] Memory once error for event "${event}":`, error.message);
103
+ }
104
+ }
105
+ /**
106
+ * Removes event listener(s) with cleanup tracking
107
+ * @llm-rule WHEN: Cleaning up event listeners to prevent memory leaks
108
+ * @llm-rule AVOID: Forgetting to remove listeners - memory strategy tracks everything
109
+ */
110
+ off(event, handler) {
111
+ try {
112
+ if (handler) {
113
+ // Remove specific handler
114
+ this.emitter.off(event, handler);
115
+ this.decrementListenerCount(event);
116
+ }
117
+ else {
118
+ // Remove all handlers for event
119
+ const count = this.emitter.listenerCount(event);
120
+ this.emitter.removeAllListeners(event);
121
+ this.listenerCounts.set(event, 0);
122
+ if (this.config.environment.isDevelopment && count > 0) {
123
+ console.log(`📤 [AppKit] Memory removed ${count} listeners for: ${event}`);
124
+ }
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.error(`[AppKit] Memory off error for event "${event}":`, error.message);
129
+ }
130
+ }
131
+ /**
132
+ * Gets current event listeners for debugging
133
+ * @llm-rule WHEN: Debugging event listeners or monitoring memory usage
134
+ * @llm-rule AVOID: Using for business logic - this is for debugging only
135
+ */
136
+ getListeners(event) {
137
+ if (event) {
138
+ return {
139
+ count: this.emitter.listenerCount(event),
140
+ events: [event],
141
+ maxListeners: this.emitter.getMaxListeners(),
142
+ };
143
+ }
144
+ // Get all events with listeners
145
+ const eventNames = this.emitter.eventNames();
146
+ const summary = eventNames.map(eventName => ({
147
+ event: eventName.toString(),
148
+ count: this.emitter.listenerCount(eventName),
149
+ }));
150
+ return {
151
+ totalEvents: eventNames.length,
152
+ totalListeners: summary.reduce((sum, item) => sum + item.count, 0),
153
+ maxListeners: this.emitter.getMaxListeners(),
154
+ events: summary,
155
+ };
156
+ }
157
+ /**
158
+ * Disconnects memory strategy gracefully
159
+ * @llm-rule WHEN: App shutdown or event cleanup
160
+ * @llm-rule AVOID: Memory leaks - always cleanup intervals and listeners
161
+ */
162
+ async disconnect() {
163
+ try {
164
+ // Stop cleanup interval
165
+ this.stopCleanup();
166
+ // Remove all listeners
167
+ this.emitter.removeAllListeners();
168
+ // Clear tracking
169
+ this.listenerCounts.clear();
170
+ if (this.config.environment.isDevelopment) {
171
+ console.log(`👋 [AppKit] Memory event strategy disconnected (namespace: ${this.namespace})`);
172
+ }
173
+ }
174
+ catch (error) {
175
+ console.error(`[AppKit] Memory disconnect error:`, error.message);
176
+ }
177
+ }
178
+ // Private helper methods
179
+ /**
180
+ * Checks if adding listener would exceed limit
181
+ */
182
+ checkListenerLimit(event) {
183
+ const currentCount = this.emitter.listenerCount(event);
184
+ const maxListeners = this.emitter.getMaxListeners();
185
+ if (currentCount >= maxListeners) {
186
+ console.warn(`[AppKit] Memory event listener limit reached for "${event}" ` +
187
+ `(${currentCount}/${maxListeners}). Consider removing unused listeners.`);
188
+ }
189
+ }
190
+ /**
191
+ * Increments listener count tracking
192
+ */
193
+ incrementListenerCount(event) {
194
+ const current = this.listenerCounts.get(event) || 0;
195
+ this.listenerCounts.set(event, current + 1);
196
+ }
197
+ /**
198
+ * Decrements listener count tracking
199
+ */
200
+ decrementListenerCount(event) {
201
+ const current = this.listenerCounts.get(event) || 0;
202
+ const newCount = Math.max(0, current - 1);
203
+ if (newCount === 0) {
204
+ this.listenerCounts.delete(event);
205
+ }
206
+ else {
207
+ this.listenerCounts.set(event, newCount);
208
+ }
209
+ }
210
+ /**
211
+ * Updates listener count from actual emitter state
212
+ */
213
+ updateListenerCount(event) {
214
+ const actualCount = this.emitter.listenerCount(event);
215
+ if (actualCount === 0) {
216
+ this.listenerCounts.delete(event);
217
+ }
218
+ else {
219
+ this.listenerCounts.set(event, actualCount);
220
+ }
221
+ }
222
+ /**
223
+ * Sets up automatic cleanup interval
224
+ */
225
+ setupCleanup() {
226
+ const interval = this.config.memory?.checkInterval || 30000;
227
+ this.cleanupInterval = setInterval(() => {
228
+ this.performCleanup();
229
+ }, interval);
230
+ // Don't let interval keep process alive
231
+ if (this.cleanupInterval.unref) {
232
+ this.cleanupInterval.unref();
233
+ }
234
+ }
235
+ /**
236
+ * Stops cleanup interval
237
+ */
238
+ stopCleanup() {
239
+ if (this.cleanupInterval) {
240
+ clearInterval(this.cleanupInterval);
241
+ this.cleanupInterval = null;
242
+ }
243
+ }
244
+ /**
245
+ * Performs memory cleanup and garbage collection
246
+ */
247
+ performCleanup() {
248
+ try {
249
+ // Sync listener counts with actual emitter state
250
+ this.syncListenerCounts();
251
+ // Clean up empty events
252
+ this.cleanupEmptyEvents();
253
+ // Log cleanup stats in development
254
+ if (this.config.environment.isDevelopment) {
255
+ const stats = this.getMemoryStats();
256
+ if (stats.totalListeners > 0) {
257
+ console.log(`🧹 [AppKit] Memory cleanup completed: ` +
258
+ `${stats.totalEvents} events, ${stats.totalListeners} listeners`);
259
+ }
260
+ }
261
+ }
262
+ catch (error) {
263
+ console.error(`[AppKit] Memory cleanup error:`, error.message);
264
+ }
265
+ }
266
+ /**
267
+ * Syncs tracking counts with actual emitter state
268
+ */
269
+ syncListenerCounts() {
270
+ // Check for events that no longer have listeners
271
+ for (const [event] of this.listenerCounts.entries()) {
272
+ const actualCount = this.emitter.listenerCount(event);
273
+ if (actualCount === 0) {
274
+ this.listenerCounts.delete(event);
275
+ }
276
+ else {
277
+ this.listenerCounts.set(event, actualCount);
278
+ }
279
+ }
280
+ }
281
+ /**
282
+ * Cleans up events with no listeners
283
+ */
284
+ cleanupEmptyEvents() {
285
+ const eventNames = this.emitter.eventNames();
286
+ for (const eventName of eventNames) {
287
+ const count = this.emitter.listenerCount(eventName);
288
+ if (count === 0) {
289
+ this.emitter.removeAllListeners(eventName);
290
+ this.listenerCounts.delete(eventName.toString());
291
+ }
292
+ }
293
+ }
294
+ /**
295
+ * Gets memory usage statistics
296
+ */
297
+ getMemoryStats() {
298
+ const eventNames = this.emitter.eventNames();
299
+ const totalListeners = eventNames.reduce((sum, eventName) => sum + this.emitter.listenerCount(eventName), 0);
300
+ return {
301
+ totalEvents: eventNames.length,
302
+ totalListeners,
303
+ maxListeners: this.emitter.getMaxListeners(),
304
+ memoryUsage: totalListeners / this.emitter.getMaxListeners(),
305
+ };
306
+ }
307
+ /**
308
+ * Gets detailed memory statistics for debugging
309
+ */
310
+ getDetailedStats() {
311
+ const eventNames = this.emitter.eventNames();
312
+ const events = eventNames.map(eventName => ({
313
+ event: eventName.toString(),
314
+ listeners: this.emitter.listenerCount(eventName),
315
+ }));
316
+ const totalListeners = events.reduce((sum, event) => sum + event.listeners, 0);
317
+ const maxListeners = this.emitter.getMaxListeners();
318
+ return {
319
+ strategy: 'memory',
320
+ namespace: this.namespace,
321
+ totalEvents: events.length,
322
+ totalListeners,
323
+ maxListeners,
324
+ memoryUsage: `${Math.round((totalListeners / maxListeners) * 100)}%`,
325
+ events: events.sort((a, b) => b.listeners - a.listeners), // Sort by listener count
326
+ cleanupEnabled: !!this.cleanupInterval,
327
+ lastCleanup: new Date().toISOString(),
328
+ };
329
+ }
330
+ }
331
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/event/strategies/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Redis event strategy with distributed pub/sub and automatic connection management
3
+ * @module @bloomneo/appkit/event
4
+ * @file src/event/strategies/redis.ts
5
+ *
6
+ * @llm-rule WHEN: App has REDIS_URL environment variable for distributed events across servers
7
+ * @llm-rule AVOID: Manual Redis setup - this handles connection, retry, and subscription management
8
+ * @llm-rule NOTE: Distributed events, automatic reconnection, pattern subscriptions, production-ready
9
+ */
10
+ import type { EventStrategy, EventHandler } from '../event.js';
11
+ import type { EventConfig } from '../defaults.js';
12
+ /**
13
+ * Redis event strategy with distributed pub/sub and reliability features
14
+ */
15
+ export declare class RedisStrategy implements EventStrategy {
16
+ private config;
17
+ private namespace;
18
+ private publisher;
19
+ private subscriber;
20
+ private connected;
21
+ private listeners;
22
+ private patternListeners;
23
+ /**
24
+ * Creates Redis strategy with direct environment access (like auth pattern)
25
+ * @llm-rule WHEN: Event initialization with REDIS_URL detected
26
+ * @llm-rule AVOID: Manual Redis configuration - environment detection handles this
27
+ */
28
+ constructor(config: EventConfig, namespace: string);
29
+ /**
30
+ * Connects to Redis with automatic retry and pub/sub setup
31
+ * @llm-rule WHEN: Event initialization or reconnection after failure
32
+ * @llm-rule AVOID: Manual connection management - this handles all Redis complexity
33
+ */
34
+ connect(): Promise<void>;
35
+ /**
36
+ * Sets up Redis event handlers for connection management
37
+ */
38
+ private setupEventHandlers;
39
+ /**
40
+ * Emits event via Redis pub/sub with automatic serialization
41
+ * @llm-rule WHEN: Sending events across multiple servers/processes
42
+ * @llm-rule AVOID: Manual Redis pub/sub - this handles serialization and namespacing
43
+ * @llm-rule NOTE: Events are distributed to all connected servers automatically
44
+ */
45
+ emit(event: string, data: any): Promise<boolean>;
46
+ /**
47
+ * Adds event listener with Redis subscription management
48
+ * @llm-rule WHEN: Listening to distributed events across servers
49
+ * @llm-rule AVOID: Manual Redis subscribe - this handles pattern matching and message routing
50
+ */
51
+ on(event: string, handler: EventHandler): void;
52
+ /**
53
+ * Adds one-time event listener with automatic cleanup
54
+ * @llm-rule WHEN: Listening to distributed events that should only fire once
55
+ * @llm-rule AVOID: Manual cleanup - this handles removal after first trigger
56
+ */
57
+ once(event: string, handler: EventHandler): void;
58
+ /**
59
+ * Removes event listener(s) with Redis unsubscribe management
60
+ * @llm-rule WHEN: Cleaning up distributed event listeners
61
+ * @llm-rule AVOID: Manual Redis unsubscribe - this handles cleanup automatically
62
+ */
63
+ off(event: string, handler?: EventHandler): void;
64
+ /**
65
+ * Gets current event listeners for debugging
66
+ * @llm-rule WHEN: Debugging distributed event listeners
67
+ * @llm-rule AVOID: Using for business logic - this is for debugging only
68
+ */
69
+ getListeners(event?: string): any;
70
+ /**
71
+ * Disconnects Redis strategy gracefully
72
+ * @llm-rule WHEN: App shutdown or event cleanup
73
+ * @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents connection issues
74
+ */
75
+ disconnect(): Promise<void>;
76
+ /**
77
+ * Builds Redis channel name with prefix and namespace
78
+ */
79
+ private buildChannelName;
80
+ /**
81
+ * Serializes message data for Redis transmission
82
+ */
83
+ private serializeMessage;
84
+ /**
85
+ * Deserializes message data from Redis
86
+ */
87
+ private deserializeMessage;
88
+ /**
89
+ * Subscribes to Redis channel for specific event
90
+ */
91
+ private subscribeToEvent;
92
+ /**
93
+ * Unsubscribes from Redis channel for specific event
94
+ */
95
+ private unsubscribeFromEvent;
96
+ /**
97
+ * Handles incoming Redis messages and routes to listeners
98
+ */
99
+ private handleRedisMessage;
100
+ /**
101
+ * Gets Redis connection statistics
102
+ */
103
+ getConnectionInfo(): {
104
+ connected: boolean;
105
+ url: string;
106
+ namespace: string;
107
+ totalSubscriptions: number;
108
+ totalListeners: number;
109
+ };
110
+ /**
111
+ * Masks sensitive parts of Redis URL for logging
112
+ */
113
+ private maskUrl;
114
+ }
115
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/event/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,gBAAgB,CAAwC;IAEhE;;;;OAIG;gBACS,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAKlD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BtD;;;;OAIG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAqB9C;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAmBhD;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IA6BhD;;;;OAIG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG;IAyBjC;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;YACW,oBAAoB;IAiBlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,iBAAiB,IAAI;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,cAAc,EAAE,MAAM,CAAC;KACxB;IAeD;;OAEG;IACH,OAAO,CAAC,OAAO;CAWhB"}