@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.
Files changed (95) hide show
  1. package/dist/api/entitlements/entitlementsApi.d.ts +3 -4
  2. package/dist/api/entitlements/entitlementsApi.js +3 -8
  3. package/dist/client.d.ts +11 -1
  4. package/dist/client.js +26 -4
  5. package/dist/clientInitialization.js +8 -7
  6. package/dist/configuration.d.ts +2 -21
  7. package/dist/configuration.js +1 -1
  8. package/dist/models.d.ts +30 -6
  9. package/dist/models.js +12 -2
  10. package/dist/services/ApiCacheMapper.d.ts +15 -0
  11. package/dist/services/ApiCacheMapper.js +96 -0
  12. package/dist/services/EdgeApiClient.d.ts +1 -2
  13. package/dist/services/EdgeApiClient.js +1 -7
  14. package/dist/services/LegacyEventPayloadMapper.d.ts +15 -0
  15. package/dist/services/LegacyEventPayloadMapper.js +102 -0
  16. package/dist/services/cache/CacheMapper.d.ts +16 -0
  17. package/dist/services/cache/CacheMapper.js +3 -0
  18. package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +3 -3
  19. package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +4 -3
  20. package/dist/services/cache/accessDeniedReasonMapper.d.ts +3 -0
  21. package/dist/services/cache/accessDeniedReasonMapper.js +16 -0
  22. package/dist/services/cache/cacheKeysHelpers.d.ts +9 -0
  23. package/dist/services/cache/cacheKeysHelpers.js +55 -0
  24. package/dist/services/cache/cacheService.d.ts +10 -28
  25. package/dist/services/cache/entities/cachedEntitlement.d.ts +20 -0
  26. package/dist/services/cache/entities/cachedEntitlement.js +53 -0
  27. package/dist/services/cache/entities/calculatedEntitlement.d.ts +34 -0
  28. package/dist/services/cache/entities/calculatedEntitlement.js +3 -0
  29. package/dist/services/cache/entities/entitlementQuery.d.ts +8 -0
  30. package/dist/services/cache/entities/entitlementQuery.js +3 -0
  31. package/dist/services/cache/entities/entitlementsMap.d.ts +33 -0
  32. package/dist/services/cache/entities/entitlementsMap.js +92 -0
  33. package/dist/services/cache/entities/index.d.ts +6 -0
  34. package/dist/services/cache/entities/index.js +12 -0
  35. package/dist/services/cache/entities/usageData.d.ts +11 -0
  36. package/dist/services/cache/entities/usageData.js +9 -0
  37. package/dist/services/cache/extractWithDependencies.d.ts +12 -0
  38. package/dist/services/cache/extractWithDependencies.js +37 -0
  39. package/dist/services/cache/freshness/EntitlementsFreshener.d.ts +11 -0
  40. package/dist/services/cache/freshness/EntitlementsFreshener.js +27 -0
  41. package/dist/services/cache/freshness/transformers/CreditAccessPropagator.d.ts +15 -0
  42. package/dist/services/cache/freshness/transformers/CreditAccessPropagator.js +67 -0
  43. package/dist/services/cache/freshness/transformers/UsagePeriodReset.d.ts +11 -0
  44. package/dist/services/cache/freshness/transformers/UsagePeriodReset.js +45 -0
  45. package/dist/services/cache/inMemoryCacheService.d.ts +19 -14
  46. package/dist/services/cache/inMemoryCacheService.js +44 -69
  47. package/dist/services/cache/index.d.ts +13 -0
  48. package/dist/services/cache/index.js +38 -0
  49. package/dist/services/cache/redis/distributedLocks.d.ts +4 -3
  50. package/dist/services/cache/redis/distributedLocks.js +5 -4
  51. package/dist/services/cache/redisCacheService.constants.d.ts +1 -1
  52. package/dist/services/cache/redisCacheService.constants.js +3 -3
  53. package/dist/services/cache/redisCacheService.d.ts +54 -17
  54. package/dist/services/cache/redisCacheService.js +293 -159
  55. package/dist/services/cache/types/cacheInstrumentation.d.ts +37 -0
  56. package/dist/services/cache/types/cacheInstrumentation.js +3 -0
  57. package/dist/services/cache/types/cacheResponse.d.ts +26 -0
  58. package/dist/services/cache/types/cacheResponse.js +19 -0
  59. package/dist/services/cache/types/cacheServiceParams.d.ts +20 -0
  60. package/dist/services/cache/types/cacheServiceParams.js +3 -0
  61. package/dist/services/cache/types/entitlementFeature.d.ts +19 -0
  62. package/dist/services/cache/types/entitlementFeature.js +3 -0
  63. package/dist/services/cache/types/entitlementsMapTransformer.d.ts +4 -0
  64. package/dist/services/cache/types/entitlementsMapTransformer.js +3 -0
  65. package/dist/services/cache/types/logger.d.ts +6 -0
  66. package/dist/services/cache/types/logger.js +3 -0
  67. package/dist/services/cache/types/redisConfiguration.d.ts +39 -0
  68. package/dist/services/cache/types/redisConfiguration.js +14 -0
  69. package/dist/services/entitlementDecisionService.d.ts +14 -2
  70. package/dist/services/entitlementDecisionService.js +41 -14
  71. package/dist/services/entitlementsService.d.ts +26 -23
  72. package/dist/services/entitlementsService.js +126 -110
  73. package/dist/services/entitlementsService.utils.d.ts +1 -28
  74. package/dist/services/entitlementsService.utils.js +1 -17
  75. package/dist/services/eventEmitter.d.ts +1 -1
  76. package/dist/services/eventEmitterCacheInstrumentation.d.ts +9 -0
  77. package/dist/services/eventEmitterCacheInstrumentation.js +19 -0
  78. package/dist/services/inMemoryEntitlementsService.d.ts +5 -6
  79. package/dist/services/inMemoryEntitlementsService.js +52 -59
  80. package/dist/services/redisEntitlementsService.d.ts +5 -4
  81. package/dist/services/redisEntitlementsService.js +2 -2
  82. package/dist/types.d.ts +2 -0
  83. package/dist/utils/ModelMapper.d.ts +8 -7
  84. package/dist/utils/ModelMapper.js +17 -3
  85. package/dist/{services/cache → utils}/calculateUsagePeriod.js +1 -1
  86. package/package.json +18 -1
  87. package/dist/services/cache/cachedEntitlement.d.ts +0 -29
  88. package/dist/services/cache/cachedEntitlement.js +0 -10
  89. package/dist/services/cacheInstrumentation.d.ts +0 -18
  90. package/dist/services/cacheInstrumentation.js +0 -19
  91. package/dist/utils/CacheMapper.d.ts +0 -6
  92. package/dist/utils/CacheMapper.js +0 -57
  93. package/dist/utils/cacheKeysHelpers.d.ts +0 -7
  94. package/dist/utils/cacheKeysHelpers.js +0 -42
  95. /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 cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
