@stigg/node-server-sdk 4.10.0 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/entitlements/entitlementsApi.d.ts +3 -4
- package/dist/api/entitlements/entitlementsApi.js +3 -8
- package/dist/client.d.ts +11 -1
- package/dist/client.js +26 -4
- package/dist/clientInitialization.js +8 -7
- package/dist/configuration.d.ts +2 -21
- package/dist/configuration.js +1 -1
- package/dist/models.d.ts +30 -6
- package/dist/models.js +12 -2
- package/dist/services/ApiCacheMapper.d.ts +15 -0
- package/dist/services/ApiCacheMapper.js +96 -0
- package/dist/services/EdgeApiClient.d.ts +1 -2
- package/dist/services/EdgeApiClient.js +1 -7
- package/dist/services/LegacyEventPayloadMapper.d.ts +15 -0
- package/dist/services/LegacyEventPayloadMapper.js +102 -0
- package/dist/services/cache/CacheMapper.d.ts +16 -0
- package/dist/services/cache/CacheMapper.js +3 -0
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +3 -3
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +4 -3
- package/dist/services/cache/accessDeniedReasonMapper.d.ts +3 -0
- package/dist/services/cache/accessDeniedReasonMapper.js +16 -0
- package/dist/services/cache/cacheKeysHelpers.d.ts +9 -0
- package/dist/services/cache/cacheKeysHelpers.js +55 -0
- package/dist/services/cache/cacheService.d.ts +10 -28
- package/dist/services/cache/entities/cachedEntitlement.d.ts +20 -0
- package/dist/services/cache/entities/cachedEntitlement.js +53 -0
- package/dist/services/cache/entities/calculatedEntitlement.d.ts +34 -0
- package/dist/services/cache/entities/calculatedEntitlement.js +3 -0
- package/dist/services/cache/entities/entitlementQuery.d.ts +8 -0
- package/dist/services/cache/entities/entitlementQuery.js +3 -0
- package/dist/services/cache/entities/entitlementsMap.d.ts +33 -0
- package/dist/services/cache/entities/entitlementsMap.js +92 -0
- package/dist/services/cache/entities/index.d.ts +6 -0
- package/dist/services/cache/entities/index.js +12 -0
- package/dist/services/cache/entities/usageData.d.ts +11 -0
- package/dist/services/cache/entities/usageData.js +9 -0
- package/dist/services/cache/extractWithDependencies.d.ts +12 -0
- package/dist/services/cache/extractWithDependencies.js +37 -0
- package/dist/services/cache/freshness/EntitlementsFreshener.d.ts +11 -0
- package/dist/services/cache/freshness/EntitlementsFreshener.js +27 -0
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.d.ts +15 -0
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.js +67 -0
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.d.ts +11 -0
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.js +45 -0
- package/dist/services/cache/inMemoryCacheService.d.ts +19 -14
- package/dist/services/cache/inMemoryCacheService.js +44 -69
- package/dist/services/cache/index.d.ts +13 -0
- package/dist/services/cache/index.js +38 -0
- package/dist/services/cache/redis/distributedLocks.d.ts +4 -3
- package/dist/services/cache/redis/distributedLocks.js +5 -4
- package/dist/services/cache/redisCacheService.constants.d.ts +1 -1
- package/dist/services/cache/redisCacheService.constants.js +3 -3
- package/dist/services/cache/redisCacheService.d.ts +54 -17
- package/dist/services/cache/redisCacheService.js +293 -159
- package/dist/services/cache/types/cacheInstrumentation.d.ts +37 -0
- package/dist/services/cache/types/cacheInstrumentation.js +3 -0
- package/dist/services/cache/types/cacheResponse.d.ts +26 -0
- package/dist/services/cache/types/cacheResponse.js +19 -0
- package/dist/services/cache/types/cacheServiceParams.d.ts +20 -0
- package/dist/services/cache/types/cacheServiceParams.js +3 -0
- package/dist/services/cache/types/entitlementFeature.d.ts +19 -0
- package/dist/services/cache/types/entitlementFeature.js +3 -0
- package/dist/services/cache/types/entitlementsMapTransformer.d.ts +4 -0
- package/dist/services/cache/types/entitlementsMapTransformer.js +3 -0
- package/dist/services/cache/types/logger.d.ts +6 -0
- package/dist/services/cache/types/logger.js +3 -0
- package/dist/services/cache/types/redisConfiguration.d.ts +39 -0
- package/dist/services/cache/types/redisConfiguration.js +14 -0
- package/dist/services/entitlementDecisionService.d.ts +14 -2
- package/dist/services/entitlementDecisionService.js +41 -14
- package/dist/services/entitlementsService.d.ts +26 -23
- package/dist/services/entitlementsService.js +126 -110
- package/dist/services/entitlementsService.utils.d.ts +1 -28
- package/dist/services/entitlementsService.utils.js +1 -17
- package/dist/services/eventEmitter.d.ts +1 -1
- package/dist/services/eventEmitterCacheInstrumentation.d.ts +9 -0
- package/dist/services/eventEmitterCacheInstrumentation.js +19 -0
- package/dist/services/inMemoryEntitlementsService.d.ts +5 -6
- package/dist/services/inMemoryEntitlementsService.js +52 -59
- package/dist/services/redisEntitlementsService.d.ts +5 -4
- package/dist/services/redisEntitlementsService.js +2 -2
- package/dist/types.d.ts +2 -0
- package/dist/utils/ModelMapper.d.ts +8 -7
- package/dist/utils/ModelMapper.js +17 -3
- package/dist/{services/cache → utils}/calculateUsagePeriod.js +1 -1
- package/package.json +18 -1
- package/dist/services/cache/cachedEntitlement.d.ts +0 -29
- package/dist/services/cache/cachedEntitlement.js +0 -10
- package/dist/services/cacheInstrumentation.d.ts +0 -18
- package/dist/services/cacheInstrumentation.js +0 -19
- package/dist/utils/CacheMapper.d.ts +0 -6
- package/dist/utils/CacheMapper.js +0 -57
- package/dist/utils/cacheKeysHelpers.d.ts +0 -7
- package/dist/utils/cacheKeysHelpers.js +0 -42
- /package/dist/{services/cache → utils}/calculateUsagePeriod.d.ts +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EntitlementType, ResetPeriodConfigurationFragment, EntitlementResetPeriod, AccessDeniedReason } from '@stigg/api-client-js/src/generated/sdk';
|
|
2
|
+
import { EntitlementCreditRate, EntitlementFeature } from '../types/entitlementFeature';
|
|
3
|
+
/**
|
|
4
|
+
* Note: Optional fields use `| null` instead of `?` to ensure they are explicitly
|
|
5
|
+
* mapped by the CacheMapper {@link CacheMapper}. Using optional properties (`?`)
|
|
6
|
+
* could result in fields being omitted during mapping, whereas `| null` ensures they
|
|
7
|
+
* are always present.
|
|
8
|
+
*/
|
|
9
|
+
interface BaseCalculatedEntitlement {
|
|
10
|
+
type: EntitlementType;
|
|
11
|
+
accessDeniedReason: AccessDeniedReason | null;
|
|
12
|
+
validUntil: number | null;
|
|
13
|
+
}
|
|
14
|
+
export interface CalculatedFeatureEntitlement extends BaseCalculatedEntitlement {
|
|
15
|
+
type: EntitlementType.Feature;
|
|
16
|
+
feature: EntitlementFeature;
|
|
17
|
+
usageLimit: number | null;
|
|
18
|
+
enumValues: string[] | null;
|
|
19
|
+
hasUnlimitedUsage: boolean;
|
|
20
|
+
hasSoftLimit: boolean;
|
|
21
|
+
usagePeriodAnchor: number | null;
|
|
22
|
+
resetPeriod: EntitlementResetPeriod | null;
|
|
23
|
+
resetPeriodConfiguration: ResetPeriodConfigurationFragment | null;
|
|
24
|
+
creditRate: EntitlementCreditRate | null;
|
|
25
|
+
}
|
|
26
|
+
export interface CalculatedCreditEntitlement extends BaseCalculatedEntitlement {
|
|
27
|
+
type: EntitlementType.Credit;
|
|
28
|
+
currency: {
|
|
29
|
+
currencyId: string;
|
|
30
|
+
};
|
|
31
|
+
usageLimit: number;
|
|
32
|
+
}
|
|
33
|
+
export type CalculatedEntitlement = CalculatedFeatureEntitlement | CalculatedCreditEntitlement;
|
|
34
|
+
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,33 @@
|
|
|
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
|
+
import { CacheMapper } from '../CacheMapper';
|
|
6
|
+
/**
|
|
7
|
+
* Type-safe wrapper around Map<string, CachedEntitlement> that encapsulates key building.
|
|
8
|
+
* Prevents errors from manual string key lookups.
|
|
9
|
+
*/
|
|
10
|
+
export declare class EntitlementsMap {
|
|
11
|
+
private readonly map;
|
|
12
|
+
protected constructor(entries?: Iterable<CachedEntitlement>);
|
|
13
|
+
static getUniqueKey(query: EntitlementQuery): string;
|
|
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): void;
|
|
20
|
+
toJSON(): Record<string, CachedEntitlement>;
|
|
21
|
+
static fromJSON(obj: Record<string, unknown>): EntitlementsMap;
|
|
22
|
+
static empty(): EntitlementsMap;
|
|
23
|
+
static fromEntitlements(entries: Iterable<CachedEntitlement>): EntitlementsMap;
|
|
24
|
+
/**
|
|
25
|
+
* Creates an EntitlementsMap by mapping raw inputs using the provided mapper.
|
|
26
|
+
* Filters out null results automatically.
|
|
27
|
+
* Returns both the map and a map of usageUpdatedAt timestamps keyed by entitlement key.
|
|
28
|
+
*/
|
|
29
|
+
static fromInput<T>(mapper: CacheMapper<T>, inputs: T[]): {
|
|
30
|
+
entitlements: EntitlementsMap;
|
|
31
|
+
usageUpdatedAtMap: Map<string, Date>;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntitlementsMap = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const cachedEntitlement_1 = require("./cachedEntitlement");
|
|
6
|
+
const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
|
|
7
|
+
/**
|
|
8
|
+
* Type-safe wrapper around Map<string, CachedEntitlement> that encapsulates key building.
|
|
9
|
+
* Prevents errors from manual string key lookups.
|
|
10
|
+
*/
|
|
11
|
+
class EntitlementsMap {
|
|
12
|
+
constructor(entries) {
|
|
13
|
+
this.map = new Map();
|
|
14
|
+
if (entries) {
|
|
15
|
+
for (const entitlement of entries) {
|
|
16
|
+
this.set(entitlement);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Feature entitlements use raw ID for backward compatibility with existing cache data
|
|
21
|
+
// Credit entitlements use prefix since they're new and need to be distinguishable
|
|
22
|
+
static getUniqueKey(query) {
|
|
23
|
+
if (query.type === sdk_1.EntitlementType.Feature) {
|
|
24
|
+
return query.id;
|
|
25
|
+
}
|
|
26
|
+
return `${query.type}:${query.id}`;
|
|
27
|
+
}
|
|
28
|
+
get(query) {
|
|
29
|
+
return this.map.get(EntitlementsMap.getUniqueKey(query));
|
|
30
|
+
}
|
|
31
|
+
set(entitlement) {
|
|
32
|
+
const key = EntitlementsMap.getUniqueKey(entitlement.getEntitlementQuery());
|
|
33
|
+
this.map.set(key, entitlement);
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
get size() {
|
|
37
|
+
return this.map.size;
|
|
38
|
+
}
|
|
39
|
+
values() {
|
|
40
|
+
return Array.from(this.map.values());
|
|
41
|
+
}
|
|
42
|
+
/** Updates usage data for an entitlement. Returns the updated entitlement or null if not found. */
|
|
43
|
+
updateUsage(entitlementReference, usageData) {
|
|
44
|
+
const existingEntitlement = this.get(entitlementReference);
|
|
45
|
+
if (!existingEntitlement) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const updatedEntitlement = new cachedEntitlement_1.CachedEntitlement(existingEntitlement.calculatedEntitlement, usageData);
|
|
49
|
+
this.set(updatedEntitlement);
|
|
50
|
+
}
|
|
51
|
+
// For serialization (Redis)
|
|
52
|
+
toJSON() {
|
|
53
|
+
return Object.fromEntries(this.map);
|
|
54
|
+
}
|
|
55
|
+
// For deserialization (Redis)
|
|
56
|
+
static fromJSON(obj) {
|
|
57
|
+
const map = new EntitlementsMap();
|
|
58
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
59
|
+
const entitlementData = value;
|
|
60
|
+
// Create actual CachedEntitlement instance (not just a plain object) so instance methods work
|
|
61
|
+
const entitlement = new cachedEntitlement_1.CachedEntitlement(entitlementData.calculatedEntitlement, entitlementData.usageData);
|
|
62
|
+
map.map.set(key, entitlement);
|
|
63
|
+
}
|
|
64
|
+
return map;
|
|
65
|
+
}
|
|
66
|
+
static empty() {
|
|
67
|
+
return new EntitlementsMap();
|
|
68
|
+
}
|
|
69
|
+
static fromEntitlements(entries) {
|
|
70
|
+
return new EntitlementsMap(entries);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Creates an EntitlementsMap by mapping raw inputs using the provided mapper.
|
|
74
|
+
* Filters out null results automatically.
|
|
75
|
+
* Returns both the map and a map of usageUpdatedAt timestamps keyed by entitlement key.
|
|
76
|
+
*/
|
|
77
|
+
static fromInput(mapper, inputs) {
|
|
78
|
+
const entitlements = new EntitlementsMap();
|
|
79
|
+
const usageUpdatedAtMap = new Map();
|
|
80
|
+
const mappedEntitlements = (0, lodash_1.compact)(inputs.map((input) => mapper.mapEntitlement(input)));
|
|
81
|
+
for (const { entitlement, usageUpdatedAt } of mappedEntitlements) {
|
|
82
|
+
entitlements.set(entitlement);
|
|
83
|
+
if (usageUpdatedAt) {
|
|
84
|
+
const key = EntitlementsMap.getUniqueKey(entitlement.getEntitlementQuery());
|
|
85
|
+
usageUpdatedAtMap.set(key, new Date(usageUpdatedAt));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { entitlements, usageUpdatedAtMap };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.EntitlementsMap = EntitlementsMap;
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzTWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2VudGl0aWVzL2VudGl0bGVtZW50c01hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBaUM7QUFDakMsMkRBQXdEO0FBQ3hELGdFQUF5RTtBQUt6RTs7O0dBR0c7QUFDSCxNQUFhLGVBQWU7SUFHMUIsWUFBc0IsT0FBcUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksT0FBTyxFQUFFO1lBQ1gsS0FBSyxNQUFNLFdBQVcsSUFBSSxPQUFPLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdkI7U0FDRjtJQUNILENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsa0ZBQWtGO0lBQ2xGLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBdUI7UUFDekMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFlLENBQUMsT0FBTyxFQUFFO1lBQzFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNqQjtRQUNELE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsR0FBRyxDQUE0QixLQUEwQjtRQUN2RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQXFDLENBQUM7SUFDL0YsQ0FBQztJQUVELEdBQUcsQ0FBQyxXQUE4QjtRQUNoQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLE9B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
|
|
@@ -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, isCreditEntitlement } from './cachedEntitlement';
|
|
6
|
+
export { EntitlementsMap } from './entitlementsMap';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntitlementsMap = exports.isCreditEntitlement = 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, "isCreditEntitlement", { enumerable: true, get: function () { return cachedEntitlement_1.isCreditEntitlement; } });
|
|
10
|
+
var entitlementsMap_1 = require("./entitlementsMap");
|
|
11
|
+
Object.defineProperty(exports, "EntitlementsMap", { enumerable: true, get: function () { return entitlementsMap_1.EntitlementsMap; } });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvZW50aXRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQXlFO0FBQWhFLHNHQUFBLGVBQWUsT0FBQTtBQVF4Qix5REFBbUc7QUFBMUYsc0hBQUEsaUJBQWlCLE9BQUE7QUFBRSx5SEFBQSxvQkFBb0IsT0FBQTtBQUFFLHdIQUFBLG1CQUFtQixPQUFBO0FBQ3JFLHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUEifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Note: Optional fields use `| null` instead of `?` to ensure they are explicitly
|
|
3
|
+
* mapped by the CacheMapper {@link CacheMapper}. Using optional properties (`?`)
|
|
4
|
+
* could result in fields being omitted during mapping, whereas `| null` ensures they
|
|
5
|
+
* are always present.
|
|
6
|
+
*/
|
|
7
|
+
export interface UsageData {
|
|
8
|
+
currentUsage: number;
|
|
9
|
+
usagePeriodStart: number | null;
|
|
10
|
+
usagePeriodEnd: number | null;
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Note: Optional fields use `| null` instead of `?` to ensure they are explicitly
|
|
4
|
+
* mapped by the CacheMapper {@link CacheMapper}. Using optional properties (`?`)
|
|
5
|
+
* could result in fields being omitted during mapping, whereas `| null` ensures they
|
|
6
|
+
* are always present.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2VEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2VudGl0aWVzL3VzYWdlRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0cifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EntitlementsMap, EntitlementQuery } from './entities';
|
|
2
|
+
import { EntitlementsMapTransformer } from './types/entitlementsMapTransformer';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the requested entitlement along with its dependencies (e.g., credit entitlement for features with creditRate).
|
|
5
|
+
* Returns an empty map if the entitlement is not found.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ExtractWithDependencies implements EntitlementsMapTransformer {
|
|
8
|
+
private readonly query;
|
|
9
|
+
constructor(query: EntitlementQuery);
|
|
10
|
+
transform(entitlements: EntitlementsMap): EntitlementsMap;
|
|
11
|
+
private getCreditRateDependency;
|
|
12
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExtractWithDependencies = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const entities_1 = require("./entities");
|
|
6
|
+
/**
|
|
7
|
+
* Extracts the requested entitlement along with its dependencies (e.g., credit entitlement for features with creditRate).
|
|
8
|
+
* Returns an empty map if the entitlement is not found.
|
|
9
|
+
*/
|
|
10
|
+
class ExtractWithDependencies {
|
|
11
|
+
constructor(query) {
|
|
12
|
+
this.query = query;
|
|
13
|
+
}
|
|
14
|
+
transform(entitlements) {
|
|
15
|
+
const entitlement = entitlements.get(this.query);
|
|
16
|
+
if (!entitlement) {
|
|
17
|
+
return entities_1.EntitlementsMap.empty();
|
|
18
|
+
}
|
|
19
|
+
const credit = this.getCreditRateDependency(entitlement, entitlements);
|
|
20
|
+
return entities_1.EntitlementsMap.fromEntitlements((0, lodash_1.compact)([entitlement, credit]));
|
|
21
|
+
}
|
|
22
|
+
getCreditRateDependency(entitlement, entitlements) {
|
|
23
|
+
if (!(0, entities_1.isFeatureEntitlement)(entitlement)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const creditRate = entitlement.calculatedEntitlement.creditRate;
|
|
27
|
+
if (!creditRate) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return entitlements.get({
|
|
31
|
+
type: entities_1.EntitlementType.Credit,
|
|
32
|
+
id: creditRate.currencyId,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ExtractWithDependencies = ExtractWithDependencies;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdFdpdGhEZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvZXh0cmFjdFdpdGhEZXBlbmRlbmNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWlDO0FBQ2pDLHlDQU1vQjtBQUdwQjs7O0dBR0c7QUFDSCxNQUFhLHVCQUF1QjtJQUNsQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtJQUFHLENBQUM7SUFFeEQsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTywwQkFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV2RSxPQUFPLDBCQUFlLENBQUMsZ0JBQWdCLENBQUMsSUFBQSxnQkFBTyxFQUFDLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sdUJBQXVCLENBQzdCLFdBQWlDLEVBQ2pDLFlBQTZCO1FBRTdCLElBQUksQ0FBQyxJQUFBLCtCQUFvQixFQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztRQUNoRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDdEIsSUFBSSxFQUFFLDBCQUFlLENBQUMsTUFBTTtZQUM1QixFQUFFLEVBQUUsVUFBVSxDQUFDLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBaENELDBEQWdDQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EntitlementsMap } from '../entities';
|
|
2
|
+
import { EntitlementsMapTransformer } from '../types/entitlementsMapTransformer';
|
|
3
|
+
/**
|
|
4
|
+
* Ensures cached entitlements reflect the current state at read time.
|
|
5
|
+
* Cached data may become stale between writes, so this applies
|
|
6
|
+
* transformations to correct time-sensitive values before returning.
|
|
7
|
+
*/
|
|
8
|
+
export declare class EntitlementsFreshener implements EntitlementsMapTransformer {
|
|
9
|
+
private readonly transformations;
|
|
10
|
+
transform(entitlements: EntitlementsMap): EntitlementsMap;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntitlementsFreshener = void 0;
|
|
4
|
+
const UsagePeriodReset_1 = require("./transformers/UsagePeriodReset");
|
|
5
|
+
const CreditAccessPropagator_1 = require("./transformers/CreditAccessPropagator");
|
|
6
|
+
/**
|
|
7
|
+
* Ensures cached entitlements reflect the current state at read time.
|
|
8
|
+
* Cached data may become stale between writes, so this applies
|
|
9
|
+
* transformations to correct time-sensitive values before returning.
|
|
10
|
+
*/
|
|
11
|
+
class EntitlementsFreshener {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.transformations = [
|
|
14
|
+
new UsagePeriodReset_1.UsagePeriodReset(),
|
|
15
|
+
new CreditAccessPropagator_1.CreditAccessPropagator(),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
transform(entitlements) {
|
|
19
|
+
let result = entitlements;
|
|
20
|
+
for (const transformation of this.transformations) {
|
|
21
|
+
result = transformation.transform(result);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.EntitlementsFreshener = EntitlementsFreshener;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXRsZW1lbnRzRnJlc2hlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2ZyZXNobmVzcy9FbnRpdGxlbWVudHNGcmVzaGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsc0VBQW1FO0FBQ25FLGtGQUErRTtBQUUvRTs7OztHQUlHO0FBQ0gsTUFBYSxxQkFBcUI7SUFBbEM7UUFDbUIsb0JBQWUsR0FBaUM7WUFDL0QsSUFBSSxtQ0FBZ0IsRUFBRTtZQUN0QixJQUFJLCtDQUFzQixFQUFFO1NBQzdCLENBQUM7SUFXSixDQUFDO0lBVEMsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQztRQUUxQixLQUFLLE1BQU0sY0FBYyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDakQsTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0M7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFmRCxzREFlQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EntitlementsMap } from '../../entities';
|
|
2
|
+
import { EntitlementsMapTransformer } from '../../types/entitlementsMapTransformer';
|
|
3
|
+
/**
|
|
4
|
+
* Propagates credit access state to features linked via creditRate.
|
|
5
|
+
* - Sets InsufficientCredits when linked credit balance is depleted
|
|
6
|
+
* - Clears InsufficientCredits when linked credit balance is restored
|
|
7
|
+
*/
|
|
8
|
+
export declare class CreditAccessPropagator implements EntitlementsMapTransformer {
|
|
9
|
+
transform(entitlements: EntitlementsMap): EntitlementsMap;
|
|
10
|
+
private processEntitlement;
|
|
11
|
+
private getCachedCreditAccessReason;
|
|
12
|
+
private getCreditAccessDeniedReason;
|
|
13
|
+
private hasSufficientCredits;
|
|
14
|
+
private withCreditAccessReason;
|
|
15
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreditAccessPropagator = void 0;
|
|
4
|
+
const entities_1 = require("../../entities");
|
|
5
|
+
const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
|
|
6
|
+
/**
|
|
7
|
+
* Propagates credit access state to features linked via creditRate.
|
|
8
|
+
* - Sets InsufficientCredits when linked credit balance is depleted
|
|
9
|
+
* - Clears InsufficientCredits when linked credit balance is restored
|
|
10
|
+
*/
|
|
11
|
+
class CreditAccessPropagator {
|
|
12
|
+
transform(entitlements) {
|
|
13
|
+
const result = entities_1.EntitlementsMap.empty();
|
|
14
|
+
// Cache credit access reason per currencyId to avoid redundant
|
|
15
|
+
// lookups when multiple features share the same currency
|
|
16
|
+
const creditAccessCache = new Map();
|
|
17
|
+
for (const entitlement of entitlements.values()) {
|
|
18
|
+
result.set(this.processEntitlement(entitlement, entitlements, creditAccessCache));
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
processEntitlement(entitlement, entitlements, cache) {
|
|
23
|
+
if (!(0, entities_1.isFeatureEntitlement)(entitlement) || !entitlement.calculatedEntitlement.creditRate) {
|
|
24
|
+
return entitlement;
|
|
25
|
+
}
|
|
26
|
+
const { currencyId } = entitlement.calculatedEntitlement.creditRate;
|
|
27
|
+
const creditAccessReason = this.getCachedCreditAccessReason(currencyId, entitlements, cache);
|
|
28
|
+
return this.withCreditAccessReason(entitlement, creditAccessReason);
|
|
29
|
+
}
|
|
30
|
+
getCachedCreditAccessReason(currencyId, entitlements, cache) {
|
|
31
|
+
const cached = cache.get(currencyId);
|
|
32
|
+
if (cached !== undefined) {
|
|
33
|
+
return cached;
|
|
34
|
+
}
|
|
35
|
+
const credit = entitlements.get({
|
|
36
|
+
type: entities_1.EntitlementType.Credit,
|
|
37
|
+
id: currencyId,
|
|
38
|
+
});
|
|
39
|
+
const reason = this.getCreditAccessDeniedReason(credit);
|
|
40
|
+
cache.set(currencyId, reason);
|
|
41
|
+
return reason;
|
|
42
|
+
}
|
|
43
|
+
getCreditAccessDeniedReason(credit) {
|
|
44
|
+
if (credit && this.hasSufficientCredits(credit)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return sdk_1.AccessDeniedReason.InsufficientCredits;
|
|
48
|
+
}
|
|
49
|
+
hasSufficientCredits(credit) {
|
|
50
|
+
const { usageLimit } = credit.calculatedEntitlement;
|
|
51
|
+
const { currentUsage } = credit.usageData;
|
|
52
|
+
return usageLimit - currentUsage > 0;
|
|
53
|
+
}
|
|
54
|
+
withCreditAccessReason(entitlement, creditAccessReason) {
|
|
55
|
+
const currentReason = entitlement.calculatedEntitlement.accessDeniedReason;
|
|
56
|
+
// Don't overwrite other access denied reasons
|
|
57
|
+
if (currentReason !== null && currentReason !== sdk_1.AccessDeniedReason.InsufficientCredits) {
|
|
58
|
+
return entitlement;
|
|
59
|
+
}
|
|
60
|
+
if (creditAccessReason === currentReason) {
|
|
61
|
+
return entitlement;
|
|
62
|
+
}
|
|
63
|
+
return new entities_1.CachedEntitlement(Object.assign(Object.assign({}, entitlement.calculatedEntitlement), { accessDeniedReason: creditAccessReason }), entitlement.usageData);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.CreditAccessPropagator = CreditAccessPropagator;
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlZGl0QWNjZXNzUHJvcGFnYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9mcmVzaG5lc3MvdHJhbnNmb3JtZXJzL0NyZWRpdEFjY2Vzc1Byb3BhZ2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTJHO0FBRTNHLGdFQUE0RTtBQUU1RTs7OztHQUlHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakMsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLDBCQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkMsK0RBQStEO1FBQy9ELHlEQUF5RDtRQUN6RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUF5RCxDQUFDO1FBRTNGLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1NBQ25GO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixXQUE4QixFQUM5QixZQUE2QixFQUM3QixLQUFpRTtRQUVqRSxJQUFJLENBQUMsSUFBQSwrQkFBb0IsRUFBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7WUFDdkYsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFFRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztRQUNwRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTdGLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTywyQkFBMkIsQ0FDakMsVUFBa0IsRUFDbEIsWUFBNkIsRUFDN0IsS0FBaUU7UUFFakUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDeEIsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDOUIsSUFBSSxFQUFFLDBCQUFlLENBQUMsTUFBTTtZQUM1QixFQUFFLEVBQUUsVUFBVTtTQUNmLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4RCxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sMkJBQTJCLENBQ2pDLE1BQTZEO1FBRTdELElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyx3QkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQztJQUNoRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBaUQ7UUFDNUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUNwRCxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxPQUFPLFVBQVUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsV0FBdUQsRUFDdkQsa0JBQWlFO1FBRWpFLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQztRQUUzRSw4Q0FBOEM7UUFDOUMsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyx3QkFBa0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUN0RixPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUVELElBQUksa0JBQWtCLEtBQUssYUFBYSxFQUFFO1lBQ3hDLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxJQUFJLDRCQUFpQixpQ0FDckIsV0FBVyxDQUFDLHFCQUFxQixLQUFFLGtCQUFrQixFQUFFLGtCQUFrQixLQUM5RSxXQUFXLENBQUMsU0FBUyxDQUN0QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkZELHdEQXVGQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EntitlementsMap } from '../../entities';
|
|
2
|
+
import { EntitlementsMapTransformer } from '../../types/entitlementsMapTransformer';
|
|
3
|
+
/**
|
|
4
|
+
* Resets usage data when the usage period has ended.
|
|
5
|
+
* For metered features, if the current time is past usagePeriodEnd,
|
|
6
|
+
* resets currentUsage to 0 and recalculates the period boundaries.
|
|
7
|
+
*/
|
|
8
|
+
export declare class UsagePeriodReset implements EntitlementsMapTransformer {
|
|
9
|
+
transform(entitlements: EntitlementsMap): EntitlementsMap;
|
|
10
|
+
private transformEntitlement;
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsagePeriodReset = void 0;
|
|
4
|
+
const entities_1 = require("../../entities");
|
|
5
|
+
const featureTypes_1 = require("../../../../utils/featureTypes");
|
|
6
|
+
const calculateUsagePeriod_1 = require("../../../../utils/calculateUsagePeriod");
|
|
7
|
+
/**
|
|
8
|
+
* Resets usage data when the usage period has ended.
|
|
9
|
+
* For metered features, if the current time is past usagePeriodEnd,
|
|
10
|
+
* resets currentUsage to 0 and recalculates the period boundaries.
|
|
11
|
+
*/
|
|
12
|
+
class UsagePeriodReset {
|
|
13
|
+
transform(entitlements) {
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const result = entities_1.EntitlementsMap.empty();
|
|
16
|
+
for (const entitlement of entitlements.values()) {
|
|
17
|
+
result.set(this.transformEntitlement(entitlement, now));
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
transformEntitlement(entitlement, now) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
if (!(0, entities_1.isFeatureEntitlement)(entitlement)) {
|
|
24
|
+
return entitlement;
|
|
25
|
+
}
|
|
26
|
+
const { calculatedEntitlement, usageData } = entitlement;
|
|
27
|
+
const wasPeriodOver = (0, featureTypes_1.isMetered)(calculatedEntitlement.feature) && usageData.usagePeriodEnd && usageData.usagePeriodEnd < now.getTime();
|
|
28
|
+
if (!wasPeriodOver) {
|
|
29
|
+
return entitlement;
|
|
30
|
+
}
|
|
31
|
+
const { resetPeriod, usagePeriodAnchor } = calculatedEntitlement;
|
|
32
|
+
let usagePeriodStart;
|
|
33
|
+
let usagePeriodEnd;
|
|
34
|
+
if (usagePeriodAnchor && resetPeriod) {
|
|
35
|
+
({ usagePeriodStart, usagePeriodEnd } = (0, calculateUsagePeriod_1.calculateUsagePeriod)(new Date(usagePeriodAnchor), now, resetPeriod));
|
|
36
|
+
}
|
|
37
|
+
return new entities_1.CachedEntitlement(calculatedEntitlement, {
|
|
38
|
+
currentUsage: 0,
|
|
39
|
+
usagePeriodStart: (_a = usagePeriodStart === null || usagePeriodStart === void 0 ? void 0 : usagePeriodStart.getTime()) !== null && _a !== void 0 ? _a : null,
|
|
40
|
+
usagePeriodEnd: (_b = usagePeriodEnd === null || usagePeriodEnd === void 0 ? void 0 : usagePeriodEnd.getTime()) !== null && _b !== void 0 ? _b : null,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.UsagePeriodReset = UsagePeriodReset;
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXNhZ2VQZXJpb2RSZXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9mcmVzaG5lc3MvdHJhbnNmb3JtZXJzL1VzYWdlUGVyaW9kUmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBGO0FBRTFGLGlFQUEyRDtBQUMzRCxpRkFBOEU7QUFFOUU7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCLFNBQVMsQ0FBQyxZQUE2QjtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLDBCQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkMsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsV0FBOEIsRUFBRSxHQUFTOztRQUNwRSxJQUFJLENBQUMsSUFBQSwrQkFBb0IsRUFBQyxXQUFXLENBQUMsRUFBRTtZQUN0QyxPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUVELE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFFekQsTUFBTSxhQUFhLEdBQ2pCLElBQUEsd0JBQVMsRUFBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRW5ILElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEdBQUcscUJBQXFCLENBQUM7UUFFakUsSUFBSSxnQkFBa0MsQ0FBQztRQUN2QyxJQUFJLGNBQWdDLENBQUM7UUFFckMsSUFBSSxpQkFBaUIsSUFBSSxXQUFXLEVBQUU7WUFDcEMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsMkNBQW9CLEVBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RztRQUVELE9BQU8sSUFBSSw0QkFBaUIsQ0FBQyxxQkFBcUIsRUFBRTtZQUNsRCxZQUFZLEVBQUUsQ0FBQztZQUNmLGdCQUFnQixFQUFFLE1BQUEsZ0JBQWdCLGFBQWhCLGdCQUFnQix1QkFBaEIsZ0JBQWdCLENBQUUsT0FBTyxFQUFFLG1DQUFJLElBQUk7WUFDckQsY0FBYyxFQUFFLE1BQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLE9BQU8sRUFBRSxtQ0FBSSxJQUFJO1NBQ2xELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpDRCw0Q0F5Q0MifQ==
|
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
import { CacheService
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { CacheService } from './cacheService';
|
|
2
|
+
import { CustomerIdentity, SetCustomerParams, GetCustomerEntitlementParams, UpdateUsageParams } from './types/cacheServiceParams';
|
|
3
|
+
import { EntitlementType, EntitlementsMap } from './entities';
|
|
4
|
+
import { CacheMapper } from './CacheMapper';
|
|
5
|
+
import { OneOrMany } from '../../types';
|
|
6
|
+
import { EntitlementResponse, EntitlementsResponse } from './types/cacheResponse';
|
|
7
|
+
import { CacheInstrumentation } from './types/cacheInstrumentation';
|
|
8
|
+
import { AccessDeniedReason } from '@stigg/api-client-js/src/generated/sdk';
|
|
6
9
|
export declare function getApproxSizeBytes(obj: any): number;
|
|
7
10
|
export type CachedCustomerEntitlements = {
|
|
8
|
-
entitlements:
|
|
11
|
+
entitlements: EntitlementsMap;
|
|
9
12
|
accessDeniedReason: AccessDeniedReason | null;
|
|
10
13
|
};
|
|
11
|
-
export declare class InMemoryCacheService implements CacheService {
|
|
14
|
+
export declare class InMemoryCacheService<Input> implements CacheService<Input> {
|
|
12
15
|
private readonly instrumentation;
|
|
16
|
+
private readonly cacheMapper;
|
|
13
17
|
private readonly entitlements;
|
|
14
|
-
|
|
18
|
+
private readonly freshen;
|
|
19
|
+
constructor(maxSizeBytes: number, instrumentation: CacheInstrumentation, cacheMapper: CacheMapper<Input>);
|
|
15
20
|
waitForInitialization(): Promise<void>;
|
|
16
21
|
clearCache: () => void;
|
|
17
|
-
setCustomer(customerId
|
|
18
|
-
|
|
19
|
-
getCustomerEntitlements(customerId
|
|
20
|
-
|
|
21
|
-
getCustomerEntitlement
|
|
22
|
-
|
|
22
|
+
setCustomer({ customerId, resourceId, entitlements: entitlementsInput, accessDeniedReason, }: SetCustomerParams<Input>): EntitlementsMap;
|
|
23
|
+
purge(customers: OneOrMany<CustomerIdentity>): void;
|
|
24
|
+
getCustomerEntitlements({ customerId, resourceId }: CustomerIdentity): EntitlementsResponse;
|
|
25
|
+
updateUsage<T extends EntitlementType>({ customerId, resourceId, entitlementReference, usage, }: UpdateUsageParams<T>): void;
|
|
26
|
+
getCustomerEntitlement<T extends EntitlementType>(params: GetCustomerEntitlementParams<T>): EntitlementResponse<T>;
|
|
27
|
+
private getCached;
|
|
23
28
|
}
|