@stigg/node-server-sdk 4.9.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 +2 -2
  43. package/dist/services/cache/cachedEntitlement.d.ts +0 -29
  44. package/dist/services/cache/cachedEntitlement.js +0 -10
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildUsageUpdatedV1Payload = exports.mapEntitlementsUpdatedV2ToV1 = void 0;
4
+ const lodash_1 = require("lodash");
5
+ function toEpochMs(date) {
6
+ if ((0, lodash_1.isNil)(date)) {
7
+ return null;
8
+ }
9
+ if (typeof date === 'number') {
10
+ return date;
11
+ }
12
+ return new Date(date).getTime();
13
+ }
14
+ function toIsoString(date) {
15
+ if ((0, lodash_1.isNil)(date)) {
16
+ return null;
17
+ }
18
+ if (typeof date === 'string') {
19
+ return date;
20
+ }
21
+ return new Date(date).toISOString();
22
+ }
23
+ /**
24
+ * Maps V2 entitlements payload to V1 format for backward compatibility.
25
+ * Filters out credit entitlements (only keeps feature entitlements).
26
+ */
27
+ function mapEntitlementsUpdatedV2ToV1(v2Payload) {
28
+ // Filter out credit entitlements (only keep feature entitlements)
29
+ const featureEntitlements = v2Payload.entitlements.filter((e) => e.__typename === 'FeatureEntitlement');
30
+ // Map FeatureEntitlement to legacy Entitlement type
31
+ const legacyEntitlements = featureEntitlements.map((fe) => (Object.assign(Object.assign({}, (0, lodash_1.omit)(fe, '__typename')), { __typename: 'Entitlement', customerId: null, resourceId: null, requestedUsage: null, requestedValues: null, nextResetDate: fe.usagePeriodEnd })));
32
+ return {
33
+ __typename: 'EntitlementsUpdated',
34
+ customerId: v2Payload.customerId,
35
+ resourceId: v2Payload.resourceId,
36
+ accessDeniedReason: v2Payload.accessDeniedReason,
37
+ entitlements: legacyEntitlements,
38
+ };
39
+ }
40
+ exports.mapEntitlementsUpdatedV2ToV1 = mapEntitlementsUpdatedV2ToV1;
41
+ /**
42
+ * Builds V1 usage updated payload from a cached feature entitlement.
43
+ * Returns null if the entitlement is not a feature entitlement.
44
+ */
45
+ function buildUsageUpdatedV1Payload(customerId, resourceId, cachedEntitlement) {
46
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
47
+ const { calculatedEntitlement, usageData } = cachedEntitlement;
48
+ const feature = calculatedEntitlement.feature;
49
+ const usage = {
50
+ __typename: 'UsageMeasurementUpdated',
51
+ customerId,
52
+ resourceId: resourceId !== null && resourceId !== void 0 ? resourceId : null,
53
+ featureId: feature.id,
54
+ currentUsage: usageData.currentUsage,
55
+ usagePeriodStart: toEpochMs(usageData.usagePeriodStart),
56
+ usagePeriodEnd: toEpochMs(usageData.usagePeriodEnd),
57
+ nextResetDate: toEpochMs(usageData.usagePeriodEnd),
58
+ };
59
+ const mappedFeature = feature
60
+ ? {
61
+ __typename: 'EntitlementFeature',
62
+ refId: feature.id,
63
+ displayName: feature.displayName,
64
+ featureType: feature.featureType,
65
+ meterType: (_a = feature.meterType) !== null && _a !== void 0 ? _a : null,
66
+ featureUnits: (_b = feature.units) !== null && _b !== void 0 ? _b : null,
67
+ featureUnitsPlural: (_c = feature.unitsPlural) !== null && _c !== void 0 ? _c : null,
68
+ description: (_d = feature.description) !== null && _d !== void 0 ? _d : '',
69
+ unitTransformation: (_e = feature.unitTransformation) !== null && _e !== void 0 ? _e : null,
70
+ }
71
+ : null;
72
+ const entitlement = {
73
+ __typename: 'Entitlement',
74
+ isGranted: !calculatedEntitlement.accessDeniedReason,
75
+ accessDeniedReason: (_f = calculatedEntitlement.accessDeniedReason) !== null && _f !== void 0 ? _f : null,
76
+ customerId: null,
77
+ resourceId: null,
78
+ usageLimit: (_g = calculatedEntitlement.usageLimit) !== null && _g !== void 0 ? _g : null,
79
+ hasUnlimitedUsage: calculatedEntitlement.hasUnlimitedUsage,
80
+ hasSoftLimit: (_h = calculatedEntitlement.hasSoftLimit) !== null && _h !== void 0 ? _h : null,
81
+ currentUsage: (_j = usageData.currentUsage) !== null && _j !== void 0 ? _j : null,
82
+ requestedUsage: null,
83
+ requestedValues: null,
84
+ enumValues: (_k = calculatedEntitlement.enumValues) !== null && _k !== void 0 ? _k : null,
85
+ entitlementUpdatedAt: toIsoString(calculatedEntitlement.entitlementUpdatedAt),
86
+ usageUpdatedAt: toIsoString(usageData.updatedAt),
87
+ usagePeriodAnchor: toIsoString(calculatedEntitlement.usagePeriodAnchor),
88
+ usagePeriodStart: toIsoString(usageData.usagePeriodStart),
89
+ usagePeriodEnd: toIsoString(usageData.usagePeriodEnd),
90
+ nextResetDate: toIsoString(usageData.usagePeriodEnd),
91
+ resetPeriod: (_l = calculatedEntitlement.resetPeriod) !== null && _l !== void 0 ? _l : null,
92
+ validUntil: (_m = calculatedEntitlement.validUntil) !== null && _m !== void 0 ? _m : null,
93
+ resetPeriodConfiguration: (_o = calculatedEntitlement.resetPeriodConfiguration) !== null && _o !== void 0 ? _o : null,
94
+ feature: mappedFeature,
95
+ creditRate: (_p = calculatedEntitlement.creditRate) !== null && _p !== void 0 ? _p : null,
96
+ };
97
+ return {
98
+ __typename: 'UsageUpdated',
99
+ usage,
100
+ entitlement,
101
+ };
102
+ }
103
+ exports.buildUsageUpdatedV1Payload = buildUsageUpdatedV1Payload;
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVnYWN5RXZlbnRQYXlsb2FkTWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0xlZ2FjeUV2ZW50UGF5bG9hZE1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxtQ0FBcUM7QUFNckMsU0FBUyxTQUFTLENBQUMsSUFBK0M7SUFDaEUsSUFBSSxJQUFBLGNBQUssRUFBQyxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBK0M7SUFDbEUsSUFBSSxJQUFBLGNBQUssRUFBQyxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLFNBQXVDO0lBRXZDLGtFQUFrRTtJQUNsRSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN2RCxDQUFDLENBQUMsRUFBMEUsRUFBRSxDQUM1RSxDQUFDLENBQUMsVUFBVSxLQUFLLG9CQUFvQixDQUN4QyxDQUFDO0lBRUYsb0RBQW9EO0lBQ3BELE1BQU0sa0JBQWtCLEdBQStELG1CQUFtQixDQUFDLEdBQUcsQ0FDNUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLGlDQUNILElBQUEsYUFBSSxFQUFDLEVBQUUsRUFBRSxZQUFZLENB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
@@ -1,15 +1,12 @@
1
- import CachedEntitlement from './cachedEntitlement';
2
- import { OptionalPromise } from '../../types';
1
+ import { CachedEntitlement, EntitlementQuery, EntitlementType, EntitlementsMap, UsageData } from './entities';
2
+ import { Maybe, OptionalPromise } from '../../types';
3
3
  import { EntitlementResponse, EntitlementsResponse } from '../entitlementsService.utils';
