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,3 +1,4 @@
|
|
|
1
|
+
import { CryptoIntegrityError } from '@naman_deep_singh/errors-utils';
|
|
1
2
|
import { decrypt as functionalDecrypt, encrypt as functionalEncrypt, hmacSign as functionalHmacSign, hmacVerify as functionalHmacVerify, randomToken as functionalRandomToken, } from './index';
|
|
2
3
|
/**
|
|
3
4
|
* Default configuration
|
|
@@ -31,17 +32,27 @@ export class CryptoManager {
|
|
|
31
32
|
* Encrypt data using the default or specified algorithm
|
|
32
33
|
*/
|
|
33
34
|
encrypt(plaintext, key, _options) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
try {
|
|
36
|
+
return functionalEncrypt(plaintext, key);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new CryptoIntegrityError({
|
|
40
|
+
reason: 'Encryption failed',
|
|
41
|
+
}, error instanceof Error ? error : undefined);
|
|
42
|
+
}
|
|
37
43
|
}
|
|
38
44
|
/**
|
|
39
45
|
* Decrypt data using the default or specified algorithm
|
|
40
46
|
*/
|
|
41
47
|
decrypt(encryptedData, key, _options) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
try {
|
|
49
|
+
return functionalDecrypt(encryptedData, key);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new CryptoIntegrityError({
|
|
53
|
+
reason: 'Decryption failed',
|
|
54
|
+
}, error instanceof Error ? error : undefined);
|
|
55
|
+
}
|
|
45
56
|
}
|
|
46
57
|
/**
|
|
47
58
|
* Generate HMAC signature
|
|
@@ -71,9 +82,11 @@ export class CryptoManager {
|
|
|
71
82
|
deriveKey(password, salt, iterations = 100000, keyLength = 32) {
|
|
72
83
|
return new Promise((resolve, reject) => {
|
|
73
84
|
const crypto = require('crypto');
|
|
74
|
-
crypto.pbkdf2(password, salt, iterations, keyLength, 'sha256', (
|
|
75
|
-
if (
|
|
76
|
-
reject(
|
|
85
|
+
crypto.pbkdf2(password, salt, iterations, keyLength, 'sha256', (error, derivedKey) => {
|
|
86
|
+
if (error) {
|
|
87
|
+
reject(new CryptoIntegrityError({
|
|
88
|
+
reason: 'Key derivation failed',
|
|
89
|
+
}, error instanceof Error ? error : undefined));
|
|
77
90
|
}
|
|
78
91
|
else {
|
|
79
92
|
resolve(derivedKey.toString('hex'));
|
|
@@ -143,15 +156,17 @@ export class CryptoManager {
|
|
|
143
156
|
rsaSign(data, privateKey, algorithm = 'sha256') {
|
|
144
157
|
return new Promise((resolve, reject) => {
|
|
145
158
|
const crypto = require('crypto');
|
|
146
|
-
const sign = crypto.createSign(algorithm);
|
|
147
|
-
sign.update(data);
|
|
148
|
-
sign.end();
|
|
149
159
|
try {
|
|
160
|
+
const sign = crypto.createSign(algorithm);
|
|
161
|
+
sign.update(data);
|
|
162
|
+
sign.end();
|
|
150
163
|
const signature = sign.sign(privateKey, 'base64');
|
|
151
164
|
resolve(signature);
|
|
152
165
|
}
|
|
153
166
|
catch (error) {
|
|
154
|
-
reject(
|
|
167
|
+
reject(new CryptoIntegrityError({
|
|
168
|
+
reason: 'RSA signing failed',
|
|
169
|
+
}, error instanceof Error ? error : undefined));
|
|
155
170
|
}
|
|
156
171
|
});
|
|
157
172
|
}
|
|
@@ -161,15 +176,17 @@ export class CryptoManager {
|
|
|
161
176
|
rsaVerify(data, signature, publicKey, algorithm = 'sha256') {
|
|
162
177
|
return new Promise((resolve, reject) => {
|
|
163
178
|
const crypto = require('crypto');
|
|
164
|
-
const verify = crypto.createVerify(algorithm);
|
|
165
|
-
verify.update(data);
|
|
166
|
-
verify.end();
|
|
167
179
|
try {
|
|
180
|
+
const verify = crypto.createVerify(algorithm);
|
|
181
|
+
verify.update(data);
|
|
182
|
+
verify.end();
|
|
168
183
|
const isValid = verify.verify(publicKey, signature, 'base64');
|
|
169
184
|
resolve(isValid);
|
|
170
185
|
}
|
|
171
186
|
catch (error) {
|
|
172
|
-
reject(
|
|
187
|
+
reject(new CryptoIntegrityError({
|
|
188
|
+
reason: 'RSA verification failed',
|
|
189
|
+
}, error instanceof Error ? error : undefined));
|
|
173
190
|
}
|
|
174
191
|
});
|
|
175
192
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BadRequestError } from '@naman_deep_singh/errors-utils';
|
|
1
2
|
// src/jwt/decodeToken.ts
|
|
2
3
|
import { decode } from 'jsonwebtoken';
|
|
3
4
|
/**
|
|
@@ -15,7 +16,9 @@ export function decodeToken(token) {
|
|
|
15
16
|
export function decodeTokenStrict(token) {
|
|
16
17
|
const decoded = decode(token);
|
|
17
18
|
if (!decoded || typeof decoded === 'string') {
|
|
18
|
-
throw new
|
|
19
|
+
throw new BadRequestError({
|
|
20
|
+
reason: 'Invalid JWT payload structure',
|
|
21
|
+
});
|
|
19
22
|
}
|
|
20
23
|
return decoded;
|
|
21
24
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TokenMalformedError } from '@naman_deep_singh/errors-utils';
|
|
1
2
|
import { signToken } from './signToken';
|
|
2
3
|
import { verifyToken } from './verify';
|
|
3
4
|
// Helper function to create branded tokens
|
|
@@ -19,7 +20,9 @@ export const generateTokens = (payload, accessSecret, refreshSecret, accessExpir
|
|
|
19
20
|
export function rotateRefreshToken(oldToken, secret) {
|
|
20
21
|
const decoded = verifyToken(oldToken, secret);
|
|
21
22
|
if (typeof decoded === 'string') {
|
|
22
|
-
throw new
|
|
23
|
+
throw new TokenMalformedError({
|
|
24
|
+
reason: 'Invalid token payload — expected JWT payload object',
|
|
25
|
+
});
|
|
23
26
|
}
|
|
24
27
|
const payload = { ...decoded };
|
|
25
28
|
delete payload.iat;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type JwtPayload, type Secret } from 'jsonwebtoken';
|
|
2
|
-
import type { AccessToken, ITokenManager, JWTConfig, RefreshToken, TokenPair
|
|
2
|
+
import type { AccessToken, ITokenManager, JWTConfig, RefreshToken, TokenPair } from '../../interfaces/jwt.interface';
|
|
3
3
|
export declare class JWTManager implements ITokenManager {
|
|
4
4
|
private accessSecret;
|
|
5
5
|
private refreshSecret;
|
|
@@ -8,60 +8,36 @@ export declare class JWTManager implements ITokenManager {
|
|
|
8
8
|
private cache?;
|
|
9
9
|
private cacheTTL;
|
|
10
10
|
constructor(config: JWTConfig);
|
|
11
|
-
/**
|
|
12
|
-
* Generate both access and refresh tokens
|
|
13
|
-
*/
|
|
11
|
+
/** Generate both access and refresh tokens */
|
|
14
12
|
generateTokens(payload: Record<string, unknown>): Promise<TokenPair>;
|
|
15
|
-
/**
|
|
16
|
-
* Generate access token
|
|
17
|
-
*/
|
|
13
|
+
/** Generate access token */
|
|
18
14
|
generateAccessToken(payload: Record<string, unknown>): Promise<AccessToken>;
|
|
19
|
-
/**
|
|
20
|
-
* Generate refresh token
|
|
21
|
-
*/
|
|
15
|
+
/** Generate refresh token */
|
|
22
16
|
generateRefreshToken(payload: Record<string, unknown>): Promise<RefreshToken>;
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Verify refresh token
|
|
29
|
-
*/
|
|
30
|
-
verifyRefreshToken(token: string): Promise<JwtPayload | string>;
|
|
31
|
-
/**
|
|
32
|
-
* Decode token without verification
|
|
33
|
-
*/
|
|
17
|
+
/** Verify access token */
|
|
18
|
+
verifyAccessToken(token: string): Promise<JwtPayload>;
|
|
19
|
+
/** Verify refresh token */
|
|
20
|
+
verifyRefreshToken(token: string): Promise<JwtPayload>;
|
|
21
|
+
/** Decode token without verification */
|
|
34
22
|
decodeToken(token: string, complete?: boolean): JwtPayload | string | null;
|
|
35
|
-
/**
|
|
36
|
-
* Extract token from Authorization header
|
|
37
|
-
*/
|
|
23
|
+
/** Extract token from Authorization header */
|
|
38
24
|
extractTokenFromHeader(authHeader: string): string | null;
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
validateToken(token: string, secret: Secret, _options?: TokenValidationOptions): boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Rotate refresh token
|
|
45
|
-
*/
|
|
25
|
+
/** Validate token without throwing exceptions */
|
|
26
|
+
validateToken(token: string, secret: Secret): boolean;
|
|
27
|
+
/** Rotate refresh token */
|
|
46
28
|
rotateRefreshToken(oldToken: string): Promise<RefreshToken>;
|
|
47
|
-
/**
|
|
48
|
-
* Check if token is expired
|
|
49
|
-
*/
|
|
29
|
+
/** Check if token is expired */
|
|
50
30
|
isTokenExpired(token: string): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Get token expiration date
|
|
53
|
-
*/
|
|
31
|
+
/** Get token expiration date */
|
|
54
32
|
getTokenExpiration(token: string): Date | null;
|
|
55
|
-
/**
|
|
56
|
-
* Clear token cache
|
|
57
|
-
*/
|
|
33
|
+
/** Clear token cache */
|
|
58
34
|
clearCache(): void;
|
|
59
|
-
/**
|
|
60
|
-
* Get cache statistics
|
|
61
|
-
*/
|
|
35
|
+
/** Get cache statistics */
|
|
62
36
|
getCacheStats(): {
|
|
63
37
|
size: number;
|
|
64
38
|
maxSize: number;
|
|
65
39
|
} | null;
|
|
40
|
+
/** Private helper methods */
|
|
66
41
|
private validatePayload;
|
|
42
|
+
private verifyTokenWithCache;
|
|
67
43
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import jwt from 'jsonwebtoken';
|
|
2
2
|
import { signToken } from './signToken';
|
|
3
|
-
import { safeVerifyToken
|
|
3
|
+
import { safeVerifyToken } from './verify';
|
|
4
4
|
import { BadRequestError, UnauthorizedError, ValidationError, } from '@naman_deep_singh/errors-utils';
|
|
5
5
|
import { LRUCache } from '@naman_deep_singh/js-extensions';
|
|
6
6
|
export class JWTManager {
|
|
@@ -9,35 +9,26 @@ export class JWTManager {
|
|
|
9
9
|
this.refreshSecret = config.refreshSecret;
|
|
10
10
|
this.accessExpiry = config.accessExpiry || '15m';
|
|
11
11
|
this.refreshExpiry = config.refreshExpiry || '7d';
|
|
12
|
-
this.cacheTTL = 5 * 60 * 1000; // 5 minutes
|
|
12
|
+
this.cacheTTL = 5 * 60 * 1000; // 5 minutes
|
|
13
13
|
if (config.enableCaching) {
|
|
14
14
|
this.cache = new LRUCache(config.maxCacheSize || 100);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Generate both access and refresh tokens
|
|
19
|
-
*/
|
|
17
|
+
/** Generate both access and refresh tokens */
|
|
20
18
|
async generateTokens(payload) {
|
|
21
19
|
try {
|
|
22
20
|
this.validatePayload(payload);
|
|
23
21
|
const accessToken = await this.generateAccessToken(payload);
|
|
24
22
|
const refreshToken = await this.generateRefreshToken(payload);
|
|
25
|
-
return {
|
|
26
|
-
accessToken,
|
|
27
|
-
refreshToken,
|
|
28
|
-
};
|
|
23
|
+
return { accessToken, refreshToken };
|
|
29
24
|
}
|
|
30
25
|
catch (error) {
|
|
31
|
-
if (error instanceof BadRequestError ||
|
|
32
|
-
error instanceof ValidationError) {
|
|
26
|
+
if (error instanceof BadRequestError || error instanceof ValidationError)
|
|
33
27
|
throw error;
|
|
34
|
-
}
|
|
35
|
-
throw new BadRequestError('Failed to generate tokens');
|
|
28
|
+
throw new BadRequestError({ reason: 'Failed to generate tokens' }, error instanceof Error ? error : undefined);
|
|
36
29
|
}
|
|
37
30
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Generate access token
|
|
40
|
-
*/
|
|
31
|
+
/** Generate access token */
|
|
41
32
|
async generateAccessToken(payload) {
|
|
42
33
|
try {
|
|
43
34
|
this.validatePayload(payload);
|
|
@@ -47,16 +38,12 @@ export class JWTManager {
|
|
|
47
38
|
return token;
|
|
48
39
|
}
|
|
49
40
|
catch (error) {
|
|
50
|
-
if (error instanceof BadRequestError ||
|
|
51
|
-
error instanceof ValidationError) {
|
|
41
|
+
if (error instanceof BadRequestError || error instanceof ValidationError)
|
|
52
42
|
throw error;
|
|
53
|
-
}
|
|
54
|
-
throw new BadRequestError('Failed to generate access token');
|
|
43
|
+
throw new BadRequestError({ reason: 'Failed to generate access token' }, error instanceof Error ? error : undefined);
|
|
55
44
|
}
|
|
56
45
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Generate refresh token
|
|
59
|
-
*/
|
|
46
|
+
/** Generate refresh token */
|
|
60
47
|
async generateRefreshToken(payload) {
|
|
61
48
|
try {
|
|
62
49
|
this.validatePayload(payload);
|
|
@@ -66,231 +53,129 @@ export class JWTManager {
|
|
|
66
53
|
return token;
|
|
67
54
|
}
|
|
68
55
|
catch (error) {
|
|
69
|
-
if (error instanceof BadRequestError ||
|
|
70
|
-
error instanceof ValidationError) {
|
|
56
|
+
if (error instanceof BadRequestError || error instanceof ValidationError)
|
|
71
57
|
throw error;
|
|
72
|
-
}
|
|
73
|
-
throw new BadRequestError('Failed to generate refresh token');
|
|
58
|
+
throw new BadRequestError({ reason: 'Failed to generate refresh token' }, error instanceof Error ? error : undefined);
|
|
74
59
|
}
|
|
75
60
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Verify access token
|
|
78
|
-
*/
|
|
61
|
+
/** Verify access token */
|
|
79
62
|
async verifyAccessToken(token) {
|
|
80
|
-
|
|
81
|
-
if (!token || typeof token !== 'string') {
|
|
82
|
-
throw new ValidationError('Access token must be a non-empty string');
|
|
83
|
-
}
|
|
84
|
-
const cacheKey = `access_${token}`;
|
|
85
|
-
if (this.cache) {
|
|
86
|
-
const cached = this.cache.get(cacheKey);
|
|
87
|
-
if (cached && Date.now() - cached.timestamp <= this.cacheTTL) {
|
|
88
|
-
if (!cached.valid) {
|
|
89
|
-
throw new UnauthorizedError('Access token is invalid or expired');
|
|
90
|
-
}
|
|
91
|
-
return cached.payload;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
const decoded = verifyToken(token, this.accessSecret);
|
|
95
|
-
if (this.cache) {
|
|
96
|
-
this.cache.set(cacheKey, {
|
|
97
|
-
valid: true,
|
|
98
|
-
payload: decoded,
|
|
99
|
-
timestamp: Date.now(),
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return decoded;
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
if (error instanceof ValidationError ||
|
|
106
|
-
error instanceof UnauthorizedError) {
|
|
107
|
-
throw error;
|
|
108
|
-
}
|
|
109
|
-
if (error instanceof Error && error.name === 'TokenExpiredError') {
|
|
110
|
-
throw new UnauthorizedError('Access token has expired');
|
|
111
|
-
}
|
|
112
|
-
if (error instanceof Error && error.name === 'JsonWebTokenError') {
|
|
113
|
-
throw new UnauthorizedError('Access token is invalid');
|
|
114
|
-
}
|
|
115
|
-
throw new UnauthorizedError('Failed to verify access token');
|
|
116
|
-
}
|
|
63
|
+
return this.verifyTokenWithCache(token, this.accessSecret, 'access');
|
|
117
64
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Verify refresh token
|
|
120
|
-
*/
|
|
65
|
+
/** Verify refresh token */
|
|
121
66
|
async verifyRefreshToken(token) {
|
|
122
|
-
|
|
123
|
-
if (!token || typeof token !== 'string') {
|
|
124
|
-
throw new ValidationError('Refresh token must be a non-empty string');
|
|
125
|
-
}
|
|
126
|
-
const cacheKey = `refresh_${token}`;
|
|
127
|
-
if (this.cache) {
|
|
128
|
-
const cached = this.cache.get(cacheKey);
|
|
129
|
-
if (cached) {
|
|
130
|
-
if (!cached.valid) {
|
|
131
|
-
throw new UnauthorizedError('Refresh token is invalid or expired');
|
|
132
|
-
}
|
|
133
|
-
return cached.payload;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
const decoded = verifyToken(token, this.refreshSecret);
|
|
137
|
-
if (this.cache) {
|
|
138
|
-
this.cache.set(cacheKey, {
|
|
139
|
-
valid: true,
|
|
140
|
-
payload: decoded,
|
|
141
|
-
timestamp: Date.now(),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
return decoded;
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
if (error instanceof ValidationError ||
|
|
148
|
-
error instanceof UnauthorizedError) {
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
if (error instanceof Error && error.name === 'TokenExpiredError') {
|
|
152
|
-
throw new UnauthorizedError('Refresh token has expired');
|
|
153
|
-
}
|
|
154
|
-
if (error instanceof Error && error.name === 'JsonWebTokenError') {
|
|
155
|
-
throw new UnauthorizedError('Refresh token is invalid');
|
|
156
|
-
}
|
|
157
|
-
throw new UnauthorizedError('Failed to verify refresh token');
|
|
158
|
-
}
|
|
67
|
+
return this.verifyTokenWithCache(token, this.refreshSecret, 'refresh');
|
|
159
68
|
}
|
|
160
|
-
/**
|
|
161
|
-
* Decode token without verification
|
|
162
|
-
*/
|
|
69
|
+
/** Decode token without verification */
|
|
163
70
|
decodeToken(token, complete = false) {
|
|
164
|
-
|
|
165
|
-
if (!token || typeof token !== 'string') {
|
|
166
|
-
throw new ValidationError('Token must be a non-empty string');
|
|
167
|
-
}
|
|
168
|
-
return jwt.decode(token, { complete });
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
if (error instanceof ValidationError) {
|
|
172
|
-
throw error;
|
|
173
|
-
}
|
|
71
|
+
if (!token || typeof token !== 'string')
|
|
174
72
|
return null;
|
|
175
|
-
}
|
|
73
|
+
return jwt.decode(token, { complete });
|
|
176
74
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Extract token from Authorization header
|
|
179
|
-
*/
|
|
75
|
+
/** Extract token from Authorization header */
|
|
180
76
|
extractTokenFromHeader(authHeader) {
|
|
181
|
-
|
|
182
|
-
if (!authHeader || typeof authHeader !== 'string') {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
const parts = authHeader.split(' ');
|
|
186
|
-
if (parts.length !== 2 || parts[0] !== 'Bearer') {
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
return parts[1];
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
77
|
+
if (!authHeader || typeof authHeader !== 'string')
|
|
192
78
|
return null;
|
|
193
|
-
|
|
79
|
+
const parts = authHeader.split(' ');
|
|
80
|
+
if (parts.length !== 2 || parts[0] !== 'Bearer')
|
|
81
|
+
return null;
|
|
82
|
+
return parts[1];
|
|
194
83
|
}
|
|
195
|
-
/**
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
validateToken(token, secret, _options = {}) {
|
|
199
|
-
try {
|
|
200
|
-
if (!token || typeof token !== 'string') {
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
const result = safeVerifyToken(token, secret);
|
|
204
|
-
return result.valid;
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
84
|
+
/** Validate token without throwing exceptions */
|
|
85
|
+
validateToken(token, secret) {
|
|
86
|
+
if (!token || typeof token !== 'string')
|
|
207
87
|
return false;
|
|
208
|
-
|
|
88
|
+
return safeVerifyToken(token, secret).valid;
|
|
209
89
|
}
|
|
210
|
-
/**
|
|
211
|
-
* Rotate refresh token
|
|
212
|
-
*/
|
|
90
|
+
/** Rotate refresh token */
|
|
213
91
|
async rotateRefreshToken(oldToken) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
const decoded = await this.verifyRefreshToken(oldToken);
|
|
219
|
-
if (typeof decoded === 'string') {
|
|
220
|
-
throw new ValidationError('Invalid token payload — expected JWT payload object');
|
|
221
|
-
}
|
|
222
|
-
// Create new payload without issued/expired timestamps
|
|
223
|
-
const payload = { ...decoded };
|
|
224
|
-
delete payload.iat;
|
|
225
|
-
delete payload.exp;
|
|
226
|
-
// Generate new refresh token
|
|
227
|
-
const newToken = signToken(payload, this.refreshSecret, this.refreshExpiry);
|
|
228
|
-
return newToken;
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
if (error instanceof ValidationError ||
|
|
232
|
-
error instanceof UnauthorizedError) {
|
|
233
|
-
throw error;
|
|
234
|
-
}
|
|
235
|
-
throw new BadRequestError('Failed to rotate refresh token');
|
|
92
|
+
if (!oldToken || typeof oldToken !== 'string') {
|
|
93
|
+
throw new ValidationError({
|
|
94
|
+
reason: 'Old refresh token must be a non-empty string',
|
|
95
|
+
});
|
|
236
96
|
}
|
|
97
|
+
const decoded = await this.verifyRefreshToken(oldToken);
|
|
98
|
+
const payload = { ...decoded };
|
|
99
|
+
delete payload.iat;
|
|
100
|
+
delete payload.exp;
|
|
101
|
+
const newToken = signToken(payload, this.refreshSecret, this.refreshExpiry);
|
|
102
|
+
return newToken;
|
|
237
103
|
}
|
|
238
|
-
/**
|
|
239
|
-
* Check if token is expired
|
|
240
|
-
*/
|
|
104
|
+
/** Check if token is expired */
|
|
241
105
|
isTokenExpired(token) {
|
|
242
106
|
try {
|
|
243
107
|
const decoded = this.decodeToken(token);
|
|
244
|
-
if (!decoded || !decoded.exp)
|
|
108
|
+
if (!decoded || !decoded.exp)
|
|
245
109
|
return true;
|
|
246
|
-
|
|
247
|
-
const currentTime = Math.floor(Date.now() / 1000);
|
|
248
|
-
return decoded.exp < currentTime;
|
|
110
|
+
return decoded.exp < Math.floor(Date.now() / 1000);
|
|
249
111
|
}
|
|
250
112
|
catch {
|
|
251
113
|
return true;
|
|
252
114
|
}
|
|
253
115
|
}
|
|
254
|
-
/**
|
|
255
|
-
* Get token expiration date
|
|
256
|
-
*/
|
|
116
|
+
/** Get token expiration date */
|
|
257
117
|
getTokenExpiration(token) {
|
|
258
118
|
try {
|
|
259
119
|
const decoded = this.decodeToken(token);
|
|
260
|
-
if (!decoded || !decoded.exp)
|
|
120
|
+
if (!decoded || !decoded.exp)
|
|
261
121
|
return null;
|
|
262
|
-
}
|
|
263
122
|
return new Date(decoded.exp * 1000);
|
|
264
123
|
}
|
|
265
124
|
catch {
|
|
266
125
|
return null;
|
|
267
126
|
}
|
|
268
127
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Clear token cache
|
|
271
|
-
*/
|
|
128
|
+
/** Clear token cache */
|
|
272
129
|
clearCache() {
|
|
273
130
|
this.cache?.clear();
|
|
274
131
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Get cache statistics
|
|
277
|
-
*/
|
|
132
|
+
/** Get cache statistics */
|
|
278
133
|
getCacheStats() {
|
|
279
134
|
if (!this.cache)
|
|
280
135
|
return null;
|
|
281
|
-
|
|
282
|
-
return {
|
|
283
|
-
size: -1, // Size not available from LRUCache
|
|
284
|
-
maxSize: this.cache.maxSize,
|
|
285
|
-
};
|
|
136
|
+
return { size: -1, maxSize: this.cache.maxSize };
|
|
286
137
|
}
|
|
287
|
-
|
|
138
|
+
/** Private helper methods */
|
|
288
139
|
validatePayload(payload) {
|
|
289
140
|
if (!payload || typeof payload !== 'object') {
|
|
290
|
-
throw new ValidationError(
|
|
141
|
+
throw new ValidationError({
|
|
142
|
+
reason: 'Payload must be a non-null object',
|
|
143
|
+
});
|
|
291
144
|
}
|
|
292
145
|
if (Object.keys(payload).length === 0) {
|
|
293
|
-
throw new ValidationError('Payload cannot be empty');
|
|
146
|
+
throw new ValidationError({ reason: 'Payload cannot be empty' });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async verifyTokenWithCache(token, secret, type) {
|
|
150
|
+
if (!token || typeof token !== 'string') {
|
|
151
|
+
throw new ValidationError({
|
|
152
|
+
reason: `${type} token must be a non-empty string`,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
const cacheKey = `${type}_${token}`;
|
|
156
|
+
if (this.cache) {
|
|
157
|
+
const cached = this.cache.get(cacheKey);
|
|
158
|
+
if (cached && Date.now() - cached.timestamp <= this.cacheTTL) {
|
|
159
|
+
if (!cached.valid)
|
|
160
|
+
throw new UnauthorizedError({
|
|
161
|
+
reason: `${type} token is invalid or expired`,
|
|
162
|
+
});
|
|
163
|
+
return cached.payload;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const { valid, payload, error } = safeVerifyToken(token, secret);
|
|
167
|
+
if (!valid || !payload || typeof payload === 'string') {
|
|
168
|
+
this.cache?.set(cacheKey, {
|
|
169
|
+
valid: false,
|
|
170
|
+
payload: {},
|
|
171
|
+
timestamp: Date.now(),
|
|
172
|
+
});
|
|
173
|
+
throw new UnauthorizedError({
|
|
174
|
+
reason: `${type} token is invalid or expired`,
|
|
175
|
+
cause: error,
|
|
176
|
+
});
|
|
294
177
|
}
|
|
178
|
+
this.cache?.set(cacheKey, { valid: true, payload, timestamp: Date.now() });
|
|
179
|
+
return payload;
|
|
295
180
|
}
|
|
296
181
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValidationError } from '@naman_deep_singh/errors-utils';
|
|
1
2
|
const TIME_UNITS = {
|
|
2
3
|
s: 1,
|
|
3
4
|
m: 60,
|
|
@@ -15,12 +16,12 @@ export function parseDuration(input) {
|
|
|
15
16
|
const value = Number.parseInt(match[1], 10);
|
|
16
17
|
const unit = match[2].toLowerCase();
|
|
17
18
|
if (!TIME_UNITS[unit]) {
|
|
18
|
-
throw new
|
|
19
|
+
throw new ValidationError({ reason: `Invalid time unit: ${unit}` });
|
|
19
20
|
}
|
|
20
21
|
totalSeconds += value * TIME_UNITS[unit];
|
|
21
22
|
}
|
|
22
23
|
if (totalSeconds === 0) {
|
|
23
|
-
throw new
|
|
24
|
+
throw new ValidationError({ reason: `Invalid expiry format: "${input}"` });
|
|
24
25
|
}
|
|
25
26
|
return totalSeconds;
|
|
26
27
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValidationError } from '@naman_deep_singh/errors-utils';
|
|
1
2
|
import { sign } from 'jsonwebtoken';
|
|
2
3
|
import { parseDuration } from './parseDuration';
|
|
3
4
|
function getExpiryTimestamp(seconds) {
|
|
@@ -6,7 +7,7 @@ function getExpiryTimestamp(seconds) {
|
|
|
6
7
|
export const signToken = (payload, secret, expiresIn = '1h', options = {}) => {
|
|
7
8
|
const seconds = parseDuration(expiresIn);
|
|
8
9
|
if (!seconds || seconds < 10) {
|
|
9
|
-
throw new
|
|
10
|
+
throw new ValidationError({ reason: 'Token expiry too small' });
|
|
10
11
|
}
|
|
11
12
|
const tokenPayload = {
|
|
12
13
|
...payload,
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import type { JwtPayload } from '
|
|
1
|
+
import type { JwtPayload } from 'jsonwebtoken';
|
|
2
2
|
export interface TokenRequirements {
|
|
3
3
|
requiredFields?: string[];
|
|
4
4
|
forbiddenFields?: string[];
|
|
5
5
|
validateTypes?: Record<string, 'string' | 'number' | 'boolean'>;
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Validates a JWT payload according to the provided rules.
|
|
9
|
+
* Throws ValidationError if validation fails.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateTokenPayload(payload: Record<string, unknown>, rules?: TokenRequirements): void;
|
|
12
|
+
/**
|
|
13
|
+
* Checks if a JWT payload is expired.
|
|
14
|
+
* Returns true if expired or missing 'exp'.
|
|
15
|
+
*/
|
|
13
16
|
export declare function isTokenExpired(payload: JwtPayload): boolean;
|