@stigg/node-server-sdk 3.35.0 → 3.37.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.
@@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RedisCacheService = void 0;
7
7
  const ioredis_1 = __importDefault(require("ioredis"));
8
8
  const lodash_1 = require("lodash");
9
- const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
10
9
  const redlock_1 = __importDefault(require("redlock"));
11
10
  const cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
12
11
  const RedisSingleExecutionService_1 = require("./RedisSingleExecutionService");
13
12
  const entitlementsService_utils_1 = require("../entitlementsService.utils");
14
13
  const redisCacheService_constants_1 = require("./redisCacheService.constants");
14
+ const isMetered_1 = require("../../utils/isMetered");
15
15
  class RedisCacheService {
16
16
  constructor(options, loggerService) {
17
17
  this.loggerService = loggerService;
@@ -28,75 +28,73 @@ class RedisCacheService {
28
28
  this.distributedRefetchEntitlementsService = new RedisSingleExecutionService_1.RedisSingleExecutionService(redisCacheService_constants_1.REFETCH_OPERATION_NAME, this.environmentPrefix, notificationTimeoutMs, this.redisClient, this.redlock, this.loggerService);
29
29
  }
30
30
  }
31
- async updateFeatureUsage({ featureId, currentUsage, customerId, nextResetDate, resourceId, timestamp, }) {
32
- const entitlementUsageKey = (0, cacheKeysHelpers_1.buildUsageKey)(this.environmentPrefix, customerId, featureId, resourceId);
33
- const usageValue = {
31
+ async updateFeatureUsage(params) {
32
+ const item = this.getFeatureUsageItemToUpdate(params);
33
+ await this.updateCacheItems([item]);
34
+ return true;
35
+ }
36
+ getFeatureUsageItemToUpdate({ featureId, currentUsage, customerId, nextResetDate, resourceId, timestamp, }) {
37
+ const value = {
34
38
  currentUsage,
35
39
  nextResetDate,
36
40
  };
37
- await this.updateKey(timestamp, entitlementUsageKey, usageValue);
38
- return true;
41
+ return {
42
+ messageTimestamp: timestamp,
43
+ key: (0, cacheKeysHelpers_1.buildUsageKey)(this.environmentPrefix, customerId, featureId, resourceId),
44
+ value,
45
+ };
39
46
  }
40
47
  async setCustomer(customerId, customerEntitlements, resourceId, entitlementsTimestamp, featureIdToUsageTimestamp) {
41
48
  const lockKey = (0, cacheKeysHelpers_1.buildLockKey)(this.environmentPrefix, customerId, resourceId);
42
- const entitlementsDbKey = (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId);
43
- const customerEntitlementsAsObject = Object.fromEntries(customerEntitlements);
44
49
  await this.redlock.using([lockKey], redisCacheService_constants_1.LOCK_DURATION, async () => {
45
- await this.updateKey(new Date(entitlementsTimestamp), entitlementsDbKey, customerEntitlementsAsObject);
46
- const entitlements = new Array(...customerEntitlements.values());
47
- const updateUsagesPromises = entitlements
48
- .filter((entitlement) => {
49
- var _a, _b;
50
- return ((_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.meterType) &&
51
- ((_b = entitlement.calculatedEntitlement.feature) === null || _b === void 0 ? void 0 : _b.meterType) !== sdk_1.MeterType.None;
52
- })
53
- .map((entitlement) => {
54
- var _a;
55
- try {
56
- const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, nextResetDate }, } = entitlement;
57
- if ((0, lodash_1.isEmpty)(feature === null || feature === void 0 ? void 0 : feature.id)) {
58
- throw new Error(`Customer key (${entitlementsDbKey}) has an entitlement without feature data`);
59
- }
60
- const featureId = feature.id;
61
- const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
62
- if (featureUsageTimestamp) {
63
- return this.updateFeatureUsage({
64
- featureId,
65
- customerId,
66
- timestamp: new Date(featureUsageTimestamp),
67
- currentUsage,
68
- nextResetDate: nextResetDate,
69
- resourceId,
70
- });
71
- }
72
- else {
73
- this.loggerService.error(`Usage timestamp for feature ${featureId} is missing`, {
74
- customerId,
75
- resourceId,
76
- featureId,
77
- });
78
- return Promise.resolve();
79
- }
80
- }
81
- catch (err) {
82
- this.loggerService.error(`Failed to update feature usage after fetching entitlements via network`, {
83
- error: err,
84
- customerId,
85
- resourceId,
86
- timestamp: entitlementsTimestamp,
87
- featureId: (_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.id,
88
- });
89
- throw err;
90
- }
50
+ const entitlementsItem = {
51
+ messageTimestamp: new Date(entitlementsTimestamp),
52
+ key: (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId),
53
+ value: Object.fromEntries(customerEntitlements),
54
+ };
55
+ const featureUsagesItems = this.extractFeatureUsagesToUpdate({
56
+ customerId,
57
+ resourceId,
58
+ customerEntitlements,
59
+ featureIdToUsageTimestamp,
91
60
  });
92
- // TODO: Partial success is not covered yet, it awaits transactions
93
- const updateUsagesResult = await Promise.allSettled(updateUsagesPromises);
94
- updateUsagesResult
95
- .filter((result) => result.status === 'rejected')
96
- .forEach((result) => this.loggerService.error(`Failed to update feature usage result: ${result.reason}`));
61
+ ``;
62
+ await this.updateCacheItems([entitlementsItem, ...featureUsagesItems]);
97
63
  });
98
64
  }
99
- async getCustomerEntitlements(customerId, resourceId) {
65
+ extractFeatureUsagesToUpdate({ customerId, resourceId, customerEntitlements, featureIdToUsageTimestamp, }) {
66
+ return (0, lodash_1.compact)(new Array(...customerEntitlements.values())
67
+ .filter(({ calculatedEntitlement }) => (0, isMetered_1.isMetered)(calculatedEntitlement.feature))
68
+ .map((entitlement) => {
69
+ const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, nextResetDate }, } = entitlement;
70
+ if ((0, lodash_1.isEmpty)(feature === null || feature === void 0 ? void 0 : feature.id)) {
71
+ this.loggerService.error(`entitlement without feature id`, {
72
+ customerId,
73
+ resourceId,
74
+ });
75
+ return;
76
+ }
77
+ const featureId = feature.id;
78
+ const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
79
+ if (!featureUsageTimestamp) {
80
+ this.loggerService.error(`Usage timestamp for feature is missing`, {
81
+ customerId,
82
+ resourceId,
83
+ featureId,
84
+ });
85
+ return;
86
+ }
87
+ return this.getFeatureUsageItemToUpdate({
88
+ customerId,
89
+ resourceId,
90
+ featureId,
91
+ currentUsage,
92
+ nextResetDate,
93
+ timestamp: new Date(featureUsageTimestamp),
94
+ });
95
+ }));
96
+ }
97
+ async getCustomerEntitlementsWithoutUsage(customerId, resourceId) {
100
98
  const customerKey = (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId);
101
99
  const keysToFetch = [customerKey];
102
100
  if (resourceId) {
@@ -140,48 +138,42 @@ class RedisCacheService {
140
138
  });
141
139
  return true;
142
140
  }
143
- async getCustomerEntitlementsWithUsage(customerId, resourceId) {
144
- const response = await this.getCustomerEntitlements(customerId, resourceId);
141
+ async getCustomerEntitlements(customerId, resourceId) {
142
+ const response = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
145
143
  if (response.cacheMiss) {
146
144
  return response;
147
145
  }
148
146
  const { entitlements } = response;
149
147
  const meteredFeatureIds = Array.from(entitlements.values())
150
- .filter((entitlement) => {
151
- var _a, _b;
152
- return ((_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.meterType) &&
153
- ((_b = entitlement.calculatedEntitlement.feature) === null || _b === void 0 ? void 0 : _b.meterType) !== sdk_1.MeterType.None;
154
- })
155
- .map((entitlement) => entitlement.calculatedEntitlement.feature.id);
156
- const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, meteredFeatureIds);
157
- const foundFeatureIds = Array.from(featuresUsageByFeatureKey.keys());
158
- const missingFeatureIds = (0, lodash_1.difference)(meteredFeatureIds, foundFeatureIds);
159
- if (!(0, lodash_1.isEmpty)(missingFeatureIds)) {
160
- this.loggerService.error(`Failed to find metered features usage - considering it as cache miss`, {
161
- customerId,
162
- resourceId,
163
- missingFeatureIds,
164
- });
165
- return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
166
- }
167
- featuresUsageByFeatureKey.forEach((usageValue, featureKey) => {
168
- const cachedEntitlement = entitlements.get(featureKey);
169
- if (cachedEntitlement) {
170
- const { calculatedEntitlement, featureUsage } = cachedEntitlement;
171
- entitlements.set(featureKey, { calculatedEntitlement, featureUsage: Object.assign(Object.assign({}, featureUsage), usageValue) });
172
- }
173
- else {
174
- this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
148
+ .filter(({ calculatedEntitlement }) => (0, isMetered_1.isMetered)(calculatedEntitlement.feature))
149
+ .map(({ calculatedEntitlement }) => calculatedEntitlement.feature.id);
150
+ if (!(0, lodash_1.isEmpty)(meteredFeatureIds)) {
151
+ const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, meteredFeatureIds);
152
+ const foundFeatureIds = Array.from(featuresUsageByFeatureKey.keys());
153
+ const missingFeatureIds = (0, lodash_1.difference)(meteredFeatureIds, foundFeatureIds);
154
+ if (!(0, lodash_1.isEmpty)(missingFeatureIds)) {
155
+ this.loggerService.error(`Failed to find metered features usage - considering it as cache miss`, {
175
156
  customerId,
176
- featureKey,
157
+ resourceId,
158
+ missingFeatureIds,
177
159
  });
160
+ return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
178
161
  }
179
- });
162
+ featuresUsageByFeatureKey.forEach((usageValue, featureKey) => {
163
+ const cachedEntitlement = entitlements.get(featureKey);
164
+ if (cachedEntitlement) {
165
+ entitlements.set(featureKey, this.mergeEntitlementWithUsage(cachedEntitlement, usageValue));
166
+ }
167
+ else {
168
+ this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
169
+ customerId,
170
+ featureKey,
171
+ });
172
+ }
173
+ });
174
+ }
180
175
  return entitlementsService_utils_1.entitlementsResponseMapper.cacheHit(entitlements);
181
176
  }
182
- async getFeatureUsage(customerId, featureId, resourceId) {
183
- return this.redisClient.get((0, cacheKeysHelpers_1.buildUsageKey)(this.environmentPrefix, customerId, featureId, resourceId));
184
- }
185
177
  async getFeaturesUsage(environmentPrefix, customerId, resourceId, meteredFeatureIds) {
186
178
  const keysToFetch = meteredFeatureIds.map((featureId) => (0, cacheKeysHelpers_1.buildUsageKey)(environmentPrefix, customerId, featureId, resourceId));
187
179
  const usageValues = await this.redisClient.mget(keysToFetch);
@@ -200,35 +192,52 @@ class RedisCacheService {
200
192
  clearCache() {
201
193
  return;
202
194
  }
203
- async updateKey(messageTimestamp, key, value) {
204
- const latestTimestamp = await this.getKeyLatestTimestamp(key);
205
- if (!latestTimestamp ||
206
- messageTimestamp.getTime() === entitlementsService_utils_1.DATE_IN_FAR_PAST.getTime() ||
207
- latestTimestamp.getTime() <= messageTimestamp.getTime()) {
208
- const writeableValue = typeof value === 'string' ? value : JSON.stringify(value);
209
- await this.redisClient
210
- .multi()
211
- .set(key, writeableValue, 'EX', this.ttl)
212
- .set(`${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`, messageTimestamp.getTime(), 'EX', this.ttl)
213
- .exec();
195
+ async updateCacheItems(items) {
196
+ if ((0, lodash_1.isEmpty)(items)) {
197
+ return;
214
198
  }
215
- else {
216
- this.loggerService.log('Cache data timestamp is after message timestamp, skipping key update', {
217
- messageTimestamp,
218
- latestTimestamp,
219
- key,
220
- });
199
+ const latestTimestampByKey = await this.getKeysLatestTimestamp(items.map((item) => item.key));
200
+ const itemsToUpdate = [];
201
+ items.forEach(({ messageTimestamp, key, value }) => {
202
+ const latestTimestamp = latestTimestampByKey.get(key);
203
+ if (!latestTimestamp ||
204
+ messageTimestamp.getTime() === entitlementsService_utils_1.DATE_IN_FAR_PAST.getTime() ||
205
+ latestTimestamp.getTime() <= messageTimestamp.getTime()) {
206
+ const writeableValue = typeof value === 'string' ? value : JSON.stringify(value);
207
+ itemsToUpdate.push({ key, value: writeableValue });
208
+ itemsToUpdate.push({ key: `${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`, value: messageTimestamp.getTime() });
209
+ }
210
+ else {
211
+ this.loggerService.log('Cache data timestamp is after message timestamp, skipping key update', {
212
+ messageTimestamp,
213
+ latestTimestamp,
214
+ key,
215
+ });
216
+ }
217
+ });
218
+ if ((0, lodash_1.isEmpty)(itemsToUpdate)) {
219
+ return;
221
220
  }
221
+ const batch = this.redisClient.multi();
222
+ itemsToUpdate.forEach(({ key, value }) => {
223
+ batch.set(key, value, 'EX', this.ttl);
224
+ });
225
+ await batch.exec();
222
226
  }
223
- async getKeyLatestTimestamp(key) {
224
- const value = await this.redisClient.get(`${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`);
225
- return this.parseTimestamp(value);
227
+ async getKeysLatestTimestamp(keys) {
228
+ const timestampKeys = keys.map((key) => `${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`);
229
+ const value = await this.redisClient.mget(timestampKeys);
230
+ const result = new Map();
231
+ keys.forEach((key, index) => {
232
+ result.set(key, this.parseTimestamp(value[index]));
233
+ });
234
+ return result;
226
235
  }
227
236
  parseTimestamp(value) {
228
237
  if ((0, lodash_1.isNil)(value)) {
229
238
  return undefined;
230
239
  }
231
- const number = parseInt(value, 10);
240
+ const number = (0, lodash_1.parseInt)(value, 10);
232
241
  if (Number.isNaN(number)) {
233
242
  return undefined;
234
243
  }
@@ -239,6 +248,34 @@ class RedisCacheService {
239
248
  await this.redlock.quit();
240
249
  await ((_a = this.distributedRefetchEntitlementsService) === null || _a === void 0 ? void 0 : _a.cleanup());
241
250
  }
251
+ async getCustomerEntitlement(featureId, customerId, resourceId) {
252
+ const { entitlements, customerExists, cacheMiss, globalCustomerMissing } = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
253
+ const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureId)) || null : null;
254
+ const result = { cacheMiss, customerExists, entitlement, globalCustomerMissing };
255
+ if (!entitlement || !(0, isMetered_1.isMetered)(entitlement === null || entitlement === void 0 ? void 0 : entitlement.calculatedEntitlement.feature)) {
256
+ return result;
257
+ }
258
+ const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, [
259
+ featureId,
260
+ ]);
261
+ const cachedFeatureUsage = featuresUsageByFeatureKey.get(featureId);
262
+ if ((0, lodash_1.isNil)(cachedFeatureUsage)) {
263
+ this.loggerService.error('Failed to find metered feature usage - considering it as cache miss', {
264
+ customerId,
265
+ resourceId,
266
+ featureId,
267
+ });
268
+ return { cacheMiss: true, customerExists: false, entitlement: null, globalCustomerMissing: false };
269
+ }
270
+ return Object.assign(Object.assign({}, result), { entitlement: this.mergeEntitlementWithUsage(entitlement, cachedFeatureUsage) });
271
+ }
272
+ mergeEntitlementWithUsage(entitlement, cachedUsage) {
273
+ const { calculatedEntitlement, featureUsage } = entitlement;
274
+ return {
275
+ calculatedEntitlement,
276
+ featureUsage: Object.assign(Object.assign({}, featureUsage), cachedUsage),
277
+ };
278
+ }
242
279
  }
243
280
  exports.RedisCacheService = RedisCacheService;
244
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsc0RBQTRCO0FBQzVCLG1DQUFvRDtBQUNwRCxnRUFBbUU7QUFFbkUsc0RBQThCO0FBRTlCLG1FQUE2RjtBQUM3RiwrRUFBNEU7QUFDNUUsNEVBQWtIO0FBQ2xILCtFQU11QztBQUV2QyxNQUFhLGlCQUFpQjtJQVE1QixZQUFZLE9BQTBCLEVBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25GLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEdBQUcsOENBQWdCLEVBQUUsK0JBQStCLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXBHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJ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
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsc0RBQTRCO0FBQzVCLG1DQUF1RTtBQUV2RSxzREFBOEI7QUFFOUIsbUVBQTZGO0FBQzdGLCtFQUE0RTtBQUM1RSw0RUFLc0M7QUFDdEMsK0VBTXVDO0FBQ3ZDLHFEQUFrRDtBQWFsRCxNQUFhLGlCQUFpQjtJQVE1QixZQUFZLE9BQTBCLEVBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25GLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEdBQUcsOENBQWdCLEVBQUUsK0JBQStCLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXBHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJ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
@@ -1,14 +1,13 @@
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, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
4
+ import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
5
5
  import { ModelMapper } from '../utils/ModelMapper';
6
- import CachedEntitlement from './cache/cachedEntitlement';
7
6
  import { CacheService } from './cache/cacheService';
8
7
  import { EdgeApiClient } from './EdgeApiClient';
9
8
  import { EntitlementCheckResult, EntitlementFragment, ReportEventMutation, ReportUsageBulkInput, ReportUsageBulkMutation, ReportUsageFragment, ReportUsageMutation } from '@stigg/api-client-js/src/generated/sdk';
10
9
  import CacheMapper from '../utils/CacheMapper';
11
- import { EntitlementsMap, RefetchEntitlementsAfterCacheMissParams, RefetchEntitlementsParams, RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
10
+ import { EntitlementsResponse, EntitlementsResponseCacheHit, RefetchEntitlementsAfterCacheMissParams, RefetchEntitlementsParams, RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
12
11
  export declare abstract class EntitlementsService {
13
12
  protected readonly loggerService: LoggerService;
14
13
  protected readonly cacheService: CacheService;
@@ -22,32 +21,26 @@ export declare abstract class EntitlementsService {
22
21
  getNumericEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: NumericEntitlement, resourceId?: string, options?: NumericEntitlementOptions): Promise<NumericEntitlement>;
23
22
  getMeteredEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: MeteredEntitlement, resourceId?: string, options?: MeteredEntitlementOptions): Promise<MeteredEntitlement>;
24
23
  private getCustomerAndEntitlementFromCacheOrRefetch;
25
- abstract getCustomerEntitlementsWithUsage(customerRefId: string, resourceId: string | undefined): Promise<Entitlement[]>;
24
+ getCustomerEntitlements(customerRefId: string, resourceId: string | undefined): Promise<import("../models").Entitlement[]>;
26
25
  abstract clearCache(): void | Promise<void>;
27
26
  abstract init(): void | Promise<void>;
28
27
  abstract cleanup(): void | Promise<void>;
29
28
  reportUsage(input: CreateUsageMeasurement): Promise<FetchResult<ReportUsageMutation>>;
30
29
  reportUsageBulk(input: ReportUsageBulkInput): Promise<FetchResult<ReportUsageBulkMutation>>;
31
30
  reportEvent(input: ReportEvent[]): Promise<FetchResult<ReportEventMutation>>;
32
- protected tryGetCacheCustomerAndEntitlement(featureRefId: string, customerRefId: string, resourceId?: string): Promise<{
33
- cacheMiss: boolean;
34
- customerExists: boolean;
35
- entitlement: CachedEntitlement | null;
36
- globalCustomerMissing: boolean;
37
- }>;
38
- protected refetchEntitlementsAfterCacheMiss<T>(params: RefetchEntitlementsAfterCacheMissParams<T>): Promise<T>;
39
- protected abstract refetchEntityEntitlementsAfterCacheMiss<T>(params: RefetchEntityEntitlementsAfterCacheMissParams<T>): Promise<T>;
40
- refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsMap>;
31
+ protected refetchEntitlementsAfterCacheMiss(params: RefetchEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
32
+ protected abstract refetchEntityEntitlementsAfterCacheMiss(params: RefetchEntityEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
33
+ refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsResponseCacheHit>;
41
34
  setEntitlementsIfExists(options: {
42
35
  entitlements?: EntitlementFragment[] | null;
43
36
  customerId: string;
44
37
  resourceId: string | undefined;
45
- }): Promise<Map<string, CachedEntitlement> | null>;
38
+ }): Promise<Map<string, import("./cache/cachedEntitlement").default> | null>;
46
39
  setEntitlements(params: {
47
40
  entitlements: EntitlementFragment[];
48
41
  customerId: string;
49
42
  resourceId: string | undefined;
50
- }): Promise<Map<string, CachedEntitlement>>;
43
+ }): Promise<Map<string, import("./cache/cachedEntitlement").default>>;
51
44
  private getEntitlementsUpdatedAtTimestamp;
52
45
  protected tryTrackEntitlementCheck(shouldTrack: boolean, featureRefId: string, customerRefId: string, resourceRefId: string | undefined, result: EntitlementCheckResult, requestedUsage?: number): void;
53
46
  updateFeatureUsage({ featureId, customerId, resourceId, currentUsage, nextResetDate, timestamp, }: ReportUsageFragment): Promise<void>;
@@ -115,24 +115,40 @@ class EntitlementsService {
115
115
  return this.modelMapper.mapMeteredEntitlement(entitlement, decision, requestUsage);
116
116
  }
117
117
  async getCustomerAndEntitlementFromCacheOrRefetch(featureRefId, customerRefId, resourceId, triggeredBy) {
118
- const loadFromCache = () => this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId, resourceId);
119
- const result = await loadFromCache();
118
+ var _a;
119
+ const result = await this.cacheService.getCustomerEntitlement(featureRefId, customerRefId, resourceId);
120
120
  let { entitlement, customerExists } = result;
121
121
  if (result.cacheMiss || !this.isInitialized) {
122
- ({ entitlement, customerExists } = await this.refetchEntitlementsAfterCacheMiss({
122
+ const postMissResult = await this.refetchEntitlementsAfterCacheMiss({
123
123
  customerId: customerRefId,
124
124
  resourceId,
125
125
  refetchGlobalCustomer: result.globalCustomerMissing,
126
126
  triggeredBy,
127
- loadFromCache,
128
- transformApiResult: (entitlements) => ({
129
- entitlement: (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureRefId)) || null,
130
- customerExists: (0, entitlementsService_utils_1.doesCustomerExist)(entitlements),
131
- }),
132
- }));
127
+ });
128
+ entitlement = ((_a = postMissResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(featureRefId)) || null;
129
+ customerExists = postMissResult.customerExists;
133
130
  }
134
131
  return { entitlement, customerExists };
135
132
  }
133
+ async getCustomerEntitlements(customerRefId, resourceId) {
134
+ const result = await this.cacheService.getCustomerEntitlements(customerRefId, resourceId);
135
+ let { entitlements, customerExists } = result;
136
+ if (result.cacheMiss || !this.isInitialized) {
137
+ ({ entitlements, customerExists } = await this.refetchEntitlementsAfterCacheMiss({
138
+ customerId: customerRefId,
139
+ resourceId,
140
+ refetchGlobalCustomer: result.globalCustomerMissing,
141
+ triggeredBy: 'getCustomerEntitlements',
142
+ }));
143
+ }
144
+ if (!entitlements) {
145
+ return [];
146
+ }
147
+ return Array.from(entitlements.values()).map((value) => {
148
+ const decision = entitlementDecisionService_1.EntitlementDecisionService.decideEntitlementPolicy(customerExists, value);
149
+ return this.modelMapper.mapEntitlement(value, decision);
150
+ });
151
+ }
136
152
  async reportUsage(input) {
137
153
  const result = await this.entitlementsApi.reportUsage(input);
138
154
  if (result.data) {
@@ -152,11 +168,6 @@ class EntitlementsService {
152
168
  reportEvent(input) {
153
169
  return this.entitlementsApi.reportEvent(input);
154
170
  }
155
- async tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId, resourceId) {
156
- const { entitlements, customerExists, cacheMiss, globalCustomerMissing } = await this.cacheService.getCustomerEntitlements(customerRefId, resourceId);
157
- const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureRefId)) || null : null;
158
- return { cacheMiss, customerExists, entitlement, globalCustomerMissing };
159
- }
160
171
  async refetchEntitlementsAfterCacheMiss(params) {
161
172
  const { customerId, resourceId, triggeredBy, refetchGlobalCustomer } = params;
162
173
  const refetchPromise = this.refetchEntityEntitlementsAfterCacheMiss(params);
@@ -164,8 +175,6 @@ class EntitlementsService {
164
175
  return refetchPromise;
165
176
  }
166
177
  const globalCustomerRefetchPromise = this.refetchEntityEntitlementsAfterCacheMiss({
167
- loadFromCache: lodash_1.noop,
168
- transformApiResult: lodash_1.noop,
169
178
  customerId,
170
179
  resourceId: undefined,
171
180
  triggeredBy,
@@ -181,11 +190,12 @@ class EntitlementsService {
181
190
  triggeredBy,
182
191
  });
183
192
  const entitlementsResult = await this.entitlementsApi.getEntitlements(customerId, resourceId, skipEdge);
184
- return this.setEntitlements({
193
+ const entitlements = await this.setEntitlements({
185
194
  entitlements: entitlementsResult.data.entitlements,
186
195
  customerId,
187
196
  resourceId,
188
197
  });
198
+ return entitlementsService_utils_1.entitlementsResponseMapper.cacheHit(entitlements);
189
199
  }
190
200
  async setEntitlementsIfExists(options) {
191
201
  const { entitlements } = options, rest = __rest(options, ["entitlements"]);
@@ -244,7 +254,7 @@ class EntitlementsService {
244
254
  if ((0, lodash_1.isNil)(currentUsage)) {
245
255
  return;
246
256
  }
247
- const response = await this.cacheService.getCustomerEntitlements(customerId, resourceId || undefined);
257
+ const response = await this.cacheService.getCustomerEntitlement(featureId, customerId, resourceId || undefined);
248
258
  if (response.cacheMiss) {
249
259
  return;
250
260
  }
@@ -259,4 +269,4 @@ class EntitlementsService {
259
269
  }
260
270
  }
261
271
  exports.EntitlementsService = EntitlementsService;
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXNGO0FBQ3RGLDBGQUFrRTtBQUdsRSxzQ0FZbUI7QUFDbkIsc0RBQW1EO0FBQ25ELDZFQUEwRTtBQUcxRSxtQ0FBOEM7QUFFOUMsa0RBQWlEO0FBVWpELHVFQUErQztBQUMvQywyRUFRcUM7QUFFckMsTUFBc0IsbUJBQW1CO0lBUXZDLFlBQ0UsTUFBMkMsRUFDeEIsYUFBNEIsRUFDL0Msb0JBQXlELEVBQ3pELGFBQW1DLEVBQ2hCLFlBQTBCO1FBSDFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBUHJDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBUzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLG1FQUFnQyxDQUMxRSxJQUFJLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RSxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsbUJBQXVDLEVBQ3ZDLFVBQW1CLEVBQ25CLE9BQW1DOztRQUVuQyxNQUFNLFdBQVcsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksS0FB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
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXNGO0FBQ3RGLDBGQUFrRTtBQUdsRSxzQ0FXbUI7QUFDbkIsc0RBQW1EO0FBQ25ELDZFQUEwRTtBQUUxRSxtQ0FBd0M7QUFFeEMsa0RBQWlEO0FBVWpELHVFQUErQztBQUMvQywyRUFTcUM7QUFFckMsTUFBc0IsbUJBQW1CO0lBUXZDLFlBQ0UsTUFBMkMsRUFDeEIsYUFBNEIsRUFDL0Msb0JBQXlELEVBQ3pELGFBQW1DLEVBQ2hCLFlBQTBCO1FBSDFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBUHJDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBUzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLG1FQUFnQyxDQUMxRSxJQUFJLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RSxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsbUJBQXVDLEVBQ3ZDLFVBQW1CLEVBQ25CLE9BQW1DOztRQUVuQyxNQUFNLFdBQVcsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksS0FB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