4
4
  import { AccessDeniedReason } from '../../models';
5
- export type UpdateFeatureUsagePayload = {
5
+ export type UpdateUsagePayload<T extends EntitlementType = EntitlementType> = {
6
6
  customerId: string;
7
- featureId: string;
8
- currentUsage: number;
9
- timestamp: Date;
10
- resourceId: string | undefined;
11
- usagePeriodStart?: number;
12
- usagePeriodEnd?: number;
7
+ resourceId: Maybe<string>;
8
+ entitlementReference: EntitlementQuery<T>;
9
+ usage: UsageData;
13
10
  };
14
11
  export type UpdateCreditBalancePayload = {
15
12
  timestamp: Date;
@@ -24,8 +21,8 @@ export type UpdateCreditBalancePayload = {
24
21
  export interface CacheService {
25
22
  waitForInitialization(): Promise<void>;
26
23
  clearCache(): OptionalPromise<void>;
27
- setCustomer(customerId: string, customerEntitlements: Map<string, CachedEntitlement>, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined, entitlementsTimestamp: number, usageTimestamp: Map<string, number>): void | Promise<void>;
28
- updateFeatureUsage(payload: UpdateFeatureUsagePayload): OptionalPromise<boolean>;
24
+ setCustomer(customerId: string, customerEntitlements: EntitlementsMap, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined, entitlementsTimestamp: number): void | Promise<void>;
25
+ updateUsage<T extends EntitlementType>(payload: UpdateUsagePayload<T>): OptionalPromise<CachedEntitlement<T> | null>;
29
26
  getCustomerEntitlements(customerId: string, resourceId: string | undefined): OptionalPromise<EntitlementsResponse>;
30
- getCustomerEntitlement(featureId: string, customerId: string, resourceId: string | undefined): OptionalPromise<EntitlementResponse>;
27
+ getCustomerEntitlement<T extends EntitlementType>(query: EntitlementQuery<T>, customerId: string, resourceId: string | undefined): OptionalPromise<EntitlementResponse<T>>;
31
28
  }
@@ -0,0 +1,17 @@
1
+ import { EntitlementType } from '@stigg/api-client-js/src/generated/sdk';
2
+ import { CalculatedCreditEntitlement, CalculatedEntitlement, CalculatedFeatureEntitlement } from './calculatedEntitlement';
3
+ import { UsageData } from './usageData';
4
+ /** internal helper type - maps EntitlementType to the corresponding CalculatedEntitlement type */
5
+ type CalculatedEntitlementByType<T extends EntitlementType> = T extends EntitlementType.Feature ? CalculatedFeatureEntitlement : T extends EntitlementType.Credit ? CalculatedCreditEntitlement : CalculatedEntitlement;
6
+ export declare class CachedEntitlement<T extends EntitlementType = EntitlementType> {
7
+ readonly calculatedEntitlement: CalculatedEntitlementByType<T>;
8
+ readonly usageData: UsageData;
9
+ constructor(calculatedEntitlement: CalculatedEntitlementByType<T>, usageData: UsageData);
10
+ }
11
+ /** Type guard to check if a cached entitlement is a feature entitlement */
12
+ export declare function isFeatureEntitlement(entitlement: CachedEntitlement): entitlement is CachedEntitlement<EntitlementType.Feature>;
13
+ /** Type guard to check if a cached entitlement is a metered feature entitlement */
14
+ export declare function isMeteredFeatureEntitlement(entitlement: CachedEntitlement): entitlement is CachedEntitlement<EntitlementType.Feature>;
15
+ /** Type guard to check if a cached entitlement is a credit entitlement */
16
+ export declare function isCreditEntitlement(entitlement: CachedEntitlement): entitlement is CachedEntitlement<EntitlementType.Credit>;
17
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCreditEntitlement = exports.isMeteredFeatureEntitlement = exports.isFeatureEntitlement = exports.CachedEntitlement = void 0;
4
+ const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
5
+ const featureTypes_1 = require("../../../utils/featureTypes");
6
+ class CachedEntitlement {
7
+ constructor(calculatedEntitlement, usageData) {
8
+ this.calculatedEntitlement = calculatedEntitlement;
9
+ this.usageData = usageData;
10
+ }
11
+ }
12
+ exports.CachedEntitlement = CachedEntitlement;
13
+ /** Type guard to check if a cached entitlement is a feature entitlement */
14
+ function isFeatureEntitlement(entitlement) {
15
+ return entitlement.calculatedEntitlement.type === sdk_1.EntitlementType.Feature;
16
+ }
17
+ exports.isFeatureEntitlement = isFeatureEntitlement;
18
+ /** Type guard to check if a cached entitlement is a metered feature entitlement */
19
+ function isMeteredFeatureEntitlement(entitlement) {
20
+ return isFeatureEntitlement(entitlement) && (0, featureTypes_1.isMetered)(entitlement.calculatedEntitlement.feature);
21
+ }
22
+ exports.isMeteredFeatureEntitlement = isMeteredFeatureEntitlement;
23
+ /** Type guard to check if a cached entitlement is a credit entitlement */
24
+ function isCreditEntitlement(entitlement) {
25
+ return entitlement.calculatedEntitlement.type === sdk_1.EntitlementType.Credit;
26
+ }
27
+ exports.isCreditEntitlement = isCreditEntitlement;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkRW50aXRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvZW50aXRpZXMvY2FjaGVkRW50aXRsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQXlFO0FBT3pFLDhEQUF3RDtBQVN4RCxNQUFhLGlCQUFpQjtJQUk1QixZQUFZLHFCQUFxRCxFQUFFLFNBQW9CO1FBQ3JGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFSRCw4Q0FRQztBQUVELDJFQUEyRTtBQUMzRSxTQUFnQixvQkFBb0IsQ0FDbEMsV0FBOEI7SUFFOUIsT0FBTyxXQUFXLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLHFCQUFlLENBQUMsT0FBTyxDQUFDO0FBQzVFLENBQUM7QUFKRCxvREFJQztBQUVELG1GQUFtRjtBQUNuRixTQUFnQiwyQkFBMkIsQ0FDekMsV0FBOEI7SUFFOUIsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFBLHdCQUFTLEVBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFKRCxrRUFJQztBQUVELDBFQUEwRTtBQUMxRSxTQUFnQixtQkFBbUIsQ0FDakMsV0FBOEI7SUFFOUIsT0FBTyxXQUFXLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLHFCQUFlLENBQUMsTUFBTSxDQUFDO0FBQzNFLENBQUM7QUFKRCxrREFJQyJ9
@@ -0,0 +1,33 @@
1
+ import { AccessDeniedReason, EntitlementFeature, EntitlementResetPeriod } from '../../../models';
2
+ import { EntitlementType, ResetPeriodConfigurationFragment } from '@stigg/api-client-js/src/generated/sdk';
3
+ import { Maybe } from '../../../types';
4
+ interface BaseCalculatedEntitlement {
5
+ type: EntitlementType;
6
+ accessDeniedReason?: AccessDeniedReason;
7
+ validUntil?: number;
8
+ entitlementUpdatedAt: Maybe<number>;
9
+ }
10
+ export interface CalculatedFeatureEntitlement extends BaseCalculatedEntitlement {
11
+ type: EntitlementType.Feature;
12
+ feature: EntitlementFeature;
13
+ usageLimit: Maybe<number | null>;
14
+ enumValues: Maybe<string[]>;
15
+ hasUnlimitedUsage: boolean;
16
+ hasSoftLimit: boolean;
17
+ usagePeriodAnchor: Maybe<number>;
18
+ resetPeriod: Maybe<EntitlementResetPeriod | null>;
19
+ resetPeriodConfiguration?: ResetPeriodConfigurationFragment | null;
20
+ creditRate: Maybe<{
21
+ amount: number;
22
+ currencyId: string;
23
+ }>;
24
+ }
25
+ export interface CalculatedCreditEntitlement extends BaseCalculatedEntitlement {
26
+ type: EntitlementType.Credit;
27
+ currency: {
28
+ currencyId: string;
29
+ };
30
+ usageLimit: number;
31
+ }
32
+ export type CalculatedEntitlement = CalculatedFeatureEntitlement | CalculatedCreditEntitlement;
33
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlZEVudGl0bGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2VudGl0aWVzL2NhbGN1bGF0ZWRFbnRpdGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,8 @@
1
+ import { EntitlementType } from '@stigg/api-client-js/src/generated/sdk';
2
+ /** Query to look up an entitlement by type and id */
3
+ export type EntitlementQuery<T extends EntitlementType = EntitlementType> = {
4
+ /** The entitlement type */
5
+ type: T;
6
+ /** The unique identifier of the entitlement type */
7
+ id: string;
8
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9lbnRpdGllcy9lbnRpdGxlbWVudFF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,22 @@
1
+ import { CachedEntitlement } from './cachedEntitlement';
2
+ import { EntitlementType } from '@stigg/api-client-js/src/generated/sdk';
3
+ import { EntitlementQuery } from './entitlementQuery';
4
+ import { UsageData } from './usageData';
5
+ /**
6
+ * Type-safe wrapper around Map<string, CachedEntitlement> that encapsulates key building.
7
+ * Prevents errors from manual string key lookups.
8
+ */
9
+ export declare class EntitlementsMap {
10
+ private readonly map;
11
+ constructor(entries?: Iterable<CachedEntitlement>);
12
+ private buildKey;
13
+ private getKeyFromEntitlement;
14
+ get<T extends EntitlementType>(query: EntitlementQuery<T>): CachedEntitlement<T> | undefined;
15
+ set(entitlement: CachedEntitlement): this;
16
+ get size(): number;
17
+ values(): CachedEntitlement[];
18
+ /** Updates usage data for an entitlement. Returns the updated entitlement or null if not found. */
19
+ updateUsage<T extends EntitlementType>(entitlementReference: EntitlementQuery<T>, usageData: UsageData): CachedEntitlement<T> | null;
20
+ toJSON(): Record<string, CachedEntitlement>;
21
+ static fromJSON(obj: Record<string, unknown>): EntitlementsMap;
22
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntitlementsMap = void 0;
4
+ const cachedEntitlement_1 = require("./cachedEntitlement");
5
+ const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
6
+ /**
7
+ * Type-safe wrapper around Map<string, CachedEntitlement> that encapsulates key building.
8
+ * Prevents errors from manual string key lookups.
9
+ */
10
+ class EntitlementsMap {
11
+ constructor(entries) {
12
+ this.map = new Map();
13
+ if (entries) {
14
+ for (const entitlement of entries) {
15
+ this.set(entitlement);
16
+ }
17
+ }
18
+ }
19
+ // Feature entitlements use raw ID for backward compatibility with existing cache data
20
+ // Credit entitlements use prefix since they're new and need to be distinguishable
21
+ buildKey(query) {
22
+ if (query.type === sdk_1.EntitlementType.Feature) {
23
+ return query.id;
24
+ }
25
+ return `${query.type}:${query.id}`;
26
+ }
27
+ getKeyFromEntitlement(entitlement) {
28
+ const { type } = entitlement.calculatedEntitlement;
29
+ switch (type) {
30
+ case sdk_1.EntitlementType.Feature:
31
+ return this.buildKey({
32
+ type,
33
+ id: entitlement.calculatedEntitlement.feature.id,
34
+ });
35
+ case sdk_1.EntitlementType.Credit:
36
+ return this.buildKey({
37
+ type,
38
+ id: entitlement.calculatedEntitlement.currency.currencyId,
39
+ });
40
+ default:
41
+ return '';
42
+ }
43
+ }
44
+ get(query) {
45
+ return this.map.get(this.buildKey(query));
46
+ }
47
+ set(entitlement) {
48
+ const key = this.getKeyFromEntitlement(entitlement);
49
+ this.map.set(key, entitlement);
50
+ return this;
51
+ }
52
+ get size() {
53
+ return this.map.size;
54
+ }
55
+ values() {
56
+ return Array.from(this.map.values());
57
+ }
58
+ /** Updates usage data for an entitlement. Returns the updated entitlement or null if not found. */
59
+ updateUsage(entitlementReference, usageData) {
60
+ const existingEntitlement = this.get(entitlementReference);
61
+ if (!existingEntitlement) {
62
+ return null;
63
+ }
64
+ const updatedEntitlement = new cachedEntitlement_1.CachedEntitlement(existingEntitlement.calculatedEntitlement, usageData);
65
+ this.set(updatedEntitlement);
66
+ return updatedEntitlement;
67
+ }
68
+ // For serialization (Redis)
69
+ toJSON() {
70
+ return Object.fromEntries(this.map);
71
+ }
72
+ // For deserialization (Redis)
73
+ static fromJSON(obj) {
74
+ const map = new EntitlementsMap();
75
+ for (const [key, value] of Object.entries(obj)) {
76
+ map.map.set(key, value);
77
+ }
78
+ return map;
79
+ }
80
+ }
81
+ exports.EntitlementsMap = EntitlementsMap;
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzTWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2VudGl0aWVzL2VudGl0bGVtZW50c01hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBd0Q7QUFDeEQsZ0VBQXlFO0FBSXpFOzs7R0FHRztBQUNILE1BQWEsZUFBZTtJQUcxQixZQUFZLE9BQXFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sRUFBRTtZQUNYLEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLGtGQUFrRjtJQUMxRSxRQUFRLENBQUMsS0FBdUI7UUFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFlLENBQUMsT0FBTyxFQUFFO1lBQzFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNqQjtRQUNELE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8scUJBQXFCLENBQUMsV0FBOEI7UUFDMUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQztRQUNuRCxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUsscUJBQWUsQ0FBQyxPQUFPO2dCQUMxQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ25CLElBQUk7b0JBQ0osRUFBRSxFQUFFLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtpQkFDakQsQ0FBQyxDQUFDO1lBQ0wsS0FBSyxxQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDbkIsSUFBSTtvQkFDSixFQUFFLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxVQUFVO2lCQUMxRCxDQUFDLENBQUM7WUFDTDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBNEIsS0FBMEI7UUFDdkQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFxQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxHQUFHLENBQUMsV0FBOEI7UUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsbUdBQW1HO0lBQ25HLFdBQVcsQ0FDVCxvQkFBeUMsRUFDekMsU0FBb0I7UUFFcEIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUkscUNBQWlCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixNQUFNO1FBQ0osT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBNEI7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNsQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBMEIsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFyRkQsMENBcUZDIn0=
@@ -0,0 +1,6 @@
1
+ export { EntitlementType } from '@stigg/api-client-js/src/generated/sdk';
2
+ export { EntitlementQuery } from './entitlementQuery';
3
+ export { CalculatedEntitlement, CalculatedFeatureEntitlement, CalculatedCreditEntitlement, } from './calculatedEntitlement';
4
+ export { UsageData } from './usageData';
5
+ export { CachedEntitlement, isFeatureEntitlement, isMeteredFeatureEntitlement, isCreditEntitlement, } from './cachedEntitlement';
6
+ export { EntitlementsMap } from './entitlementsMap';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntitlementsMap = exports.isCreditEntitlement = exports.isMeteredFeatureEntitlement = exports.isFeatureEntitlement = exports.CachedEntitlement = exports.EntitlementType = void 0;
4
+ var sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
5
+ Object.defineProperty(exports, "EntitlementType", { enumerable: true, get: function () { return sdk_1.EntitlementType; } });
6
+ var cachedEntitlement_1 = require("./cachedEntitlement");
7
+ Object.defineProperty(exports, "CachedEntitlement", { enumerable: true, get: function () { return cachedEntitlement_1.CachedEntitlement; } });
8
+ Object.defineProperty(exports, "isFeatureEntitlement", { enumerable: true, get: function () { return cachedEntitlement_1.isFeatureEntitlement; } });
9
+ Object.defineProperty(exports, "isMeteredFeatureEntitlement", { enumerable: true, get: function () { return cachedEntitlement_1.isMeteredFeatureEntitlement; } });
10
+ Object.defineProperty(exports, "isCreditEntitlement", { enumerable: true, get: function () { return cachedEntitlement_1.isCreditEntitlement; } });
11
+ var entitlementsMap_1 = require("./entitlementsMap");
12
+ Object.defineProperty(exports, "EntitlementsMap", { enumerable: true, get: function () { return entitlementsMap_1.EntitlementsMap; } });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvZW50aXRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQXlFO0FBQWhFLHNHQUFBLGVBQWUsT0FBQTtBQVF4Qix5REFLNkI7QUFKM0Isc0hBQUEsaUJBQWlCLE9BQUE7QUFDakIseUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsZ0lBQUEsMkJBQTJCLE9BQUE7QUFDM0Isd0hBQUEsbUJBQW1CLE9BQUE7QUFFckIscURBQW9EO0FBQTNDLGtIQUFBLGVBQWUsT0FBQSJ9
@@ -0,0 +1,7 @@
1
+ import { Maybe } from '../../../types';
2
+ export interface UsageData {
3
+ currentUsage: number;
4
+ usagePeriodStart: Maybe<number>;
5
+ usagePeriodEnd: Maybe<number>;
6
+ updatedAt: number;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2VEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2VudGl0aWVzL3VzYWdlRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -1,11 +1,11 @@
1
- import { CacheService, UpdateCreditBalancePayload, UpdateFeatureUsagePayload } from './cacheService';
2
- import CachedEntitlement from './cachedEntitlement';
1
+ import { CacheService, UpdateCreditBalancePayload, UpdateUsagePayload } from './cacheService';
2
+ import { CachedEntitlement, EntitlementQuery, EntitlementType, EntitlementsMap } from './entities';
3
3
  import { EntitlementResponse, EntitlementsResponse } from '../entitlementsService.utils';
4
4
  import { CacheInstrumentation } from '../cacheInstrumentation';
5
5
  import { AccessDeniedReason } from '../../models';
6
6
  export declare function getApproxSizeBytes(obj: any): number;
7
7
  export type CachedCustomerEntitlements = {
8
- entitlements: Map<string, CachedEntitlement>;
8
+ entitlements: EntitlementsMap;
9
9
  accessDeniedReason: AccessDeniedReason | null;
10
10
  };
11
11
  export declare class InMemoryCacheService implements CacheService {
@@ -14,10 +14,10 @@ export declare class InMemoryCacheService implements CacheService {
14
14
  constructor(maxSizeBytes: number, instrumentation: CacheInstrumentation);
15
15
  waitForInitialization(): Promise<void>;
16
16
  clearCache: () => void;
17
- setCustomer(customerId: string, customerEntitlements: Map<string, CachedEntitlement>, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined): void;
17
+ setCustomer(customerId: string, customerEntitlements: EntitlementsMap, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined): void;
18
18
  clearCustomer(customerId: string, resourceId: string | undefined): void;
19
19
  getCustomerEntitlements(customerId: string, resourceId: string | undefined): EntitlementsResponse;
20
- updateFeatureUsage({ customerId, featureId, currentUsage, resourceId, usagePeriodStart, usagePeriodEnd, }: UpdateFeatureUsagePayload): boolean | Promise<boolean>;
21
- getCustomerEntitlement(featureId: string, customerId: string, resourceId: string | undefined): EntitlementResponse;
20
+ updateUsage<T extends EntitlementType>({ customerId, resourceId, entitlementReference, usage, }: UpdateUsagePayload<T>): CachedEntitlement<T> | null;
21
+ getCustomerEntitlement<T extends EntitlementType>(query: EntitlementQuery<T>, customerId: string, resourceId: string | undefined): EntitlementResponse<T>;
22
22
  updateEntitlementsBasedOnCreditBalanceUpdate({ customerId, resourceId, currencyId, currentBalance, validUntil, }: UpdateCreditBalancePayload): void;
23
23
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InMemoryCacheService = exports.getApproxSizeBytes = void 0;
4
+ const entities_1 = require("./entities");
4
5
  const cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
5
6
  const lru_cache_1 = require("lru-cache");
6
7
  const entitlementsService_utils_1 = require("../entitlementsService.utils");
@@ -47,25 +48,18 @@ class InMemoryCacheService {
47
48
  return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
48
49
  }
49
50
  }
50
- updateFeatureUsage({ customerId, featureId, currentUsage, resourceId, usagePeriodStart, usagePeriodEnd, }) {
51
+ updateUsage({ customerId, resourceId, entitlementReference, usage, }) {
51
52
  var _a;
52
53
  const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
53
54
  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;
55
+ if (!customerEntitlements) {
56
+ return null;
58
57
  }
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;
58
+ return customerEntitlements.updateUsage(entitlementReference, usage);
65
59
  }
66
- getCustomerEntitlement(featureId, customerId, resourceId) {
60
+ getCustomerEntitlement(query, customerId, resourceId) {
67
61
  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;
62
+ const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(query)) || null : null;
69
63
  return { cacheMiss, accessDeniedReason, entitlement, globalCustomerMissing };
70
64
  }
71
65
  updateEntitlementsBasedOnCreditBalanceUpdate({ customerId, resourceId, currencyId, currentBalance, validUntil, }) {
@@ -77,29 +71,26 @@ class InMemoryCacheService {
77
71
  }
78
72
  const isExceeded = currentBalance <= 0;
79
73
  // 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
- }
74
+ customerEntitlements
75
+ .values()
76
+ .filter(entities_1.isFeatureEntitlement)
77
+ .filter((entitlement) => { var _a; return ((_a = entitlement.calculatedEntitlement.creditRate) === null || _a === void 0 ? void 0 : _a.currencyId) === currencyId; })
78
+ .forEach((entitlement) => {
79
+ const { calculatedEntitlement, usageData } = entitlement;
80
+ const updatedCalculatedEntitlement = Object.assign(Object.assign({}, calculatedEntitlement), { validUntil });
81
+ if (isExceeded) {
82
+ if (!calculatedEntitlement.accessDeniedReason) {
83
+ updatedCalculatedEntitlement.accessDeniedReason = models_1.AccessDeniedReason.InsufficientCredits;
90
84
  }
91
- else {
92
- if (calculatedEntitlement.accessDeniedReason === models_1.AccessDeniedReason.InsufficientCredits) {
93
- updatedCalculatedEntitlement.accessDeniedReason = undefined;
94
- }
85
+ }
86
+ else {
87
+ if (calculatedEntitlement.accessDeniedReason === models_1.AccessDeniedReason.InsufficientCredits) {
88
+ updatedCalculatedEntitlement.accessDeniedReason = undefined;
95
89
  }
96
- customerEntitlements.set(featureId, {
97
- calculatedEntitlement: updatedCalculatedEntitlement,
98
- featureUsage,
99
- });
100
90
  }
91
+ customerEntitlements.set(new entities_1.CachedEntitlement(updatedCalculatedEntitlement, usageData));
101
92
  });
102
93
  }
103
94
  }
104
95
  exports.InMemoryCacheService = InMemoryCacheService;
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsbUVBQXNFO0FBQ3RFLHlDQUFxQztBQUNyQyw0RUFBcUg7QUFFckgseUNBQWtEO0FBRWxELE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFFdEMsU0FBZ0Isa0JBQWtCLENBQUMsR0FBUTtJQUN6QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEYsQ0FBQztBQUZELGdEQUVDO0FBT0QsTUFBYSxvQkFBb0I7SUFHL0IsWUFBWSxZQUFvQixFQUFtQixlQUFxQztRQUFyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBc0I7UUFZeEYsZUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQWJBLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVEsQ0FBcUM7WUFDbkUsT0FBTztZQUNQLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQU1ELFdBQVcsQ0FDVCxVQUFrQixFQUNsQixvQkFBb0QsRUFDcEQsa0JBQTZDLEVBQzdDLFVBQThCO1FBRTlCLE1BQU0saUJBQWlCLEdB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
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBTW9CO0FBQ3BCLG1FQUFzRTtBQUN0RSx5Q0FBcUM7QUFDckMsNEVBQXFIO0FBRXJILHlDQUFrRDtBQUVsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXRDLFNBQWdCLGtCQUFrQixDQUFDLEdBQVE7SUFDekMsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3hGLENBQUM7QUFGRCxnREFFQztBQU9ELE1BQWEsb0JBQW9CO0lBRy9CLFlBQVksWUFBb0IsRUFBbUIsZUFBcUM7UUFBckMsb0JBQWUsR0FBZixlQUFlLENBQXNCO1FBWXhGLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFiQSxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLG9CQUFRLENBQXFDO1lBQ25FLE9BQU87WUFDUCxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFNRCxXQUFXLENBQ1QsVUFBa0IsRUFDbEIsb0JBQXFDLEVBQ3JDLGtCQUE2QyxFQUM3QyxVQUE4QjtRQUU5QixN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
@@ -1,5 +1,5 @@
1
- import { CacheService, UpdateFeatureUsagePayload } from './cacheService';
2
- import CachedEntitlement from './cachedEntitlement';
1
+ import { CacheService, UpdateUsagePayload } from './cacheService';
2
+ import { CachedEntitlement, EntitlementType, EntitlementQuery, EntitlementsMap } from './entities';
3
3
  import { LoggerService } from '../loggerService';
4
4
  import { ClientConfiguration } from '../../configuration';
5
5
  import { RedisSingleExecutionService } from './RedisSingleExecutionService';
@@ -22,9 +22,9 @@ export declare class RedisCacheService implements CacheService {
22
22
  */
23
23
  waitForInitialization(): Promise<void>;
24
24
  isClientConnected(): boolean;
25
- updateFeatureUsage(params: UpdateFeatureUsagePayload): Promise<boolean>;
25
+ updateUsage<T extends EntitlementType>({ customerId, resourceId, entitlementReference, usage, }: UpdateUsagePayload<T>): Promise<CachedEntitlement<T> | null>;
26
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>;
27
+ setCustomer(customerId: string, customerEntitlements: EntitlementsMap, accessDeniedReason: AccessDeniedReason | null, resourceId: string | undefined, entitlementsTimestamp: number): Promise<void>;
28
28
  private extractFeatureUsagesToUpdate;
29
29
  getCustomerEntitlementsWithoutUsage(customerId: string, resourceId: string | undefined): Promise<EntitlementsResponse>;
30
30
  private isGlobalCustomerMissingInCache;
@@ -35,7 +35,18 @@ export declare class RedisCacheService implements CacheService {
35
35
  private getKeysLatestTimestamp;
36
36
  private parseTimestamp;
37
37
  cleanup(): Promise<void>;
38
- getCustomerEntitlement(featureId: string, customerId: string, resourceId: string | undefined): Promise<EntitlementResponse>;
38
+ getCustomerEntitlement<T extends EntitlementType>(query: EntitlementQuery<T>, customerId: string, resourceId: string | undefined): Promise<EntitlementResponse<T>>;
39
39
  private mergeEntitlementWithUsage;
40
+ /**
41
+ * Migrates old cache format to new format.
42
+ * Handles: featureUsage→usageData rename, adds type discriminator, moves fields,
43
+ * adds updatedAt, adds displayName fallback, nextResetDate→usagePeriodEnd.
44
+ */
45
+ private migrateOldCacheFormat;
46
+ /**
47
+ * Migrates old usage data format.
48
+ * Handles backward compatibility for old items that have nextResetDate instead of usagePeriodEnd.
49
+ */
50
+ private migrateUsageData;
40
51
  private executeSafely;
41
52
  }