@stigg/node-server-sdk 4.10.0 → 4.11.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 (44) hide show
  1. package/dist/api/entitlements/entitlementsApi.d.ts +3 -3
  2. package/dist/api/entitlements/entitlementsApi.js +3 -3
  3. package/dist/client.d.ts +11 -1
  4. package/dist/client.js +26 -4
  5. package/dist/models.d.ts +35 -1
  6. package/dist/models.js +12 -2
  7. package/dist/services/EdgeApiClient.d.ts +1 -2
  8. package/dist/services/EdgeApiClient.js +1 -7
  9. package/dist/services/LegacyEventPayloadMapper.d.ts +15 -0
  10. package/dist/services/LegacyEventPayloadMapper.js +104 -0
  11. package/dist/services/cache/cacheService.d.ts +9 -12
  12. package/dist/services/cache/entities/cachedEntitlement.d.ts +17 -0
  13. package/dist/services/cache/entities/cachedEntitlement.js +28 -0
  14. package/dist/services/cache/entities/calculatedEntitlement.d.ts +33 -0
  15. package/dist/services/cache/entities/calculatedEntitlement.js +3 -0
  16. package/dist/services/cache/entities/entitlementQuery.d.ts +8 -0
  17. package/dist/services/cache/entities/entitlementQuery.js +3 -0
  18. package/dist/services/cache/entities/entitlementsMap.d.ts +22 -0
  19. package/dist/services/cache/entities/entitlementsMap.js +82 -0
  20. package/dist/services/cache/entities/index.d.ts +6 -0
  21. package/dist/services/cache/entities/index.js +13 -0
  22. package/dist/services/cache/entities/usageData.d.ts +7 -0
  23. package/dist/services/cache/entities/usageData.js +3 -0
  24. package/dist/services/cache/inMemoryCacheService.d.ts +6 -6
  25. package/dist/services/cache/inMemoryCacheService.js +23 -32
  26. package/dist/services/cache/redisCacheService.d.ts +16 -5
  27. package/dist/services/cache/redisCacheService.js +112 -42
  28. package/dist/services/entitlementDecisionService.d.ts +14 -2
  29. package/dist/services/entitlementDecisionService.js +41 -14
  30. package/dist/services/entitlementsService.d.ts +8 -7
  31. package/dist/services/entitlementsService.js +103 -53
  32. package/dist/services/entitlementsService.utils.d.ts +4 -5
  33. package/dist/services/entitlementsService.utils.js +1 -1
  34. package/dist/services/inMemoryEntitlementsService.js +24 -14
  35. package/dist/types.d.ts +1 -0
  36. package/dist/utils/CacheMapper.d.ts +11 -4
  37. package/dist/utils/CacheMapper.js +77 -39
  38. package/dist/utils/ModelMapper.d.ts +8 -7
  39. package/dist/utils/ModelMapper.js +17 -3
  40. package/dist/utils/cacheKeysHelpers.d.ts +5 -4
  41. package/dist/utils/cacheKeysHelpers.js +1 -1
  42. package/package.json +1 -1
  43. package/dist/services/cache/cachedEntitlement.d.ts +0 -29
  44. package/dist/services/cache/cachedEntitlement.js +0 -10
@@ -4,14 +4,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RedisCacheService = void 0;
7
- const cachedEntitlement_1 = __importDefault(require("./cachedEntitlement"));
7
+ const entities_1 = require("./entities");
8
8
  const ioredis_1 = __importDefault(require("ioredis"));
9
9
  const lodash_1 = require("lodash");
10
10
  const cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
11
11
  const RedisSingleExecutionService_1 = require("./RedisSingleExecutionService");
12
12
  const entitlementsService_utils_1 = require("../entitlementsService.utils");
13
13
  const redisCacheService_constants_1 = require("./redisCacheService.constants");
14
- const featureTypes_1 = require("../../utils/featureTypes");
15
14
  const distributedLocks_1 = require("./redis/distributedLocks");
16
15
  const GRACE_CONNECT_TIMEOUT_MS = 250;
17
16
  const READY_STATUSES = ['connect', 'ready'];
