@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,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory cache strategy with LRU eviction and TTL expiration
|
|
3
|
+
* @module @bloomneo/appkit/cache
|
|
4
|
+
* @file src/cache/strategies/memory.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: No REDIS_URL environment variable - perfect for development and testing
|
|
7
|
+
* @llm-rule AVOID: Production use without Redis - memory cache doesn't persist across restarts
|
|
8
|
+
* @llm-rule NOTE: LRU eviction, TTL cleanup, memory limits, thread-safe operations
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Memory cache strategy with intelligent eviction and cleanup
|
|
12
|
+
*/
|
|
13
|
+
export class MemoryStrategy {
|
|
14
|
+
config;
|
|
15
|
+
cache = new Map();
|
|
16
|
+
totalSize = 0;
|
|
17
|
+
cleanupInterval = null;
|
|
18
|
+
connected = false;
|
|
19
|
+
/**
|
|
20
|
+
* Creates memory strategy with direct environment access (like auth pattern)
|
|
21
|
+
* @llm-rule WHEN: Cache initialization without Redis URL - automatic fallback
|
|
22
|
+
* @llm-rule AVOID: Manual memory configuration - environment detection handles this
|
|
23
|
+
*/
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Connects memory cache (starts cleanup intervals)
|
|
29
|
+
* @llm-rule WHEN: Cache initialization - sets up automatic TTL cleanup
|
|
30
|
+
* @llm-rule AVOID: Manual memory management - this handles TTL and size limits automatically
|
|
31
|
+
*/
|
|
32
|
+
async connect() {
|
|
33
|
+
if (this.connected)
|
|
34
|
+
return;
|
|
35
|
+
// Start cleanup interval for TTL expiration
|
|
36
|
+
this.startCleanupInterval();
|
|
37
|
+
this.connected = true;
|
|
38
|
+
if (this.config.environment.isDevelopment) {
|
|
39
|
+
console.log(`✅ [AppKit] Memory cache initialized (max: ${this.formatBytes(this.config.memory.maxSizeBytes)}, items: ${this.config.memory.maxItems})`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Disconnects memory cache (stops cleanup intervals)
|
|
44
|
+
* @llm-rule WHEN: App shutdown or cache cleanup
|
|
45
|
+
* @llm-rule AVOID: Memory leaks - always stop intervals on shutdown
|
|
46
|
+
*/
|
|
47
|
+
async disconnect() {
|
|
48
|
+
if (!this.connected)
|
|
49
|
+
return;
|
|
50
|
+
this.stopCleanupInterval();
|
|
51
|
+
this.cache.clear();
|
|
52
|
+
this.totalSize = 0;
|
|
53
|
+
this.connected = false;
|
|
54
|
+
if (this.config.environment.isDevelopment) {
|
|
55
|
+
console.log(`👋 [AppKit] Memory cache disconnected`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Gets value from memory cache with TTL checking
|
|
60
|
+
* @llm-rule WHEN: Retrieving cached data from in-memory storage
|
|
61
|
+
* @llm-rule AVOID: Manual TTL checking - this handles expiration automatically
|
|
62
|
+
*/
|
|
63
|
+
async get(key) {
|
|
64
|
+
const item = this.cache.get(key);
|
|
65
|
+
if (!item) {
|
|
66
|
+
return null; // Key not found
|
|
67
|
+
}
|
|
68
|
+
// Check TTL expiration
|
|
69
|
+
if (this.isExpired(item)) {
|
|
70
|
+
this.deleteItem(key);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// Update access time for LRU
|
|
74
|
+
item.accessTime = Date.now();
|
|
75
|
+
return this.deepClone(item.value);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Sets value in memory cache with TTL and automatic eviction
|
|
79
|
+
* @llm-rule WHEN: Storing data in memory cache with size and TTL management
|
|
80
|
+
* @llm-rule AVOID: Manual memory management - this handles LRU eviction automatically
|
|
81
|
+
*/
|
|
82
|
+
async set(key, value, ttl) {
|
|
83
|
+
try {
|
|
84
|
+
// Clone value to prevent external mutations
|
|
85
|
+
const clonedValue = this.deepClone(value);
|
|
86
|
+
const size = this.calculateSize(clonedValue);
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
const item = {
|
|
89
|
+
value: clonedValue,
|
|
90
|
+
ttl: now + (ttl * 1000), // Convert seconds to milliseconds
|
|
91
|
+
size,
|
|
92
|
+
accessTime: now,
|
|
93
|
+
createTime: now,
|
|
94
|
+
};
|
|
95
|
+
// Remove existing item if present
|
|
96
|
+
if (this.cache.has(key)) {
|
|
97
|
+
this.deleteItem(key);
|
|
98
|
+
}
|
|
99
|
+
// Check if single item exceeds max size
|
|
100
|
+
if (size > this.config.memory.maxSizeBytes) {
|
|
101
|
+
console.warn(`[AppKit] Cache item too large (${this.formatBytes(size)} > ${this.formatBytes(this.config.memory.maxSizeBytes)})`);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
// Evict items to make space
|
|
105
|
+
this.evictIfNeeded(size);
|
|
106
|
+
// Add new item
|
|
107
|
+
this.cache.set(key, item);
|
|
108
|
+
this.totalSize += size;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`[AppKit] Memory set error for key "${key}":`, error.message);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Deletes key from memory cache
|
|
118
|
+
* @llm-rule WHEN: Cache invalidation or removing specific cached data
|
|
119
|
+
* @llm-rule AVOID: Manual memory cleanup - this handles size tracking automatically
|
|
120
|
+
*/
|
|
121
|
+
async delete(key) {
|
|
122
|
+
return this.deleteItem(key);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Clears entire memory cache
|
|
126
|
+
* @llm-rule WHEN: Full cache invalidation or testing cleanup
|
|
127
|
+
* @llm-rule AVOID: Using in production without consideration - clears all cached data
|
|
128
|
+
*/
|
|
129
|
+
async clear() {
|
|
130
|
+
this.cache.clear();
|
|
131
|
+
this.totalSize = 0;
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Checks if key exists in memory cache
|
|
136
|
+
* @llm-rule WHEN: Checking cache key existence without retrieving value
|
|
137
|
+
* @llm-rule AVOID: Using get() then checking null - this is more efficient
|
|
138
|
+
*/
|
|
139
|
+
async has(key) {
|
|
140
|
+
const item = this.cache.get(key);
|
|
141
|
+
if (!item) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Check TTL expiration
|
|
145
|
+
if (this.isExpired(item)) {
|
|
146
|
+
this.deleteItem(key);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Gets all keys matching pattern (supports wildcards)
|
|
153
|
+
* @llm-rule WHEN: Finding all keys in namespace for bulk operations
|
|
154
|
+
* @llm-rule AVOID: Complex pattern matching - simple wildcards only
|
|
155
|
+
*/
|
|
156
|
+
async keys(pattern = '*') {
|
|
157
|
+
const keys = [];
|
|
158
|
+
const regex = this.patternToRegex(pattern);
|
|
159
|
+
for (const [key, item] of this.cache.entries()) {
|
|
160
|
+
// Skip expired items
|
|
161
|
+
if (this.isExpired(item)) {
|
|
162
|
+
this.deleteItem(key);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (regex.test(key)) {
|
|
166
|
+
keys.push(key);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return keys;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Deletes multiple keys efficiently
|
|
173
|
+
* @llm-rule WHEN: Bulk deletion operations like namespace clearing
|
|
174
|
+
* @llm-rule AVOID: Individual delete calls in loops - this batches operations
|
|
175
|
+
*/
|
|
176
|
+
async deleteMany(keys) {
|
|
177
|
+
let deletedCount = 0;
|
|
178
|
+
for (const key of keys) {
|
|
179
|
+
if (this.deleteItem(key)) {
|
|
180
|
+
deletedCount++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return deletedCount;
|
|
184
|
+
}
|
|
185
|
+
// Private helper methods
|
|
186
|
+
/**
|
|
187
|
+
* Deletes single item and updates size tracking
|
|
188
|
+
*/
|
|
189
|
+
deleteItem(key) {
|
|
190
|
+
const item = this.cache.get(key);
|
|
191
|
+
if (!item)
|
|
192
|
+
return false;
|
|
193
|
+
this.cache.delete(key);
|
|
194
|
+
this.totalSize -= item.size;
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Checks if cache item has expired
|
|
199
|
+
*/
|
|
200
|
+
isExpired(item) {
|
|
201
|
+
return Date.now() > item.ttl;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Evicts items when memory limits are exceeded
|
|
205
|
+
*/
|
|
206
|
+
evictIfNeeded(newItemSize) {
|
|
207
|
+
const memoryConfig = this.config.memory;
|
|
208
|
+
// Check item count limit
|
|
209
|
+
while (this.cache.size >= memoryConfig.maxItems) {
|
|
210
|
+
this.evictLRU();
|
|
211
|
+
}
|
|
212
|
+
// Check memory size limit
|
|
213
|
+
while (this.totalSize + newItemSize > memoryConfig.maxSizeBytes) {
|
|
214
|
+
if (!this.evictLRU()) {
|
|
215
|
+
break; // No more items to evict
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Evicts least recently used item
|
|
221
|
+
*/
|
|
222
|
+
evictLRU() {
|
|
223
|
+
if (this.cache.size === 0)
|
|
224
|
+
return false;
|
|
225
|
+
let oldestKey = null;
|
|
226
|
+
let oldestTime = Infinity;
|
|
227
|
+
// Find LRU item
|
|
228
|
+
for (const [key, item] of this.cache.entries()) {
|
|
229
|
+
if (item.accessTime < oldestTime) {
|
|
230
|
+
oldestTime = item.accessTime;
|
|
231
|
+
oldestKey = key;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (oldestKey) {
|
|
235
|
+
this.deleteItem(oldestKey);
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Calculates memory size of value (approximate)
|
|
242
|
+
*/
|
|
243
|
+
calculateSize(value) {
|
|
244
|
+
try {
|
|
245
|
+
// Simple size calculation using JSON serialization
|
|
246
|
+
const serialized = JSON.stringify(value);
|
|
247
|
+
return Buffer.byteLength(serialized, 'utf8');
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Fallback for non-serializable values
|
|
251
|
+
return 1024; // 1KB default
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Deep clones value to prevent external mutations
|
|
256
|
+
*/
|
|
257
|
+
deepClone(value) {
|
|
258
|
+
try {
|
|
259
|
+
return JSON.parse(JSON.stringify(value));
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Fallback for non-serializable values
|
|
263
|
+
return value;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Converts glob pattern to regex for key matching
|
|
268
|
+
*/
|
|
269
|
+
patternToRegex(pattern) {
|
|
270
|
+
if (pattern === '*') {
|
|
271
|
+
return /.*/; // Match everything
|
|
272
|
+
}
|
|
273
|
+
// Escape special regex characters except * and ?
|
|
274
|
+
const escaped = pattern
|
|
275
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
276
|
+
.replace(/\*/g, '.*') // * becomes .*
|
|
277
|
+
.replace(/\?/g, '.'); // ? becomes .
|
|
278
|
+
return new RegExp(`^${escaped}$`);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Starts automatic cleanup interval for TTL expiration
|
|
282
|
+
*/
|
|
283
|
+
startCleanupInterval() {
|
|
284
|
+
const interval = this.config.memory.checkInterval;
|
|
285
|
+
this.cleanupInterval = setInterval(() => {
|
|
286
|
+
this.cleanupExpired();
|
|
287
|
+
}, interval);
|
|
288
|
+
// Don't let interval keep process alive
|
|
289
|
+
if (this.cleanupInterval.unref) {
|
|
290
|
+
this.cleanupInterval.unref();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Stops cleanup interval
|
|
295
|
+
*/
|
|
296
|
+
stopCleanupInterval() {
|
|
297
|
+
if (this.cleanupInterval) {
|
|
298
|
+
clearInterval(this.cleanupInterval);
|
|
299
|
+
this.cleanupInterval = null;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Removes expired items from cache
|
|
304
|
+
*/
|
|
305
|
+
cleanupExpired() {
|
|
306
|
+
const keysToDelete = [];
|
|
307
|
+
for (const [key, item] of this.cache.entries()) {
|
|
308
|
+
if (this.isExpired(item)) {
|
|
309
|
+
keysToDelete.push(key);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Delete expired items
|
|
313
|
+
for (const key of keysToDelete) {
|
|
314
|
+
this.deleteItem(key);
|
|
315
|
+
}
|
|
316
|
+
// Log cleanup results in development
|
|
317
|
+
if (keysToDelete.length > 0 && this.config.environment.isDevelopment) {
|
|
318
|
+
console.log(`🧹 [AppKit] Memory cache cleanup: removed ${keysToDelete.length} expired items`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Formats bytes for human-readable display
|
|
323
|
+
*/
|
|
324
|
+
formatBytes(bytes) {
|
|
325
|
+
if (bytes === 0)
|
|
326
|
+
return '0 B';
|
|
327
|
+
const k = 1024;
|
|
328
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
329
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
330
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Gets memory cache statistics for debugging
|
|
334
|
+
*/
|
|
335
|
+
getStats() {
|
|
336
|
+
const memoryConfig = this.config.memory;
|
|
337
|
+
return {
|
|
338
|
+
itemCount: this.cache.size,
|
|
339
|
+
totalSize: this.totalSize,
|
|
340
|
+
totalSizeFormatted: this.formatBytes(this.totalSize),
|
|
341
|
+
maxItems: memoryConfig.maxItems,
|
|
342
|
+
maxSize: memoryConfig.maxSizeBytes,
|
|
343
|
+
maxSizeFormatted: this.formatBytes(memoryConfig.maxSizeBytes),
|
|
344
|
+
memoryUsage: this.totalSize / memoryConfig.maxSizeBytes,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cache/strategies/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis cache strategy with automatic connection management and retry logic
|
|
3
|
+
* @module @bloomneo/appkit/cache
|
|
4
|
+
* @file src/cache/strategies/redis.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: App has REDIS_URL environment variable for distributed caching
|
|
7
|
+
* @llm-rule AVOID: Manual Redis setup - this handles connection, retry, and serialization automatically
|
|
8
|
+
* @llm-rule NOTE: Auto-reconnects on failure, handles JSON serialization, production-ready
|
|
9
|
+
*/
|
|
10
|
+
import type { CacheStrategy } from '../cache.js';
|
|
11
|
+
import type { CacheConfig } from '../defaults.js';
|
|
12
|
+
/**
|
|
13
|
+
* Redis cache strategy with enterprise-grade reliability
|
|
14
|
+
*/
|
|
15
|
+
export declare class RedisStrategy implements CacheStrategy {
|
|
16
|
+
private config;
|
|
17
|
+
private client;
|
|
18
|
+
private connected;
|
|
19
|
+
private connectionPromise;
|
|
20
|
+
/**
|
|
21
|
+
* Creates Redis strategy with direct environment access (like auth pattern)
|
|
22
|
+
* @llm-rule WHEN: Cache initialization with Redis URL detected
|
|
23
|
+
* @llm-rule AVOID: Manual Redis configuration - environment detection handles this
|
|
24
|
+
*/
|
|
25
|
+
constructor(config: CacheConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Connects to Redis with automatic retry and connection pooling
|
|
28
|
+
* @llm-rule WHEN: Cache initialization or reconnection after failure
|
|
29
|
+
* @llm-rule AVOID: Manual connection management - this handles all Redis complexity
|
|
30
|
+
*/
|
|
31
|
+
connect(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Establishes Redis connection with retry logic
|
|
34
|
+
*/
|
|
35
|
+
private establishConnection;
|
|
36
|
+
/**
|
|
37
|
+
* Sets up Redis event handlers for connection management
|
|
38
|
+
*/
|
|
39
|
+
private setupEventHandlers;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnects from Redis gracefully
|
|
42
|
+
* @llm-rule WHEN: App shutdown or cache cleanup
|
|
43
|
+
* @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents data loss
|
|
44
|
+
*/
|
|
45
|
+
disconnect(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Gets value from Redis with automatic JSON deserialization
|
|
48
|
+
* @llm-rule WHEN: Retrieving cached data from distributed Redis cache
|
|
49
|
+
* @llm-rule AVOID: Manual Redis commands - this handles serialization automatically
|
|
50
|
+
*/
|
|
51
|
+
get(key: string): Promise<any>;
|
|
52
|
+
/**
|
|
53
|
+
* Sets value in Redis with TTL and automatic JSON serialization
|
|
54
|
+
* @llm-rule WHEN: Storing data in distributed Redis cache with expiration
|
|
55
|
+
* @llm-rule AVOID: Manual Redis commands - this handles serialization and TTL automatically
|
|
56
|
+
*/
|
|
57
|
+
set(key: string, value: any, ttl: number): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Deletes key from Redis
|
|
60
|
+
* @llm-rule WHEN: Cache invalidation or removing specific cached data
|
|
61
|
+
* @llm-rule AVOID: Manual key management - this handles Redis delete operations
|
|
62
|
+
*/
|
|
63
|
+
delete(key: string): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Clears all keys matching pattern (usually namespace-based)
|
|
66
|
+
* @llm-rule WHEN: Namespace-based cache invalidation
|
|
67
|
+
* @llm-rule AVOID: Using FLUSHDB - this only clears specific namespace keys
|
|
68
|
+
*/
|
|
69
|
+
clear(): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* Checks if key exists in Redis
|
|
72
|
+
* @llm-rule WHEN: Checking cache key existence without retrieving value
|
|
73
|
+
* @llm-rule AVOID: Using get() then checking null - this is more efficient
|
|
74
|
+
*/
|
|
75
|
+
has(key: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Gets all keys matching pattern (for namespace operations)
|
|
78
|
+
* @llm-rule WHEN: Finding all keys in namespace for bulk operations
|
|
79
|
+
* @llm-rule AVOID: Using KEYS in production with large datasets - use SCAN instead
|
|
80
|
+
*/
|
|
81
|
+
keys(pattern?: string): Promise<string[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Deletes multiple keys efficiently
|
|
84
|
+
* @llm-rule WHEN: Bulk deletion operations like namespace clearing
|
|
85
|
+
* @llm-rule AVOID: Individual delete calls - batch operations are much faster
|
|
86
|
+
*/
|
|
87
|
+
deleteMany(keys: string[]): Promise<number>;
|
|
88
|
+
/**
|
|
89
|
+
* Ensures Redis connection is established
|
|
90
|
+
*/
|
|
91
|
+
private ensureConnected;
|
|
92
|
+
/**
|
|
93
|
+
* Serializes value to JSON string for Redis storage
|
|
94
|
+
*/
|
|
95
|
+
private serialize;
|
|
96
|
+
/**
|
|
97
|
+
* Deserializes JSON string from Redis
|
|
98
|
+
*/
|
|
99
|
+
private deserialize;
|
|
100
|
+
/**
|
|
101
|
+
* Masks sensitive parts of Redis URL for logging
|
|
102
|
+
*/
|
|
103
|
+
private maskUrl;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,iBAAiB,CAA8B;IAEvD;;;;OAIG;gBACS,MAAM,EAAE,WAAW;IAI/B;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;OAEG;YACW,mBAAmB;IAiDjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBpC;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBjE;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3C;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAM/B;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxC;;;;OAIG;IACG,IAAI,CAAC,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBpD;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBjD;;OAEG;YACW,eAAe;IAM7B;;OAEG;IACH,OAAO,CAAC,SAAS;IAQjB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,OAAO;CAWhB"}
|