@stigg/node-server-sdk 4.10.0 → 4.12.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/dist/api/entitlements/entitlementsApi.d.ts +3 -4
- package/dist/api/entitlements/entitlementsApi.js +3 -8
- package/dist/client.d.ts +11 -1
- package/dist/client.js +26 -4
- package/dist/clientInitialization.js +8 -7
- package/dist/configuration.d.ts +2 -21
- package/dist/configuration.js +1 -1
- package/dist/models.d.ts +30 -6
- package/dist/models.js +12 -2
- package/dist/services/ApiCacheMapper.d.ts +15 -0
- package/dist/services/ApiCacheMapper.js +96 -0
- package/dist/services/EdgeApiClient.d.ts +1 -2
- package/dist/services/EdgeApiClient.js +1 -7
- package/dist/services/LegacyEventPayloadMapper.d.ts +15 -0
- package/dist/services/LegacyEventPayloadMapper.js +102 -0
- package/dist/services/cache/CacheMapper.d.ts +16 -0
- package/dist/services/cache/CacheMapper.js +3 -0
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +3 -3
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +4 -3
- package/dist/services/cache/accessDeniedReasonMapper.d.ts +3 -0
- package/dist/services/cache/accessDeniedReasonMapper.js +16 -0
- package/dist/services/cache/cacheKeysHelpers.d.ts +9 -0
- package/dist/services/cache/cacheKeysHelpers.js +55 -0
- package/dist/services/cache/cacheService.d.ts +10 -28
- package/dist/services/cache/entities/cachedEntitlement.d.ts +20 -0
- package/dist/services/cache/entities/cachedEntitlement.js +53 -0
- package/dist/services/cache/entities/calculatedEntitlement.d.ts +34 -0
- package/dist/services/cache/entities/calculatedEntitlement.js +3 -0
- package/dist/services/cache/entities/entitlementQuery.d.ts +8 -0
- package/dist/services/cache/entities/entitlementQuery.js +3 -0
- package/dist/services/cache/entities/entitlementsMap.d.ts +33 -0
- package/dist/services/cache/entities/entitlementsMap.js +92 -0
- package/dist/services/cache/entities/index.d.ts +6 -0
- package/dist/services/cache/entities/index.js +12 -0
- package/dist/services/cache/entities/usageData.d.ts +11 -0
- package/dist/services/cache/entities/usageData.js +9 -0
- package/dist/services/cache/extractWithDependencies.d.ts +12 -0
- package/dist/services/cache/extractWithDependencies.js +37 -0
- package/dist/services/cache/freshness/EntitlementsFreshener.d.ts +11 -0
- package/dist/services/cache/freshness/EntitlementsFreshener.js +27 -0
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.d.ts +15 -0
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.js +67 -0
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.d.ts +11 -0
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.js +45 -0
- package/dist/services/cache/inMemoryCacheService.d.ts +19 -14
- package/dist/services/cache/inMemoryCacheService.js +44 -69
- package/dist/services/cache/index.d.ts +13 -0
- package/dist/services/cache/index.js +38 -0
- package/dist/services/cache/redis/distributedLocks.d.ts +4 -3
- package/dist/services/cache/redis/distributedLocks.js +5 -4
- package/dist/services/cache/redisCacheService.constants.d.ts +1 -1
- package/dist/services/cache/redisCacheService.constants.js +3 -3
- package/dist/services/cache/redisCacheService.d.ts +54 -17
- package/dist/services/cache/redisCacheService.js +293 -159
- package/dist/services/cache/types/cacheInstrumentation.d.ts +37 -0
- package/dist/services/cache/types/cacheInstrumentation.js +3 -0
- package/dist/services/cache/types/cacheResponse.d.ts +26 -0
- package/dist/services/cache/types/cacheResponse.js +19 -0
- package/dist/services/cache/types/cacheServiceParams.d.ts +20 -0
- package/dist/services/cache/types/cacheServiceParams.js +3 -0
- package/dist/services/cache/types/entitlementFeature.d.ts +19 -0
- package/dist/services/cache/types/entitlementFeature.js +3 -0
- package/dist/services/cache/types/entitlementsMapTransformer.d.ts +4 -0
- package/dist/services/cache/types/entitlementsMapTransformer.js +3 -0
- package/dist/services/cache/types/logger.d.ts +6 -0
- package/dist/services/cache/types/logger.js +3 -0
- package/dist/services/cache/types/redisConfiguration.d.ts +39 -0
- package/dist/services/cache/types/redisConfiguration.js +14 -0
- package/dist/services/entitlementDecisionService.d.ts +14 -2
- package/dist/services/entitlementDecisionService.js +41 -14
- package/dist/services/entitlementsService.d.ts +26 -23
- package/dist/services/entitlementsService.js +126 -110
- package/dist/services/entitlementsService.utils.d.ts +1 -28
- package/dist/services/entitlementsService.utils.js +1 -17
- package/dist/services/eventEmitter.d.ts +1 -1
- package/dist/services/eventEmitterCacheInstrumentation.d.ts +9 -0
- package/dist/services/eventEmitterCacheInstrumentation.js +19 -0
- package/dist/services/inMemoryEntitlementsService.d.ts +5 -6
- package/dist/services/inMemoryEntitlementsService.js +52 -59
- package/dist/services/redisEntitlementsService.d.ts +5 -4
- package/dist/services/redisEntitlementsService.js +2 -2
- package/dist/types.d.ts +2 -0
- package/dist/utils/ModelMapper.d.ts +8 -7
- package/dist/utils/ModelMapper.js +17 -3
- package/dist/{services/cache → utils}/calculateUsagePeriod.js +1 -1
- package/package.json +18 -1
- package/dist/services/cache/cachedEntitlement.d.ts +0 -29
- package/dist/services/cache/cachedEntitlement.js +0 -10
- package/dist/services/cacheInstrumentation.d.ts +0 -18
- package/dist/services/cacheInstrumentation.js +0 -19
- package/dist/utils/CacheMapper.d.ts +0 -6
- package/dist/utils/CacheMapper.js +0 -57
- package/dist/utils/cacheKeysHelpers.d.ts +0 -7
- package/dist/utils/cacheKeysHelpers.js +0 -42
- /package/dist/{services/cache → utils}/calculateUsagePeriod.d.ts +0 -0
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InMemoryCacheService = exports.getApproxSizeBytes = void 0;
|
|
4
|
-
const
|
|
4
|
+
const entities_1 = require("./entities");
|
|
5
|
+
const cacheKeysHelpers_1 = require("./cacheKeysHelpers");
|
|
5
6
|
const lru_cache_1 = require("lru-cache");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
7
|
+
const cacheResponse_1 = require("./types/cacheResponse");
|
|
8
|
+
const accessDeniedReasonMapper_1 = require("./accessDeniedReasonMapper");
|
|
9
|
+
const EntitlementsFreshener_1 = require("./freshness/EntitlementsFreshener");
|
|
10
|
+
const extractWithDependencies_1 = require("./extractWithDependencies");
|
|
8
11
|
const textEncoder = new TextEncoder();
|
|
9
12
|
function getApproxSizeBytes(obj) {
|
|
10
13
|
return textEncoder.encode(typeof obj === 'string' ? obj : JSON.stringify(obj)).length;
|
|
11
14
|
}
|
|
12
15
|
exports.getApproxSizeBytes = getApproxSizeBytes;
|
|
13
16
|
class InMemoryCacheService {
|
|
14
|
-
constructor(maxSizeBytes, instrumentation) {
|
|
17
|
+
constructor(maxSizeBytes, instrumentation, cacheMapper) {
|
|
15
18
|
this.instrumentation = instrumentation;
|
|
19
|
+
this.cacheMapper = cacheMapper;
|
|
20
|
+
this.freshen = new EntitlementsFreshener_1.EntitlementsFreshener();
|
|
16
21
|
this.clearCache = () => {
|
|
17
22
|
this.entitlements.clear();
|
|
18
23
|
};
|
|
@@ -25,81 +30,51 @@ class InMemoryCacheService {
|
|
|
25
30
|
waitForInitialization() {
|
|
26
31
|
return Promise.resolve();
|
|
27
32
|
}
|
|
28
|
-
setCustomer(customerId,
|
|
33
|
+
setCustomer({ customerId, resourceId, entitlements: entitlementsInput, accessDeniedReason, }) {
|
|
29
34
|
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
30
|
-
|
|
35
|
+
const { entitlements } = entities_1.EntitlementsMap.fromInput(this.cacheMapper, entitlementsInput);
|
|
36
|
+
this.entitlements.set(cachedCustomerKey, {
|
|
37
|
+
entitlements,
|
|
38
|
+
accessDeniedReason: (0, accessDeniedReasonMapper_1.mapAccessDeniedReason)(accessDeniedReason),
|
|
39
|
+
});
|
|
40
|
+
return this.freshen.transform(entitlements);
|
|
31
41
|
}
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
42
|
+
purge(customers) {
|
|
43
|
+
const customersArray = Array.isArray(customers) ? customers : [customers];
|
|
44
|
+
customersArray.forEach(({ customerId, resourceId }) => {
|
|
45
|
+
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
46
|
+
this.entitlements.delete(cachedCustomerKey);
|
|
47
|
+
});
|
|
35
48
|
}
|
|
36
|
-
getCustomerEntitlements(customerId, resourceId) {
|
|
37
|
-
|
|
38
|
-
const cached = this.entitlements.get(cachedCustomerKey) || null;
|
|
39
|
-
const entitlements = (cached === null || cached === void 0 ? void 0 : cached.entitlements) || null;
|
|
40
|
-
const accessDeniedReason = (cached === null || cached === void 0 ? void 0 : cached.accessDeniedReason) || null;
|
|
41
|
-
if (entitlements) {
|
|
42
|
-
this.instrumentation.trackHit({ customerId, resourceId });
|
|
43
|
-
return entitlementsService_utils_1.entitlementsResponseMapper.cacheHit(entitlements, accessDeniedReason);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this.instrumentation.trackMiss({ customerId, resourceId });
|
|
47
|
-
return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
|
|
48
|
-
}
|
|
49
|
+
getCustomerEntitlements({ customerId, resourceId }) {
|
|
50
|
+
return this.getCached({ customerId, resourceId });
|
|
49
51
|
}
|
|
50
|
-
|
|
51
|
-
var _a;
|
|
52
|
+
updateUsage({ customerId, resourceId, entitlementReference, usage, }) {
|
|
53
|
+
var _a, _b;
|
|
52
54
|
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
53
|
-
|
|
54
|
-
const existingFeatureEntitlement = customerEntitlements === null || customerEntitlements === void 0 ? void 0 : customerEntitlements.get(featureId);
|
|
55
|
-
if (!customerEntitlements || !existingFeatureEntitlement) {
|
|
56
|
-
// do nothing in this case, we've never checked this for customer entitlements yet
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
const { featureUsage: existingFeatureUsage, calculatedEntitlement } = existingFeatureEntitlement;
|
|
60
|
-
customerEntitlements.set(featureId, {
|
|
61
|
-
calculatedEntitlement,
|
|
62
|
-
featureUsage: Object.assign(Object.assign({}, existingFeatureUsage), { currentUsage, usagePeriodStart, usagePeriodEnd }),
|
|
63
|
-
});
|
|
64
|
-
return true;
|
|
55
|
+
(_b = (_a = this.entitlements.get(cachedCustomerKey)) === null || _a === void 0 ? void 0 : _a.entitlements) === null || _b === void 0 ? void 0 : _b.updateUsage(entitlementReference, usage);
|
|
65
56
|
}
|
|
66
|
-
getCustomerEntitlement(
|
|
67
|
-
const {
|
|
68
|
-
const
|
|
57
|
+
getCustomerEntitlement(params) {
|
|
58
|
+
const { query } = params;
|
|
59
|
+
const extractor = new extractWithDependencies_1.ExtractWithDependencies(query);
|
|
60
|
+
const { entitlements, accessDeniedReason, cacheMiss, globalCustomerMissing } = this.getCached(params, extractor);
|
|
61
|
+
const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(query)) || null : null;
|
|
69
62
|
return { cacheMiss, accessDeniedReason, entitlement, globalCustomerMissing };
|
|
70
63
|
}
|
|
71
|
-
|
|
72
|
-
var _a;
|
|
64
|
+
getCached({ customerId, resourceId }, extract) {
|
|
65
|
+
var _a, _b, _c, _d;
|
|
73
66
|
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
74
|
-
const
|
|
75
|
-
if (!
|
|
76
|
-
|
|
67
|
+
const cached = this.entitlements.get(cachedCustomerKey) || null;
|
|
68
|
+
if (!cached) {
|
|
69
|
+
(_b = (_a = this.instrumentation).trackMiss) === null || _b === void 0 ? void 0 : _b.call(_a, { customerId, resourceId });
|
|
70
|
+
return cacheResponse_1.entitlementsResponseMapper.cacheMiss();
|
|
77
71
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const entitlementCurrencyId = (_a = calculatedEntitlement.creditRate) === null || _a === void 0 ? void 0 : _a.currencyId;
|
|
84
|
-
if (entitlementCurrencyId === currencyId) {
|
|
85
|
-
const updatedCalculatedEntitlement = Object.assign(Object.assign({}, calculatedEntitlement), { validUntil });
|
|
86
|
-
if (isExceeded) {
|
|
87
|
-
if (!calculatedEntitlement.accessDeniedReason) {
|
|
88
|
-
updatedCalculatedEntitlement.accessDeniedReason = models_1.AccessDeniedReason.InsufficientCredits;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
if (calculatedEntitlement.accessDeniedReason === models_1.AccessDeniedReason.InsufficientCredits) {
|
|
93
|
-
updatedCalculatedEntitlement.accessDeniedReason = undefined;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
customerEntitlements.set(featureId, {
|
|
97
|
-
calculatedEntitlement: updatedCalculatedEntitlement,
|
|
98
|
-
featureUsage,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
});
|
|
72
|
+
const { entitlements: cachedEntitlements, accessDeniedReason } = cached;
|
|
73
|
+
const extracted = extract ? extract.transform(cachedEntitlements) : cachedEntitlements;
|
|
74
|
+
const entitlements = this.freshen.transform(extracted);
|
|
75
|
+
(_d = (_c = this.instrumentation).trackHit) === null || _d === void 0 ? void 0 : _d.call(_c, { customerId, resourceId });
|
|
76
|
+
return cacheResponse_1.entitlementsResponseMapper.cacheHit(entitlements, accessDeniedReason);
|
|
102
77
|
}
|
|
103
78
|
}
|
|
104
79
|
exports.InMemoryCacheService = InMemoryCacheService;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EseUNBQThEO0FBRTlELHlEQUE0RDtBQUU1RCx5Q0FBcUM7QUFDckMseURBQThHO0FBRzlHLHlFQUFtRTtBQUNuRSw2RUFBMEU7QUFDMUUsdUVBQW9FO0FBR3BFLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFFdEMsU0FBZ0Isa0JBQWtCLENBQUMsR0FBUTtJQUN6QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEYsQ0FBQztBQUZELGdEQUVDO0FBT0QsTUFBYSxvQkFBb0I7SUFJL0IsWUFDRSxZQUFvQixFQUNILGVBQXFDLEVBQ3JDLFdBQStCO1FBRC9CLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFMakMsWUFBTyxHQUFHLElBQUksNkNBQXFCLEVBQUUsQ0FBQztRQWtCdkQsZUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQWJBLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVEsQ0FBcUM7WUFDbkUsT0FBTztZQUNQLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { CacheService } from './cacheService';
|
|
2
|
+
export { RedisCacheService, CustomerMetadata } from './redisCacheService';
|
|
3
|
+
export { InMemoryCacheService } from './inMemoryCacheService';
|
|
4
|
+
export { SlimLogger, LoggerExtra } from './types/logger';
|
|
5
|
+
export { CacheInstrumentation, CacheHit, CacheMiss, RedisClientErrorData } from './types/cacheInstrumentation';
|
|
6
|
+
export { EntitlementFeature, UnitTransformation } from './types/entitlementFeature';
|
|
7
|
+
export { StiggRedisOptions, DistributedEntitlementsFetchingOptions, CacheUpdatePolicy, RedisCacheConfiguration, LockSettings, } from './types/redisConfiguration';
|
|
8
|
+
export { DATE_IN_FAR_PAST, EntitlementsResponseCacheHit, EntitlementsResponse, entitlementsResponseMapper, } from './types/cacheResponse';
|
|
9
|
+
export { CachedEntitlement, EntitlementsMap, EntitlementQuery, UsageData, EntitlementType, isFeatureEntitlement, isCreditEntitlement, } from './entities';
|
|
10
|
+
export { buildRedisCustomerKey, buildRedisUsageKey } from './cacheKeysHelpers';
|
|
11
|
+
export { CacheMapper, CacheMapperResult } from './CacheMapper';
|
|
12
|
+
export { AccessDeniedReason, EntitlementsStateAccessDeniedReason, EntitlementResetPeriod, MonthlyAccordingTo, WeeklyAccordingTo, ResetPeriodConfigurationFragment, FeatureType, MeterType, } from '@stigg/api-client-js/src/generated/sdk';
|
|
13
|
+
export { mapAccessDeniedReason } from './accessDeniedReasonMapper';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapAccessDeniedReason = exports.MeterType = exports.FeatureType = exports.WeeklyAccordingTo = exports.MonthlyAccordingTo = exports.EntitlementResetPeriod = exports.EntitlementsStateAccessDeniedReason = exports.AccessDeniedReason = exports.buildRedisUsageKey = exports.buildRedisCustomerKey = exports.isCreditEntitlement = exports.isFeatureEntitlement = exports.EntitlementType = exports.EntitlementsMap = exports.CachedEntitlement = exports.entitlementsResponseMapper = exports.DATE_IN_FAR_PAST = exports.CacheUpdatePolicy = exports.InMemoryCacheService = exports.RedisCacheService = void 0;
|
|
4
|
+
// Redis cache service implementation
|
|
5
|
+
var redisCacheService_1 = require("./redisCacheService");
|
|
6
|
+
Object.defineProperty(exports, "RedisCacheService", { enumerable: true, get: function () { return redisCacheService_1.RedisCacheService; } });
|
|
7
|
+
// In-memory cache service implementation
|
|
8
|
+
var inMemoryCacheService_1 = require("./inMemoryCacheService");
|
|
9
|
+
Object.defineProperty(exports, "InMemoryCacheService", { enumerable: true, get: function () { return inMemoryCacheService_1.InMemoryCacheService; } });
|
|
10
|
+
var redisConfiguration_1 = require("./types/redisConfiguration");
|
|
11
|
+
Object.defineProperty(exports, "CacheUpdatePolicy", { enumerable: true, get: function () { return redisConfiguration_1.CacheUpdatePolicy; } });
|
|
12
|
+
var cacheResponse_1 = require("./types/cacheResponse");
|
|
13
|
+
Object.defineProperty(exports, "DATE_IN_FAR_PAST", { enumerable: true, get: function () { return cacheResponse_1.DATE_IN_FAR_PAST; } });
|
|
14
|
+
Object.defineProperty(exports, "entitlementsResponseMapper", { enumerable: true, get: function () { return cacheResponse_1.entitlementsResponseMapper; } });
|
|
15
|
+
// Entity classes and types
|
|
16
|
+
var entities_1 = require("./entities");
|
|
17
|
+
Object.defineProperty(exports, "CachedEntitlement", { enumerable: true, get: function () { return entities_1.CachedEntitlement; } });
|
|
18
|
+
Object.defineProperty(exports, "EntitlementsMap", { enumerable: true, get: function () { return entities_1.EntitlementsMap; } });
|
|
19
|
+
Object.defineProperty(exports, "EntitlementType", { enumerable: true, get: function () { return entities_1.EntitlementType; } });
|
|
20
|
+
Object.defineProperty(exports, "isFeatureEntitlement", { enumerable: true, get: function () { return entities_1.isFeatureEntitlement; } });
|
|
21
|
+
Object.defineProperty(exports, "isCreditEntitlement", { enumerable: true, get: function () { return entities_1.isCreditEntitlement; } });
|
|
22
|
+
// Utilities
|
|
23
|
+
var cacheKeysHelpers_1 = require("./cacheKeysHelpers");
|
|
24
|
+
Object.defineProperty(exports, "buildRedisCustomerKey", { enumerable: true, get: function () { return cacheKeysHelpers_1.buildRedisCustomerKey; } });
|
|
25
|
+
Object.defineProperty(exports, "buildRedisUsageKey", { enumerable: true, get: function () { return cacheKeysHelpers_1.buildRedisUsageKey; } });
|
|
26
|
+
// Re-export enums from api-client-js for convenience
|
|
27
|
+
var sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
|
|
28
|
+
Object.defineProperty(exports, "AccessDeniedReason", { enumerable: true, get: function () { return sdk_1.AccessDeniedReason; } });
|
|
29
|
+
Object.defineProperty(exports, "EntitlementsStateAccessDeniedReason", { enumerable: true, get: function () { return sdk_1.EntitlementsStateAccessDeniedReason; } });
|
|
30
|
+
Object.defineProperty(exports, "EntitlementResetPeriod", { enumerable: true, get: function () { return sdk_1.EntitlementResetPeriod; } });
|
|
31
|
+
Object.defineProperty(exports, "MonthlyAccordingTo", { enumerable: true, get: function () { return sdk_1.MonthlyAccordingTo; } });
|
|
32
|
+
Object.defineProperty(exports, "WeeklyAccordingTo", { enumerable: true, get: function () { return sdk_1.WeeklyAccordingTo; } });
|
|
33
|
+
Object.defineProperty(exports, "FeatureType", { enumerable: true, get: function () { return sdk_1.FeatureType; } });
|
|
34
|
+
Object.defineProperty(exports, "MeterType", { enumerable: true, get: function () { return sdk_1.MeterType; } });
|
|
35
|
+
// Access denied reason mapper
|
|
36
|
+
var accessDeniedReasonMapper_1 = require("./accessDeniedReasonMapper");
|
|
37
|
+
Object.defineProperty(exports, "mapAccessDeniedReason", { enumerable: true, get: function () { return accessDeniedReasonMapper_1.mapAccessDeniedReason; } });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EscUNBQXFDO0FBQ3JDLHlEQUEwRTtBQUFqRSxzSEFBQSxpQkFBaUIsT0FBQTtBQUUxQix5Q0FBeUM7QUFDekMsK0RBQThEO0FBQXJELDRIQUFBLG9CQUFvQixPQUFBO0FBTTdCLGlFQU1vQztBQUhsQyx1SEFBQSxpQkFBaUIsT0FBQTtBQUluQix1REFLK0I7QUFKN0IsaUhBQUEsZ0JBQWdCLE9BQUE7QUFHaEIsMkhBQUEsMEJBQTBCLE9BQUE7QUFHNUIsMkJBQTJCO0FBQzNCLHVDQVFvQjtBQVBsQiw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQiwyR0FBQSxlQUFlLE9BQUE7QUFHZiwyR0FBQSxlQUFlLE9BQUE7QUFDZixnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQiwrR0FBQSxtQkFBbUIsT0FBQTtBQUdyQixZQUFZO0FBQ1osdURBQStFO0FBQXRFLHlIQUFBLHFCQUFxQixPQUFBO0FBQUUsc0hBQUEsa0JBQWtCLE9BQUE7QUFLbEQscURBQXFEO0FBQ3JELDhEQVNnRDtBQVI5Qyx5R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwwSEFBQSxtQ0FBbUMsT0FBQTtBQUNuQyw2R0FBQSxzQkFBc0IsT0FBQTtBQUN0Qix5R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix3R0FBQSxpQkFBaUIsT0FBQTtBQUVqQixrR0FBQSxXQUFXLE9BQUE7QUFDWCxnR0FBQSxTQUFTLE9BQUE7QUFHWCw4QkFBOEI7QUFDOUIsdUVBQW1FO0FBQTFELGlJQUFBLHFCQUFxQixPQUFBIn0=
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Redis from 'ioredis';
|
|
2
|
-
import {
|
|
3
|
-
import { CacheInstrumentation } from '
|
|
2
|
+
import { SlimLogger } from '../types/logger';
|
|
3
|
+
import { CacheInstrumentation } from '../types/cacheInstrumentation';
|
|
4
|
+
import { LockSettings } from '../types/redisConfiguration';
|
|
4
5
|
export declare class DistributedLocks {
|
|
5
6
|
private readonly redisClient;
|
|
6
7
|
private readonly loggerService;
|
|
7
8
|
private readonly redlock;
|
|
8
|
-
constructor(redisClient: Redis, loggerService:
|
|
9
|
+
constructor(redisClient: Redis, loggerService: SlimLogger, cacheInstrumentation: CacheInstrumentation, lockSettings?: LockSettings);
|
|
9
10
|
usingSingleAttempt<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
10
11
|
using<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
11
12
|
isLockTakenByAnotherClientError(err: any): boolean;
|
|
@@ -28,13 +28,14 @@ const redlock_1 = __importStar(require("redlock"));
|
|
|
28
28
|
const LOCK_DURATION = 5000;
|
|
29
29
|
const LOCK_NO_RETRY_SETTINGS = { retryCount: 0 };
|
|
30
30
|
class DistributedLocks {
|
|
31
|
-
constructor(redisClient, loggerService, cacheInstrumentation) {
|
|
31
|
+
constructor(redisClient, loggerService, cacheInstrumentation, lockSettings) {
|
|
32
32
|
this.redisClient = redisClient;
|
|
33
33
|
this.loggerService = loggerService;
|
|
34
|
-
this.redlock = new redlock_1.default([redisClient]);
|
|
34
|
+
this.redlock = new redlock_1.default([redisClient], lockSettings);
|
|
35
35
|
this.redlock.on('clientError', (err) => {
|
|
36
|
+
var _a;
|
|
36
37
|
this.loggerService.error('Redis client error: ', err);
|
|
37
|
-
cacheInstrumentation.trackRedisClientError({ error: err, clientName: 'redlock' });
|
|
38
|
+
(_a = cacheInstrumentation.trackRedisClientError) === null || _a === void 0 ? void 0 : _a.call(cacheInstrumentation, { error: err, clientName: 'redlock' });
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
async usingSingleAttempt(lockKey, handler) {
|
|
@@ -76,4 +77,4 @@ class DistributedLocks {
|
|
|
76
77
|
}
|
|
77
78
|
}
|
|
78
79
|
exports.DistributedLocks = DistributedLocks;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdHJpYnV0ZWRMb2Nrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9yZWRpcy9kaXN0cmlidXRlZExvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQTREO0FBTTVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLHNCQUFzQixHQUFzQixFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUVwRSxNQUFhLGdCQUFnQjtJQUczQixZQUNtQixXQUFrQixFQUNsQixhQUF5QixFQUMxQyxvQkFBMEMsRUFDMUMsWUFBMkI7UUFIVixnQkFBVyxHQUFYLFdBQVcsQ0FBTztRQUNsQixrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUkxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFOztZQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxNQUFBLG9CQUFvQixDQUFDLHFCQUFxQixxRUFBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFJLE9BQWUsRUFBRSxPQUF5QjtRQUNwRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUFJLE9BQWUsRUFBRSxPQUF5QjtRQUN2RCxJQUFJO1lBQ0Ysd0VBQXdFO1lBQ3hFLDZDQUE2QztZQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN4RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsMERBQTBEO1lBQzFELG9DQUFvQztZQUNwQyxJQUFJLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7YUFDeEU7WUFFRCwyREFBMkQ7WUFDM0QsSUFBSSxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDOUQ7WUFFRCxNQUFNLEtBQUssQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELCtCQUErQixDQUFDLEdBQVE7UUFDdEMsT0FBTyxHQUFHLFlBQVksd0JBQWMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsR0FBUTs7UUFDbkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLHdCQUFjLENBQUMsRUFBRTtZQUNwQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxPQUFPLENBQUM7UUFDNUQsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUExREQsNENBMERDIn0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const TIMESTAMP_SUFFIX = "timestamp";
|
|
2
2
|
export declare const METADATA_SUFFIX = "metadata";
|
|
3
|
-
export declare const ACCESS_DENIED_REASON_METADATA_KEY = "accessDeniedReason";
|
|
4
3
|
export declare const DEFAULT_TTL_SECS: number;
|
|
4
|
+
export declare const DEFAULT_ENTITLEMENTS_TIMEOUT_MS = 30000;
|
|
5
5
|
export declare const REFETCH_OPERATION_NAME = "refetchEntityEntitlementsAfterCacheMiss";
|
|
6
6
|
export declare const REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REFETCH_NOTIFICATION_BUFFER_MS = exports.REFETCH_OPERATION_NAME = exports.
|
|
3
|
+
exports.REFETCH_NOTIFICATION_BUFFER_MS = exports.REFETCH_OPERATION_NAME = exports.DEFAULT_ENTITLEMENTS_TIMEOUT_MS = exports.DEFAULT_TTL_SECS = exports.METADATA_SUFFIX = exports.TIMESTAMP_SUFFIX = void 0;
|
|
4
4
|
exports.TIMESTAMP_SUFFIX = 'timestamp';
|
|
5
5
|
exports.METADATA_SUFFIX = 'metadata';
|
|
6
|
-
exports.ACCESS_DENIED_REASON_METADATA_KEY = 'accessDeniedReason';
|
|
7
6
|
exports.DEFAULT_TTL_SECS = 7 * 24 * 60 * 60;
|
|
7
|
+
exports.DEFAULT_ENTITLEMENTS_TIMEOUT_MS = 30000;
|
|
8
8
|
exports.REFETCH_OPERATION_NAME = 'refetchEntityEntitlementsAfterCacheMiss';
|
|
9
9
|
exports.REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3JlZGlzQ2FjaGVTZXJ2aWNlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDcEMsUUFBQSwrQkFBK0IsR0FBRyxLQUFNLENBQUM7QUFFekMsUUFBQSxzQkFBc0IsR0FBRyx5Q0FBeUMsQ0FBQztBQUNuRSxRQUFBLDhCQUE4QixHQUFHLEdBQUcsQ0FBQyJ9
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
-
import { CacheService
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { CacheService } from './cacheService';
|
|
2
|
+
import { CacheInstrumentation } from './types/cacheInstrumentation';
|
|
3
|
+
import { CustomerIdentity, SetCustomerParams, GetCustomerEntitlementParams, UpdateUsageParams } from './types/cacheServiceParams';
|
|
4
|
+
import { EntitlementType, EntitlementsMap } from './entities';
|
|
5
|
+
import { CacheMapper } from './CacheMapper';
|
|
6
|
+
import { SlimLogger } from './types/logger';
|
|
7
|
+
import { RedisCacheConfiguration } from './types/redisConfiguration';
|
|
5
8
|
import { RedisSingleExecutionService } from './RedisSingleExecutionService';
|
|
6
|
-
import { EntitlementResponse, EntitlementsResponse } from '
|
|
7
|
-
import {
|
|
8
|
-
import { AccessDeniedReason } from '
|
|
9
|
-
export
|
|
9
|
+
import { EntitlementResponse, EntitlementsResponse } from './types/cacheResponse';
|
|
10
|
+
import { OneOrMany } from '../../types';
|
|
11
|
+
import { AccessDeniedReason } from '@stigg/api-client-js/src/generated/sdk';
|
|
12
|
+
export type CustomerMetadata = {
|
|
13
|
+
accessDeniedReason: AccessDeniedReason | null;
|
|
14
|
+
};
|
|
15
|
+
export declare class RedisCacheService<Input> implements CacheService<Input> {
|
|
10
16
|
private readonly loggerService;
|
|
11
17
|
private readonly cacheInstrumentation;
|
|
18
|
+
private readonly cacheMapper;
|
|
19
|
+
private static readonly DELETE_CHUNK_SIZE;
|
|
12
20
|
private readonly environmentPrefix;
|
|
13
21
|
private readonly ttl;
|
|
14
22
|
private readonly redisClient;
|
|
15
23
|
private readonly distributedLocks;
|
|
24
|
+
private readonly cacheUpdatePolicy;
|
|
25
|
+
private readonly directExecution;
|
|
26
|
+
private readonly freshen;
|
|
16
27
|
readonly distributedRefetchEntitlementsService: RedisSingleExecutionService | undefined;
|
|
17
|
-
constructor(options:
|
|
28
|
+
constructor(options: RedisCacheConfiguration, loggerService: SlimLogger, cacheInstrumentation: CacheInstrumentation, cacheMapper: CacheMapper<Input>);
|
|
18
29
|
/**
|
|
19
30
|
* Waits for Redis client to be ready for use.
|
|
20
31
|
* Returns immediately if already connected, otherwise waits for 'ready' or 'error' events
|
|
@@ -22,20 +33,46 @@ export declare class RedisCacheService implements CacheService {
|
|
|
22
33
|
*/
|
|
23
34
|
waitForInitialization(): Promise<void>;
|
|
24
35
|
isClientConnected(): boolean;
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
updateUsage<T extends EntitlementType>({ customerId, resourceId, entitlementReference, usage, usageTimestamp, }: UpdateUsageParams<T>): Promise<void>;
|
|
37
|
+
private keyExists;
|
|
38
|
+
private getUsageItemToUpdate;
|
|
39
|
+
setCustomer({ customerId, resourceId, entitlements: entitlementsInput, accessDeniedReason, entitlementsTimestamp, }: SetCustomerParams<Input>): Promise<EntitlementsMap>;
|
|
40
|
+
private extractUsagesToUpdate;
|
|
41
|
+
private getUsageTimestamp;
|
|
42
|
+
private getCustomerEntitlementsWithoutUsage;
|
|
30
43
|
private isGlobalCustomerMissingInCache;
|
|
31
|
-
getCustomerEntitlements(
|
|
32
|
-
private
|
|
44
|
+
getCustomerEntitlements(params: CustomerIdentity): Promise<EntitlementsResponse>;
|
|
45
|
+
private getCached;
|
|
46
|
+
/**
|
|
47
|
+
* Fetches usage for all trackable entitlements and merges it into the map.
|
|
48
|
+
* Returns null if any trackable entitlement is missing usage (cache miss).
|
|
49
|
+
*/
|
|
50
|
+
private fetchAndMergeUsage;
|
|
51
|
+
private getUsages;
|
|
33
52
|
clearCache(): void | Promise<void>;
|
|
34
53
|
private updateCacheItems;
|
|
54
|
+
private shouldSkipWriting;
|
|
35
55
|
private getKeysLatestTimestamp;
|
|
36
56
|
private parseTimestamp;
|
|
37
57
|
cleanup(): Promise<void>;
|
|
38
|
-
|
|
58
|
+
purge(customers: OneOrMany<CustomerIdentity>): Promise<void>;
|
|
59
|
+
getCustomerEntitlement<T extends EntitlementType>(params: GetCustomerEntitlementParams<T>): Promise<EntitlementResponse<T>>;
|
|
39
60
|
private mergeEntitlementWithUsage;
|
|
61
|
+
/**
|
|
62
|
+
* Returns Redis server info for the specified section (e.g., 'memory', 'stats').
|
|
63
|
+
* Throws if the client is not connected.
|
|
64
|
+
*/
|
|
65
|
+
getServerInfo(section: string): Promise<string>;
|
|
66
|
+
/**
|
|
67
|
+
* Migrates old cache format to new format.
|
|
68
|
+
* Handles: featureUsage→usageData rename, adds type discriminator, moves fields,
|
|
69
|
+
* adds updatedAt, adds displayName fallback, nextResetDate→usagePeriodEnd.
|
|
70
|
+
*/
|
|
71
|
+
private migrateOldCacheFormat;
|
|
72
|
+
/**
|
|
73
|
+
* Migrates old usage data format.
|
|
74
|
+
* Handles backward compatibility for old items that have nextResetDate instead of usagePeriodEnd.
|
|
75
|
+
*/
|
|
76
|
+
private migrateUsageData;
|
|
40
77
|
private executeSafely;
|
|
41
78
|
}
|