@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,37 @@
|
|
|
1
|
+
import { Maybe } from '../../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Data for cache hit tracking.
|
|
4
|
+
*/
|
|
5
|
+
export interface CacheHit {
|
|
6
|
+
customerId: string;
|
|
7
|
+
resourceId?: Maybe<string>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Data for cache miss tracking.
|
|
11
|
+
*/
|
|
12
|
+
export interface CacheMiss extends CacheHit {
|
|
13
|
+
globalCustomerMissing?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Data for Redis client error tracking.
|
|
17
|
+
*/
|
|
18
|
+
export interface RedisClientErrorData {
|
|
19
|
+
error: Error;
|
|
20
|
+
clientName: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Interface for cache instrumentation/metrics.
|
|
24
|
+
* Supports both read operations (trackHit/trackMiss) and write operations (trackWriteDuration/trackWriteError).
|
|
25
|
+
*/
|
|
26
|
+
export interface CacheInstrumentation {
|
|
27
|
+
/** Track a cache hit for a customer lookup */
|
|
28
|
+
trackHit?(data: CacheHit): void;
|
|
29
|
+
/** Track a cache miss for a customer lookup */
|
|
30
|
+
trackMiss?(data: CacheMiss): void;
|
|
31
|
+
/** Track Redis client connection or operation errors */
|
|
32
|
+
trackRedisClientError?(data: RedisClientErrorData): void;
|
|
33
|
+
/** Track the duration of a write operation */
|
|
34
|
+
trackWriteDuration?(operation: string, durationSeconds: number): void;
|
|
35
|
+
/** Track write operation errors */
|
|
36
|
+
trackWriteError?(operation: string): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVJbnN0cnVtZW50YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvdHlwZXMvY2FjaGVJbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CachedEntitlement, EntitlementType, EntitlementsMap } from '../entities';
|
|
2
|
+
import { AccessDeniedReason } from '@stigg/api-client-js/src/generated/sdk';
|
|
3
|
+
export declare const DATE_IN_FAR_PAST: Date;
|
|
4
|
+
export type EntitlementsResponseCacheHit = {
|
|
5
|
+
cacheMiss: false;
|
|
6
|
+
entitlements: EntitlementsMap;
|
|
7
|
+
accessDeniedReason: AccessDeniedReason | null;
|
|
8
|
+
globalCustomerMissing: false;
|
|
9
|
+
};
|
|
10
|
+
export type EntitlementsResponseCacheMiss = {
|
|
11
|
+
cacheMiss: true;
|
|
12
|
+
entitlements: null;
|
|
13
|
+
accessDeniedReason: null;
|
|
14
|
+
globalCustomerMissing: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type EntitlementsResponse = EntitlementsResponseCacheHit | EntitlementsResponseCacheMiss;
|
|
17
|
+
export type EntitlementResponse<T extends EntitlementType = EntitlementType> = {
|
|
18
|
+
cacheMiss: boolean;
|
|
19
|
+
accessDeniedReason: AccessDeniedReason | null;
|
|
20
|
+
entitlement: CachedEntitlement<T> | null;
|
|
21
|
+
globalCustomerMissing: boolean;
|
|
22
|
+
};
|
|
23
|
+
export declare const entitlementsResponseMapper: {
|
|
24
|
+
cacheHit: (entitlements: EntitlementsMap, accessDeniedReason: AccessDeniedReason | null) => EntitlementsResponseCacheHit;
|
|
25
|
+
cacheMiss: (globalCustomerMissing?: boolean) => EntitlementsResponseCacheMiss;
|
|
26
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.entitlementsResponseMapper = exports.DATE_IN_FAR_PAST = void 0;
|
|
4
|
+
exports.DATE_IN_FAR_PAST = new Date(0);
|
|
5
|
+
exports.entitlementsResponseMapper = {
|
|
6
|
+
cacheHit: (entitlements, accessDeniedReason) => ({
|
|
7
|
+
cacheMiss: false,
|
|
8
|
+
entitlements,
|
|
9
|
+
accessDeniedReason,
|
|
10
|
+
globalCustomerMissing: false,
|
|
11
|
+
}),
|
|
12
|
+
cacheMiss: (globalCustomerMissing = false) => ({
|
|
13
|
+
cacheMiss: true,
|
|
14
|
+
entitlements: null,
|
|
15
|
+
accessDeniedReason: null,
|
|
16
|
+
globalCustomerMissing,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVSZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS90eXBlcy9jYWNoZVJlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdhLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUF5Qi9CLFFBQUEsMEJBQTBCLEdBQUc7SUFDeEMsUUFBUSxFQUFFLENBQ1IsWUFBNkIsRUFDN0Isa0JBQTZDLEVBQ2YsRUFBRSxDQUFDLENBQUM7UUFDbEMsU0FBUyxFQUFFLEtBQUs7UUFDaEIsWUFBWTtRQUNaLGtCQUFrQjtRQUNsQixxQkFBcUIsRUFBRSxLQUFLO0tBQzdCLENBQUM7SUFDRixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLEVBQWlDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLFNBQVMsRUFBRSxJQUFJO1FBQ2YsWUFBWSxFQUFFLElBQUk7UUFDbEIsa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixxQkFBcUI7S0FDdEIsQ0FBQztDQUNILENBQUMifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EntitlementsStateAccessDeniedReason } from '@stigg/api-client-js/src/generated/sdk';
|
|
2
|
+
import { EntitlementQuery, EntitlementType, UsageData } from '../entities';
|
|
3
|
+
import { Maybe } from '../../../types';
|
|
4
|
+
export type CustomerIdentity = {
|
|
5
|
+
customerId: string;
|
|
6
|
+
resourceId: Maybe<string>;
|
|
7
|
+
};
|
|
8
|
+
export type SetCustomerParams<T> = CustomerIdentity & {
|
|
9
|
+
entitlements: T[];
|
|
10
|
+
accessDeniedReason: Maybe<EntitlementsStateAccessDeniedReason>;
|
|
11
|
+
entitlementsTimestamp: number;
|
|
12
|
+
};
|
|
13
|
+
export type GetCustomerEntitlementParams<T extends EntitlementType = EntitlementType> = CustomerIdentity & {
|
|
14
|
+
query: EntitlementQuery<T>;
|
|
15
|
+
};
|
|
16
|
+
export type UpdateUsageParams<T extends EntitlementType = EntitlementType> = CustomerIdentity & {
|
|
17
|
+
entitlementReference: EntitlementQuery<T>;
|
|
18
|
+
usage: UsageData;
|
|
19
|
+
usageTimestamp: Date;
|
|
20
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVTZXJ2aWNlUGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3R5cGVzL2NhY2hlU2VydmljZVBhcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FeatureType, MeterType, UnitTransformationRound } from '@stigg/api-client-js/src/generated/sdk';
|
|
2
|
+
export type UnitTransformation = {
|
|
3
|
+
divide: number;
|
|
4
|
+
round: UnitTransformationRound;
|
|
5
|
+
};
|
|
6
|
+
export type EntitlementFeature = {
|
|
7
|
+
id: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
featureType: FeatureType;
|
|
11
|
+
meterType?: MeterType;
|
|
12
|
+
units?: string;
|
|
13
|
+
unitsPlural?: string;
|
|
14
|
+
unitTransformation?: UnitTransformation;
|
|
15
|
+
};
|
|
16
|
+
export type EntitlementCreditRate = {
|
|
17
|
+
amount: number;
|
|
18
|
+
currencyId: string;
|
|
19
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRGZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3R5cGVzL2VudGl0bGVtZW50RmVhdHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzTWFwVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvdHlwZXMvZW50aXRsZW1lbnRzTWFwVHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type LoggerExtra = Record<string, any> | Error | Error['stack'];
|
|
2
|
+
export interface SlimLogger {
|
|
3
|
+
log: (message: string, object?: LoggerExtra) => void;
|
|
4
|
+
debug: (message: string, object?: LoggerExtra) => void;
|
|
5
|
+
error: (message: string, error?: LoggerExtra) => void;
|
|
6
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3R5cGVzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RedisOptions } from 'ioredis/built/redis/RedisOptions';
|
|
2
|
+
import { Settings } from 'redlock';
|
|
3
|
+
/**
|
|
4
|
+
* Cache update policy that controls how the cache handles write operations.
|
|
5
|
+
*/
|
|
6
|
+
export declare enum CacheUpdatePolicy {
|
|
7
|
+
/** Always write to cache, creating new entries if they don't exist (default) */
|
|
8
|
+
UPSERT = "UPSERT",
|
|
9
|
+
/** Only update existing cache entries, skip if the key doesn't exist */
|
|
10
|
+
UPDATE_IF_EXISTS = "UPDATE_IF_EXISTS"
|
|
11
|
+
}
|
|
12
|
+
export type DistributedEntitlementsFetchingOptions = {
|
|
13
|
+
/** Whether to disable the distributed entitlements fetching mechanism */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The buffer in milliseconds for waiting for notification from other instance.
|
|
17
|
+
*/
|
|
18
|
+
notificationBufferMs?: number;
|
|
19
|
+
};
|
|
20
|
+
export type StiggRedisOptions = RedisOptions & {
|
|
21
|
+
/** A prefix used in all Redis interactions to distinguish between different environments operating on the same Redis database */
|
|
22
|
+
environmentPrefix: string;
|
|
23
|
+
/** The TTL of data stored in Redis */
|
|
24
|
+
ttl?: number;
|
|
25
|
+
/** Configuration of the distributed entitlements fetching in case of a cache miss */
|
|
26
|
+
distributedEntitlementsFetching?: DistributedEntitlementsFetchingOptions;
|
|
27
|
+
};
|
|
28
|
+
export type LockSettings = Pick<Settings, 'retryCount' | 'retryDelay' | 'retryJitter'>;
|
|
29
|
+
export type RedisCacheConfiguration = {
|
|
30
|
+
redis: StiggRedisOptions;
|
|
31
|
+
/** Timeout for entitlements fetching in milliseconds. Defaults to 30000 (30 seconds). */
|
|
32
|
+
entitlementsTimeout?: number;
|
|
33
|
+
/** Cache update policy. Defaults to UPSERT. */
|
|
34
|
+
cacheUpdatePolicy?: CacheUpdatePolicy;
|
|
35
|
+
/** Settings for distributed lock acquisition. */
|
|
36
|
+
lockSettings?: LockSettings;
|
|
37
|
+
/** When true, operations run directly without safety wrapper (no connection check, errors propagate). Defaults to false. */
|
|
38
|
+
directExecution?: boolean;
|
|
39
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CacheUpdatePolicy = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Cache update policy that controls how the cache handles write operations.
|
|
6
|
+
*/
|
|
7
|
+
var CacheUpdatePolicy;
|
|
8
|
+
(function (CacheUpdatePolicy) {
|
|
9
|
+
/** Always write to cache, creating new entries if they don't exist (default) */
|
|
10
|
+
CacheUpdatePolicy["UPSERT"] = "UPSERT";
|
|
11
|
+
/** Only update existing cache entries, skip if the key doesn't exist */
|
|
12
|
+
CacheUpdatePolicy["UPDATE_IF_EXISTS"] = "UPDATE_IF_EXISTS";
|
|
13
|
+
})(CacheUpdatePolicy = exports.CacheUpdatePolicy || (exports.CacheUpdatePolicy = {}));
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3R5cGVzL3JlZGlzQ29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7R0FFRztBQUNILElBQVksaUJBTVg7QUFORCxXQUFZLGlCQUFpQjtJQUMzQixnRkFBZ0Y7SUFDaEYsc0NBQWlCLENBQUE7SUFFakIsd0VBQXdFO0lBQ3hFLDBEQUFxQyxDQUFBO0FBQ3ZDLENBQUMsRUFOVyxpQkFBaUIsR0FBakIseUJBQWlCLEtBQWpCLHlCQUFpQixRQU01QiJ9
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import CachedEntitlement from './cache
|
|
1
|
+
import { CachedEntitlement, EntitlementType } from './cache';
|
|
2
2
|
import { AccessDeniedReason } from '../models';
|
|
3
|
+
import { Maybe } from '../types';
|
|
4
|
+
export interface DecideEntitlementPolicyParams {
|
|
5
|
+
entitlementType: EntitlementType;
|
|
6
|
+
accessDeniedReason: Maybe<AccessDeniedReason>;
|
|
7
|
+
entitlement: Maybe<CachedEntitlement>;
|
|
8
|
+
requestedUsage?: number;
|
|
9
|
+
requestedValues?: string[];
|
|
10
|
+
}
|
|
3
11
|
export declare class EntitlementDecisionService {
|
|
4
|
-
static decideEntitlementPolicy(
|
|
12
|
+
static decideEntitlementPolicy({ entitlementType, accessDeniedReason, entitlement, requestedUsage, requestedValues, }: DecideEntitlementPolicyParams): Decision;
|
|
13
|
+
private static getNotFoundReason;
|
|
14
|
+
private static decideFeatureAccess;
|
|
15
|
+
private static decideCreditAccess;
|
|
16
|
+
private static decideUsageBasedAccess;
|
|
5
17
|
}
|
|
6
18
|
export interface Decision {
|
|
7
19
|
readonly hasAccess: boolean;
|
|
@@ -1,22 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EntitlementDecisionService = void 0;
|
|
4
|
+
const cache_1 = require("./cache");
|
|
4
5
|
const models_1 = require("../models");
|
|
5
6
|
const lodash_1 = require("lodash");
|
|
6
7
|
// TODO: Extract to a common lib for other sdks
|
|
7
8
|
class EntitlementDecisionService {
|
|
8
|
-
static decideEntitlementPolicy(accessDeniedReason, entitlement,
|
|
9
|
-
var _a;
|
|
9
|
+
static decideEntitlementPolicy({ entitlementType, accessDeniedReason, entitlement, requestedUsage = 0, requestedValues = [], }) {
|
|
10
10
|
if (accessDeniedReason) {
|
|
11
11
|
return { accessDeniedReason: accessDeniedReason, hasAccess: false };
|
|
12
12
|
}
|
|
13
|
-
if (!entitlement
|
|
14
|
-
return { hasAccess: false, accessDeniedReason:
|
|
13
|
+
if (!entitlement) {
|
|
14
|
+
return { hasAccess: false, accessDeniedReason: this.getNotFoundReason(entitlementType) };
|
|
15
15
|
}
|
|
16
16
|
if (entitlement.calculatedEntitlement.accessDeniedReason) {
|
|
17
17
|
return { hasAccess: false, accessDeniedReason: entitlement.calculatedEntitlement.accessDeniedReason };
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
if ((0, cache_1.isCreditEntitlement)(entitlement)) {
|
|
20
|
+
return this.decideCreditAccess(entitlement);
|
|
21
|
+
}
|
|
22
|
+
if ((0, cache_1.isFeatureEntitlement)(entitlement)) {
|
|
23
|
+
return this.decideFeatureAccess(entitlement, requestedUsage, requestedValues);
|
|
24
|
+
}
|
|
25
|
+
return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.NoFeatureEntitlementInSubscription };
|
|
26
|
+
}
|
|
27
|
+
static getNotFoundReason(entitlementType) {
|
|
28
|
+
if (entitlementType === cache_1.EntitlementType.Feature) {
|
|
29
|
+
// for backward compatability
|
|
30
|
+
return models_1.AccessDeniedReason.NoFeatureEntitlementInSubscription;
|
|
31
|
+
}
|
|
32
|
+
return models_1.AccessDeniedReason.EntitlementNotFound;
|
|
33
|
+
}
|
|
34
|
+
static decideFeatureAccess(entitlement, requestUsage, requestedValues) {
|
|
35
|
+
const { feature } = entitlement.calculatedEntitlement;
|
|
36
|
+
const { featureType, meterType } = feature;
|
|
20
37
|
switch (featureType) {
|
|
21
38
|
case models_1.FeatureType.Boolean:
|
|
22
39
|
return { hasAccess: true };
|
|
@@ -37,17 +54,27 @@ class EntitlementDecisionService {
|
|
|
37
54
|
if (entitlement.calculatedEntitlement.hasUnlimitedUsage || entitlement.calculatedEntitlement.hasSoftLimit) {
|
|
38
55
|
return { hasAccess: true };
|
|
39
56
|
}
|
|
40
|
-
const usageLimit =
|
|
41
|
-
const currentUsage = entitlement.
|
|
42
|
-
|
|
43
|
-
return { hasAccess: true };
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.RequestedUsageExceedingLimit };
|
|
47
|
-
}
|
|
57
|
+
const usageLimit = entitlement.calculatedEntitlement.usageLimit || 0;
|
|
58
|
+
const currentUsage = entitlement.usageData.currentUsage;
|
|
59
|
+
return this.decideUsageBasedAccess(usageLimit, currentUsage, requestUsage);
|
|
48
60
|
}
|
|
49
61
|
}
|
|
50
62
|
}
|
|
63
|
+
static decideCreditAccess(entitlement) {
|
|
64
|
+
const { usageLimit } = entitlement.calculatedEntitlement;
|
|
65
|
+
const { currentUsage } = entitlement.usageData;
|
|
66
|
+
// checking at least 1 credit to deny access when none remaining
|
|
67
|
+
const requestUsage = 1;
|
|
68
|
+
return this.decideUsageBasedAccess(usageLimit, currentUsage, requestUsage);
|
|
69
|
+
}
|
|
70
|
+
static decideUsageBasedAccess(usageLimit, currentUsage, requestUsage) {
|
|
71
|
+
if (currentUsage + requestUsage <= usageLimit) {
|
|
72
|
+
return { hasAccess: true };
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return { hasAccess: false, accessDeniedReason: models_1.AccessDeniedReason.RequestedUsageExceedingLimit };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
51
78
|
}
|
|
52
79
|
exports.EntitlementDecisionService = EntitlementDecisionService;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZW50aXRsZW1lbnREZWNpc2lvblNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXdHO0FBQ3hHLHNDQUF1RTtBQUN2RSxtQ0FBNkM7QUFXN0MsK0NBQStDO0FBQy9DLE1BQWEsMEJBQTBCO0lBQzlCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxFQUNwQyxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxjQUFjLEdBQUcsQ0FBQyxFQUNsQixlQUFlLEdBQUcsRUFBRSxHQUNVO1FBQzlCLElBQUksa0JBQWtCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7U0FDMUY7UUFFRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRTtZQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUN2RztRQUVELElBQUksSUFBQSwyQkFBbUIsRUFBQyxXQUFXLENBQUMsRUFBRTtZQUNwQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksSUFBQSw0QkFBb0IsRUFBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQy9FO1FB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
|
|
@@ -1,36 +1,35 @@
|
|
|
1
1
|
import EntitlementsApi from '../api/entitlements/entitlementsApi';
|
|
2
2
|
import { LoggerService } from './loggerService';
|
|
3
3
|
import { ApolloClient, FetchResult, NormalizedCacheObject } from '@apollo/client/core';
|
|
4
|
-
import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, Entitlement, EnumEntitlement, EnumEntitlementOptions, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
|
|
4
|
+
import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, CreditEntitlement, Entitlement, EnumEntitlement, EnumEntitlementOptions, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
|
|
5
5
|
import { ModelMapper } from '../utils/ModelMapper';
|
|
6
|
-
import { CacheService } from './cache
|
|
6
|
+
import { CacheService, EntitlementsMap, AccessDeniedReason, EntitlementsStateAccessDeniedReason } from './cache';
|
|
7
|
+
import { Maybe } from '../types';
|
|
7
8
|
import { EdgeApiClient } from './EdgeApiClient';
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
export declare const accessDeniedReasonMap: Record<EntitlementsStateAccessDeniedReason, AccessDeniedReason>;
|
|
9
|
+
import { EntitlementUnionFragment, ReportEventMutation, ReportUsageBulkInput, ReportUsageBulkMutation, ReportUsageFragment, ReportUsageMutation } from '@stigg/api-client-js/src/generated/sdk';
|
|
10
|
+
import { EntitlementsResponse, EntitlementsResponseCacheHit } from './cache';
|
|
11
|
+
import { RefetchEntitlementsAfterCacheMissParams, RefetchEntitlementsParams, RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
|
|
12
|
+
import { CacheableEntitlement } from './ApiCacheMapper';
|
|
13
13
|
export interface CustomerEntitlementsResult {
|
|
14
14
|
entitlements: Entitlement[];
|
|
15
15
|
accessDeniedReason: AccessDeniedReason | null;
|
|
16
16
|
}
|
|
17
17
|
export declare abstract class EntitlementsService {
|
|
18
18
|
protected readonly loggerService: LoggerService;
|
|
19
|
-
protected readonly cacheService: CacheService
|
|
19
|
+
protected readonly cacheService: CacheService<CacheableEntitlement>;
|
|
20
20
|
private readonly entitlementsTimeout;
|
|
21
21
|
protected readonly entitlementsApi: EntitlementsApi;
|
|
22
22
|
protected readonly modelMapper: ModelMapper;
|
|
23
|
-
protected readonly cacheMapper: CacheMapper;
|
|
24
23
|
protected isInitialized: boolean;
|
|
25
|
-
protected constructor(client: ApolloClient<NormalizedCacheObject>, loggerService: LoggerService, edgeApiClient: EdgeApiClient | null, cacheService: CacheService
|
|
26
|
-
getBooleanEntitlement(
|
|
27
|
-
getNumericEntitlement(
|
|
28
|
-
getMeteredEntitlement(
|
|
29
|
-
getEnumEntitlement(
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
protected constructor(client: ApolloClient<NormalizedCacheObject>, loggerService: LoggerService, edgeApiClient: EdgeApiClient | null, cacheService: CacheService<CacheableEntitlement>, entitlementsTimeout: number);
|
|
25
|
+
getBooleanEntitlement(customerId: string, featureRefId: string, fallbackEntitlement: BooleanEntitlement, resourceId?: string, options?: BooleanEntitlementOptions): Promise<BooleanEntitlement>;
|
|
26
|
+
getNumericEntitlement(customerId: string, featureRefId: string, fallbackEntitlement: NumericEntitlement, resourceId?: string, options?: NumericEntitlementOptions): Promise<NumericEntitlement>;
|
|
27
|
+
getMeteredEntitlement(customerId: string, featureRefId: string, fallbackEntitlement: MeteredEntitlement, resourceId?: string, options?: MeteredEntitlementOptions): Promise<MeteredEntitlement>;
|
|
28
|
+
getEnumEntitlement(customerId: string, featureRefId: string, fallbackEntitlement: EnumEntitlement, resourceId?: string, options?: EnumEntitlementOptions): Promise<EnumEntitlement>;
|
|
29
|
+
getCreditEntitlement(customerId: string, currencyId: string, resourceId?: string): Promise<CreditEntitlement>;
|
|
30
|
+
getEntitlement(customerId: string, featureRefId: string, fallbackEntitlement: Entitlement, resourceId?: string, requestedUsage?: number, requestedValues?: string[]): Promise<Entitlement>;
|
|
32
31
|
private getCustomerAndEntitlementFromCacheOrRefetch;
|
|
33
|
-
getCustomerEntitlements(
|
|
32
|
+
getCustomerEntitlements(customerId: string, resourceId: string | undefined): Promise<CustomerEntitlementsResult>;
|
|
34
33
|
abstract clearCache(): void | Promise<void>;
|
|
35
34
|
abstract init(): void | Promise<void>;
|
|
36
35
|
abstract cleanup(): void | Promise<void>;
|
|
@@ -41,17 +40,21 @@ export declare abstract class EntitlementsService {
|
|
|
41
40
|
protected abstract refetchEntityEntitlementsAfterCacheMiss(params: RefetchEntityEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
|
|
42
41
|
refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsResponseCacheHit>;
|
|
43
42
|
setEntitlementsIfExists(options: {
|
|
44
|
-
entitlements?:
|
|
43
|
+
entitlements?: EntitlementUnionFragment[] | null;
|
|
45
44
|
customerId: string;
|
|
46
45
|
resourceId: string | undefined;
|
|
47
|
-
}): Promise<
|
|
46
|
+
}): Promise<EntitlementsMap | null>;
|
|
48
47
|
setEntitlements(params: {
|
|
49
|
-
entitlements:
|
|
50
|
-
accessDeniedReason:
|
|
48
|
+
entitlements: EntitlementUnionFragment[];
|
|
49
|
+
accessDeniedReason: Maybe<EntitlementsStateAccessDeniedReason>;
|
|
51
50
|
customerId: string;
|
|
52
51
|
resourceId: string | undefined;
|
|
53
|
-
}): Promise<
|
|
54
|
-
|
|
52
|
+
}): Promise<EntitlementsMap>;
|
|
53
|
+
protected getEntitlementsUpdatedAtTimestamp({ entitlements, customerId, resourceId, }: {
|
|
54
|
+
entitlements: EntitlementUnionFragment[];
|
|
55
|
+
customerId: string;
|
|
56
|
+
resourceId: Maybe<string>;
|
|
57
|
+
}): Date;
|
|
55
58
|
updateFeatureUsage({ featureId, customerId, resourceId, currentUsage, usagePeriodStart, usagePeriodEnd, timestamp, }: ReportUsageFragment): Promise<void>;
|
|
56
59
|
waitForInitialization(): Promise<void>;
|
|
57
60
|
private isEntitlementExpired;
|