4
+ const entities_1 = require("./entities");
5
+ const cacheKeysHelpers_1 = require("./cacheKeysHelpers");
5
6
  const lru_cache_1 = require("lru-cache");
6
- const entitlementsService_utils_1 = require("../entitlementsService.utils");
7
- const models_1 = require("../../models");
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, customerEntitlements, accessDeniedReason, resourceId) {
33
+ setCustomer({ customerId, resourceId, entitlements: entitlementsInput, accessDeniedReason, }) {
29
34
  const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
30
- this.entitlements.set(cachedCustomerKey, { entitlements: customerEntitlements, accessDeniedReason });
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
- clearCustomer(customerId, resourceId) {
33
- const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
34
- this.entitlements.delete(cachedCustomerKey);
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
- const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
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
- updateFeatureUsage({ customerId, featureId, currentUsage, resourceId, usagePeriodStart, usagePeriodEnd, }) {
51
- var _a;
52
+ updateUsage({ customerId, resourceId, entitlementReference, usage, }) {
53
+ var _a, _b;
52
54
  const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
53
- const customerEntitlements = (_a = this.entitlements.get(cachedCustomerKey)) === null || _a === void 0 ? void 0 : _a.entitlements;
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(featureId, customerId, resourceId) {
67
- const { entitlements, accessDeniedReason, cacheMiss, globalCustomerMissing } = this.getCustomerEntitlements(customerId, resourceId);
68
- const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureId)) || null : null;
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
- updateEntitlementsBasedOnCreditBalanceUpdate({ customerId, resourceId, currencyId, currentBalance, validUntil, }) {
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 customerEntitlements = (_a = this.entitlements.get(cachedCustomerKey)) === null || _a === void 0 ? void 0 : _a.entitlements;
75
- if (!customerEntitlements) {
76
- return;
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 isExceeded = currentBalance <= 0;
79
- // Update entitlements that have credit rates matching this currency
80
- customerEntitlements.forEach((cachedEntitlement, featureId) => {
81
- var _a;
82
- const { calculatedEntitlement, featureUsage } = cachedEntitlement;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsbUVBQXNFO0FBQ3RFLHlDQUFxQztBQUNyQyw0RUFBcUg7QUFFckgseUNBQWtEO0FBRWxELE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFFdEMsU0FBZ0Isa0JBQWtCLENBQUMsR0FBUTtJQUN6QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEYsQ0FBQztBQUZELGdEQUVDO0FBT0QsTUFBYSxvQkFBb0I7SUFHL0IsWUFBWSxZQUFvQixFQUFtQixlQUFxQztRQUFyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBc0I7UUFZeEYsZUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQWJBLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVEsQ0FBcUM7WUFDbkUsT0FBTztZQUNQLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQU1ELFdBQVcsQ0FDVCxVQUFrQixFQUNsQixvQkFBb0QsRUFDcEQsa0JBQTZDLEVBQzdDLFVBQThCO1FBRTlCLE1BQU0saUJBQWlCLEdB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
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 { LoggerService } from '../../loggerService';
3
- import { CacheInstrumentation } from '../../cacheInstrumentation';
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: LoggerService, cacheInstrumentation: CacheInstrumentation);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdHJpYnV0ZWRMb2Nrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9yZWRpcy9kaXN0cmlidXRlZExvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQTREO0FBSzVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLHNCQUFzQixHQUFzQixFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUVwRSxNQUFhLGdCQUFnQjtJQUczQixZQUNtQixXQUFrQixFQUNsQixhQUE0QixFQUM3QyxvQkFBMEM7UUFGekIsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFDbEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFHN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUksT0FBZSxFQUFFLE9BQXlCO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUksT0FBZSxFQUFFLE9BQXlCO1FBQ3ZELElBQUk7WUFDRix3RUFBd0U7WUFDeEUsNkNBQTZDO1lBQzdDLE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3hEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCwwREFBMEQ7WUFDMUQsb0NBQW9DO1lBQ3BDLElBQUksTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQzthQUN4RTtZQUVELDJEQUEyRDtZQUMzRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDL0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUM5RDtZQUVELE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQsK0JBQStCLENBQUMsR0FBUTtRQUN0QyxPQUFPLEdBQUcsWUFBWSx3QkFBYyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFROztRQUNuQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksd0JBQWMsQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQUEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLDBDQUFFLE9BQU8sQ0FBQztRQUM1RCxPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQXpERCw0Q0F5REMifQ==
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.DEFAULT_TTL_SECS = exports.ACCESS_DENIED_REASON_METADATA_KEY = exports.METADATA_SUFFIX = exports.TIMESTAMP_SUFFIX = void 0;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3JlZGlzQ2FjaGVTZXJ2aWNlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxpQ0FBaUMsR0FBRyxvQkFBb0IsQ0FBQztBQUN6RCxRQUFBLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVwQyxRQUFBLHNCQUFzQixHQUFHLHlDQUF5QyxDQUFDO0FBQ25FLFFBQUEsOEJBQThCLEdBQUcsR0FBRyxDQUFDIn0=
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3JlZGlzQ2FjaGVTZXJ2aWNlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDcEMsUUFBQSwrQkFBK0IsR0FBRyxLQUFNLENBQUM7QUFFekMsUUFBQSxzQkFBc0IsR0FBRyx5Q0FBeUMsQ0FBQztBQUNuRSxRQUFBLDhCQUE4QixHQUFHLEdBQUcsQ0FBQyJ9
@@ -1,20 +1,31 @@
1
- import { CacheService, UpdateFeatureUsagePayload } from './cacheService';
2
- import CachedEntitlement from './cachedEntitlement';
3
- import { LoggerService } from '../loggerService';
4
- import { ClientConfiguration } from '../../configuration';
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 '../entitlementsService.utils';
7
- import { CacheInstrumentation } from '../cacheInstrumentation';
8
- import { AccessDeniedReason } from '../../models';
9
- export declare class RedisCacheService implements CacheService {
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: Required<ClientConfiguration>, loggerService: LoggerService, cacheInstrumentation: CacheInstrumentation);
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
- updateFeatureUsage(params: UpdateFeatureUsagePayload): Promise<boolean>;
26
- private getFeatureUsageItemToUpdate;
27
- setCustomer(customerId: string, customerEntitlements: Map<string, CachedEntitlement>, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined, entitlementsTimestamp: number, featureIdToUsageTimestamp: Map<string, number>): Promise<void>;
28
- private extractFeatureUsagesToUpdate;
29
- getCustomerEntitlementsWithoutUsage(customerId: string, resourceId: string | undefined): Promise<EntitlementsResponse>;
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(customerId: string, resourceId: string | undefined): Promise<EntitlementsResponse>;
32
- private getFeaturesUsage;
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
- getCustomerEntitlement(featureId: string, customerId: string, resourceId: string | undefined): Promise<EntitlementResponse>;
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
  }