@stigg/node-server-sdk 4.21.1 → 4.22.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/client.js +8 -8
- package/dist/clientInitialization.js +6 -6
- package/dist/configuration.d.ts +2 -2
- package/dist/models.d.ts +1 -1
- package/dist/services/LegacyEventPayloadMapper.d.ts +1 -2
- package/dist/services/LegacyEventPayloadMapper.js +1 -1
- package/dist/services/entitlementDecisionService.d.ts +1 -2
- package/dist/services/entitlementDecisionService.js +5 -5
- package/dist/services/entitlementsService.d.ts +2 -4
- package/dist/services/entitlementsService.js +29 -31
- package/dist/services/eventEmitter.d.ts +1 -1
- package/dist/services/eventEmitterCacheInstrumentation.d.ts +1 -1
- package/dist/services/inMemoryEntitlementsService.d.ts +2 -3
- package/dist/services/inMemoryEntitlementsService.js +4 -5
- package/dist/services/redisEntitlementsService.d.ts +3 -3
- package/dist/services/redisEntitlementsService.js +3 -3
- package/dist/utils/ModelMapper.d.ts +1 -1
- package/dist/utils/ModelMapper.js +22 -24
- package/dist/utils/entitlementFallbackUtils.d.ts +1 -1
- package/dist/utils/entitlementFallbackUtils.js +3 -3
- package/package.json +3 -1
- package/dist/services/ApiCacheMapper.d.ts +0 -15
- package/dist/services/ApiCacheMapper.js +0 -100
- package/dist/services/cache/CacheMapper.d.ts +0 -16
- package/dist/services/cache/CacheMapper.js +0 -3
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +0 -28
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +0 -184
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.d.ts +0 -22
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.js +0 -16
- package/dist/services/cache/RedisSingleExecutionService/index.d.ts +0 -1
- package/dist/services/cache/RedisSingleExecutionService/index.js +0 -6
- package/dist/services/cache/accessDeniedReasonMapper.d.ts +0 -3
- package/dist/services/cache/accessDeniedReasonMapper.js +0 -15
- package/dist/services/cache/cacheKeysHelpers.d.ts +0 -9
- package/dist/services/cache/cacheKeysHelpers.js +0 -55
- package/dist/services/cache/cacheService.d.ts +0 -13
- package/dist/services/cache/cacheService.js +0 -3
- package/dist/services/cache/entities/cachedEntitlement.d.ts +0 -20
- package/dist/services/cache/entities/cachedEntitlement.js +0 -53
- package/dist/services/cache/entities/calculatedEntitlement.d.ts +0 -39
- package/dist/services/cache/entities/calculatedEntitlement.js +0 -3
- package/dist/services/cache/entities/entitlementQuery.d.ts +0 -8
- package/dist/services/cache/entities/entitlementQuery.js +0 -3
- package/dist/services/cache/entities/entitlementsMap.d.ts +0 -33
- package/dist/services/cache/entities/entitlementsMap.js +0 -92
- package/dist/services/cache/entities/index.d.ts +0 -6
- package/dist/services/cache/entities/index.js +0 -12
- package/dist/services/cache/entities/usageData.d.ts +0 -11
- package/dist/services/cache/entities/usageData.js +0 -9
- package/dist/services/cache/extractWithDependencies.d.ts +0 -12
- package/dist/services/cache/extractWithDependencies.js +0 -37
- package/dist/services/cache/freshness/EntitlementsFreshener.d.ts +0 -11
- package/dist/services/cache/freshness/EntitlementsFreshener.js +0 -27
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.d.ts +0 -15
- package/dist/services/cache/freshness/transformers/CreditAccessPropagator.js +0 -67
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.d.ts +0 -11
- package/dist/services/cache/freshness/transformers/UsagePeriodReset.js +0 -45
- package/dist/services/cache/inMemoryCacheService.d.ts +0 -28
- package/dist/services/cache/inMemoryCacheService.js +0 -80
- package/dist/services/cache/index.d.ts +0 -13
- package/dist/services/cache/index.js +0 -38
- package/dist/services/cache/redis/distributedLocks.d.ts +0 -15
- package/dist/services/cache/redis/distributedLocks.js +0 -90
- package/dist/services/cache/redisCacheService.constants.d.ts +0 -6
- package/dist/services/cache/redisCacheService.constants.js +0 -10
- package/dist/services/cache/redisCacheService.d.ts +0 -78
- package/dist/services/cache/redisCacheService.js +0 -519
- package/dist/services/cache/types/cacheInstrumentation.d.ts +0 -37
- package/dist/services/cache/types/cacheInstrumentation.js +0 -3
- package/dist/services/cache/types/cacheResponse.d.ts +0 -26
- package/dist/services/cache/types/cacheResponse.js +0 -19
- package/dist/services/cache/types/cacheServiceParams.d.ts +0 -20
- package/dist/services/cache/types/cacheServiceParams.js +0 -3
- package/dist/services/cache/types/entitlementFeature.d.ts +0 -19
- package/dist/services/cache/types/entitlementFeature.js +0 -3
- package/dist/services/cache/types/entitlementsMapTransformer.d.ts +0 -4
- package/dist/services/cache/types/entitlementsMapTransformer.js +0 -3
- package/dist/services/cache/types/logger.d.ts +0 -6
- package/dist/services/cache/types/logger.js +0 -3
- package/dist/services/cache/types/redisConfiguration.d.ts +0 -39
- package/dist/services/cache/types/redisConfiguration.js +0 -14
- package/dist/types.d.ts +0 -3
- package/dist/types.js +0 -3
- package/dist/utils/calculateUsagePeriod.d.ts +0 -5
- package/dist/utils/calculateUsagePeriod.js +0 -37
- package/dist/utils/dateUtils.d.ts +0 -2
- package/dist/utils/dateUtils.js +0 -13
- package/dist/utils/decorators/ReuseOngoingExecution.d.ts +0 -2
- package/dist/utils/decorators/ReuseOngoingExecution.js +0 -38
- package/dist/utils/featureTypes.d.ts +0 -10
- package/dist/utils/featureTypes.js +0 -24
|
@@ -1,12 +0,0 @@
|
|
|
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==
|
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
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==
|
|
@@ -1,12 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdFdpdGhEZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvZXh0cmFjdFdpdGhEZXBlbmRlbmNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWlDO0FBQ2pDLHlDQU1vQjtBQUdwQjs7O0dBR0c7QUFDSCxNQUFhLHVCQUF1QjtJQUNsQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtJQUFHLENBQUM7SUFFeEQsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLDBCQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFdkUsT0FBTywwQkFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUEsZ0JBQU8sRUFBQyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLHVCQUF1QixDQUM3QixXQUFpQyxFQUNqQyxZQUE2QjtRQUU3QixJQUFJLENBQUMsSUFBQSwrQkFBb0IsRUFBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQ3RCLElBQUksRUFBRSwwQkFBZSxDQUFDLE1BQU07WUFDNUIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhDRCwwREFnQ0MifQ==
|
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXRsZW1lbnRzRnJlc2hlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL2ZyZXNobmVzcy9FbnRpdGxlbWVudHNGcmVzaGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsc0VBQW1FO0FBQ25FLGtGQUErRTtBQUUvRTs7OztHQUlHO0FBQ0gsTUFBYSxxQkFBcUI7SUFBbEM7UUFDbUIsb0JBQWUsR0FBaUM7WUFDL0QsSUFBSSxtQ0FBZ0IsRUFBRTtZQUN0QixJQUFJLCtDQUFzQixFQUFFO1NBQzdCLENBQUM7SUFXSixDQUFDO0lBVEMsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQztRQUUxQixLQUFLLE1BQU0sY0FBYyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBZkQsc0RBZUMifQ==
|
|
@@ -1,15 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlZGl0QWNjZXNzUHJvcGFnYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9mcmVzaG5lc3MvdHJhbnNmb3JtZXJzL0NyZWRpdEFjY2Vzc1Byb3BhZ2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTJHO0FBRTNHLGdFQUE0RTtBQUU1RTs7OztHQUlHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakMsU0FBUyxDQUFDLFlBQTZCO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLDBCQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkMsK0RBQStEO1FBQy9ELHlEQUF5RDtRQUN6RCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUF5RCxDQUFDO1FBRTNGLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsV0FBOEIsRUFDOUIsWUFBNkIsRUFDN0IsS0FBaUU7UUFFakUsSUFBSSxDQUFDLElBQUEsK0JBQW9CLEVBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEYsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUVELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO1FBQ3BFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFN0YsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLDJCQUEyQixDQUNqQyxVQUFrQixFQUNsQixZQUE2QixFQUM3QixLQUFpRTtRQUVqRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQzlCLElBQUksRUFBRSwwQkFBZSxDQUFDLE1BQU07WUFDNUIsRUFBRSxFQUFFLFVBQVU7U0FDZixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDJCQUEyQixDQUNqQyxNQUE2RDtRQUU3RCxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLHdCQUFrQixDQUFDLG1CQUFtQixDQUFDO0lBQ2hELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxNQUFpRDtRQUM1RSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1FBQ3BELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzFDLE9BQU8sVUFBVSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixXQUF1RCxFQUN2RCxrQkFBaUU7UUFFakUsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDO1FBRTNFLDhDQUE4QztRQUM5QyxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksYUFBYSxLQUFLLHdCQUFrQixDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdkYsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUVELElBQUksa0JBQWtCLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDekMsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sSUFBSSw0QkFBaUIsaUNBQ3JCLFdBQVcsQ0FBQyxxQkFBcUIsS0FBRSxrQkFBa0IsRUFBRSxrQkFBa0IsS0FDOUUsV0FBVyxDQUFDLFNBQVMsQ0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZGRCx3REF1RkMifQ==
|
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXNhZ2VQZXJpb2RSZXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9mcmVzaG5lc3MvdHJhbnNmb3JtZXJzL1VzYWdlUGVyaW9kUmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBGO0FBRTFGLGlFQUEyRDtBQUMzRCxpRkFBOEU7QUFFOUU7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCLFNBQVMsQ0FBQyxZQUE2QjtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLDBCQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkMsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFdBQThCLEVBQUUsR0FBUzs7UUFDcEUsSUFBSSxDQUFDLElBQUEsK0JBQW9CLEVBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBRUQsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUV6RCxNQUFNLGFBQWEsR0FDakIsSUFBQSx3QkFBUyxFQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbkgsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEdBQUcscUJBQXFCLENBQUM7UUFFakUsSUFBSSxnQkFBa0MsQ0FBQztRQUN2QyxJQUFJLGNBQWdDLENBQUM7UUFFckMsSUFBSSxpQkFBaUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBQSwyQ0FBb0IsRUFBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9HLENBQUM7UUFFRCxPQUFPLElBQUksNEJBQWlCLENBQUMscUJBQXFCLEVBQUU7WUFDbEQsWUFBWSxFQUFFLENBQUM7WUFDZixnQkFBZ0IsRUFBRSxNQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLE9BQU8sRUFBRSxtQ0FBSSxJQUFJO1lBQ3JELGNBQWMsRUFBRSxNQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxPQUFPLEVBQUUsbUNBQUksSUFBSTtTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6Q0QsNENBeUNDIn0=
|
|
@@ -1,28 +0,0 @@
|
|
|
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';
|
|
9
|
-
export declare function getApproxSizeBytes(obj: any): number;
|
|
10
|
-
export type CachedCustomerEntitlements = {
|
|
11
|
-
entitlements: EntitlementsMap;
|
|
12
|
-
accessDeniedReason: AccessDeniedReason | null;
|
|
13
|
-
};
|
|
14
|
-
export declare class InMemoryCacheService<Input> implements CacheService<Input> {
|
|
15
|
-
private readonly instrumentation;
|
|
16
|
-
private readonly cacheMapper;
|
|
17
|
-
private readonly entitlements;
|
|
18
|
-
private readonly freshen;
|
|
19
|
-
constructor(maxSizeBytes: number, instrumentation: CacheInstrumentation, cacheMapper: CacheMapper<Input>);
|
|
20
|
-
waitForInitialization(): Promise<void>;
|
|
21
|
-
clearCache: () => void;
|
|
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;
|
|
28
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InMemoryCacheService = void 0;
|
|
4
|
-
exports.getApproxSizeBytes = getApproxSizeBytes;
|
|
5
|
-
const entities_1 = require("./entities");
|
|
6
|
-
const cacheKeysHelpers_1 = require("./cacheKeysHelpers");
|
|
7
|
-
const lru_cache_1 = require("lru-cache");
|
|
8
|
-
const cacheResponse_1 = require("./types/cacheResponse");
|
|
9
|
-
const accessDeniedReasonMapper_1 = require("./accessDeniedReasonMapper");
|
|
10
|
-
const EntitlementsFreshener_1 = require("./freshness/EntitlementsFreshener");
|
|
11
|
-
const extractWithDependencies_1 = require("./extractWithDependencies");
|
|
12
|
-
const textEncoder = new TextEncoder();
|
|
13
|
-
function getApproxSizeBytes(obj) {
|
|
14
|
-
return textEncoder.encode(typeof obj === 'string' ? obj : JSON.stringify(obj)).length;
|
|
15
|
-
}
|
|
16
|
-
class InMemoryCacheService {
|
|
17
|
-
constructor(maxSizeBytes, instrumentation, cacheMapper) {
|
|
18
|
-
this.instrumentation = instrumentation;
|
|
19
|
-
this.cacheMapper = cacheMapper;
|
|
20
|
-
this.freshen = new EntitlementsFreshener_1.EntitlementsFreshener();
|
|
21
|
-
this.clearCache = () => {
|
|
22
|
-
this.entitlements.clear();
|
|
23
|
-
};
|
|
24
|
-
const maxSize = maxSizeBytes;
|
|
25
|
-
this.entitlements = new lru_cache_1.LRUCache({
|
|
26
|
-
maxSize,
|
|
27
|
-
sizeCalculation: (value) => getApproxSizeBytes(value),
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
waitForInitialization() {
|
|
31
|
-
return Promise.resolve();
|
|
32
|
-
}
|
|
33
|
-
setCustomer({ customerId, resourceId, entitlements: entitlementsInput, accessDeniedReason, }) {
|
|
34
|
-
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
35
|
-
const { entitlements } = entities_1.EntitlementsMap.fromInput(this.cacheMapper, entitlementsInput);
|
|
36
|
-
this.entitlements.set(cachedCustomerKey, {
|
|
37
|
-
entitlements,
|
|
38
|
-
accessDeniedReason: (0, accessDeniedReasonMapper_1.mapAccessDeniedReason)(accessDeniedReason),
|
|
39
|
-
});
|
|
40
|
-
return this.freshen.transform(entitlements);
|
|
41
|
-
}
|
|
42
|
-
purge(customers) {
|
|
43
|
-
const customersArray = Array.isArray(customers) ? customers : [customers];
|
|
44
|
-
customersArray.forEach(({ customerId, resourceId }) => {
|
|
45
|
-
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
46
|
-
this.entitlements.delete(cachedCustomerKey);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
getCustomerEntitlements({ customerId, resourceId }) {
|
|
50
|
-
return this.getCached({ customerId, resourceId });
|
|
51
|
-
}
|
|
52
|
-
updateUsage({ customerId, resourceId, entitlementReference, usage, }) {
|
|
53
|
-
var _a, _b;
|
|
54
|
-
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
55
|
-
(_b = (_a = this.entitlements.get(cachedCustomerKey)) === null || _a === void 0 ? void 0 : _a.entitlements) === null || _b === void 0 ? void 0 : _b.updateUsage(entitlementReference, usage);
|
|
56
|
-
}
|
|
57
|
-
getCustomerEntitlement(params) {
|
|
58
|
-
const { query } = params;
|
|
59
|
-
const extractor = new extractWithDependencies_1.ExtractWithDependencies(query);
|
|
60
|
-
const { entitlements, accessDeniedReason, cacheMiss, globalCustomerMissing } = this.getCached(params, extractor);
|
|
61
|
-
const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(query)) || null : null;
|
|
62
|
-
return { cacheMiss, accessDeniedReason, entitlement, globalCustomerMissing };
|
|
63
|
-
}
|
|
64
|
-
getCached({ customerId, resourceId }, extract) {
|
|
65
|
-
var _a, _b, _c, _d;
|
|
66
|
-
const cachedCustomerKey = (0, cacheKeysHelpers_1.buildCachedCustomerKey)(customerId, resourceId);
|
|
67
|
-
const cached = this.entitlements.get(cachedCustomerKey) || null;
|
|
68
|
-
if (!cached) {
|
|
69
|
-
(_b = (_a = this.instrumentation).trackMiss) === null || _b === void 0 ? void 0 : _b.call(_a, { customerId, resourceId });
|
|
70
|
-
return cacheResponse_1.entitlementsResponseMapper.cacheMiss();
|
|
71
|
-
}
|
|
72
|
-
const { entitlements: cachedEntitlements, accessDeniedReason } = cached;
|
|
73
|
-
const extracted = extract ? extract.transform(cachedEntitlements) : cachedEntitlements;
|
|
74
|
-
const entitlements = this.freshen.transform(extracted);
|
|
75
|
-
(_d = (_c = this.instrumentation).trackHit) === null || _d === void 0 ? void 0 : _d.call(_c, { customerId, resourceId });
|
|
76
|
-
return cacheResponse_1.entitlementsResponseMapper.cacheHit(entitlements, accessDeniedReason);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
exports.InMemoryCacheService = InMemoryCacheService;
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLGdEQUVDO0FBakJELHlDQUE4RDtBQUU5RCx5REFBNEQ7QUFFNUQseUNBQXFDO0FBQ3JDLHlEQUE4RztBQUc5Ryx5RUFBbUU7QUFDbkUsNkVBQTBFO0FBQzFFLHVFQUFvRTtBQUdwRSxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXRDLFNBQWdCLGtCQUFrQixDQUFDLEdBQVE7SUFDekMsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3hGLENBQUM7QUFPRCxNQUFhLG9CQUFvQjtJQUkvQixZQUNFLFlBQW9CLEVBQ0gsZUFBcUMsRUFDckMsV0FBK0I7UUFEL0Isb0JBQWUsR0FBZixlQUFlLENBQXNCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUxqQyxZQUFPLEdBQUcsSUFBSSw2Q0FBcUIsRUFBRSxDQUFDO1FBa0J2RCxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBYkEsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxvQkFBUSxDQUFxQztZQUNuRSxPQUFPO1lBQ1AsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7U0FDdEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixP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
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { CacheService } from './cacheService';
|
|
2
|
-
export { RedisCacheService, CustomerMetadata } from './redisCacheService';
|
|
3
|
-
export { InMemoryCacheService } from './inMemoryCacheService';
|
|
4
|
-
export { SlimLogger, LoggerExtra } from './types/logger';
|
|
5
|
-
export { CacheInstrumentation, CacheHit, CacheMiss, RedisClientErrorData } from './types/cacheInstrumentation';
|
|
6
|
-
export { EntitlementFeature, UnitTransformation } from './types/entitlementFeature';
|
|
7
|
-
export { StiggRedisOptions, DistributedEntitlementsFetchingOptions, CacheUpdatePolicy, RedisCacheConfiguration, LockSettings, } from './types/redisConfiguration';
|
|
8
|
-
export { DATE_IN_FAR_PAST, EntitlementsResponseCacheHit, EntitlementsResponse, entitlementsResponseMapper, } from './types/cacheResponse';
|
|
9
|
-
export { CachedEntitlement, EntitlementsMap, EntitlementQuery, UsageData, EntitlementType, isFeatureEntitlement, isCreditEntitlement, } from './entities';
|
|
10
|
-
export { buildRedisCustomerKey, buildRedisUsageKey } from './cacheKeysHelpers';
|
|
11
|
-
export { CacheMapper, CacheMapperResult } from './CacheMapper';
|
|
12
|
-
export { AccessDeniedReason, EntitlementsStateAccessDeniedReason, EntitlementResetPeriod, MonthlyAccordingTo, WeeklyAccordingTo, ResetPeriodConfigurationFragment, FeatureType, MeterType, } from '@stigg/api-client-js/src/generated/sdk';
|
|
13
|
-
export { mapAccessDeniedReason } from './accessDeniedReasonMapper';
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mapAccessDeniedReason = exports.MeterType = exports.FeatureType = exports.WeeklyAccordingTo = exports.MonthlyAccordingTo = exports.EntitlementResetPeriod = exports.EntitlementsStateAccessDeniedReason = exports.AccessDeniedReason = exports.buildRedisUsageKey = exports.buildRedisCustomerKey = exports.isCreditEntitlement = exports.isFeatureEntitlement = exports.EntitlementType = exports.EntitlementsMap = exports.CachedEntitlement = exports.entitlementsResponseMapper = exports.DATE_IN_FAR_PAST = exports.CacheUpdatePolicy = exports.InMemoryCacheService = exports.RedisCacheService = void 0;
|
|
4
|
-
// Redis cache service implementation
|
|
5
|
-
var redisCacheService_1 = require("./redisCacheService");
|
|
6
|
-
Object.defineProperty(exports, "RedisCacheService", { enumerable: true, get: function () { return redisCacheService_1.RedisCacheService; } });
|
|
7
|
-
// In-memory cache service implementation
|
|
8
|
-
var inMemoryCacheService_1 = require("./inMemoryCacheService");
|
|
9
|
-
Object.defineProperty(exports, "InMemoryCacheService", { enumerable: true, get: function () { return inMemoryCacheService_1.InMemoryCacheService; } });
|
|
10
|
-
var redisConfiguration_1 = require("./types/redisConfiguration");
|
|
11
|
-
Object.defineProperty(exports, "CacheUpdatePolicy", { enumerable: true, get: function () { return redisConfiguration_1.CacheUpdatePolicy; } });
|
|
12
|
-
var cacheResponse_1 = require("./types/cacheResponse");
|
|
13
|
-
Object.defineProperty(exports, "DATE_IN_FAR_PAST", { enumerable: true, get: function () { return cacheResponse_1.DATE_IN_FAR_PAST; } });
|
|
14
|
-
Object.defineProperty(exports, "entitlementsResponseMapper", { enumerable: true, get: function () { return cacheResponse_1.entitlementsResponseMapper; } });
|
|
15
|
-
// Entity classes and types
|
|
16
|
-
var entities_1 = require("./entities");
|
|
17
|
-
Object.defineProperty(exports, "CachedEntitlement", { enumerable: true, get: function () { return entities_1.CachedEntitlement; } });
|
|
18
|
-
Object.defineProperty(exports, "EntitlementsMap", { enumerable: true, get: function () { return entities_1.EntitlementsMap; } });
|
|
19
|
-
Object.defineProperty(exports, "EntitlementType", { enumerable: true, get: function () { return entities_1.EntitlementType; } });
|
|
20
|
-
Object.defineProperty(exports, "isFeatureEntitlement", { enumerable: true, get: function () { return entities_1.isFeatureEntitlement; } });
|
|
21
|
-
Object.defineProperty(exports, "isCreditEntitlement", { enumerable: true, get: function () { return entities_1.isCreditEntitlement; } });
|
|
22
|
-
// Utilities
|
|
23
|
-
var cacheKeysHelpers_1 = require("./cacheKeysHelpers");
|
|
24
|
-
Object.defineProperty(exports, "buildRedisCustomerKey", { enumerable: true, get: function () { return cacheKeysHelpers_1.buildRedisCustomerKey; } });
|
|
25
|
-
Object.defineProperty(exports, "buildRedisUsageKey", { enumerable: true, get: function () { return cacheKeysHelpers_1.buildRedisUsageKey; } });
|
|
26
|
-
// Re-export enums from api-client-js for convenience
|
|
27
|
-
var sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
|
|
28
|
-
Object.defineProperty(exports, "AccessDeniedReason", { enumerable: true, get: function () { return sdk_1.AccessDeniedReason; } });
|
|
29
|
-
Object.defineProperty(exports, "EntitlementsStateAccessDeniedReason", { enumerable: true, get: function () { return sdk_1.EntitlementsStateAccessDeniedReason; } });
|
|
30
|
-
Object.defineProperty(exports, "EntitlementResetPeriod", { enumerable: true, get: function () { return sdk_1.EntitlementResetPeriod; } });
|
|
31
|
-
Object.defineProperty(exports, "MonthlyAccordingTo", { enumerable: true, get: function () { return sdk_1.MonthlyAccordingTo; } });
|
|
32
|
-
Object.defineProperty(exports, "WeeklyAccordingTo", { enumerable: true, get: function () { return sdk_1.WeeklyAccordingTo; } });
|
|
33
|
-
Object.defineProperty(exports, "FeatureType", { enumerable: true, get: function () { return sdk_1.FeatureType; } });
|
|
34
|
-
Object.defineProperty(exports, "MeterType", { enumerable: true, get: function () { return sdk_1.MeterType; } });
|
|
35
|
-
// Access denied reason mapper
|
|
36
|
-
var accessDeniedReasonMapper_1 = require("./accessDeniedReasonMapper");
|
|
37
|
-
Object.defineProperty(exports, "mapAccessDeniedReason", { enumerable: true, get: function () { return accessDeniedReasonMapper_1.mapAccessDeniedReason; } });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EscUNBQXFDO0FBQ3JDLHlEQUEwRTtBQUFqRSxzSEFBQSxpQkFBaUIsT0FBQTtBQUUxQix5Q0FBeUM7QUFDekMsK0RBQThEO0FBQXJELDRIQUFBLG9CQUFvQixPQUFBO0FBTTdCLGlFQU1vQztBQUhsQyx1SEFBQSxpQkFBaUIsT0FBQTtBQUluQix1REFLK0I7QUFKN0IsaUhBQUEsZ0JBQWdCLE9BQUE7QUFHaEIsMkhBQUEsMEJBQTBCLE9BQUE7QUFHNUIsMkJBQTJCO0FBQzNCLHVDQVFvQjtBQVBsQiw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQiwyR0FBQSxlQUFlLE9BQUE7QUFHZiwyR0FBQSxlQUFlLE9BQUE7QUFDZixnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQiwrR0FBQSxtQkFBbUIsT0FBQTtBQUdyQixZQUFZO0FBQ1osdURBQStFO0FBQXRFLHlIQUFBLHFCQUFxQixPQUFBO0FBQUUsc0hBQUEsa0JBQWtCLE9BQUE7QUFLbEQscURBQXFEO0FBQ3JELDhEQVNnRDtBQVI5Qyx5R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwwSEFBQSxtQ0FBbUMsT0FBQTtBQUNuQyw2R0FBQSxzQkFBc0IsT0FBQTtBQUN0Qix5R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix3R0FBQSxpQkFBaUIsT0FBQTtBQUVqQixrR0FBQSxXQUFXLE9BQUE7QUFDWCxnR0FBQSxTQUFTLE9BQUE7QUFHWCw4QkFBOEI7QUFDOUIsdUVBQW1FO0FBQTFELGlJQUFBLHFCQUFxQixPQUFBIn0=
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import Redis from 'ioredis';
|
|
2
|
-
import { SlimLogger } from '../types/logger';
|
|
3
|
-
import { CacheInstrumentation } from '../types/cacheInstrumentation';
|
|
4
|
-
import { LockSettings } from '../types/redisConfiguration';
|
|
5
|
-
export declare class DistributedLocks {
|
|
6
|
-
private readonly redisClient;
|
|
7
|
-
private readonly loggerService;
|
|
8
|
-
private readonly redlock;
|
|
9
|
-
constructor(redisClient: Redis, loggerService: SlimLogger, cacheInstrumentation: CacheInstrumentation, lockSettings?: LockSettings);
|
|
10
|
-
usingSingleAttempt<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
11
|
-
using<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
12
|
-
isLockTakenByAnotherClientError(err: any): boolean;
|
|
13
|
-
isReadOnlyReplicaError(err: any): Promise<boolean | "" | undefined>;
|
|
14
|
-
cleanup(): Promise<void>;
|
|
15
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.DistributedLocks = void 0;
|
|
37
|
-
const redlock_1 = __importStar(require("redlock"));
|
|
38
|
-
const LOCK_DURATION = 5000;
|
|
39
|
-
const LOCK_NO_RETRY_SETTINGS = { retryCount: 0 };
|
|
40
|
-
class DistributedLocks {
|
|
41
|
-
constructor(redisClient, loggerService, cacheInstrumentation, lockSettings) {
|
|
42
|
-
this.redisClient = redisClient;
|
|
43
|
-
this.loggerService = loggerService;
|
|
44
|
-
this.redlock = new redlock_1.default([redisClient], lockSettings);
|
|
45
|
-
this.redlock.on('clientError', (err) => {
|
|
46
|
-
var _a;
|
|
47
|
-
this.loggerService.error('Redis client error: ', err);
|
|
48
|
-
(_a = cacheInstrumentation.trackRedisClientError) === null || _a === void 0 ? void 0 : _a.call(cacheInstrumentation, { error: err, clientName: 'redlock' });
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
async usingSingleAttempt(lockKey, handler) {
|
|
52
|
-
return this.redlock.using([lockKey], LOCK_DURATION, LOCK_NO_RETRY_SETTINGS, handler);
|
|
53
|
-
}
|
|
54
|
-
async using(lockKey, handler) {
|
|
55
|
-
try {
|
|
56
|
-
// first - try to acquire the lock without retrying in order to identify
|
|
57
|
-
// cases that the redis instance is read-only
|
|
58
|
-
return await this.usingSingleAttempt(lockKey, handler);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
// if first attempt failed on redis instance is read-only,
|
|
62
|
-
// then we don't want to wait for it
|
|
63
|
-
if (await this.isReadOnlyReplicaError(error)) {
|
|
64
|
-
throw new Error(`Redis is read-only. Cannot acquire distributed lock`);
|
|
65
|
-
}
|
|
66
|
-
// if the lock is acquired, now wait for it to be available
|
|
67
|
-
if (this.isLockTakenByAnotherClientError(error)) {
|
|
68
|
-
return this.redlock.using([lockKey], LOCK_DURATION, handler);
|
|
69
|
-
}
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
isLockTakenByAnotherClientError(err) {
|
|
74
|
-
return err instanceof redlock_1.ExecutionError && err.message.includes('unable to achieve a quorum');
|
|
75
|
-
}
|
|
76
|
-
async isReadOnlyReplicaError(err) {
|
|
77
|
-
var _a;
|
|
78
|
-
if (!(err instanceof redlock_1.ExecutionError)) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
const { votesAgainst } = await err.attempts[0];
|
|
82
|
-
const message = (_a = votesAgainst.get(this.redisClient)) === null || _a === void 0 ? void 0 : _a.message;
|
|
83
|
-
return message && message.includes(`You can't write against a read only replica`);
|
|
84
|
-
}
|
|
85
|
-
async cleanup() {
|
|
86
|
-
await this.redlock.quit();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
exports.DistributedLocks = DistributedLocks;
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdHJpYnV0ZWRMb2Nrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9yZWRpcy9kaXN0cmlidXRlZExvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUE0RDtBQU01RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxzQkFBc0IsR0FBc0IsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFFcEUsTUFBYSxnQkFBZ0I7SUFHM0IsWUFDbUIsV0FBa0IsRUFDbEIsYUFBeUIsRUFDMUMsb0JBQTBDLEVBQzFDLFlBQTJCO1FBSFYsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFDbEIsa0JBQWEsR0FBYixhQUFhLENBQVk7UUFJMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTs7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEQsTUFBQSxvQkFBb0IsQ0FBQyxxQkFBcUIscUVBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBSSxPQUFlLEVBQUUsT0FBeUI7UUFDcEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBSSxPQUFlLEVBQUUsT0FBeUI7UUFDdkQsSUFBSSxDQUFDO1lBQ0gsd0VBQXdFO1lBQ3hFLDZDQUE2QztZQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDBEQUEwRDtZQUMxRCxvQ0FBb0M7WUFDcEMsSUFBSSxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFFRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsK0JBQStCLENBQUMsR0FBUTtRQUN0QyxPQUFPLEdBQUcsWUFBWSx3QkFBYyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFROztRQUNuQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksd0JBQWMsQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFBLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxPQUFPLENBQUM7UUFDNUQsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUExREQsNENBMERDIn0=
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare const TIMESTAMP_SUFFIX = "timestamp";
|
|
2
|
-
export declare const METADATA_SUFFIX = "metadata";
|
|
3
|
-
export declare const DEFAULT_TTL_SECS: number;
|
|
4
|
-
export declare const DEFAULT_ENTITLEMENTS_TIMEOUT_MS = 30000;
|
|
5
|
-
export declare const REFETCH_OPERATION_NAME = "refetchEntityEntitlementsAfterCacheMiss";
|
|
6
|
-
export declare const REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REFETCH_NOTIFICATION_BUFFER_MS = exports.REFETCH_OPERATION_NAME = exports.DEFAULT_ENTITLEMENTS_TIMEOUT_MS = exports.DEFAULT_TTL_SECS = exports.METADATA_SUFFIX = exports.TIMESTAMP_SUFFIX = void 0;
|
|
4
|
-
exports.TIMESTAMP_SUFFIX = 'timestamp';
|
|
5
|
-
exports.METADATA_SUFFIX = 'metadata';
|
|
6
|
-
exports.DEFAULT_TTL_SECS = 7 * 24 * 60 * 60;
|
|
7
|
-
exports.DEFAULT_ENTITLEMENTS_TIMEOUT_MS = 30000;
|
|
8
|
-
exports.REFETCH_OPERATION_NAME = 'refetchEntityEntitlementsAfterCacheMiss';
|
|
9
|
-
exports.REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3JlZGlzQ2FjaGVTZXJ2aWNlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDN0IsUUFBQSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDcEMsUUFBQSwrQkFBK0IsR0FBRyxLQUFNLENBQUM7QUFFekMsUUFBQSxzQkFBc0IsR0FBRyx5Q0FBeUMsQ0FBQztBQUNuRSxRQUFBLDhCQUE4QixHQUFHLEdBQUcsQ0FBQyJ9
|