@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,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ultra-simple event-driven architecture that just works with automatic Redis/Memory strategy
|
|
3
|
+
* @module @bloomneo/appkit/event
|
|
4
|
+
* @file src/event/index.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building apps that need event-driven architecture with zero configuration
|
|
7
|
+
* @llm-rule AVOID: Complex event setups - this auto-detects Redis/Memory from environment
|
|
8
|
+
* @llm-rule NOTE: Uses eventClass.get() pattern like auth - get() → event.emit() → distributed
|
|
9
|
+
* @llm-rule NOTE: Common pattern - eventClass.get(namespace) → event.on() → event.emit() → handled
|
|
10
|
+
*/
|
|
11
|
+
import { EventClass } from './event.js';
|
|
12
|
+
import { getSmartDefaults, validateProductionRequirements, validateStartupConfiguration, performHealthCheck } from './defaults.js';
|
|
13
|
+
// Global event instances for performance (like auth module)
|
|
14
|
+
let globalConfig = null;
|
|
15
|
+
const namedEvents = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Get event instance for specific namespace - the only function you need to learn
|
|
18
|
+
* Strategy auto-detected from environment (REDIS_URL → Redis, no URL → Memory)
|
|
19
|
+
* @llm-rule WHEN: Need event-driven architecture in any part of your app - this is your main entry point
|
|
20
|
+
* @llm-rule AVOID: Creating EventClass directly - always use this function
|
|
21
|
+
* @llm-rule NOTE: Typical flow - get(namespace) → event.on() → event.emit() → distributed handling
|
|
22
|
+
*/
|
|
23
|
+
function get(namespace = 'default') {
|
|
24
|
+
// Validate namespace
|
|
25
|
+
if (!namespace || typeof namespace !== 'string') {
|
|
26
|
+
throw new Error('Event namespace must be a non-empty string');
|
|
27
|
+
}
|
|
28
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(namespace)) {
|
|
29
|
+
throw new Error('Event namespace must contain only letters, numbers, underscores, and hyphens');
|
|
30
|
+
}
|
|
31
|
+
// Lazy initialization - parse environment once (like auth)
|
|
32
|
+
if (!globalConfig) {
|
|
33
|
+
globalConfig = getSmartDefaults();
|
|
34
|
+
}
|
|
35
|
+
// Return cached instance if exists
|
|
36
|
+
if (namedEvents.has(namespace)) {
|
|
37
|
+
return namedEvents.get(namespace);
|
|
38
|
+
}
|
|
39
|
+
// Create new event instance for namespace
|
|
40
|
+
const eventInstance = new EventClass(globalConfig, namespace);
|
|
41
|
+
// Auto-connect on first use
|
|
42
|
+
eventInstance.connect().catch((error) => {
|
|
43
|
+
console.error(`[AppKit] Event auto-connect failed for namespace "${namespace}":`, error.message);
|
|
44
|
+
});
|
|
45
|
+
namedEvents.set(namespace, eventInstance);
|
|
46
|
+
return eventInstance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Clear all event instances and disconnect - essential for testing
|
|
50
|
+
* @llm-rule WHEN: Testing event logic with different configurations or app shutdown
|
|
51
|
+
* @llm-rule AVOID: Using in production except for graceful shutdown
|
|
52
|
+
*/
|
|
53
|
+
async function clear() {
|
|
54
|
+
const disconnectPromises = [];
|
|
55
|
+
for (const [namespace, event] of namedEvents) {
|
|
56
|
+
disconnectPromises.push(event.disconnect().catch((error) => {
|
|
57
|
+
console.error(`[AppKit] Event disconnect failed for namespace "${namespace}":`, error.message);
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
await Promise.all(disconnectPromises);
|
|
61
|
+
namedEvents.clear();
|
|
62
|
+
globalConfig = null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reset event configuration (useful for testing)
|
|
66
|
+
* @llm-rule WHEN: Testing event logic with different environment configurations
|
|
67
|
+
* @llm-rule AVOID: Using in production - only for tests and development
|
|
68
|
+
*/
|
|
69
|
+
async function reset(newConfig) {
|
|
70
|
+
// Clear existing instances
|
|
71
|
+
await clear();
|
|
72
|
+
// Reset configuration
|
|
73
|
+
if (newConfig) {
|
|
74
|
+
const defaults = getSmartDefaults();
|
|
75
|
+
globalConfig = { ...defaults, ...newConfig };
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
globalConfig = null; // Will reload from environment on next get()
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get active event strategy for debugging
|
|
83
|
+
* @llm-rule WHEN: Debugging or health checks to see which strategy is active (Redis vs Memory)
|
|
84
|
+
* @llm-rule AVOID: Using for application logic - events should be transparent
|
|
85
|
+
*/
|
|
86
|
+
function getStrategy() {
|
|
87
|
+
if (!globalConfig) {
|
|
88
|
+
globalConfig = getSmartDefaults();
|
|
89
|
+
}
|
|
90
|
+
return globalConfig.strategy;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all active event namespaces
|
|
94
|
+
* @llm-rule WHEN: Debugging or monitoring which event namespaces are active
|
|
95
|
+
* @llm-rule AVOID: Using for business logic - this is for observability only
|
|
96
|
+
*/
|
|
97
|
+
function getActiveNamespaces() {
|
|
98
|
+
return Array.from(namedEvents.keys());
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get event configuration summary for debugging
|
|
102
|
+
* @llm-rule WHEN: Health checks or debugging event configuration
|
|
103
|
+
* @llm-rule AVOID: Exposing sensitive connection details - this only shows safe info
|
|
104
|
+
*/
|
|
105
|
+
function getConfig() {
|
|
106
|
+
if (!globalConfig) {
|
|
107
|
+
globalConfig = getSmartDefaults();
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
strategy: globalConfig.strategy,
|
|
111
|
+
historyEnabled: globalConfig.history.enabled,
|
|
112
|
+
activeNamespaces: getActiveNamespaces(),
|
|
113
|
+
environment: globalConfig.environment.nodeEnv,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if Redis is available and configured
|
|
118
|
+
* @llm-rule WHEN: Conditional logic based on event capabilities
|
|
119
|
+
* @llm-rule AVOID: Complex event detection - just use events normally, strategy handles it
|
|
120
|
+
*/
|
|
121
|
+
function hasRedis() {
|
|
122
|
+
return !!process.env.REDIS_URL;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Emit event across all namespaces (dangerous)
|
|
126
|
+
* @llm-rule WHEN: Broadcasting system-wide events like shutdown or maintenance
|
|
127
|
+
* @llm-rule AVOID: Using for regular events - use namespace-specific events instead
|
|
128
|
+
* @llm-rule NOTE: Only use for system-level events that need global broadcast
|
|
129
|
+
*/
|
|
130
|
+
async function broadcast(event, data = {}) {
|
|
131
|
+
const activeInstances = Array.from(namedEvents.values());
|
|
132
|
+
if (activeInstances.length === 0) {
|
|
133
|
+
console.warn(`[AppKit] No active event namespaces for broadcast: ${event}`);
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const results = await Promise.allSettled(activeInstances.map(instance => instance.emit(event, data)));
|
|
137
|
+
return results.map(result => result.status === 'fulfilled' ? result.value : false);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get event statistics across all namespaces
|
|
141
|
+
* @llm-rule WHEN: Monitoring event system health and usage
|
|
142
|
+
* @llm-rule AVOID: Using for business logic - this is for monitoring only
|
|
143
|
+
*/
|
|
144
|
+
function getStats() {
|
|
145
|
+
const strategy = getStrategy();
|
|
146
|
+
const namespaces = Array.from(namedEvents.entries()).map(([namespace, instance]) => {
|
|
147
|
+
const config = instance.getConfig();
|
|
148
|
+
const listeners = instance.getListeners();
|
|
149
|
+
return {
|
|
150
|
+
namespace,
|
|
151
|
+
listeners: listeners.totalListeners || 0,
|
|
152
|
+
connected: config.connected,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
strategy,
|
|
157
|
+
totalNamespaces: namespaces.length,
|
|
158
|
+
totalListeners: namespaces.reduce((sum, ns) => sum + ns.listeners, 0),
|
|
159
|
+
connected: namespaces.filter(ns => ns.connected).length,
|
|
160
|
+
namespaces,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Validate event configuration at startup with detailed feedback
|
|
165
|
+
* @llm-rule WHEN: App startup to ensure events are properly configured
|
|
166
|
+
* @llm-rule AVOID: Skipping validation - missing event config causes runtime issues
|
|
167
|
+
* @llm-rule NOTE: Returns validation results instead of throwing - allows graceful handling
|
|
168
|
+
*/
|
|
169
|
+
function validateConfig() {
|
|
170
|
+
try {
|
|
171
|
+
const validation = validateStartupConfiguration();
|
|
172
|
+
if (validation.errors.length > 0) {
|
|
173
|
+
console.error('[VoilaJSX AppKit] Event configuration errors:', validation.errors);
|
|
174
|
+
}
|
|
175
|
+
if (validation.warnings.length > 0) {
|
|
176
|
+
console.warn('[VoilaJSX AppKit] Event configuration warnings:', validation.warnings);
|
|
177
|
+
}
|
|
178
|
+
if (validation.ready) {
|
|
179
|
+
console.log(`✅ [VoilaJSX AppKit] Events configured with ${validation.strategy} strategy`);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
valid: validation.errors.length === 0,
|
|
183
|
+
strategy: validation.strategy,
|
|
184
|
+
warnings: validation.warnings,
|
|
185
|
+
errors: validation.errors,
|
|
186
|
+
ready: validation.ready,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const errorMessage = error.message;
|
|
191
|
+
console.error('[VoilaJSX AppKit] Event configuration validation failed:', errorMessage);
|
|
192
|
+
return {
|
|
193
|
+
valid: false,
|
|
194
|
+
strategy: 'unknown',
|
|
195
|
+
warnings: [],
|
|
196
|
+
errors: [errorMessage],
|
|
197
|
+
ready: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Validate production requirements and throw if critical issues found
|
|
203
|
+
* @llm-rule WHEN: Production deployment validation - ensures events work in production
|
|
204
|
+
* @llm-rule AVOID: Skipping in production - event failures are often silent
|
|
205
|
+
* @llm-rule NOTE: Throws on critical issues, warns on non-critical ones
|
|
206
|
+
*/
|
|
207
|
+
function validateProduction() {
|
|
208
|
+
try {
|
|
209
|
+
validateProductionRequirements();
|
|
210
|
+
if (process.env.NODE_ENV === 'production' && !hasRedis()) {
|
|
211
|
+
console.warn('[VoilaJSX AppKit] No Redis configured in production. ' +
|
|
212
|
+
'Set REDIS_URL for distributed events across servers.');
|
|
213
|
+
}
|
|
214
|
+
console.log('✅ [VoilaJSX AppKit] Production event requirements validated');
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error('[VoilaJSX AppKit] Production event validation failed:', error.message);
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get comprehensive health check status for monitoring
|
|
223
|
+
* @llm-rule WHEN: Health check endpoints or monitoring systems
|
|
224
|
+
* @llm-rule AVOID: Using in critical application path - this is for monitoring only
|
|
225
|
+
* @llm-rule NOTE: Returns detailed status without exposing sensitive configuration
|
|
226
|
+
*/
|
|
227
|
+
function getHealthStatus() {
|
|
228
|
+
return performHealthCheck();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Graceful shutdown for all event instances
|
|
232
|
+
* @llm-rule WHEN: App shutdown or process termination
|
|
233
|
+
* @llm-rule AVOID: Abrupt process exit - graceful shutdown prevents data loss
|
|
234
|
+
*/
|
|
235
|
+
async function shutdown() {
|
|
236
|
+
console.log('🔄 [AppKit] Event graceful shutdown...');
|
|
237
|
+
try {
|
|
238
|
+
// Broadcast shutdown event before closing
|
|
239
|
+
await broadcast('system.shutdown', {
|
|
240
|
+
timestamp: new Date().toISOString(),
|
|
241
|
+
reason: 'graceful_shutdown'
|
|
242
|
+
});
|
|
243
|
+
// Small delay to allow event processing
|
|
244
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
245
|
+
// Clear all instances
|
|
246
|
+
await clear();
|
|
247
|
+
console.log('✅ [AppKit] Event shutdown complete');
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error('❌ [AppKit] Event shutdown error:', error.message);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Single eventing export with minimal API (like auth module)
|
|
255
|
+
*/
|
|
256
|
+
export const eventClass = {
|
|
257
|
+
// Core method (like auth.get())
|
|
258
|
+
get,
|
|
259
|
+
// Utility methods
|
|
260
|
+
clear,
|
|
261
|
+
reset,
|
|
262
|
+
getStrategy,
|
|
263
|
+
getActiveNamespaces,
|
|
264
|
+
getConfig,
|
|
265
|
+
hasRedis,
|
|
266
|
+
getStats,
|
|
267
|
+
// Advanced methods
|
|
268
|
+
broadcast,
|
|
269
|
+
// Validation and lifecycle
|
|
270
|
+
validateConfig,
|
|
271
|
+
validateProduction,
|
|
272
|
+
getHealthStatus,
|
|
273
|
+
shutdown,
|
|
274
|
+
};
|
|
275
|
+
export { EventClass } from './event.js';
|
|
276
|
+
// Default export
|
|
277
|
+
export default eventClass;
|
|
278
|
+
// Auto-setup graceful shutdown handlers
|
|
279
|
+
if (typeof process !== 'undefined') {
|
|
280
|
+
// Handle graceful shutdown
|
|
281
|
+
const shutdownHandler = () => {
|
|
282
|
+
shutdown().finally(() => {
|
|
283
|
+
process.exit(0);
|
|
284
|
+
});
|
|
285
|
+
};
|
|
286
|
+
process.on('SIGTERM', shutdownHandler);
|
|
287
|
+
process.on('SIGINT', shutdownHandler);
|
|
288
|
+
// Handle uncaught errors
|
|
289
|
+
process.on('uncaughtException', (error) => {
|
|
290
|
+
console.error('[AppKit] Uncaught exception during event operation:', error);
|
|
291
|
+
shutdown().finally(() => {
|
|
292
|
+
process.exit(1);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
process.on('unhandledRejection', (reason) => {
|
|
296
|
+
console.error('[AppKit] Unhandled rejection during event operation:', reason);
|
|
297
|
+
shutdown().finally(() => {
|
|
298
|
+
process.exit(1);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
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 type { EventStrategy, EventHandler } from '../event.js';
|
|
11
|
+
import type { EventConfig } from '../defaults.js';
|
|
12
|
+
/**
|
|
13
|
+
* Memory event strategy with intelligent cleanup and limits
|
|
14
|
+
*/
|
|
15
|
+
export declare class MemoryStrategy implements EventStrategy {
|
|
16
|
+
private config;
|
|
17
|
+
private namespace;
|
|
18
|
+
private emitter;
|
|
19
|
+
private cleanupInterval;
|
|
20
|
+
private listenerCounts;
|
|
21
|
+
/**
|
|
22
|
+
* Creates memory strategy with direct environment access (like auth pattern)
|
|
23
|
+
* @llm-rule WHEN: Event initialization without Redis URL - automatic fallback
|
|
24
|
+
* @llm-rule AVOID: Manual memory configuration - environment detection handles this
|
|
25
|
+
*/
|
|
26
|
+
constructor(config: EventConfig, namespace: string);
|
|
27
|
+
/**
|
|
28
|
+
* Emits event via Node.js EventEmitter
|
|
29
|
+
* @llm-rule WHEN: Sending events within single process/server
|
|
30
|
+
* @llm-rule AVOID: Expecting cross-process delivery - memory events are local only
|
|
31
|
+
* @llm-rule NOTE: Instant delivery, no network latency, perfect for development
|
|
32
|
+
*/
|
|
33
|
+
emit(event: string, data: any): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Adds event listener with automatic cleanup tracking
|
|
36
|
+
* @llm-rule WHEN: Listening to events within single process
|
|
37
|
+
* @llm-rule AVOID: Adding too many listeners - respects maxListeners limit
|
|
38
|
+
*/
|
|
39
|
+
on(event: string, handler: EventHandler): void;
|
|
40
|
+
/**
|
|
41
|
+
* Adds one-time event listener with automatic cleanup
|
|
42
|
+
* @llm-rule WHEN: Listening to events that should only fire once
|
|
43
|
+
* @llm-rule AVOID: Manual cleanup - this handles removal automatically
|
|
44
|
+
*/
|
|
45
|
+
once(event: string, handler: EventHandler): void;
|
|
46
|
+
/**
|
|
47
|
+
* Removes event listener(s) with cleanup tracking
|
|
48
|
+
* @llm-rule WHEN: Cleaning up event listeners to prevent memory leaks
|
|
49
|
+
* @llm-rule AVOID: Forgetting to remove listeners - memory strategy tracks everything
|
|
50
|
+
*/
|
|
51
|
+
off(event: string, handler?: EventHandler): void;
|
|
52
|
+
/**
|
|
53
|
+
* Gets current event listeners for debugging
|
|
54
|
+
* @llm-rule WHEN: Debugging event listeners or monitoring memory usage
|
|
55
|
+
* @llm-rule AVOID: Using for business logic - this is for debugging only
|
|
56
|
+
*/
|
|
57
|
+
getListeners(event?: string): any;
|
|
58
|
+
/**
|
|
59
|
+
* Disconnects memory strategy gracefully
|
|
60
|
+
* @llm-rule WHEN: App shutdown or event cleanup
|
|
61
|
+
* @llm-rule AVOID: Memory leaks - always cleanup intervals and listeners
|
|
62
|
+
*/
|
|
63
|
+
disconnect(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Checks if adding listener would exceed limit
|
|
66
|
+
*/
|
|
67
|
+
private checkListenerLimit;
|
|
68
|
+
/**
|
|
69
|
+
* Increments listener count tracking
|
|
70
|
+
*/
|
|
71
|
+
private incrementListenerCount;
|
|
72
|
+
/**
|
|
73
|
+
* Decrements listener count tracking
|
|
74
|
+
*/
|
|
75
|
+
private decrementListenerCount;
|
|
76
|
+
/**
|
|
77
|
+
* Updates listener count from actual emitter state
|
|
78
|
+
*/
|
|
79
|
+
private updateListenerCount;
|
|
80
|
+
/**
|
|
81
|
+
* Sets up automatic cleanup interval
|
|
82
|
+
*/
|
|
83
|
+
private setupCleanup;
|
|
84
|
+
/**
|
|
85
|
+
* Stops cleanup interval
|
|
86
|
+
*/
|
|
87
|
+
private stopCleanup;
|
|
88
|
+
/**
|
|
89
|
+
* Performs memory cleanup and garbage collection
|
|
90
|
+
*/
|
|
91
|
+
private performCleanup;
|
|
92
|
+
/**
|
|
93
|
+
* Syncs tracking counts with actual emitter state
|
|
94
|
+
*/
|
|
95
|
+
private syncListenerCounts;
|
|
96
|
+
/**
|
|
97
|
+
* Cleans up events with no listeners
|
|
98
|
+
*/
|
|
99
|
+
private cleanupEmptyEvents;
|
|
100
|
+
/**
|
|
101
|
+
* Gets memory usage statistics
|
|
102
|
+
*/
|
|
103
|
+
private getMemoryStats;
|
|
104
|
+
/**
|
|
105
|
+
* Gets detailed memory statistics for debugging
|
|
106
|
+
*/
|
|
107
|
+
getDetailedStats(): {
|
|
108
|
+
strategy: string;
|
|
109
|
+
namespace: string;
|
|
110
|
+
totalEvents: number;
|
|
111
|
+
totalListeners: number;
|
|
112
|
+
maxListeners: number;
|
|
113
|
+
memoryUsage: string;
|
|
114
|
+
events: Array<{
|
|
115
|
+
event: string;
|
|
116
|
+
listeners: number;
|
|
117
|
+
}>;
|
|
118
|
+
cleanupEnabled: boolean;
|
|
119
|
+
lastCleanup: string;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/event/strategies/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;;OAIG;gBACS,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAkBlD;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAetD;;;;OAIG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAmB9C;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAyBhD;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAqBhD;;;;OAIG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG;IAwBjC;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,gBAAgB,IAAI;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,cAAc,EAAE,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB;CAsBF"}
|