ts-packages 2.0.0 → 3.0.0
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/package.json +1 -1
- package/packages/cache/README.md +105 -9
- package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.js +75 -281
- package/packages/cache/dist/cjs/adapters/memory/MemoryCache.js +76 -22
- package/packages/cache/dist/cjs/adapters/redis/RedisCache.js +84 -26
- package/packages/cache/dist/cjs/core/BaseCache.js +13 -4
- package/packages/cache/dist/cjs/core/factory.js +26 -4
- package/packages/cache/dist/cjs/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/cjs/errors/CacheError.js +6 -11
- package/packages/cache/dist/cjs/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/dist/cjs/errors/cacheErrorCodes.js +24 -0
- package/packages/cache/dist/cjs/errors/index.js +3 -0
- package/packages/cache/dist/cjs/middleware/express/cacheMiddleware.js +8 -8
- package/packages/cache/dist/cjs/session/SessionStore.js +84 -28
- package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.js +75 -281
- package/packages/cache/dist/esm/adapters/memory/MemoryCache.js +76 -22
- package/packages/cache/dist/esm/adapters/redis/RedisCache.js +84 -26
- package/packages/cache/dist/esm/core/BaseCache.js +13 -4
- package/packages/cache/dist/esm/core/factory.js +26 -4
- package/packages/cache/dist/esm/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/esm/errors/CacheError.js +6 -11
- package/packages/cache/dist/esm/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/dist/esm/errors/cacheErrorCodes.js +21 -0
- package/packages/cache/dist/esm/errors/index.js +3 -0
- package/packages/cache/dist/esm/middleware/express/cacheMiddleware.js +8 -8
- package/packages/cache/dist/esm/session/SessionStore.js +84 -28
- package/packages/cache/dist/types/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/types/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/types/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/package.json +8 -6
- package/packages/cache/src/adapters/memcache/MemcacheCache.ts +79 -352
- package/packages/cache/src/adapters/memory/MemoryCache.ts +76 -77
- package/packages/cache/src/adapters/redis/RedisCache.ts +84 -86
- package/packages/cache/src/core/BaseCache.ts +13 -14
- package/packages/cache/src/core/factory.ts +27 -16
- package/packages/cache/src/errors/CacheError.ts +16 -17
- package/packages/cache/src/errors/cacheErrorCodes.ts +24 -0
- package/packages/cache/src/errors/index.ts +5 -0
- package/packages/cache/src/middleware/express/cacheMiddleware.ts +8 -8
- package/packages/cache/src/session/SessionStore.ts +84 -84
- package/packages/errors-utils/README.md +54 -57
- package/packages/errors-utils/dist/cjs/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/cjs/constants/errorCodes.js +57 -22
- package/packages/errors-utils/dist/cjs/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/cjs/constants/errorMessages.js +72 -29
- package/packages/errors-utils/dist/cjs/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/AppError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.js +11 -0
- package/packages/errors-utils/dist/cjs/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenExpiredError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenMalformedError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/cjs/error/UnauthorizedError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/cjs/error/index.js +39 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.js +63 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/index.js +6 -0
- package/packages/errors-utils/dist/cjs/index.d.ts +3 -9
- package/packages/errors-utils/dist/cjs/index.js +12 -9
- package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.js → errorHandler.middleware.js} +4 -4
- package/packages/errors-utils/dist/cjs/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/middleware/express/index.js +2 -2
- package/packages/errors-utils/dist/esm/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/esm/constants/errorCodes.js +57 -22
- package/packages/errors-utils/dist/esm/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/esm/constants/errorMessages.js +72 -29
- package/packages/errors-utils/dist/esm/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/AppError.js +2 -2
- package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.js +7 -0
- package/packages/errors-utils/dist/esm/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/TokenExpiredError.js +2 -2
- package/packages/errors-utils/dist/esm/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/TokenMalformedError.js +2 -2
- package/packages/errors-utils/dist/esm/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/esm/error/UnauthorizedError.js +2 -2
- package/packages/errors-utils/dist/esm/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/esm/error/index.js +23 -0
- package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.js +59 -0
- package/packages/errors-utils/dist/esm/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/esm/errorRegistry/index.js +3 -0
- package/packages/errors-utils/dist/esm/index.d.ts +3 -9
- package/packages/errors-utils/dist/esm/index.js +12 -9
- package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.js → errorHandler.middleware.js} +5 -5
- package/packages/errors-utils/dist/esm/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/dist/esm/middleware/express/index.js +2 -2
- package/packages/errors-utils/dist/types/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/types/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/types/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/types/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/types/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/types/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/types/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/types/index.d.ts +3 -9
- package/packages/errors-utils/dist/types/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/package.json +4 -4
- package/packages/errors-utils/src/constants/errorCodes.ts +64 -23
- package/packages/errors-utils/src/constants/errorMessages.ts +91 -34
- package/packages/errors-utils/src/error/AppError.ts +3 -2
- package/packages/errors-utils/src/error/ServiceUnavailableError.ts +8 -0
- package/packages/errors-utils/src/error/TokenExpiredError.ts +2 -2
- package/packages/errors-utils/src/error/TokenMalformedError.ts +2 -2
- package/packages/errors-utils/src/error/UnauthorizedError.ts +8 -8
- package/packages/errors-utils/src/error/index.ts +26 -0
- package/packages/errors-utils/src/errorRegistry/errorRegistry.ts +74 -0
- package/packages/errors-utils/src/errorRegistry/index.ts +4 -0
- package/packages/errors-utils/src/index.ts +12 -10
- package/packages/errors-utils/src/middleware/express/{errorHandler.ts → errorHandler.middleware.ts} +5 -5
- package/packages/errors-utils/src/middleware/express/index.ts +2 -2
- package/packages/js-extensions/README.md +174 -425
- package/packages/js-extensions/dist/cjs/array/array-extensions.js +84 -50
- package/packages/js-extensions/dist/cjs/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/core/performance.js +6 -0
- package/packages/js-extensions/dist/cjs/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/core/version.js +9 -0
- package/packages/js-extensions/dist/cjs/index.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/index.js +1 -0
- package/packages/js-extensions/dist/cjs/number/number-extensions.js +85 -97
- package/packages/js-extensions/dist/cjs/object/object-extensions.js +102 -103
- package/packages/js-extensions/dist/cjs/string/string-extensions.js +66 -43
- package/packages/js-extensions/dist/cjs/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/defineExtension.js +13 -0
- package/packages/js-extensions/dist/cjs/utils/index.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/index.js +1 -0
- package/packages/js-extensions/dist/esm/array/array-extensions.js +84 -50
- package/packages/js-extensions/dist/esm/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/esm/core/performance.js +5 -0
- package/packages/js-extensions/dist/esm/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/esm/core/version.js +5 -0
- package/packages/js-extensions/dist/esm/index.d.ts +1 -0
- package/packages/js-extensions/dist/esm/index.js +1 -0
- package/packages/js-extensions/dist/esm/number/number-extensions.js +86 -98
- package/packages/js-extensions/dist/esm/object/object-extensions.js +102 -103
- package/packages/js-extensions/dist/esm/string/string-extensions.js +66 -43
- package/packages/js-extensions/dist/esm/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/defineExtension.js +10 -0
- package/packages/js-extensions/dist/esm/utils/index.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/index.js +1 -0
- package/packages/js-extensions/dist/types/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/types/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/types/index.d.ts +1 -0
- package/packages/js-extensions/dist/types/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/types/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/types/utils/index.d.ts +1 -0
- package/packages/js-extensions/package.json +8 -4
- package/packages/js-extensions/src/array/array-extensions.ts +268 -150
- package/packages/js-extensions/src/core/performance.ts +11 -0
- package/packages/js-extensions/src/core/version.ts +7 -0
- package/packages/js-extensions/src/index.ts +2 -0
- package/packages/js-extensions/src/number/number-extensions.ts +90 -123
- package/packages/js-extensions/src/object/object-extensions.ts +102 -130
- package/packages/js-extensions/src/string/string-extensions.ts +80 -76
- package/packages/js-extensions/src/types/global-augmentations.ts +2 -1
- package/packages/js-extensions/src/utils/defineExtension.ts +14 -0
- package/packages/js-extensions/src/utils/index.ts +1 -0
- package/packages/response-utils/README.md +156 -198
- package/packages/response-utils/dist/cjs/core/BaseResponder.js +20 -4
- package/packages/response-utils/dist/cjs/index.d.ts +0 -1
- package/packages/response-utils/dist/cjs/index.js +1 -25
- package/packages/response-utils/dist/esm/core/BaseResponder.js +20 -4
- package/packages/response-utils/dist/esm/index.d.ts +0 -1
- package/packages/response-utils/dist/esm/index.js +0 -2
- package/packages/response-utils/dist/types/index.d.ts +0 -1
- package/packages/response-utils/package.json +1 -1
- package/packages/response-utils/src/core/BaseResponder.ts +25 -4
- package/packages/response-utils/src/index.ts +0 -3
- package/packages/response-utils/src/middleware/express/expressMiddleware.ts +1 -1
- package/packages/security/README.md +153 -355
- package/packages/security/dist/cjs/core/crypto/cryptoManager.js +34 -17
- package/packages/security/dist/cjs/core/jwt/decode.js +4 -1
- package/packages/security/dist/cjs/core/jwt/generateTokens.js +4 -1
- package/packages/security/dist/cjs/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/cjs/core/jwt/jwtManager.js +84 -199
- package/packages/security/dist/cjs/core/jwt/parseDuration.js +3 -2
- package/packages/security/dist/cjs/core/jwt/signToken.js +2 -1
- package/packages/security/dist/cjs/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/cjs/core/jwt/validateToken.js +19 -10
- package/packages/security/dist/cjs/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/cjs/core/jwt/verify.js +59 -14
- package/packages/security/dist/cjs/core/password/hash.js +4 -4
- package/packages/security/dist/cjs/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/cjs/core/password/passwordManager.js +36 -80
- package/packages/security/dist/cjs/core/password/strength.js +12 -6
- package/packages/security/dist/cjs/core/password/utils.d.ts +12 -0
- package/packages/security/dist/cjs/core/password/utils.js +16 -1
- package/packages/security/dist/cjs/core/password/verify.js +4 -4
- package/packages/security/dist/cjs/index.d.ts +2 -7
- package/packages/security/dist/esm/core/crypto/cryptoManager.js +34 -17
- package/packages/security/dist/esm/core/jwt/decode.js +4 -1
- package/packages/security/dist/esm/core/jwt/generateTokens.js +4 -1
- package/packages/security/dist/esm/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/esm/core/jwt/jwtManager.js +85 -200
- package/packages/security/dist/esm/core/jwt/parseDuration.js +3 -2
- package/packages/security/dist/esm/core/jwt/signToken.js +2 -1
- package/packages/security/dist/esm/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/esm/core/jwt/validateToken.js +19 -10
- package/packages/security/dist/esm/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/esm/core/jwt/verify.js +58 -13
- package/packages/security/dist/esm/core/password/hash.js +4 -4
- package/packages/security/dist/esm/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/esm/core/password/passwordManager.js +36 -80
- package/packages/security/dist/esm/core/password/strength.js +12 -6
- package/packages/security/dist/esm/core/password/utils.d.ts +12 -0
- package/packages/security/dist/esm/core/password/utils.js +16 -1
- package/packages/security/dist/esm/core/password/verify.js +4 -4
- package/packages/security/dist/esm/index.d.ts +2 -7
- package/packages/security/dist/types/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/types/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/types/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/types/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/types/core/password/utils.d.ts +12 -0
- package/packages/security/dist/types/index.d.ts +2 -7
- package/packages/security/package.json +3 -3
- package/packages/security/src/core/crypto/cryptoManager.ts +53 -21
- package/packages/security/src/core/jwt/decode.ts +4 -1
- package/packages/security/src/core/jwt/generateTokens.ts +4 -1
- package/packages/security/src/core/jwt/jwtManager.ts +105 -257
- package/packages/security/src/core/jwt/parseDuration.ts +4 -2
- package/packages/security/src/core/jwt/signToken.ts +2 -1
- package/packages/security/src/core/jwt/validateToken.ts +21 -13
- package/packages/security/src/core/jwt/verify.ts +82 -20
- package/packages/security/src/core/password/hash.ts +10 -4
- package/packages/security/src/core/password/passwordManager.ts +38 -108
- package/packages/security/src/core/password/strength.ts +13 -8
- package/packages/security/src/core/password/utils.ts +19 -3
- package/packages/security/src/core/password/verify.ts +6 -4
- package/packages/server-utils/README.md +1 -1
- package/packages/server-utils/dist/cjs/core/server.js +6 -6
- package/packages/server-utils/dist/cjs/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/cjs/middleware/auth.middleware.js +17 -14
- package/packages/server-utils/dist/cjs/middleware/cache.middleware.js +2 -2
- package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.js +34 -17
- package/packages/server-utils/dist/cjs/middleware/session.middleware.js +8 -8
- package/packages/server-utils/dist/cjs/middleware/validation.middleware.js +2 -2
- package/packages/server-utils/dist/esm/core/server.js +6 -6
- package/packages/server-utils/dist/esm/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/esm/middleware/auth.middleware.js +18 -15
- package/packages/server-utils/dist/esm/middleware/cache.middleware.js +2 -2
- package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.js +34 -17
- package/packages/server-utils/dist/esm/middleware/session.middleware.js +8 -8
- package/packages/server-utils/dist/esm/middleware/validation.middleware.js +2 -2
- package/packages/server-utils/dist/types/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/types/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/package.json +4 -4
- package/packages/server-utils/src/core/server.ts +6 -6
- package/packages/server-utils/src/middleware/auth.middleware.ts +40 -27
- package/packages/server-utils/src/middleware/cache.middleware.ts +2 -2
- package/packages/server-utils/src/middleware/errorHandler.middleware.ts +39 -24
- package/packages/server-utils/src/middleware/session.middleware.ts +11 -8
- package/packages/server-utils/src/middleware/validation.middleware.ts +2 -3
- package/packages/errors-utils/dist/cjs/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/cjs/error/RateLimitError.js +0 -11
- package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.js +0 -27
- package/packages/errors-utils/dist/esm/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/esm/error/RateLimitError.js +0 -7
- package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.js +0 -24
- package/packages/errors-utils/dist/types/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/types/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/src/error/RateLimitError.ts +0 -8
- package/packages/errors-utils/src/utils/mapAppErrorToResponder.ts +0 -38
- package/packages/response-utils/src/legacy.ts +0 -30
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/types/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/types/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/src/middleware/express/{errorConverter.ts → errorConverter.middleware.ts} +0 -0
|
@@ -1,71 +1,18 @@
|
|
|
1
1
|
import { BaseCache } from '../../core/BaseCache';
|
|
2
2
|
import type { HealthCheckResponse, MemcacheCacheConfig } from '../../types';
|
|
3
|
-
/**
|
|
4
|
-
* Memcache adapter
|
|
5
|
-
*/
|
|
6
3
|
export declare class MemcacheCache<T = unknown> extends BaseCache<T> {
|
|
7
4
|
private memcacheConfig;
|
|
8
5
|
private client;
|
|
9
6
|
private isConnected;
|
|
10
7
|
constructor(memcacheConfig: MemcacheCacheConfig);
|
|
11
|
-
/**
|
|
12
|
-
* Connect to Memcache
|
|
13
|
-
*/
|
|
14
8
|
connect(): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* Ensure client is connected
|
|
17
|
-
*/
|
|
18
9
|
private ensureConnected;
|
|
19
|
-
/**
|
|
20
|
-
* Ping memcache
|
|
21
|
-
*/
|
|
22
10
|
private ping;
|
|
23
|
-
|
|
24
|
-
* Get a value from Memcache
|
|
25
|
-
*/
|
|
11
|
+
exists(key: string): Promise<boolean>;
|
|
26
12
|
get(key: string): Promise<T | null>;
|
|
27
|
-
/**
|
|
28
|
-
* Set a value in Memcache
|
|
29
|
-
*/
|
|
30
13
|
set(key: string, value: T, ttl?: number): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Delete a key from Memcache
|
|
33
|
-
*/
|
|
34
14
|
delete(key: string): Promise<boolean>;
|
|
35
|
-
/**
|
|
36
|
-
* Check if key exists
|
|
37
|
-
*/
|
|
38
|
-
exists(key: string): Promise<boolean>;
|
|
39
|
-
/**
|
|
40
|
-
* Clear all keys (Memcache limitation: flushes entire cache)
|
|
41
|
-
*/
|
|
42
15
|
clear(): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Get multiple values at once
|
|
45
|
-
*/
|
|
46
|
-
getMultiple(keys: string[]): Promise<Record<string, T | null>>;
|
|
47
|
-
/**
|
|
48
|
-
* Set multiple values at once
|
|
49
|
-
*/
|
|
50
|
-
setMultiple(data: Record<string, T>, ttl?: number): Promise<void>;
|
|
51
|
-
/**
|
|
52
|
-
* Delete multiple keys at once
|
|
53
|
-
*/
|
|
54
|
-
deleteMultiple(keys: string[]): Promise<number>;
|
|
55
|
-
/**
|
|
56
|
-
* Increment a numeric value (not natively supported by Memcache in this library)
|
|
57
|
-
*/
|
|
58
|
-
increment(key: string, amount?: number): Promise<number>;
|
|
59
|
-
/**
|
|
60
|
-
* Decrement a numeric value
|
|
61
|
-
*/
|
|
62
|
-
decrement(key: string, amount?: number): Promise<number>;
|
|
63
|
-
/**
|
|
64
|
-
* Check if Memcache is alive
|
|
65
|
-
*/
|
|
66
16
|
isAlive(): Promise<HealthCheckResponse>;
|
|
67
|
-
/**
|
|
68
|
-
* Close Memcache connection
|
|
69
|
-
*/
|
|
70
17
|
close(): Promise<void>;
|
|
71
18
|
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export declare class CacheError extends Error {
|
|
5
|
-
readonly code: string;
|
|
1
|
+
import { AppError } from '@naman_deep_singh/errors-utils';
|
|
2
|
+
import type { CacheErrorCode } from './cacheErrorCodes';
|
|
3
|
+
export declare class CacheError extends AppError {
|
|
6
4
|
readonly adapter?: string;
|
|
7
|
-
readonly
|
|
8
|
-
constructor(
|
|
5
|
+
readonly operation?: string;
|
|
6
|
+
constructor(code: CacheErrorCode, options?: {
|
|
7
|
+
adapter?: string;
|
|
8
|
+
operation?: string;
|
|
9
|
+
details?: unknown;
|
|
10
|
+
cause?: Error;
|
|
11
|
+
});
|
|
9
12
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const CACHE_ERROR_CODES: {
|
|
2
|
+
readonly CACHE_ERROR: "Temporary caching issue, please retry";
|
|
3
|
+
readonly CACHE_CONNECTION_FAILED: "Failed to connect to the cache server";
|
|
4
|
+
readonly CACHE_UNSUPPORTED_ADAPTER: "The specified cache adapter is not supported";
|
|
5
|
+
readonly CACHE_INVALID_CONFIG: "The provided cache configuration is invalid";
|
|
6
|
+
readonly CACHE_KEY_NOT_FOUND: "The requested cache key was not found";
|
|
7
|
+
readonly CACHE_OPERATION_TIMEOUT: "The cache operation timed out";
|
|
8
|
+
readonly CACHE_SERIALIZE_ERROR: "Failed to serialize cached data";
|
|
9
|
+
readonly CACHE_DESERIALIZE_ERROR: "Failed to deserialize cached data";
|
|
10
|
+
readonly SESSION_CREATE_ERROR: "Failed to create a new session";
|
|
11
|
+
readonly SESSION_GET_ERROR: "Failed to get session data";
|
|
12
|
+
readonly SESSION_UPDATE_ERROR: "Failed to update session data";
|
|
13
|
+
readonly SESSION_DELETE_ERROR: "Failed to delete session data";
|
|
14
|
+
readonly SESSION_EXISTS_ERROR: "Failed to check session existence";
|
|
15
|
+
readonly SESSION_CLEAR_ERROR: "Failed to clear sessions";
|
|
16
|
+
readonly SESSION_GET_MULTIPLE_ERROR: "Failed to get multiple sessions";
|
|
17
|
+
readonly SESSION_DELETE_MULTIPLE_ERROR: "Failed to delete multiple sessions";
|
|
18
|
+
readonly SESSION_EXTEND_ERROR: "Failed to extend session expiry";
|
|
19
|
+
readonly SESSION_GET_EXTEND_ERROR: "Failed to get and extend session data";
|
|
20
|
+
readonly SESSION_NOT_FOUND: "Session not found";
|
|
21
|
+
};
|
|
22
|
+
export type CacheErrorCode = (typeof CACHE_ERROR_CODES)[keyof typeof CACHE_ERROR_CODES];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naman_deep_singh/cache",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Extensible caching layer supporting Redis, Memcache, and in-memory caches with automatic fallback, namespacing, session management, and Express middleware.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -36,15 +36,17 @@
|
|
|
36
36
|
"license": "ISC",
|
|
37
37
|
"packageManager": "pnpm@10.20.0",
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/memcached": "^2.2.7",
|
|
40
39
|
"@types/express": "^5.0.5",
|
|
40
|
+
"@types/memcached": "^2.2.7",
|
|
41
41
|
"@types/node": "^25.0.1",
|
|
42
42
|
"express": "^5.1.0",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
43
|
+
"rimraf": "^5.0.5",
|
|
44
|
+
"typescript": "^5.9.3"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"
|
|
48
|
-
"
|
|
47
|
+
"@naman_deep_singh/errors-utils": "^1.4.2",
|
|
48
|
+
"@naman_deep_singh/response-utils": "^2.1.4",
|
|
49
|
+
"memcached": "^2.2.2",
|
|
50
|
+
"redis": "^4.6.10"
|
|
49
51
|
}
|
|
50
52
|
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import Memcached from 'memcached'
|
|
2
|
+
import { CACHE_ERROR_CODES } from 'src/errors/cacheErrorCodes'
|
|
2
3
|
import { BaseCache } from '../../core/BaseCache'
|
|
3
4
|
import { CacheError } from '../../errors'
|
|
4
5
|
import type { HealthCheckResponse, MemcacheCacheConfig } from '../../types'
|
|
5
6
|
|
|
6
|
-
/**
|
|
7
|
-
* Memcache adapter
|
|
8
|
-
*/
|
|
9
7
|
export class MemcacheCache<T = unknown> extends BaseCache<T> {
|
|
10
8
|
private client: Memcached | null = null
|
|
11
9
|
private isConnected = false
|
|
@@ -14,439 +12,168 @@ export class MemcacheCache<T = unknown> extends BaseCache<T> {
|
|
|
14
12
|
super(memcacheConfig)
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
/**
|
|
18
|
-
* Connect to Memcache
|
|
19
|
-
*/
|
|
20
15
|
async connect(): Promise<void> {
|
|
21
16
|
try {
|
|
22
17
|
const servers = Array.isArray(this.memcacheConfig.servers)
|
|
23
18
|
? this.memcacheConfig.servers
|
|
24
19
|
: [this.memcacheConfig.servers]
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
this.client = new Memcached(servers, {
|
|
27
22
|
retries: 2,
|
|
28
23
|
retry: 30000,
|
|
29
24
|
remove: true,
|
|
30
|
-
|
|
31
|
-
maxValue: 1048576, // 1MB default
|
|
25
|
+
maxValue: 1048576,
|
|
32
26
|
idle: 30000,
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (this.memcacheConfig.username) {
|
|
36
|
-
;(options as any).username = this.memcacheConfig.username
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (this.memcacheConfig.password) {
|
|
40
|
-
;(options as any).password = this.memcacheConfig.password
|
|
41
|
-
}
|
|
27
|
+
})
|
|
42
28
|
|
|
43
|
-
this.client = new Memcached(servers, options)
|
|
44
29
|
this.isConnected = true
|
|
45
|
-
|
|
46
|
-
// Test connection
|
|
47
30
|
await this.ping()
|
|
48
|
-
} catch (
|
|
49
|
-
throw new CacheError(
|
|
50
|
-
|
|
51
|
-
'
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
)
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_CONNECTION_FAILED, {
|
|
33
|
+
adapter: 'memcache',
|
|
34
|
+
operation: 'connect',
|
|
35
|
+
cause: error instanceof Error ? error : undefined,
|
|
36
|
+
})
|
|
55
37
|
}
|
|
56
38
|
}
|
|
57
39
|
|
|
58
|
-
/**
|
|
59
|
-
* Ensure client is connected
|
|
60
|
-
*/
|
|
61
40
|
private async ensureConnected(): Promise<void> {
|
|
62
41
|
if (!this.client) {
|
|
63
42
|
await this.connect()
|
|
64
43
|
}
|
|
65
44
|
}
|
|
66
45
|
|
|
67
|
-
/**
|
|
68
|
-
* Ping memcache
|
|
69
|
-
*/
|
|
70
46
|
private async ping(): Promise<void> {
|
|
71
47
|
return new Promise((resolve, reject) => {
|
|
72
|
-
if (!this.client)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
48
|
+
if (!this.client) return reject(new Error('Client not initialized'))
|
|
49
|
+
this.client.touch('__ping', 1, (err) => (err ? reject(err) : resolve()))
|
|
50
|
+
})
|
|
51
|
+
}
|
|
76
52
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
53
|
+
async exists(key: string): Promise<boolean> {
|
|
54
|
+
try {
|
|
55
|
+
const value = await this.get(key)
|
|
56
|
+
return value !== null
|
|
57
|
+
} catch (error) {
|
|
58
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_ERROR, {
|
|
59
|
+
adapter: 'memcache',
|
|
60
|
+
operation: 'exists',
|
|
61
|
+
details: { key },
|
|
62
|
+
cause: error instanceof Error ? error : undefined,
|
|
80
63
|
})
|
|
81
|
-
}
|
|
64
|
+
}
|
|
82
65
|
}
|
|
83
66
|
|
|
84
|
-
/**
|
|
85
|
-
* Get a value from Memcache
|
|
86
|
-
*/
|
|
87
67
|
async get(key: string): Promise<T | null> {
|
|
88
68
|
try {
|
|
89
69
|
await this.ensureConnected()
|
|
90
70
|
const fullKey = this.buildKey(key)
|
|
91
71
|
|
|
92
72
|
return new Promise((resolve, reject) => {
|
|
93
|
-
this.client!.get(fullKey, (err
|
|
94
|
-
if (err)
|
|
95
|
-
|
|
96
|
-
return
|
|
97
|
-
}
|
|
73
|
+
this.client!.get(fullKey, (err, data) => {
|
|
74
|
+
if (err) return reject(err)
|
|
75
|
+
if (data == null) return resolve(null)
|
|
98
76
|
|
|
99
|
-
if (data === undefined || data === null) {
|
|
100
|
-
this.recordMiss()
|
|
101
|
-
resolve(null)
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
this.recordHit()
|
|
106
77
|
try {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// Unknown shape from memcached client - treat as miss
|
|
113
|
-
this.recordMiss()
|
|
114
|
-
resolve(null)
|
|
115
|
-
}
|
|
116
|
-
} catch (parseErr) {
|
|
117
|
-
reject(parseErr)
|
|
78
|
+
resolve(
|
|
79
|
+
this.deserialize(Buffer.isBuffer(data) ? data.toString() : data),
|
|
80
|
+
)
|
|
81
|
+
} catch (e) {
|
|
82
|
+
reject(e)
|
|
118
83
|
}
|
|
119
84
|
})
|
|
120
85
|
})
|
|
121
|
-
} catch (
|
|
122
|
-
throw new CacheError(
|
|
123
|
-
|
|
124
|
-
'
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
)
|
|
86
|
+
} catch (error) {
|
|
87
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_KEY_NOT_FOUND, {
|
|
88
|
+
adapter: 'memcache',
|
|
89
|
+
operation: 'get',
|
|
90
|
+
details: { key },
|
|
91
|
+
cause: error instanceof Error ? error : undefined,
|
|
92
|
+
})
|
|
128
93
|
}
|
|
129
94
|
}
|
|
130
95
|
|
|
131
|
-
/**
|
|
132
|
-
* Set a value in Memcache
|
|
133
|
-
*/
|
|
134
96
|
async set(key: string, value: T, ttl?: number): Promise<void> {
|
|
135
97
|
try {
|
|
136
98
|
await this.ensureConnected()
|
|
137
99
|
const fullKey = this.buildKey(key)
|
|
138
|
-
const serialized = this.serialize(value)
|
|
139
|
-
const expiry = ttl ?? this.ttl
|
|
140
100
|
|
|
141
101
|
return new Promise((resolve, reject) => {
|
|
142
|
-
this.client!.set(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
102
|
+
this.client!.set(
|
|
103
|
+
fullKey,
|
|
104
|
+
this.serialize(value),
|
|
105
|
+
ttl ?? this.ttl,
|
|
106
|
+
(err) => (err ? reject(err) : resolve()),
|
|
107
|
+
)
|
|
108
|
+
})
|
|
109
|
+
} catch (error) {
|
|
110
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_ERROR, {
|
|
111
|
+
adapter: 'memcache',
|
|
112
|
+
operation: 'set',
|
|
113
|
+
details: { key },
|
|
114
|
+
cause: error instanceof Error ? error : undefined,
|
|
150
115
|
})
|
|
151
|
-
} catch (err) {
|
|
152
|
-
throw new CacheError(
|
|
153
|
-
`Failed to set key "${key}" in Memcache`,
|
|
154
|
-
'MEMCACHE_SET_ERROR',
|
|
155
|
-
'memcache',
|
|
156
|
-
err as Error,
|
|
157
|
-
)
|
|
158
116
|
}
|
|
159
117
|
}
|
|
160
118
|
|
|
161
|
-
/**
|
|
162
|
-
* Delete a key from Memcache
|
|
163
|
-
*/
|
|
164
119
|
async delete(key: string): Promise<boolean> {
|
|
165
120
|
try {
|
|
166
121
|
await this.ensureConnected()
|
|
167
122
|
const fullKey = this.buildKey(key)
|
|
168
123
|
|
|
169
124
|
return new Promise((resolve, reject) => {
|
|
170
|
-
this.client!.del(fullKey, (err
|
|
171
|
-
if (err) {
|
|
172
|
-
reject(err)
|
|
173
|
-
} else {
|
|
174
|
-
this.recordDelete()
|
|
175
|
-
resolve(true)
|
|
176
|
-
}
|
|
177
|
-
})
|
|
125
|
+
this.client!.del(fullKey, (err) => (err ? reject(err) : resolve(true)))
|
|
178
126
|
})
|
|
179
|
-
} catch (
|
|
180
|
-
throw new CacheError(
|
|
181
|
-
|
|
182
|
-
'
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
)
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Check if key exists
|
|
191
|
-
*/
|
|
192
|
-
async exists(key: string): Promise<boolean> {
|
|
193
|
-
try {
|
|
194
|
-
const value = await this.get(key)
|
|
195
|
-
return value !== null
|
|
196
|
-
} catch (err) {
|
|
197
|
-
throw new CacheError(
|
|
198
|
-
`Failed to check existence of key "${key}" in Memcache`,
|
|
199
|
-
'MEMCACHE_EXISTS_ERROR',
|
|
200
|
-
'memcache',
|
|
201
|
-
err as Error,
|
|
202
|
-
)
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Clear all keys (Memcache limitation: flushes entire cache)
|
|
208
|
-
*/
|
|
209
|
-
async clear(): Promise<void> {
|
|
210
|
-
try {
|
|
211
|
-
await this.ensureConnected()
|
|
212
|
-
|
|
213
|
-
return new Promise((resolve, reject) => {
|
|
214
|
-
this.client!.flush((err: Error | null) => {
|
|
215
|
-
if (err) {
|
|
216
|
-
reject(err)
|
|
217
|
-
} else {
|
|
218
|
-
resolve()
|
|
219
|
-
}
|
|
220
|
-
})
|
|
127
|
+
} catch (error) {
|
|
128
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_ERROR, {
|
|
129
|
+
adapter: 'memcache',
|
|
130
|
+
operation: 'delete',
|
|
131
|
+
details: { key },
|
|
132
|
+
cause: error instanceof Error ? error : undefined,
|
|
221
133
|
})
|
|
222
|
-
} catch (err) {
|
|
223
|
-
throw new CacheError(
|
|
224
|
-
'Failed to clear Memcache',
|
|
225
|
-
'MEMCACHE_CLEAR_ERROR',
|
|
226
|
-
'memcache',
|
|
227
|
-
err as Error,
|
|
228
|
-
)
|
|
229
134
|
}
|
|
230
135
|
}
|
|
231
136
|
|
|
232
|
-
|
|
233
|
-
* Get multiple values at once
|
|
234
|
-
*/
|
|
235
|
-
async getMultiple(keys: string[]): Promise<Record<string, T | null>> {
|
|
137
|
+
async clear(): Promise<void> {
|
|
236
138
|
try {
|
|
237
139
|
await this.ensureConnected()
|
|
238
|
-
const fullKeys = keys.map((k) => this.buildKey(k))
|
|
239
|
-
|
|
240
140
|
return new Promise((resolve, reject) => {
|
|
241
|
-
this.client!.
|
|
242
|
-
if (err) {
|
|
243
|
-
reject(err)
|
|
244
|
-
return
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const result: Record<string, T | null> = {}
|
|
248
|
-
|
|
249
|
-
if (!data || typeof data !== 'object') {
|
|
250
|
-
// Treat as all misses
|
|
251
|
-
for (const key of keys) {
|
|
252
|
-
this.recordMiss()
|
|
253
|
-
result[key] = null
|
|
254
|
-
}
|
|
255
|
-
resolve(result)
|
|
256
|
-
return
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const map = data as Record<string, unknown>
|
|
260
|
-
keys.forEach((key) => {
|
|
261
|
-
const fullKey = this.buildKey(key)
|
|
262
|
-
const value = map[fullKey]
|
|
263
|
-
if (value === undefined || value === null) {
|
|
264
|
-
this.recordMiss()
|
|
265
|
-
result[key] = null
|
|
266
|
-
} else {
|
|
267
|
-
this.recordHit()
|
|
268
|
-
try {
|
|
269
|
-
if (typeof value === 'string') {
|
|
270
|
-
result[key] = this.deserialize(value)
|
|
271
|
-
} else if (Buffer.isBuffer(value)) {
|
|
272
|
-
result[key] = this.deserialize(value.toString())
|
|
273
|
-
} else {
|
|
274
|
-
// Unknown, treat as miss
|
|
275
|
-
this.recordMiss()
|
|
276
|
-
result[key] = null
|
|
277
|
-
}
|
|
278
|
-
} catch (parseErr) {
|
|
279
|
-
reject(parseErr)
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
})
|
|
283
|
-
|
|
284
|
-
resolve(result)
|
|
285
|
-
})
|
|
141
|
+
this.client!.flush((err) => (err ? reject(err) : resolve()))
|
|
286
142
|
})
|
|
287
|
-
} catch (
|
|
288
|
-
throw new CacheError(
|
|
289
|
-
|
|
290
|
-
'
|
|
291
|
-
|
|
292
|
-
err as Error,
|
|
293
|
-
)
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Set multiple values at once
|
|
299
|
-
*/
|
|
300
|
-
async setMultiple(data: Record<string, T>, ttl?: number): Promise<void> {
|
|
301
|
-
try {
|
|
302
|
-
await this.ensureConnected()
|
|
303
|
-
const expiry = ttl ?? this.ttl
|
|
304
|
-
|
|
305
|
-
const promises: Promise<void>[] = []
|
|
306
|
-
for (const [key, value] of Object.entries(data)) {
|
|
307
|
-
const fullKey = this.buildKey(key)
|
|
308
|
-
const serialized = this.serialize(value)
|
|
309
|
-
promises.push(
|
|
310
|
-
new Promise((resolve, reject) => {
|
|
311
|
-
this.client!.set(
|
|
312
|
-
fullKey,
|
|
313
|
-
serialized,
|
|
314
|
-
expiry,
|
|
315
|
-
(err: Error | null) => {
|
|
316
|
-
if (err) reject(err)
|
|
317
|
-
else resolve()
|
|
318
|
-
},
|
|
319
|
-
)
|
|
320
|
-
}),
|
|
321
|
-
)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return Promise.all(promises).then(() => {
|
|
325
|
-
this.stats.sets += Object.keys(data).length
|
|
143
|
+
} catch (error) {
|
|
144
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_OPERATION_TIMEOUT, {
|
|
145
|
+
adapter: 'memcache',
|
|
146
|
+
operation: 'clear',
|
|
147
|
+
cause: error instanceof Error ? error : undefined,
|
|
326
148
|
})
|
|
327
|
-
} catch (err) {
|
|
328
|
-
throw new CacheError(
|
|
329
|
-
'Failed to set multiple keys in Memcache',
|
|
330
|
-
'MEMCACHE_SET_MULTIPLE_ERROR',
|
|
331
|
-
'memcache',
|
|
332
|
-
err as Error,
|
|
333
|
-
)
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Delete multiple keys at once
|
|
339
|
-
*/
|
|
340
|
-
async deleteMultiple(keys: string[]): Promise<number> {
|
|
341
|
-
try {
|
|
342
|
-
await this.ensureConnected()
|
|
343
|
-
const fullKeys = keys.map((k) => this.buildKey(k))
|
|
344
|
-
|
|
345
|
-
let deletedCount = 0
|
|
346
|
-
await Promise.all(
|
|
347
|
-
fullKeys.map(
|
|
348
|
-
(key) =>
|
|
349
|
-
new Promise<void>((resolve, reject) => {
|
|
350
|
-
this.client!.del(key, (err: Error | null) => {
|
|
351
|
-
if (err) {
|
|
352
|
-
reject(err)
|
|
353
|
-
} else {
|
|
354
|
-
deletedCount++
|
|
355
|
-
resolve()
|
|
356
|
-
}
|
|
357
|
-
})
|
|
358
|
-
}),
|
|
359
|
-
),
|
|
360
|
-
)
|
|
361
|
-
|
|
362
|
-
this.stats.deletes += deletedCount
|
|
363
|
-
return deletedCount
|
|
364
|
-
} catch (err) {
|
|
365
|
-
throw new CacheError(
|
|
366
|
-
'Failed to delete multiple keys from Memcache',
|
|
367
|
-
'MEMCACHE_DELETE_MULTIPLE_ERROR',
|
|
368
|
-
'memcache',
|
|
369
|
-
err as Error,
|
|
370
|
-
)
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Increment a numeric value (not natively supported by Memcache in this library)
|
|
376
|
-
*/
|
|
377
|
-
async increment(key: string, amount = 1): Promise<number> {
|
|
378
|
-
try {
|
|
379
|
-
const current = await this.get(key)
|
|
380
|
-
const value = (typeof current === 'number' ? current : 0) + amount
|
|
381
|
-
await this.set(key, value as T)
|
|
382
|
-
return value
|
|
383
|
-
} catch (err) {
|
|
384
|
-
throw new CacheError(
|
|
385
|
-
`Failed to increment key "${key}" in Memcache`,
|
|
386
|
-
'MEMCACHE_INCREMENT_ERROR',
|
|
387
|
-
'memcache',
|
|
388
|
-
err as Error,
|
|
389
|
-
)
|
|
390
149
|
}
|
|
391
150
|
}
|
|
392
151
|
|
|
393
|
-
/**
|
|
394
|
-
* Decrement a numeric value
|
|
395
|
-
*/
|
|
396
|
-
async decrement(key: string, amount = 1): Promise<number> {
|
|
397
|
-
try {
|
|
398
|
-
const current = await this.get(key)
|
|
399
|
-
const value = (typeof current === 'number' ? current : 0) - amount
|
|
400
|
-
await this.set(key, value as T)
|
|
401
|
-
return value
|
|
402
|
-
} catch (err) {
|
|
403
|
-
throw new CacheError(
|
|
404
|
-
`Failed to decrement key "${key}" in Memcache`,
|
|
405
|
-
'MEMCACHE_DECREMENT_ERROR',
|
|
406
|
-
'memcache',
|
|
407
|
-
err as Error,
|
|
408
|
-
)
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Check if Memcache is alive
|
|
414
|
-
*/
|
|
415
152
|
async isAlive(): Promise<HealthCheckResponse> {
|
|
416
153
|
try {
|
|
417
154
|
await this.ping()
|
|
418
|
-
return {
|
|
419
|
-
|
|
420
|
-
adapter: 'memcache',
|
|
421
|
-
timestamp: new Date(),
|
|
422
|
-
}
|
|
423
|
-
} catch (err) {
|
|
155
|
+
return { isAlive: true, adapter: 'memcache', timestamp: new Date() }
|
|
156
|
+
} catch (error) {
|
|
424
157
|
return {
|
|
425
158
|
isAlive: false,
|
|
426
159
|
adapter: 'memcache',
|
|
427
160
|
timestamp: new Date(),
|
|
428
|
-
error:
|
|
161
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
429
162
|
}
|
|
430
163
|
}
|
|
431
164
|
}
|
|
432
165
|
|
|
433
|
-
/**
|
|
434
|
-
* Close Memcache connection
|
|
435
|
-
*/
|
|
436
166
|
async close(): Promise<void> {
|
|
437
167
|
try {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
'memcache',
|
|
448
|
-
err as Error,
|
|
449
|
-
)
|
|
168
|
+
this.client?.end()
|
|
169
|
+
this.client = null
|
|
170
|
+
this.isConnected = false
|
|
171
|
+
} catch (error) {
|
|
172
|
+
throw new CacheError(CACHE_ERROR_CODES.CACHE_ERROR, {
|
|
173
|
+
adapter: 'memcache',
|
|
174
|
+
operation: 'close',
|
|
175
|
+
cause: error instanceof Error ? error : undefined,
|
|
176
|
+
})
|
|
450
177
|
}
|
|
451
178
|
}
|
|
452
179
|
}
|