@@ -82,26 +81,45 @@ class RedisCacheService {
82
81
  isClientConnected() {
83
82
  return READY_STATUSES.includes(this.redisClient.status);
84
83
  }
85
- async updateFeatureUsage(params) {
86
- return this.executeSafely('updateFeatureUsage', false, async () => {
87
- const item = this.getFeatureUsageItemToUpdate(params);
84
+ async updateUsage({ customerId, resourceId, entitlementReference, usage, }) {
85
+ return this.executeSafely('updateUsage', null, async () => {
86
+ // Credit entitlement usage updates are not supported in Redis cache yet - will be implemented in another ticket
87
+ if (entitlementReference.type !== entities_1.EntitlementType.Feature) {
88
+ return null;
89
+ }
90
+ // Only update usage if the entitlement exists in cache
91
+ const { cacheMiss, entitlements } = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId !== null && resourceId !== void 0 ? resourceId : undefined);
92
+ if (cacheMiss || !entitlements) {
93
+ return null;
94
+ }
95
+ const entitlement = entitlements.get(entitlementReference);
96
+ if (!entitlement || !(0, entities_1.isFeatureEntitlement)(entitlement)) {
97
+ return null;
98
+ }
99
+ const item = this.getFeatureUsageItemToUpdate({
100
+ customerId,
101
+ resourceId,
102
+ featureId: entitlementReference.id,
103
+ usage,
104
+ });
88
105
  await this.updateCacheItems([item]);
89
- return true;
106
+ return this.mergeEntitlementWithUsage(entitlement, usage);
90
107
  });
91
108
  }
92
- getFeatureUsageItemToUpdate({ featureId, currentUsage, customerId, usagePeriodStart, usagePeriodEnd, resourceId, timestamp, }) {
109
+ getFeatureUsageItemToUpdate({ customerId, resourceId, featureId, usage, }) {
110
+ const { currentUsage, usagePeriodStart, usagePeriodEnd, updatedAt } = usage;
93
111
  const value = {
94
112
  currentUsage,
95
113
  usagePeriodStart,
96
114
  usagePeriodEnd,
97
115
  };
98
116
  return {
99
- messageTimestamp: timestamp,
117
+ messageTimestamp: new Date(updatedAt),
100
118
  key: (0, cacheKeysHelpers_1.buildRedisUsageKey)(this.environmentPrefix, customerId, featureId, resourceId),
101
119
  value,
102
120
  };
103
121
  }
104
- async setCustomer(customerId, customerEntitlements, accessDeniedReason, resourceId, entitlementsTimestamp, featureIdToUsageTimestamp) {
122
+ async setCustomer(customerId, customerEntitlements, accessDeniedReason, resourceId, entitlementsTimestamp) {
105
123
  return this.executeSafely('setCustomer', undefined, async () => {
106
124
  const lockKey = (0, cacheKeysHelpers_1.buildLockKey)(this.environmentPrefix, customerId, resourceId);
107
125
  await this.distributedLocks.using(lockKey, async () => {
@@ -109,7 +127,7 @@ class RedisCacheService {
109
127
  const entitlementsItem = {
110
128
  messageTimestamp: new Date(entitlementsTimestamp),
111
129
  key: customerKey,
112
- value: Object.fromEntries(customerEntitlements),
130
+ value: customerEntitlements.toJSON(),
113
131
  };
114
132
  const metadata = { accessDeniedReason };
115
133
  const metadataItem = {
@@ -121,17 +139,14 @@ class RedisCacheService {
121
139
  customerId,
122
140
  resourceId,
123
141
  customerEntitlements,
124
- featureIdToUsageTimestamp,
125
142
  });
126
143
  await this.updateCacheItems([entitlementsItem, metadataItem, ...featureUsagesItems]);
127
144
  });
128
145
  });
129
146
  }
130
- extractFeatureUsagesToUpdate({ customerId, resourceId, customerEntitlements, featureIdToUsageTimestamp, }) {
131
- return (0, lodash_1.compact)(new Array(...customerEntitlements.values())
132
- .filter(({ calculatedEntitlement }) => (0, featureTypes_1.isMetered)(calculatedEntitlement.feature))
133
- .map((entitlement) => {
134
- const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, usagePeriodStart, usagePeriodEnd }, } = entitlement;
147
+ extractFeatureUsagesToUpdate({ customerId, resourceId, customerEntitlements, }) {
148
+ return (0, lodash_1.compact)(new Array(...customerEntitlements.values()).filter(entities_1.isMeteredFeatureEntitlement).map((entitlement) => {
149
+ const { calculatedEntitlement: { feature }, usageData: { currentUsage, usagePeriodStart, usagePeriodEnd, updatedAt: featureUsageTimestamp }, } = entitlement;
135
150
  if ((0, lodash_1.isEmpty)(feature === null || feature === void 0 ? void 0 : feature.id)) {
136
151
  this.loggerService.error(`entitlement without feature id`, {
137
152
  customerId,
@@ -140,7 +155,6 @@ class RedisCacheService {
140
155
  return;
141
156
  }
142
157
  const featureId = feature.id;
143
- const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
144
158
  if (!featureUsageTimestamp) {
145
159
  this.loggerService.error(`Usage timestamp for feature is missing`, {
146
160
  customerId,
@@ -153,10 +167,12 @@ class RedisCacheService {
153
167
  customerId,
154
168
  resourceId,
155
169
  featureId,
156
- currentUsage,
157
- usagePeriodStart,
158
- usagePeriodEnd,
159
- timestamp: new Date(featureUsageTimestamp),
170
+ usage: {
171
+ currentUsage,
172
+ usagePeriodStart,
173
+ usagePeriodEnd,
174
+ updatedAt: featureUsageTimestamp,
175
+ },
160
176
  });
161
177
  }));
162
178
  }
@@ -170,7 +186,7 @@ class RedisCacheService {
170
186
  }
171
187
  const [entitlementsRaw, metadataValue, entitlementsTimestampValue, globalEntitlementsTimestampValue] = await this.redisClient.mget(keysToFetch);
172
188
  const entitlements = !(0, lodash_1.isNil)(entitlementsRaw) && !(0, lodash_1.isEmpty)(entitlementsRaw)
173
- ? new Map(Object.entries(JSON.parse(entitlementsRaw)))
189
+ ? entities_1.EntitlementsMap.fromJSON(this.migrateOldCacheFormat(JSON.parse(entitlementsRaw)))
174
190
  : null;
175
191
  let accessDeniedReason = null;
176
192
  if (!(0, lodash_1.isNil)(metadataValue) && !(0, lodash_1.isEmpty)(metadataValue)) {
@@ -218,8 +234,9 @@ class RedisCacheService {
218
234
  return response;
219
235
  }
220
236
  const { entitlements, accessDeniedReason } = response;
221
- const meteredFeatureIds = Array.from(entitlements.values())
222
- .filter(({ calculatedEntitlement }) => (0, featureTypes_1.isMetered)(calculatedEntitlement.feature))
237
+ const meteredFeatureIds = entitlements
238
+ .values()
239
+ .filter(entities_1.isMeteredFeatureEntitlement)
223
240
  .map(({ calculatedEntitlement }) => calculatedEntitlement.feature.id);
224
241
  if (!(0, lodash_1.isEmpty)(meteredFeatureIds)) {
225
242
  const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, meteredFeatureIds);
@@ -234,15 +251,18 @@ class RedisCacheService {
234
251
  this.cacheInstrumentation.trackMiss({ customerId, resourceId });
235
252
  return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
236
253
  }
237
- featuresUsageByFeatureKey.forEach((usageValue, featureKey) => {
238
- const cachedEntitlement = entitlements.get(featureKey);
239
- if (cachedEntitlement) {
240
- entitlements.set(featureKey, this.mergeEntitlementWithUsage(cachedEntitlement, usageValue));
254
+ featuresUsageByFeatureKey.forEach((usageValue, featureId) => {
255
+ const cachedEntitlement = entitlements.get({
256
+ type: entities_1.EntitlementType.Feature,
257
+ id: featureId,
258
+ });
259
+ if (cachedEntitlement && (0, entities_1.isFeatureEntitlement)(cachedEntitlement)) {
260
+ entitlements.set(this.mergeEntitlementWithUsage(cachedEntitlement, usageValue));
241
261
  }
242
- else {
262
+ else if (!cachedEntitlement) {
243
263
  this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
244
264
  customerId,
245
- featureKey,
265
+ featureId,
246
266
  });
247
267
  }
248
268
  });
@@ -262,7 +282,7 @@ class RedisCacheService {
262
282
  this.loggerService.log(`Failed to find usage for metered feature: ${featureId}`);
263
283
  return;
264
284
  }
265
- featureIdToFeatureUsage.set(featureId, JSON.parse(featureUsageValue));
285
+ featureIdToFeatureUsage.set(featureId, this.migrateUsageData(JSON.parse(featureUsageValue)));
266
286
  });
267
287
  return featureIdToFeatureUsage;
268
288
  }
@@ -325,7 +345,7 @@ class RedisCacheService {
325
345
  await this.distributedLocks.cleanup();
326
346
  await ((_a = this.distributedRefetchEntitlementsService) === null || _a === void 0 ? void 0 : _a.cleanup());
327
347
  }
328
- async getCustomerEntitlement(featureId, customerId, resourceId) {
348
+ async getCustomerEntitlement(query, customerId, resourceId) {
329
349
  return this.executeSafely('getCustomerEntitlement', {
330
350
  cacheMiss: true,
331
351
  accessDeniedReason: undefined,
@@ -333,11 +353,12 @@ class RedisCacheService {
333
353
  globalCustomerMissing: false,
334
354
  }, async () => {
335
355
  const { entitlements, accessDeniedReason, cacheMiss, globalCustomerMissing } = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
336
- const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureId)) || null : null;
356
+ const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(query)) || null : null;
337
357
  const result = { cacheMiss, accessDeniedReason, entitlement, globalCustomerMissing };
338
- if (!entitlement || !(0, featureTypes_1.isMetered)(entitlement === null || entitlement === void 0 ? void 0 : entitlement.calculatedEntitlement.feature)) {
358
+ if (!entitlement || !(0, entities_1.isMeteredFeatureEntitlement)(entitlement)) {
339
359
  return result;
340
360
  }
361
+ const featureId = query.id;
341
362
  const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, [
342
363
  featureId,
343
364
  ]);
@@ -359,14 +380,63 @@ class RedisCacheService {
359
380
  });
360
381
  }
361
382
  mergeEntitlementWithUsage(entitlement, cachedUsage) {
362
- const { calculatedEntitlement, featureUsage } = entitlement;
363
- // backwards compatibility for old items that have nextResetDate instead of usagePeriodEnd
364
- if (!(0, lodash_1.isNil)(cachedUsage.nextResetDate) && (0, lodash_1.isNil)(cachedUsage.usagePeriodEnd)) {
365
- cachedUsage = (0, lodash_1.merge)((0, lodash_1.omit)(cachedUsage, 'nextResetDate'), {
366
- usagePeriodEnd: cachedUsage.nextResetDate,
367
- });
383
+ const { calculatedEntitlement, usageData } = entitlement;
384
+ return new entities_1.CachedEntitlement(calculatedEntitlement, Object.assign(Object.assign({}, usageData), cachedUsage));
385
+ }
386
+ /**
387
+ * Migrates old cache format to new format.
388
+ * Handles: featureUsage→usageData rename, adds type discriminator, moves fields,
389
+ * adds updatedAt, adds displayName fallback, nextResetDate→usagePeriodEnd.
390
+ */
391
+ migrateOldCacheFormat(cacheData) {
392
+ for (const [key, value] of Object.entries(cacheData)) {
393
+ const entry = value;
394
+ if (!(entry === null || entry === void 0 ? void 0 : entry.calculatedEntitlement))
395
+ continue;
396
+ // 1. Rename featureUsage → usageData
397
+ if (entry.featureUsage && !entry.usageData) {
398
+ entry.usageData = entry.featureUsage;
399
+ delete entry.featureUsage;
400
+ }
401
+ // 2. Add type discriminator if missing (old cache only had Feature entitlements)
402
+ if (!entry.calculatedEntitlement.type) {
403
+ entry.calculatedEntitlement.type = entities_1.EntitlementType.Feature;
404
+ }
405
+ // 3. Move fields from usageData to calculatedEntitlement (for Feature type)
406
+ if (entry.usageData && entry.calculatedEntitlement.type === entities_1.EntitlementType.Feature) {
407
+ const fieldsToMove = ['usagePeriodAnchor', 'resetPeriod', 'resetPeriodConfiguration'];
408
+ for (const field of fieldsToMove) {
409
+ if (entry.usageData[field] !== undefined && entry.calculatedEntitlement[field] === undefined) {
410
+ entry.calculatedEntitlement[field] = entry.usageData[field];
411
+ delete entry.usageData[field];
412
+ }
413
+ }
414
+ }
415
+ // 4. Add updatedAt if missing
416
+ if (entry.usageData && !entry.usageData.updatedAt) {
417
+ entry.usageData.updatedAt = Date.now();
418
+ }
419
+ // 5. Add displayName fallback if missing
420
+ if (entry.calculatedEntitlement.feature && !entry.calculatedEntitlement.feature.displayName) {
421
+ entry.calculatedEntitlement.feature.displayName = entry.calculatedEntitlement.feature.id;
422
+ }
423
+ // 6. Migrate usageData (nextResetDate → usagePeriodEnd)
424
+ if (entry.usageData) {
425
+ entry.usageData = this.migrateUsageData(entry.usageData);
426
+ }
427
+ cacheData[key] = entry;
428
+ }
429
+ return cacheData;
430
+ }
431
+ /**
432
+ * Migrates old usage data format.
433
+ * Handles backward compatibility for old items that have nextResetDate instead of usagePeriodEnd.
434
+ */
435
+ migrateUsageData(usageData) {
436
+ if (!(0, lodash_1.isNil)(usageData.nextResetDate) && (0, lodash_1.isNil)(usageData.usagePeriodEnd)) {
437
+ return Object.assign(Object.assign({}, (0, lodash_1.omit)(usageData, 'nextResetDate')), { usagePeriodEnd: usageData.nextResetDate });
368
438
  }
369
- return new cachedEntitlement_1.default(calculatedEntitlement, Object.assign(Object.assign({}, featureUsage), cachedUsage));
439
+ return usageData;
370
440
  }
371
441
  async executeSafely(operationName, defaultValue, operation) {
372
442
  if (!this.isClientConnected()) {
@@ -382,4 +452,4 @@ class RedisCacheService {
382
452
  }
383
453
  }
384
454
  exports.RedisCacheService = RedisCacheService;
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNEVBQXNFO0FBQ3RFLHNEQUE0QjtBQUM1QixtQ0FBb0Y7QUFHcEYsbUVBQXVHO0FBQ3ZHLCtFQUE0RTtBQUM1RSw0RUFLc0M7QUFDdEMsK0VBT3VDO0FBQ3ZDLDJEQUFxRDtBQUVyRCwrREFBNEQ7QUFrQjVELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0FBRXJDLE1BQU0sY0FBYyxHQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRXRELE1BQWEsaUJBQWlCO0lBUTVCLFlBQ0UsT0FBc0MsRUFDckIsYUFBNEIsRUFDNUIsb0JBQTBDO1FBRDFDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFFM0QsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0QsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsR0FBRyw4Q0FBZ0IsRUFBRSwrQkFBK0IsR0FBRyxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFFekcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGlCQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksbUNBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFZixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFH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
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EseUNBUW9CO0FBQ3BCLHNEQUE0QjtBQUM1QixtQ0FBNkU7QUFHN0UsbUVBQXVHO0FBQ3ZHLCtFQUE0RTtBQUM1RSw0RUFLc0M7QUFDdEMsK0VBS3VDO0FBRXZDLCtEQUE0RDtBQW1CNUQsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFBTSxjQUFjLEdBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFdEQsTUFBYSxpQkFBaUI7SUFRNUIsWUFDRSxPQUFzQyxFQUNyQixhQUE0QixFQUM1QixvQkFBMEM7UUFEMUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUUzRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM3RCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxHQUFHLDhDQUFnQixFQUFFLCtCQUErQixHQUFHLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUV6RyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lB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
@@ -1,7 +1,19 @@
1
- import CachedEntitlement from './cache/cachedEntitlement';
1
+ import { CachedEntitlement, EntitlementType } from './cache/entities';
2
2
  import { AccessDeniedReason } from '../models';
3
+ import { Maybe } from '../types';
4
+ export interface DecideEntitlementPolicyParams {
5
+ entitlementType: EntitlementType;
6
+ accessDeniedReason: Maybe<AccessDeniedReason>;
7
+ entitlement: Maybe<CachedEntitlement>;
8
+ requestedUsage?: number;
9
+ requestedValues?: string[];
10
+ }
3
11
  export declare class EntitlementDecisionService {
4
- static decideEntitlementPolicy(accessDeniedReason?: AccessDeniedReason | null, entitlement?: CachedEntitlement | null, requestUsage?: number, requestedValues?: string[]): Decision;
12
+ static decideEntitlementPolicy({ entitlementType, accessDeniedReason, entitlement, requestedUsage, requestedValues, }: DecideEntitlementPolicyParams): Decision;
13
+ private static getNotFoundReason;
14
+ private static decideFeatureAccess;
15
+ private static decideCreditAccess;
16
+ private static decideUsageBasedAccess;
5
17
  }
6
18
  export interface Decision {
7
19
  readonly hasAccess: boolean;
@@ -1,22 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EntitlementDecisionService = void 0;
4
+ const entities_1 = require("./cache/entities");
4
5
  const models_1 = require("../models");
5
6
  const lodash_1 = require("lodash");
6
7
  // TODO: Extract to a common lib for other sdks
7
8
  class EntitlementDecisionService {
8
- static decideEntitlementPolicy(accessDeniedReason, entitlement, requestUsage = 0, requestedValues = []) {
9
- var _a;
9
+ static decideEntitlementPolicy({ entitlementType, accessDeniedReason, entitlement, requestedUsage = 0, requestedValues = [], }) {
10
10
  if (accessDeniedReason) {
11
11
  return { accessDeniedReason: accessDeniedReason, hasAccess: false };
12
12
  }
13
- if (!entitlement || !entitlement.calculatedEntitlement.feature) {
14
- return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.NoFeatureEntitlementInSubscription };
13
+ if (!entitlement) {
14
+ return { hasAccess: false, accessDeniedReason: this.getNotFoundReason(entitlementType) };
15
15
  }
16
16
  if (entitlement.calculatedEntitlement.accessDeniedReason) {
17
17
  return { hasAccess: false, accessDeniedReason: entitlement.calculatedEntitlement.accessDeniedReason };
18
18
  }
19
- const { featureType, meterType } = entitlement.calculatedEntitlement.feature;
19
+ if ((0, entities_1.isCreditEntitlement)(entitlement)) {
20
+ return this.decideCreditAccess(entitlement);
21
+ }
22
+ if ((0, entities_1.isFeatureEntitlement)(entitlement)) {
23
+ return this.decideFeatureAccess(entitlement, requestedUsage, requestedValues);
24
+ }
25
+ return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.NoFeatureEntitlementInSubscription };
26
+ }
27
+ static getNotFoundReason(entitlementType) {
28
+ if (entitlementType === entities_1.EntitlementType.Feature) {
29
+ // for backward compatability
30
+ return models_1.AccessDeniedReason.NoFeatureEntitlementInSubscription;
31
+ }
32
+ return models_1.AccessDeniedReason.EntitlementNotFound;
33
+ }
34
+ static decideFeatureAccess(entitlement, requestUsage, requestedValues) {
35
+ const { feature } = entitlement.calculatedEntitlement;
36
+ const { featureType, meterType } = feature;
20
37
  switch (featureType) {
21
38
  case models_1.FeatureType.Boolean:
22
39
  return { hasAccess: true };
@@ -37,17 +54,27 @@ class EntitlementDecisionService {
37
54
  if (entitlement.calculatedEntitlement.hasUnlimitedUsage || entitlement.calculatedEntitlement.hasSoftLimit) {
38
55
  return { hasAccess: true };
39
56
  }
40
- const usageLimit = ((_a = entitlement.calculatedEntitlement) === null || _a === void 0 ? void 0 : _a.usageLimit) || 0;
41
- const currentUsage = entitlement.featureUsage.currentUsage;
42
- if (currentUsage + requestUsage <= usageLimit) {
43
- return { hasAccess: true };
44
- }
45
- else {
46
- return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.RequestedUsageExceedingLimit };
47
- }
57
+ const usageLimit = entitlement.calculatedEntitlement.usageLimit || 0;
58
+ const currentUsage = entitlement.usageData.currentUsage;
59
+ return this.decideUsageBasedAccess(usageLimit, currentUsage, requestUsage);
48
60
  }
49
61
  }
50
62
  }
63
+ static decideCreditAccess(entitlement) {
64
+ const { usageLimit } = entitlement.calculatedEntitlement;
65
+ const { currentUsage } = entitlement.usageData;
66
+ // checking at least 1 credit to deny access when none remaining
67
+ const requestUsage = 1;
68
+ return this.decideUsageBasedAccess(usageLimit, currentUsage, requestUsage);
69
+ }
70
+ static decideUsageBasedAccess(usageLimit, currentUsage, requestUsage) {
71
+ if (currentUsage + requestUsage <= usageLimit) {
72
+ return { hasAccess: true };
73
+ }
74
+ else {
75
+ return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.RequestedUsageExceedingLimit };
76
+ }
77
+ }
51
78
  }
52
79
  exports.EntitlementDecisionService = EntitlementDecisionService;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esc0NBQXVFO0FBQ3ZFLG1DQUE2QztBQUU3QywrQ0FBK0M7QUFDL0MsTUFBYSwwQkFBMEI7SUFDOUIsTUFBTSxDQUFDLHVCQUF1QixDQUNuQyxrQkFBOEMsRUFDOUMsV0FBc0MsRUFDdEMsWUFBWSxHQUFHLENBQUMsRUFDaEIsa0JBQTRCLEVBQUU7O1FBRTlCLElBQUksa0JBQWtCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFO1lBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLDJCQUFrQixDQUFDLGtDQUFrQyxFQUFFLENBQUM7U0FDeEc7UUFFRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRTtZQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUN2RztRQUVELE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQztRQUU3RSxRQUFRLFdBQVcsRUFBRTtZQUNuQixLQUFLLG9CQUFXLENBQUMsT0FBTztnQkFDdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM3QixLQUFLLG9CQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sYUFBYSxHQUFHLElBQUEsbUJBQVUsRUFBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdEcsSUFBSSxDQUFDLElBQUEsZ0JBQU8sRUFBQyxhQUFhLENBQUMsRUFBRTtvQkFDM0IsT0FBTzt3QkFDTCxTQUFTLEVBQUUsS0FBSzt3QkFDaEIsa0JBQWtCLEVBQUUsMkJBQWtCLENBQUMsdUJBQXVCO3FCQUMvRCxDQUFDO2lCQUNIO2dCQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDNUI7WUFDRCxLQUFLLG9CQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksU0FBUyxLQUFLLGtCQUFTLENBQUMsSUFBSSxFQUFFO29CQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsSUFBSSxXQUFXLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFO29CQUN6RyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM1QjtnQkFFRCxNQUFNLFVBQVUsR0FBRyxDQUFBLE1BQUEsV0FBVyxDQUFDLHFCQUFxQiwwQ0FBRSxVQUFVLEtBQUksQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFFM0QsSUFBSSxZQUFZLEdBQUcsWUFBWSxJQUFJLFVBQVUsRUFBRTtvQkFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsMkJBQWtCLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztpQkFDbEc7YUFDRjtTQUNGO0lBQ0gsQ0FBQztDQUNGO0FBcERELGdFQW9EQyJ9
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQWlIO0FBQ2pILHNDQUF1RTtBQUN2RSxtQ0FBNkM7QUFXN0MsK0NBQStDO0FBQy9DLE1BQWEsMEJBQTBCO0lBQzlCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxFQUNwQyxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxjQUFjLEdBQUcsQ0FBQyxFQUNsQixlQUFlLEdBQUcsRUFBRSxHQUNVO1FBQzlCLElBQUksa0JBQWtCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7U0FDMUY7UUFFRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRTtZQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUN2RztRQUVELElBQUksSUFBQSw4QkFBbUIsRUFBQyxXQUFXLENBQUMsRUFBRTtZQUNwQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksSUFBQSwrQkFBb0IsRUFBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQy9FO1FB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
@@ -1,14 +1,14 @@
1
1
  import EntitlementsApi from '../api/entitlements/entitlementsApi';
2
2
  import { LoggerService } from './loggerService';
3
3
  import { ApolloClient, FetchResult, NormalizedCacheObject } from '@apollo/client/core';
4
- import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, Entitlement, EnumEntitlement, EnumEntitlementOptions, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
4
+ import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, CreditEntitlement, Entitlement, EnumEntitlement, EnumEntitlementOptions, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
5
5
  import { ModelMapper } from '../utils/ModelMapper';
6
6
  import { CacheService } from './cache/cacheService';
7
7
  import { EdgeApiClient } from './EdgeApiClient';
8
- import { AccessDeniedReason, EntitlementFragment, EntitlementsStateAccessDeniedReason, ReportEventMutation, ReportUsageBulkInput, ReportUsageBulkMutation, ReportUsageFragment, ReportUsageMutation } from '@stigg/api-client-js/src/generated/sdk';
8
+ import { AccessDeniedReason, EntitlementsStateAccessDeniedReason, EntitlementUnionFragment, ReportEventMutation, ReportUsageBulkInput, ReportUsageBulkMutation, ReportUsageFragment, ReportUsageMutation } from '@stigg/api-client-js/src/generated/sdk';
9
9
  import CacheMapper from '../utils/CacheMapper';
10
10
  import { EntitlementsResponse, EntitlementsResponseCacheHit, RefetchEntitlementsAfterCacheMissParams, RefetchEntitlementsParams, RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
11
- import CachedEntitlement from './cache/cachedEntitlement';
11
+ import { EntitlementsMap } from './cache/entities';
12
12
  export declare const accessDeniedReasonMap: Record<EntitlementsStateAccessDeniedReason, AccessDeniedReason>;
13
13
  export interface CustomerEntitlementsResult {
14
14
  entitlements: Entitlement[];
@@ -27,6 +27,7 @@ export declare abstract class EntitlementsService {
27
27
  getNumericEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: NumericEntitlement, resourceId?: string, options?: NumericEntitlementOptions): Promise<NumericEntitlement>;
28
28
  getMeteredEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: MeteredEntitlement, resourceId?: string, options?: MeteredEntitlementOptions): Promise<MeteredEntitlement>;
29
29
  getEnumEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: EnumEntitlement, resourceId?: string, options?: EnumEntitlementOptions): Promise<EnumEntitlement>;
30
+ getCreditEntitlement(customerRefId: string, currencyId: string, resourceId?: string): Promise<CreditEntitlement>;
30
31
  getEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: Entitlement, resourceId?: string, requestedUsage?: number, requestedValues?: string[]): Promise<Entitlement>;
31
32
  private handleUsagePeriodOver;
32
33
  private getCustomerAndEntitlementFromCacheOrRefetch;
@@ -41,16 +42,16 @@ export declare abstract class EntitlementsService {
41
42
  protected abstract refetchEntityEntitlementsAfterCacheMiss(params: RefetchEntityEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
42
43
  refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsResponseCacheHit>;
43
44
  setEntitlementsIfExists(options: {
44
- entitlements?: EntitlementFragment[] | null;
45
+ entitlements?: EntitlementUnionFragment[] | null;
45
46
  customerId: string;
46
47
  resourceId: string | undefined;
47
- }): Promise<Map<string, CachedEntitlement> | null>;
48
+ }): Promise<EntitlementsMap | null>;
48
49
  setEntitlements(params: {
49
- entitlements: EntitlementFragment[];
50
+ entitlements: EntitlementUnionFragment[];
50
51
  accessDeniedReason: AccessDeniedReason | null;
51
52
  customerId: string;
52
53
  resourceId: string | undefined;
53
- }): Promise<Map<string, CachedEntitlement>>;
54
+ }): Promise<EntitlementsMap>;
54
55
  private getEntitlementsUpdatedAtTimestamp;
55
56
  updateFeatureUsage({ featureId, customerId, resourceId, currentUsage, usagePeriodStart, usagePeriodEnd, timestamp, }: ReportUsageFragment): Promise<void>;
56
57
  waitForInitialization(): Promise<void>;