@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.
- package/LICENSE +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- 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"}
|