@vritti/api-sdk 0.4.2 → 0.4.4
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/dist/auth.cjs +58 -17
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.js +58 -17
- package/dist/auth.js.map +1 -1
- package/dist/cache.cjs +51 -17
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.js +51 -17
- package/dist/cache.js.map +1 -1
- package/dist/catalog-resolver.cjs +3 -3
- package/dist/catalog-resolver.cjs.map +1 -1
- package/dist/catalog-resolver.d.cts +2 -2
- package/dist/catalog-resolver.d.ts +2 -2
- package/dist/catalog-resolver.js +3 -3
- package/dist/catalog-resolver.js.map +1 -1
- package/dist/{code-pattern-BP4zkNtT.d.cts → code-pattern-BQM7qLcU.d.cts} +1 -1
- package/dist/{code-pattern-BP4zkNtT.d.ts → code-pattern-BQM7qLcU.d.ts} +1 -1
- package/dist/data-table.cjs +153 -47
- package/dist/data-table.cjs.map +1 -1
- package/dist/data-table.js +153 -47
- package/dist/data-table.js.map +1 -1
- package/dist/database.cjs +101 -31
- package/dist/database.cjs.map +1 -1
- package/dist/database.js +101 -31
- package/dist/database.js.map +1 -1
- package/dist/decorators.d.cts +2 -2
- package/dist/decorators.d.ts +2 -2
- package/dist/drizzle-pg-core.d.cts +1 -1
- package/dist/drizzle-pg-core.d.ts +1 -1
- package/dist/email.cjs +22 -6
- package/dist/email.cjs.map +1 -1
- package/dist/email.js +22 -6
- package/dist/email.js.map +1 -1
- package/dist/files.cjs +1 -1
- package/dist/files.cjs.map +1 -1
- package/dist/files.js +1 -1
- package/dist/files.js.map +1 -1
- package/dist/filters.cjs +18 -4
- package/dist/filters.cjs.map +1 -1
- package/dist/filters.js +18 -4
- package/dist/filters.js.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/license.d.cts +1 -1
- package/dist/license.d.ts +1 -1
- package/dist/logger.cjs +49 -15
- package/dist/logger.cjs.map +1 -1
- package/dist/logger.js +49 -15
- package/dist/logger.js.map +1 -1
- package/dist/nats.cjs +49 -17
- package/dist/nats.cjs.map +1 -1
- package/dist/nats.js +49 -17
- package/dist/nats.js.map +1 -1
- package/dist/root.cjs +44 -12
- package/dist/root.cjs.map +1 -1
- package/dist/root.js +44 -12
- package/dist/root.js.map +1 -1
- package/dist/{types-Cj6uMN5E.d.cts → types-VDKSjje5.d.cts} +3 -3
- package/dist/{types-Cj6uMN5E.d.ts → types-VDKSjje5.d.ts} +3 -3
- package/package.json +29 -29
package/dist/cache.cjs
CHANGED
|
@@ -49,21 +49,30 @@ var import_config2 = require("@nestjs/config");
|
|
|
49
49
|
var import_common = require("@nestjs/common");
|
|
50
50
|
|
|
51
51
|
// src/cache/constants.ts
|
|
52
|
-
var CACHE_PROVIDER = Symbol("CACHE_PROVIDER");
|
|
53
|
-
var LRU_CACHE_OPTIONS = Symbol("LRU_CACHE_OPTIONS");
|
|
54
|
-
var CACHE_MODULE_OPTIONS = Symbol("CACHE_MODULE_OPTIONS");
|
|
52
|
+
var CACHE_PROVIDER = /* @__PURE__ */ Symbol("CACHE_PROVIDER");
|
|
53
|
+
var LRU_CACHE_OPTIONS = /* @__PURE__ */ Symbol("LRU_CACHE_OPTIONS");
|
|
54
|
+
var CACHE_MODULE_OPTIONS = /* @__PURE__ */ Symbol("CACHE_MODULE_OPTIONS");
|
|
55
55
|
var DEFAULT_LRU_MAX = 1e4;
|
|
56
56
|
|
|
57
57
|
// src/cache/cache.service.ts
|
|
58
58
|
function _ts_decorate(decorators, target, key, desc) {
|
|
59
59
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
60
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
61
|
-
|
|
60
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
61
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
62
|
+
} else {
|
|
63
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
64
|
+
if (d = decorators[i]) {
|
|
65
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
62
69
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
63
70
|
}
|
|
64
71
|
__name(_ts_decorate, "_ts_decorate");
|
|
65
|
-
function _ts_metadata(
|
|
66
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
72
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
73
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
74
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
75
|
+
}
|
|
67
76
|
}
|
|
68
77
|
__name(_ts_metadata, "_ts_metadata");
|
|
69
78
|
function _ts_param(paramIndex, decorator) {
|
|
@@ -139,13 +148,22 @@ var import_common2 = require("@nestjs/common");
|
|
|
139
148
|
var import_lru_cache = require("lru-cache");
|
|
140
149
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
141
150
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
142
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
143
|
-
|
|
151
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
152
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
153
|
+
} else {
|
|
154
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
155
|
+
if (d = decorators[i]) {
|
|
156
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
144
160
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
145
161
|
}
|
|
146
162
|
__name(_ts_decorate2, "_ts_decorate");
|
|
147
|
-
function _ts_metadata2(
|
|
148
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
163
|
+
function _ts_metadata2(metadataKey, metadataValue) {
|
|
164
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
165
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
166
|
+
}
|
|
149
167
|
}
|
|
150
168
|
__name(_ts_metadata2, "_ts_metadata");
|
|
151
169
|
function _ts_param2(paramIndex, decorator) {
|
|
@@ -214,13 +232,22 @@ var import_config = require("@nestjs/config");
|
|
|
214
232
|
var import_ioredis = __toESM(require("ioredis"), 1);
|
|
215
233
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
216
234
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
217
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
218
|
-
|
|
235
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
236
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
237
|
+
} else {
|
|
238
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
239
|
+
if (d = decorators[i]) {
|
|
240
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
219
244
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
220
245
|
}
|
|
221
246
|
__name(_ts_decorate3, "_ts_decorate");
|
|
222
|
-
function _ts_metadata3(
|
|
223
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
247
|
+
function _ts_metadata3(metadataKey, metadataValue) {
|
|
248
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
249
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
250
|
+
}
|
|
224
251
|
}
|
|
225
252
|
__name(_ts_metadata3, "_ts_metadata");
|
|
226
253
|
var RedisCacheProvider = class _RedisCacheProvider {
|
|
@@ -292,8 +319,15 @@ RedisCacheProvider = _ts_decorate3([
|
|
|
292
319
|
// src/cache/cache.module.ts
|
|
293
320
|
function _ts_decorate4(decorators, target, key, desc) {
|
|
294
321
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
295
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
296
|
-
|
|
322
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
323
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
324
|
+
} else {
|
|
325
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
326
|
+
if (d = decorators[i]) {
|
|
327
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
297
331
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
298
332
|
}
|
|
299
333
|
__name(_ts_decorate4, "_ts_decorate");
|
package/dist/cache.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/index.ts","../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["export { CacheModule, type CacheModuleAsyncOptions, type CacheModuleOptions } from './cache.module';\nexport { CacheService } from './cache.service';\nexport { CACHE_PROVIDER, DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from './constants';\nexport type { ICacheProvider } from './interfaces/cache-provider.interface';\nexport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nexport { RedisCacheProvider } from './providers/redis.provider';\n","import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["import_common","import_config","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","import_common","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","import_common","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache/index.ts","../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["export { CacheModule, type CacheModuleAsyncOptions, type CacheModuleOptions } from './cache.module';\nexport { CacheService } from './cache.service';\nexport { CACHE_PROVIDER, DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from './constants';\nexport type { ICacheProvider } from './interfaces/cache-provider.interface';\nexport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nexport { RedisCacheProvider } from './providers/redis.provider';\n","import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;ACAA,IAAAA,iBAA0D;AAC1D,IAAAC,iBAA6B;;;ACD7B,oBAA2C;;;ACCpC,IAAMC,iBAAiBC,uBAAO,gBAAA;AAG9B,IAAMC,oBAAoBD,uBAAO,mBAAA;AAGjC,IAAME,uBAAuBF,uBAAO,sBAAA;AAGpC,IAAMG,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADLxB,IAAMC,eAAN,MAAMA,cAAAA;SAAAA;;;;EACMC,SAAS,IAAIC,qBAAOF,cAAaG,IAAI;EAEtD,YAAqDC,UAA0B;SAA1BA,WAAAA;EAA2B;;EAGhF,MAAMC,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,QAAI;AACF,YAAM,KAAKJ,SAASC,IAAIC,KAAKC,OAAOC,UAAAA;IACtC,SAASC,KAAK;AACZ,WAAKR,OAAOS,MAAM,6BAA6BJ,GAAAA,KAAQG,GAAAA;IACzD;EACF;;EAGA,MAAME,IAAOL,KAAgC;AAC3C,QAAI;AACF,aAAO,MAAM,KAAKF,SAASO,IAAOL,GAAAA;IACpC,SAASG,KAAK;AACZ,WAAKR,OAAOS,MAAM,6BAA6BJ,GAAAA,KAAQG,GAAAA;AACvD,aAAO;IACT;EACF;;EAGA,MAAMG,OAAOC,MAA+B;AAC1C,QAAI;AACF,YAAM,KAAKT,SAASQ,IAAG,GAAIC,IAAAA;IAC7B,SAASJ,KAAK;AACZ,WAAKR,OAAOS,MAAM,8BAA8BG,KAAKC,KAAK,IAAA,CAAA,KAAUL,GAAAA;IACtE;EACF;;EAGA,MAAMM,SAASC,SAAoC;AACjD,QAAI;AACF,aAAO,MAAM,KAAKZ,SAASW,SAASC,OAAAA;IACtC,SAASP,KAAK;AACZ,WAAKR,OAAOS,MAAM,sCAAsCM,OAAAA,KAAYP,GAAAA;AACpE,aAAO,CAAA;IACT;EACF;;EAGA,MAAMQ,gBAAiC;AACrC,QAAI;AACF,aAAO,MAAM,KAAKb,SAASa,cAAa;IAC1C,SAASR,KAAK;AACZ,WAAKR,OAAOS,MAAM,8BAA8BD,GAAAA;AAChD,aAAO;IACT;EACF;AACF;;;;;;;;;;;AEzDA,IAAAS,iBAA6C;AAC7C,uBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;AASzB,SAASC,aAAaC,SAAe;AACnC,QAAMC,UAAUD,QACbE,QAAQ,qBAAqB,MAAA,EAC7BA,QAAQ,OAAO,IAAA,EACfA,QAAQ,OAAO,GAAA;AAClB,SAAO,IAAIC,OAAO,IAAIF,OAAAA,GAAU;AAClC;AANSF;AASF,IAAMK,mBAAN,MAAMA;SAAAA;;;EACMC;EAEjB,YAAmDC,SAA2B;AAC5E,SAAKD,QAAQ,IAAIE,0BAAyB;MAAEC,KAAKF,SAASE,OAAOC;IAAgB,CAAA;EACnF;;EAGA,MAAMC,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,SAAKR,MAAMK,IAAIC,KAAK;MAAEC;IAAM,GAAa;MAAEE,KAAKD,aAAa;IAAK,CAAA;EACpE;;EAGA,MAAME,IAAOJ,KAAgC;AAC3C,UAAMK,QAAQ,KAAKX,MAAMU,IAAIJ,GAAAA;AAC7B,WAAOK,QAAQA,MAAMJ,QAAQ;EAC/B;;EAGA,MAAMK,OAAOC,MAA+B;AAC1C,eAAWP,OAAOO,KAAM,MAAKb,MAAMc,OAAOR,GAAAA;EAC5C;;EAGA,MAAMS,SAASpB,SAAoC;AACjD,UAAMqB,QAAQtB,aAAaC,OAAAA;AAC3B,WAAO;SAAI,KAAKK,MAAMa,KAAI;MAAII,OAAO,CAACX,QAAQU,MAAME,KAAKZ,GAAAA,CAAAA;EAC3D;;EAGA,MAAMa,gBAAiC;AACrC,WAAO,WAAW,KAAKnB,MAAMoB,IAAI,QAAQ,KAAKpB,MAAMG,GAAG;EACzD;AACF;;;;;;;;;;;;ACpDA,IAAAkB,iBAAkE;AAClE,oBAA8B;AAC9B,qBAAkB;;;;;;;;;;;;;;;;;;;;;AAIX,IAAMC,qBAAN,MAAMA,oBAAAA;SAAAA;;;;EACMC,SAAS,IAAIC,sBAAOF,oBAAmBG,IAAI;EACpDC;EAER,YAA6BC,eAA8B;SAA9BA,gBAAAA;EAA+B;;EAG5DC,eAAqB;AACnB,UAAMC,MAAM,KAAKF,cAAcG,WAAmB,WAAA;AAClD,SAAKJ,SAAS,IAAIK,eAAAA,QAAMF,KAAK;MAC3BG,aAAa;MACbC,sBAAsB;IACxB,CAAA;AACA,SAAKP,OAAOQ,GAAG,WAAW,MAAM,KAAKX,OAAOY,IAAI,iBAAA,CAAA;AAChD,SAAKT,OAAOQ,GAAG,SAAS,CAACE,QAAQ,KAAKb,OAAOc,MAAM,eAAeD,GAAAA,CAAAA;EACpE;;EAGA,MAAME,kBAAiC;AACrC,UAAM,KAAKZ,OAAOa,KAAI;AACtB,SAAKhB,OAAOY,IAAI,oBAAA;EAClB;;EAGA,MAAMK,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,UAAMC,OAAOC,KAAKC,UAAUJ,KAAAA;AAC5B,UAAM,KAAKhB,OAAOqB,MAAMN,KAAKE,YAAYC,IAAAA;EAC3C;;EAGA,MAAMI,IAAOP,KAAgC;AAC3C,UAAMG,OAAO,MAAM,KAAKlB,OAAOsB,IAAIP,GAAAA;AACnC,QAAI,CAACG,KAAM,QAAO;AAClB,WAAOC,KAAKI,MAAML,IAAAA;EACpB;;EAGA,MAAMM,OAAOC,MAA+B;AAC1C,QAAIA,KAAKC,SAAS,GAAG;AACnB,YAAM,KAAK1B,OAAOwB,IAAG,GAAIC,IAAAA;IAC3B;EACF;;EAGA,MAAME,SAASC,SAAoC;AACjD,UAAMH,OAAiB,CAAA;AACvB,QAAII,SAAS;AACb,OAAG;AACD,YAAM,CAACC,YAAYC,KAAAA,IAAS,MAAM,KAAK/B,OAAOgC,KAAKH,QAAQ,SAASD,SAAS,SAAS,GAAA;AACtFC,eAASC;AACTL,WAAKQ,KAAI,GAAIF,KAAAA;IACf,SAASF,WAAW;AACpB,WAAOJ;EACT;;EAGA,MAAMS,gBAAiC;AACrC,WAAO,KAAKlC,OAAOmC,KAAK,QAAA;EAC1B;AACF;;;;;;;;;;;;;;;;;;;;;;;;AJhCO,IAAMC,cAAN,MAAMA,aAAAA;SAAAA;;;;EAEX,OAAOC,QAAQC,UAA8B,CAAC,GAAkB;AAC9D,QAAIA,QAAQC,WAAW,OAAO;AAC5B,aAAO;QACLC,QAAQJ;QACRK,WAAW;UACT;YAAEC,SAASC;YAAmBC,UAAUN,QAAQO,OAAO,CAAC;UAAE;UAC1DC;UACA;YAAEJ,SAASK;YAAgBC,aAAaF;UAAiB;UACzDG;;QAEFC,SAAS;UAACJ;UAAkBC;UAAgBE;;MAC9C;IACF;AACA,WAAO;MACLT,QAAQJ;MACRe,SAAS;QAACC;;MACVX,WAAW;QAACY;QAAoB;UAAEX,SAASK;UAAgBC,aAAaK;QAAmB;QAAGJ;;MAC9FC,SAAS;QAACG;QAAoBN;QAAgBE;;IAChD;EACF;;EAGA,OAAOK,aAAahB,SAAiD;AACnE,UAAMiB,kBAA4B;MAChCb,SAASc;MACTC,YAAYnB,QAAQmB;MACpBC,QAAQpB,QAAQoB,UAAU,CAAA;IAC5B;AACA,WAAO;MACLlB,QAAQJ;MACRe,SAAS;QAACC;WAAkBd,QAAQa,WAAW,CAAA;;MAC/CV,WAAW;QACTc;QACA;UACEb,SAASC;UACTc,YAAY,wBAACE,SAA6BA,KAAKd,OAAO,CAAC,GAA3C;UACZa,QAAQ;YAACF;;QACX;QACAV;QACAO;QACA;UACEX,SAASK;UACTU,YAAY,wBAACE,MAA0Bd,KAAuBe,UAC5DD,KAAKpB,WAAW,UAAUqB,QAAQf,KADxB;UAEZa,QAAQ;YAACF;YAAsBV;YAAkBO;;QACnD;QACAJ;;MAEFC,SAAS;QAACH;QAAgBE;;IAC5B;EACF;AACF;;;IAhEEE,SAAS;MAACC;;IACVX,WAAW;MACTY;MACA;QACEX,SAASK;QACTC,aAAaK;MACf;MACAJ;;IAEFC,SAAS;MAACG;MAAoBN;MAAgBE;;;;","names":["import_common","import_config","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","import_common","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","import_common","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
|
package/dist/cache.js
CHANGED
|
@@ -9,21 +9,30 @@ import { ConfigModule } from "@nestjs/config";
|
|
|
9
9
|
import { Inject, Injectable, Logger } from "@nestjs/common";
|
|
10
10
|
|
|
11
11
|
// src/cache/constants.ts
|
|
12
|
-
var CACHE_PROVIDER = Symbol("CACHE_PROVIDER");
|
|
13
|
-
var LRU_CACHE_OPTIONS = Symbol("LRU_CACHE_OPTIONS");
|
|
14
|
-
var CACHE_MODULE_OPTIONS = Symbol("CACHE_MODULE_OPTIONS");
|
|
12
|
+
var CACHE_PROVIDER = /* @__PURE__ */ Symbol("CACHE_PROVIDER");
|
|
13
|
+
var LRU_CACHE_OPTIONS = /* @__PURE__ */ Symbol("LRU_CACHE_OPTIONS");
|
|
14
|
+
var CACHE_MODULE_OPTIONS = /* @__PURE__ */ Symbol("CACHE_MODULE_OPTIONS");
|
|
15
15
|
var DEFAULT_LRU_MAX = 1e4;
|
|
16
16
|
|
|
17
17
|
// src/cache/cache.service.ts
|
|
18
18
|
function _ts_decorate(decorators, target, key, desc) {
|
|
19
19
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
21
|
-
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
21
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
22
|
+
} else {
|
|
23
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
24
|
+
if (d = decorators[i]) {
|
|
25
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
22
29
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
30
|
}
|
|
24
31
|
__name(_ts_decorate, "_ts_decorate");
|
|
25
|
-
function _ts_metadata(
|
|
26
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
32
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
33
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
34
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
35
|
+
}
|
|
27
36
|
}
|
|
28
37
|
__name(_ts_metadata, "_ts_metadata");
|
|
29
38
|
function _ts_param(paramIndex, decorator) {
|
|
@@ -99,13 +108,22 @@ import { Inject as Inject2, Injectable as Injectable2, Optional } from "@nestjs/
|
|
|
99
108
|
import { LRUCache } from "lru-cache";
|
|
100
109
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
101
110
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
102
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
103
|
-
|
|
111
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
112
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
113
|
+
} else {
|
|
114
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
115
|
+
if (d = decorators[i]) {
|
|
116
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
104
120
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
105
121
|
}
|
|
106
122
|
__name(_ts_decorate2, "_ts_decorate");
|
|
107
|
-
function _ts_metadata2(
|
|
108
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
123
|
+
function _ts_metadata2(metadataKey, metadataValue) {
|
|
124
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
125
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
126
|
+
}
|
|
109
127
|
}
|
|
110
128
|
__name(_ts_metadata2, "_ts_metadata");
|
|
111
129
|
function _ts_param2(paramIndex, decorator) {
|
|
@@ -174,13 +192,22 @@ import { ConfigService } from "@nestjs/config";
|
|
|
174
192
|
import Redis from "ioredis";
|
|
175
193
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
176
194
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
177
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
178
|
-
|
|
195
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
196
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
197
|
+
} else {
|
|
198
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
199
|
+
if (d = decorators[i]) {
|
|
200
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
179
204
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
180
205
|
}
|
|
181
206
|
__name(_ts_decorate3, "_ts_decorate");
|
|
182
|
-
function _ts_metadata3(
|
|
183
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
207
|
+
function _ts_metadata3(metadataKey, metadataValue) {
|
|
208
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
209
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
210
|
+
}
|
|
184
211
|
}
|
|
185
212
|
__name(_ts_metadata3, "_ts_metadata");
|
|
186
213
|
var RedisCacheProvider = class _RedisCacheProvider {
|
|
@@ -252,8 +279,15 @@ RedisCacheProvider = _ts_decorate3([
|
|
|
252
279
|
// src/cache/cache.module.ts
|
|
253
280
|
function _ts_decorate4(decorators, target, key, desc) {
|
|
254
281
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
255
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
256
|
-
|
|
282
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
283
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
284
|
+
} else {
|
|
285
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
286
|
+
if (d = decorators[i]) {
|
|
287
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
257
291
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
258
292
|
}
|
|
259
293
|
__name(_ts_decorate4, "_ts_decorate");
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":"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","names":["Module","ConfigModule","Inject","Injectable","Logger","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","Inject","Injectable","Optional","LRUCache","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","Injectable","Logger","ConfigService","Redis","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache/cache.module.ts","../src/cache/cache.service.ts","../src/cache/constants.ts","../src/cache/providers/lru.provider.ts","../src/cache/providers/redis.provider.ts"],"sourcesContent":["import { type DynamicModule, Module, type Provider } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { CacheService } from './cache.service';\nimport { CACHE_MODULE_OPTIONS, CACHE_PROVIDER, LRU_CACHE_OPTIONS } from './constants';\nimport { type LruCacheOptions, LruCacheProvider } from './providers/lru.provider';\nimport { RedisCacheProvider } from './providers/redis.provider';\n\nexport interface CacheModuleOptions {\n driver?: 'redis' | 'lru';\n lru?: LruCacheOptions;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: NestJS async factory injects/imports are heterogeneous\ntype AnyList = any[];\n\nexport interface CacheModuleAsyncOptions {\n imports?: AnyList;\n inject?: AnyList;\n useFactory: (...args: AnyList) => CacheModuleOptions | Promise<CacheModuleOptions>;\n}\n\n@Module({\n imports: [ConfigModule],\n providers: [\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useExisting: RedisCacheProvider,\n },\n CacheService,\n ],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n})\nexport class CacheModule {\n // Selects the backing provider; each import gets its own CacheService bound to the chosen driver\n static forRoot(options: CacheModuleOptions = {}): DynamicModule {\n if (options.driver === 'lru') {\n return {\n module: CacheModule,\n providers: [\n { provide: LRU_CACHE_OPTIONS, useValue: options.lru ?? {} },\n LruCacheProvider,\n { provide: CACHE_PROVIDER, useExisting: LruCacheProvider },\n CacheService,\n ],\n exports: [LruCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n return {\n module: CacheModule,\n imports: [ConfigModule],\n providers: [RedisCacheProvider, { provide: CACHE_PROVIDER, useExisting: RedisCacheProvider }, CacheService],\n exports: [RedisCacheProvider, CACHE_PROVIDER, CacheService],\n };\n }\n\n // Same driver selection as forRoot, but options (and the driver) resolve via a factory\n static forRootAsync(options: CacheModuleAsyncOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: CACHE_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n };\n return {\n module: CacheModule,\n imports: [ConfigModule, ...(options.imports ?? [])],\n providers: [\n optionsProvider,\n {\n provide: LRU_CACHE_OPTIONS,\n useFactory: (opts: CacheModuleOptions) => opts.lru ?? {},\n inject: [CACHE_MODULE_OPTIONS],\n },\n LruCacheProvider,\n RedisCacheProvider,\n {\n provide: CACHE_PROVIDER,\n useFactory: (opts: CacheModuleOptions, lru: LruCacheProvider, redis: RedisCacheProvider) =>\n opts.driver === 'redis' ? redis : lru,\n inject: [CACHE_MODULE_OPTIONS, LruCacheProvider, RedisCacheProvider],\n },\n CacheService,\n ],\n exports: [CACHE_PROVIDER, CacheService],\n };\n }\n}\n","import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_PROVIDER } from './constants';\nimport type { ICacheProvider } from './interfaces/cache-provider.interface';\n\n@Injectable()\nexport class CacheService {\n private readonly logger = new Logger(CacheService.name);\n\n constructor(@Inject(CACHE_PROVIDER) private readonly provider: ICacheProvider) {}\n\n // Stores a value with mandatory TTL — errors are logged and swallowed so DB writes still succeed\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n try {\n await this.provider.set(key, value, ttlSeconds);\n } catch (err) {\n this.logger.error(`Cache set failed for key \"${key}\"`, err);\n }\n }\n\n // Returns cached value or null on miss or any Redis error — callers fall back to DB\n async get<T>(key: string): Promise<T | null> {\n try {\n return await this.provider.get<T>(key);\n } catch (err) {\n this.logger.error(`Cache get failed for key \"${key}\"`, err);\n return null;\n }\n }\n\n // Deletes one or more keys — errors are logged and swallowed\n async del(...keys: string[]): Promise<void> {\n try {\n await this.provider.del(...keys);\n } catch (err) {\n this.logger.error(`Cache del failed for keys \"${keys.join(', ')}\"`, err);\n }\n }\n\n // Returns all keys matching a glob pattern — returns empty array on error\n async scanKeys(pattern: string): Promise<string[]> {\n try {\n return await this.provider.scanKeys(pattern);\n } catch (err) {\n this.logger.error(`Cache scanKeys failed for pattern \"${pattern}\"`, err);\n return [];\n }\n }\n\n // Returns raw memory info from the provider — returns empty string on error\n async getMemoryInfo(): Promise<string> {\n try {\n return await this.provider.getMemoryInfo();\n } catch (err) {\n this.logger.error('Cache getMemoryInfo failed', err);\n return '';\n }\n }\n}\n","// Injection token for the active cache provider — use this to inject ICacheProvider\nexport const CACHE_PROVIDER = Symbol('CACHE_PROVIDER');\n\n// Injection token for LruCacheProvider construction options\nexport const LRU_CACHE_OPTIONS = Symbol('LRU_CACHE_OPTIONS');\n\n// Injection token for the resolved CacheModuleOptions (used by forRootAsync)\nexport const CACHE_MODULE_OPTIONS = Symbol('CACHE_MODULE_OPTIONS');\n\n// Default entry cap for the in-memory LRU provider when no max is configured\nexport const DEFAULT_LRU_MAX = 10000;\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { LRUCache } from 'lru-cache';\nimport { DEFAULT_LRU_MAX, LRU_CACHE_OPTIONS } from '../constants';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\nexport interface LruCacheOptions {\n max?: number;\n}\n\n// Escapes a Redis-style glob (only * and ? are special) into an anchored RegExp for key scanning\nfunction globToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`);\n}\n\n@Injectable()\nexport class LruCacheProvider implements ICacheProvider {\n private readonly cache: LRUCache<string, object>;\n\n constructor(@Optional() @Inject(LRU_CACHE_OPTIONS) options?: LruCacheOptions) {\n this.cache = new LRUCache<string, object>({ max: options?.max ?? DEFAULT_LRU_MAX });\n }\n\n // Stores a value with a per-key TTL (wrapped so primitives survive lru-cache's object value type)\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n this.cache.set(key, { value } as object, { ttl: ttlSeconds * 1000 });\n }\n\n // Returns the stored value, or null on miss or expiry\n async get<T>(key: string): Promise<T | null> {\n const entry = this.cache.get(key) as { value: T } | undefined;\n return entry ? entry.value : null;\n }\n\n // Deletes one or more keys\n async del(...keys: string[]): Promise<void> {\n for (const key of keys) this.cache.delete(key);\n }\n\n // Returns all live keys matching a Redis-style glob pattern\n async scanKeys(pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern);\n return [...this.cache.keys()].filter((key) => regex.test(key));\n }\n\n // Reports entry count for monitoring utilities\n async getMemoryInfo(): Promise<string> {\n return `entries:${this.cache.size} max:${this.cache.max}`;\n }\n}\n","import { Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\nimport type { ICacheProvider } from '../interfaces/cache-provider.interface';\n\n@Injectable()\nexport class RedisCacheProvider implements ICacheProvider, OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(RedisCacheProvider.name);\n private client: Redis;\n\n constructor(private readonly configService: ConfigService) {}\n\n // Creates the ioredis client and attaches connection/error listeners\n onModuleInit(): void {\n const url = this.configService.getOrThrow<string>('REDIS_URL');\n this.client = new Redis(url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n });\n this.client.on('connect', () => this.logger.log('Redis connected'));\n this.client.on('error', (err) => this.logger.error('Redis error', err));\n }\n\n // Gracefully closes the ioredis connection on app shutdown\n async onModuleDestroy(): Promise<void> {\n await this.client.quit();\n this.logger.log('Redis disconnected');\n }\n\n // Serializes value to JSON and stores with a mandatory TTL\n async set<T>(key: string, value: T, ttlSeconds: number): Promise<void> {\n const json = JSON.stringify(value);\n await this.client.setex(key, ttlSeconds, json);\n }\n\n // Reads the stored JSON string and parses back to the original type\n async get<T>(key: string): Promise<T | null> {\n const json = await this.client.get(key);\n if (!json) return null;\n return JSON.parse(json) as T;\n }\n\n // Deletes one or more keys in a single command\n async del(...keys: string[]): Promise<void> {\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n\n // Cursor-iterates all keys matching a glob pattern — never uses KEYS command\n async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n keys.push(...batch);\n } while (cursor !== '0');\n return keys;\n }\n\n // Returns raw INFO memory output for memory monitoring\n async getMemoryInfo(): Promise<string> {\n return this.client.info('memory');\n }\n}\n"],"mappings":";;;;AAAA,SAA6BA,cAA6B;AAC1D,SAASC,oBAAoB;;;ACD7B,SAASC,QAAQC,YAAYC,cAAc;;;ACCpC,IAAMC,iBAAiBC,uBAAO,gBAAA;AAG9B,IAAMC,oBAAoBD,uBAAO,mBAAA;AAGjC,IAAME,uBAAuBF,uBAAO,sBAAA;AAGpC,IAAMG,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADLxB,IAAMC,eAAN,MAAMA,cAAAA;SAAAA;;;;EACMC,SAAS,IAAIC,OAAOF,cAAaG,IAAI;EAEtD,YAAqDC,UAA0B;SAA1BA,WAAAA;EAA2B;;EAGhF,MAAMC,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,QAAI;AACF,YAAM,KAAKJ,SAASC,IAAIC,KAAKC,OAAOC,UAAAA;IACtC,SAASC,KAAK;AACZ,WAAKR,OAAOS,MAAM,6BAA6BJ,GAAAA,KAAQG,GAAAA;IACzD;EACF;;EAGA,MAAME,IAAOL,KAAgC;AAC3C,QAAI;AACF,aAAO,MAAM,KAAKF,SAASO,IAAOL,GAAAA;IACpC,SAASG,KAAK;AACZ,WAAKR,OAAOS,MAAM,6BAA6BJ,GAAAA,KAAQG,GAAAA;AACvD,aAAO;IACT;EACF;;EAGA,MAAMG,OAAOC,MAA+B;AAC1C,QAAI;AACF,YAAM,KAAKT,SAASQ,IAAG,GAAIC,IAAAA;IAC7B,SAASJ,KAAK;AACZ,WAAKR,OAAOS,MAAM,8BAA8BG,KAAKC,KAAK,IAAA,CAAA,KAAUL,GAAAA;IACtE;EACF;;EAGA,MAAMM,SAASC,SAAoC;AACjD,QAAI;AACF,aAAO,MAAM,KAAKZ,SAASW,SAASC,OAAAA;IACtC,SAASP,KAAK;AACZ,WAAKR,OAAOS,MAAM,sCAAsCM,OAAAA,KAAYP,GAAAA;AACpE,aAAO,CAAA;IACT;EACF;;EAGA,MAAMQ,gBAAiC;AACrC,QAAI;AACF,aAAO,MAAM,KAAKb,SAASa,cAAa;IAC1C,SAASR,KAAK;AACZ,WAAKR,OAAOS,MAAM,8BAA8BD,GAAAA;AAChD,aAAO;IACT;EACF;AACF;;;;;;;;;;;AEzDA,SAASS,UAAAA,SAAQC,cAAAA,aAAYC,gBAAgB;AAC7C,SAASC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;AASzB,SAASC,aAAaC,SAAe;AACnC,QAAMC,UAAUD,QACbE,QAAQ,qBAAqB,MAAA,EAC7BA,QAAQ,OAAO,IAAA,EACfA,QAAQ,OAAO,GAAA;AAClB,SAAO,IAAIC,OAAO,IAAIF,OAAAA,GAAU;AAClC;AANSF;AASF,IAAMK,mBAAN,MAAMA;SAAAA;;;EACMC;EAEjB,YAAmDC,SAA2B;AAC5E,SAAKD,QAAQ,IAAIE,SAAyB;MAAEC,KAAKF,SAASE,OAAOC;IAAgB,CAAA;EACnF;;EAGA,MAAMC,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,SAAKR,MAAMK,IAAIC,KAAK;MAAEC;IAAM,GAAa;MAAEE,KAAKD,aAAa;IAAK,CAAA;EACpE;;EAGA,MAAME,IAAOJ,KAAgC;AAC3C,UAAMK,QAAQ,KAAKX,MAAMU,IAAIJ,GAAAA;AAC7B,WAAOK,QAAQA,MAAMJ,QAAQ;EAC/B;;EAGA,MAAMK,OAAOC,MAA+B;AAC1C,eAAWP,OAAOO,KAAM,MAAKb,MAAMc,OAAOR,GAAAA;EAC5C;;EAGA,MAAMS,SAASpB,SAAoC;AACjD,UAAMqB,QAAQtB,aAAaC,OAAAA;AAC3B,WAAO;SAAI,KAAKK,MAAMa,KAAI;MAAII,OAAO,CAACX,QAAQU,MAAME,KAAKZ,GAAAA,CAAAA;EAC3D;;EAGA,MAAMa,gBAAiC;AACrC,WAAO,WAAW,KAAKnB,MAAMoB,IAAI,QAAQ,KAAKpB,MAAMG,GAAG;EACzD;AACF;;;;;;;;;;;;ACpDA,SAASkB,cAAAA,aAAYC,UAAAA,eAA6C;AAClE,SAASC,qBAAqB;AAC9B,OAAOC,WAAW;;;;;;;;;;;;;;;;;;;;;AAIX,IAAMC,qBAAN,MAAMA,oBAAAA;SAAAA;;;;EACMC,SAAS,IAAIC,QAAOF,oBAAmBG,IAAI;EACpDC;EAER,YAA6BC,eAA8B;SAA9BA,gBAAAA;EAA+B;;EAG5DC,eAAqB;AACnB,UAAMC,MAAM,KAAKF,cAAcG,WAAmB,WAAA;AAClD,SAAKJ,SAAS,IAAIK,MAAMF,KAAK;MAC3BG,aAAa;MACbC,sBAAsB;IACxB,CAAA;AACA,SAAKP,OAAOQ,GAAG,WAAW,MAAM,KAAKX,OAAOY,IAAI,iBAAA,CAAA;AAChD,SAAKT,OAAOQ,GAAG,SAAS,CAACE,QAAQ,KAAKb,OAAOc,MAAM,eAAeD,GAAAA,CAAAA;EACpE;;EAGA,MAAME,kBAAiC;AACrC,UAAM,KAAKZ,OAAOa,KAAI;AACtB,SAAKhB,OAAOY,IAAI,oBAAA;EAClB;;EAGA,MAAMK,IAAOC,KAAaC,OAAUC,YAAmC;AACrE,UAAMC,OAAOC,KAAKC,UAAUJ,KAAAA;AAC5B,UAAM,KAAKhB,OAAOqB,MAAMN,KAAKE,YAAYC,IAAAA;EAC3C;;EAGA,MAAMI,IAAOP,KAAgC;AAC3C,UAAMG,OAAO,MAAM,KAAKlB,OAAOsB,IAAIP,GAAAA;AACnC,QAAI,CAACG,KAAM,QAAO;AAClB,WAAOC,KAAKI,MAAML,IAAAA;EACpB;;EAGA,MAAMM,OAAOC,MAA+B;AAC1C,QAAIA,KAAKC,SAAS,GAAG;AACnB,YAAM,KAAK1B,OAAOwB,IAAG,GAAIC,IAAAA;IAC3B;EACF;;EAGA,MAAME,SAASC,SAAoC;AACjD,UAAMH,OAAiB,CAAA;AACvB,QAAII,SAAS;AACb,OAAG;AACD,YAAM,CAACC,YAAYC,KAAAA,IAAS,MAAM,KAAK/B,OAAOgC,KAAKH,QAAQ,SAASD,SAAS,SAAS,GAAA;AACtFC,eAASC;AACTL,WAAKQ,KAAI,GAAIF,KAAAA;IACf,SAASF,WAAW;AACpB,WAAOJ;EACT;;EAGA,MAAMS,gBAAiC;AACrC,WAAO,KAAKlC,OAAOmC,KAAK,QAAA;EAC1B;AACF;;;;;;;;;;;;;;;;;;;;;;;;AJhCO,IAAMC,cAAN,MAAMA,aAAAA;SAAAA;;;;EAEX,OAAOC,QAAQC,UAA8B,CAAC,GAAkB;AAC9D,QAAIA,QAAQC,WAAW,OAAO;AAC5B,aAAO;QACLC,QAAQJ;QACRK,WAAW;UACT;YAAEC,SAASC;YAAmBC,UAAUN,QAAQO,OAAO,CAAC;UAAE;UAC1DC;UACA;YAAEJ,SAASK;YAAgBC,aAAaF;UAAiB;UACzDG;;QAEFC,SAAS;UAACJ;UAAkBC;UAAgBE;;MAC9C;IACF;AACA,WAAO;MACLT,QAAQJ;MACRe,SAAS;QAACC;;MACVX,WAAW;QAACY;QAAoB;UAAEX,SAASK;UAAgBC,aAAaK;QAAmB;QAAGJ;;MAC9FC,SAAS;QAACG;QAAoBN;QAAgBE;;IAChD;EACF;;EAGA,OAAOK,aAAahB,SAAiD;AACnE,UAAMiB,kBAA4B;MAChCb,SAASc;MACTC,YAAYnB,QAAQmB;MACpBC,QAAQpB,QAAQoB,UAAU,CAAA;IAC5B;AACA,WAAO;MACLlB,QAAQJ;MACRe,SAAS;QAACC;WAAkBd,QAAQa,WAAW,CAAA;;MAC/CV,WAAW;QACTc;QACA;UACEb,SAASC;UACTc,YAAY,wBAACE,SAA6BA,KAAKd,OAAO,CAAC,GAA3C;UACZa,QAAQ;YAACF;;QACX;QACAV;QACAO;QACA;UACEX,SAASK;UACTU,YAAY,wBAACE,MAA0Bd,KAAuBe,UAC5DD,KAAKpB,WAAW,UAAUqB,QAAQf,KADxB;UAEZa,QAAQ;YAACF;YAAsBV;YAAkBO;;QACnD;QACAJ;;MAEFC,SAAS;QAACH;QAAgBE;;IAC5B;EACF;AACF;;;IAhEEE,SAAS;MAACC;;IACVX,WAAW;MACTY;MACA;QACEX,SAASK;QACTC,aAAaK;MACf;MACAJ;;IAEFC,SAAS;MAACG;MAAoBN;MAAgBE;;;;","names":["Module","ConfigModule","Inject","Injectable","Logger","CACHE_PROVIDER","Symbol","LRU_CACHE_OPTIONS","CACHE_MODULE_OPTIONS","DEFAULT_LRU_MAX","CacheService","logger","Logger","name","provider","set","key","value","ttlSeconds","err","error","get","del","keys","join","scanKeys","pattern","getMemoryInfo","Inject","Injectable","Optional","LRUCache","globToRegExp","pattern","escaped","replace","RegExp","LruCacheProvider","cache","options","LRUCache","max","DEFAULT_LRU_MAX","set","key","value","ttlSeconds","ttl","get","entry","del","keys","delete","scanKeys","regex","filter","test","getMemoryInfo","size","Injectable","Logger","ConfigService","Redis","RedisCacheProvider","logger","Logger","name","client","configService","onModuleInit","url","getOrThrow","Redis","lazyConnect","maxRetriesPerRequest","on","log","err","error","onModuleDestroy","quit","set","key","value","ttlSeconds","json","JSON","stringify","setex","get","parse","del","keys","length","scanKeys","pattern","cursor","nextCursor","batch","scan","push","getMemoryInfo","info","CacheModule","forRoot","options","driver","module","providers","provide","LRU_CACHE_OPTIONS","useValue","lru","LruCacheProvider","CACHE_PROVIDER","useExisting","CacheService","exports","imports","ConfigModule","RedisCacheProvider","forRootAsync","optionsProvider","CACHE_MODULE_OPTIONS","useFactory","inject","opts","redis"]}
|
|
@@ -164,7 +164,7 @@ function snapshotFeatureKey(code, scope) {
|
|
|
164
164
|
return `${scope}.${code}`;
|
|
165
165
|
}
|
|
166
166
|
__name(snapshotFeatureKey, "snapshotFeatureKey");
|
|
167
|
-
var SNAPSHOT_SCHEMA_VERSION =
|
|
167
|
+
var SNAPSHOT_SCHEMA_VERSION = 6;
|
|
168
168
|
|
|
169
169
|
// src/catalog-resolver/catalog.builder.ts
|
|
170
170
|
function featureAppliesAtNode(applicableSiteTypes, siteType) {
|
|
@@ -187,7 +187,7 @@ function buildSiteCatalog(snapshot, businessCode, planCode, siteLocks, bucket, s
|
|
|
187
187
|
const locks = siteLocks;
|
|
188
188
|
const catalog = [];
|
|
189
189
|
const sortedApps = [
|
|
190
|
-
...
|
|
190
|
+
...snapshot.apps
|
|
191
191
|
].sort((a, b) => a.name.localeCompare(b.name));
|
|
192
192
|
for (const app of sortedApps) {
|
|
193
193
|
const businessAppFeatures = app.features.filter((ref) => scope === void 0 || ref.scope === scope).map((ref) => snapshot.features[snapshotFeatureKey(ref.code, ref.scope)]).filter((f) => !!f && // A UI bucket needs something to render, so a feature shipping no microfrontend is dropped.
|
|
@@ -506,7 +506,7 @@ function buildMatrix(snapshot, businessCode, planCode, siteLocks, allScopes, sit
|
|
|
506
506
|
locks
|
|
507
507
|
};
|
|
508
508
|
const apps = [];
|
|
509
|
-
for (const app of
|
|
509
|
+
for (const app of snapshot.apps) {
|
|
510
510
|
const counts = {
|
|
511
511
|
web: {
|
|
512
512
|
unlocked: 0,
|