@stigg/node-server-sdk 0.72.1 → 0.74.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/customerFragments.d.ts +0 -4
- package/dist/api/customerFragments.js +2 -209
- package/dist/api/entitlements/entitlementsApi.d.ts +7 -4
- package/dist/api/entitlements/entitlementsApi.js +9 -12
- package/dist/api/entitlements/entitlementsGql.d.ts +1 -2
- package/dist/api/entitlements/entitlementsGql.js +17 -19
- package/dist/api/generated/types.d.ts +129 -322
- package/dist/api/generated/types.js +114 -1
- package/dist/api/managementApi.d.ts +3 -2
- package/dist/api/managementApi.js +4 -20
- package/dist/client.d.ts +1 -0
- package/dist/client.js +20 -47
- package/dist/clientInitialization.d.ts +12 -0
- package/dist/clientInitialization.js +59 -0
- package/dist/configuration.d.ts +6 -0
- package/dist/configuration.js +1 -1
- package/dist/models.d.ts +2 -5
- package/dist/models.js +2 -6
- package/dist/services/EdgeApiClient.d.ts +2 -1
- package/dist/services/EdgeApiClient.js +1 -1
- package/dist/services/cache/cacheService.d.ts +3 -6
- package/dist/services/cache/inMemoryCacheService.d.ts +2 -5
- package/dist/services/cache/inMemoryCacheService.js +3 -9
- package/dist/services/cache/redisCacheService.d.ts +21 -0
- package/dist/services/cache/redisCacheService.js +142 -0
- package/dist/services/entitlementsService.d.ts +28 -30
- package/dist/services/entitlementsService.js +46 -93
- package/dist/services/inMemoryEntitlementsService.d.ts +20 -0
- package/dist/services/inMemoryEntitlementsService.js +80 -0
- package/dist/services/redisEntitlementsService.d.ts +18 -0
- package/dist/services/redisEntitlementsService.js +83 -0
- package/dist/utils/ModelMapper.d.ts +4 -3
- package/dist/utils/ModelMapper.js +24 -26
- package/dist/utils/apiErrorHandling.js +1 -1
- package/package.json +5 -1
- package/dist/api/packagesFragments.d.ts +0 -1
- package/dist/api/packagesFragments.js +0 -85
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.intializeStiggDependencies = void 0;
|
|
26
|
+
const eventEmitter_1 = require("./services/eventEmitter");
|
|
27
|
+
const inMemoryCacheService_1 = require("./services/cache/inMemoryCacheService");
|
|
28
|
+
const initApolloClient_1 = __importStar(require("./api/initApolloClient"));
|
|
29
|
+
const redisEntitlementsService_1 = require("./services/redisEntitlementsService");
|
|
30
|
+
const redisCacheService_1 = require("./services/cache/redisCacheService");
|
|
31
|
+
const inMemoryEntitlementsService_1 = require("./services/inMemoryEntitlementsService");
|
|
32
|
+
const managementApi_1 = __importDefault(require("./api/managementApi"));
|
|
33
|
+
const sdkConfigurationApi_1 = __importDefault(require("./api/sdkConfigurationApi"));
|
|
34
|
+
const EdgeApiClient_1 = require("./services/EdgeApiClient");
|
|
35
|
+
const intializeStiggDependencies = (isPersistedCacheEnabled, sdkConfiguration, loggerService) => {
|
|
36
|
+
const eventEmitter = new eventEmitter_1.TypedEventEmitter();
|
|
37
|
+
let inMemoryCacheService = null;
|
|
38
|
+
let entitlementsService;
|
|
39
|
+
if (!isPersistedCacheEnabled) {
|
|
40
|
+
inMemoryCacheService = new inMemoryCacheService_1.InMemoryCacheService();
|
|
41
|
+
}
|
|
42
|
+
const graphqlClient = (0, initApolloClient_1.default)(Object.assign(Object.assign({}, sdkConfiguration), { onConnected: (inMemoryCacheService === null || inMemoryCacheService === void 0 ? void 0 : inMemoryCacheService.clearCache) || Promise.resolve, loggerService }));
|
|
43
|
+
const batchedGraphClient = (0, initApolloClient_1.initBatchedApolloClient)(sdkConfiguration);
|
|
44
|
+
const edgeApiClient = EdgeApiClient_1.EdgeApiClient.create(sdkConfiguration);
|
|
45
|
+
if (isPersistedCacheEnabled) {
|
|
46
|
+
entitlementsService = new redisEntitlementsService_1.RedisEntitlementsService(sdkConfiguration.redis.environmentPrefix, new redisCacheService_1.RedisCacheService(sdkConfiguration.redis, loggerService), graphqlClient, loggerService, batchedGraphClient, edgeApiClient);
|
|
47
|
+
}
|
|
48
|
+
else if (inMemoryCacheService) {
|
|
49
|
+
entitlementsService = new inMemoryEntitlementsService_1.InMemoryEntitlementsService(inMemoryCacheService, graphqlClient, batchedGraphClient, eventEmitter, loggerService, edgeApiClient);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error();
|
|
53
|
+
}
|
|
54
|
+
const managementApi = new managementApi_1.default(graphqlClient, edgeApiClient);
|
|
55
|
+
const sdkConfigurationApi = new sdkConfigurationApi_1.default(graphqlClient, edgeApiClient);
|
|
56
|
+
return { eventEmitter, entitlementsService, managementApi, sdkConfigurationApi };
|
|
57
|
+
};
|
|
58
|
+
exports.intializeStiggDependencies = intializeStiggDependencies;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpZW50SW5pdGlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLDBEQUE0RDtBQUM1RCxnRkFBNkU7QUFFN0UsMkVBQW1GO0FBQ25GLGtGQUErRTtBQUMvRSwwRUFBdUU7QUFDdkUsd0ZBQXFGO0FBQ3JGLHdFQUFnRDtBQUNoRCxvRkFBNEQ7QUFDNUQsNERBQXlEO0FBRWxELE1BQU0sMEJBQTBCLEdBQUcsQ0FDeEMsdUJBQWdDLEVBQ2hDLGdCQUErQyxFQUMvQyxhQUE0QixFQUM1QixFQUFFO0lBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxnQ0FBaUIsRUFBRSxDQUFDO0lBQzdDLElBQUksb0JBQW9CLEdBQWdDLElBQUksQ0FBQztJQUM3RCxJQUFJLG1CQUF3QyxDQUFDO0lBRTdDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtRQUM1QixvQkFBb0IsR0FBRyxJQUFJLDJDQUFvQixFQUFFLENBQUM7S0FDbkQ7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLDBCQUFnQixrQ0FDakMsZ0JBQWdCLEtBQ25CLFdBQVcsRUFBRSxDQUFBLG9CQUFvQixhQUFwQixvQkFBb0IsdUJBQXBCLG9CQUFvQixDQUFFLFVBQVUsS0FBSSxPQUFPLENBQUMsT0FBTyxFQUNoRSxhQUFhLElBQ2IsQ0FBQztJQUVILE1BQU0sa0JBQWtCLEdBQUcsSUFBQSwwQ0FBdUIsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sYUFBYSxHQUFHLDZCQUFhLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFN0QsSUFBSSx1QkFBdUIsRUFBRTtRQUMzQixtQkFBbUIsR0FBRyxJQUFJLG1EQUF3QixDQUNoRCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQ3hDLElBQUkscUNBQWlCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUM1RCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixhQUFhLENBQ2QsQ0FBQztLQUNIO1NBQU0sSUFBSSxvQkFBb0IsRUFBRTtRQUMvQixtQkFBbUIsR0FBRyxJQUFJLHlEQUEyQixDQUNuRCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osYUFBYSxFQUNiLGFBQWEsQ0FDZCxDQUFDO0tBQ0g7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztLQUNuQjtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksdUJBQWEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFdEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDZCQUFtQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0FBQ25GLENBQUMsQ0FBQztBQWhEVyxRQUFBLDBCQUEwQiw4QkFnRHJDIn0=
|
package/dist/configuration.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { SourceType } from './api/generated/types';
|
|
2
2
|
import { LogConfiguration, LoggerService } from './services/loggerService';
|
|
3
|
+
import { RedisOptions } from 'ioredis/built/redis/RedisOptions';
|
|
3
4
|
export declare const SDK_SOURCE_TYPE = SourceType.NodeServerSdk;
|
|
4
5
|
export declare const SDK_NAME = "node-server-sdk";
|
|
6
|
+
export declare type StiggRedisOptions = RedisOptions & {
|
|
7
|
+
environmentPrefix: string;
|
|
8
|
+
ttl?: number;
|
|
9
|
+
};
|
|
5
10
|
declare type ClientConfiguration = {
|
|
6
11
|
apiKey: string;
|
|
7
12
|
baseUri?: string;
|
|
@@ -10,6 +15,7 @@ declare type ClientConfiguration = {
|
|
|
10
15
|
logConfiguration?: LogConfiguration;
|
|
11
16
|
realtimeUpdatesEnabled?: boolean;
|
|
12
17
|
enableEdge?: boolean;
|
|
18
|
+
redis?: StiggRedisOptions;
|
|
13
19
|
};
|
|
14
20
|
declare function getConfiguration(configuration: Partial<ClientConfiguration>): Required<ClientConfiguration>;
|
|
15
21
|
/**
|
package/dist/configuration.js
CHANGED
|
@@ -68,4 +68,4 @@ function validateConfiguration(configuration, loggerService) {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
exports.validateConfiguration = validateConfiguration;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFtRDtBQUNuRCw0REFBcUY7QUFFckYsbUNBQStCO0FBRWxCLFFBQUEsZUFBZSxHQUFHLGtCQUFVLENBQUMsYUFBYSxDQUFDO0FBQzNDLFFBQUEsUUFBUSxHQUFHLGlCQUFpQixDQUFDO0FBZTFDLE1BQU0sUUFBUSxHQUFHLEdBQWlDLEVBQUU7SUFDbEQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUM7SUFDdkMsT0FBTztRQUNMLE9BQU87UUFDUCxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN4QixXQUFXLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLGdCQUFnQixFQUFFO1lBQ2hCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsUUFBUSxFQUFFLHdCQUFRLENBQUMsS0FBSztTQUN6QjtRQUNELHNCQUFzQixFQUFFLElBQUk7UUFDNUIsVUFBVSxFQUFFLElBQUk7S0FDakIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLFNBQVMsZ0JBQWdCLENBQUMsYUFBMkM7SUFDbkUsTUFBTSxhQUFhLEdBQUcsUUFBUSxFQUFFLENBQUM7SUFFakMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUs7UUFDL0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLO1FBQ3JCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTztZQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDakMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDeEIsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVc7UUFDM0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXO1FBQzNCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTztZQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUMxQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUU5QixPQUFPLElBQUEsY0FBSyxFQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQWtDLENBQUM7QUFDdEcsQ0FBQztBQXVDUSw0Q0FBZ0I7QUFyQ3pCLFNBQVMsUUFBUSxDQUFDLE1BQWM7SUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUIsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTtRQUM1QixHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztLQUN0QjtTQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDcEMsR0FBRyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7S0FDdkI7SUFFRCxtRUFBbUU7SUFDbkUsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQWM7SUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUIsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUNoQyxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztLQUNuQjtTQUFNO1FBQ0wsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN2QztJQUVELG1FQUFtRTtJQUNuRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxhQUEyQyxFQUFFLGFBQTRCO0lBQ3RHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLCtDQUErQyxDQUFDO1FBQzlELGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtBQUNILENBQUM7QUFFK0Msc0RBQXFCIn0=
|
package/dist/models.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BillingPeriod, SubscriptionCancellationTime, PromotionalEntitlementStatus, SubscriptionStatus, TrialPeriodUnits, BillingModel, PricingType, SubscriptionDecisionStrategy, ExperimentGroupType } from './api/generated/types';
|
|
1
|
+
import { BillingPeriod, SubscriptionCancellationTime, PromotionalEntitlementStatus, SubscriptionStatus, TrialPeriodUnits, BillingModel, PricingType, SubscriptionDecisionStrategy, ExperimentGroupType, Currency } from './api/generated/types';
|
|
2
2
|
export { PricingType, ErrorCode, BillingPeriod, SubscriptionCancellationTime, EntitlementsUpdatedPayloadFragment, EntitlementUsageUpdatedFragment, ExperimentGroupType, PromotionalEntitlementStatus, SubscriptionStatus, TrialPeriodUnits, BillingModel, SubscriptionDecisionStrategy, } from './api/generated/types';
|
|
3
3
|
export interface Metadata {
|
|
4
4
|
[key: string]: string;
|
|
@@ -294,10 +294,7 @@ export declare type BillingInfo = {
|
|
|
294
294
|
invoiceCustomFields?: Record<string, string>;
|
|
295
295
|
paymentMethodId?: string;
|
|
296
296
|
};
|
|
297
|
-
export
|
|
298
|
-
Ils = "ILS",
|
|
299
|
-
Usd = "USD"
|
|
300
|
-
}
|
|
297
|
+
export { Currency };
|
|
301
298
|
/**
|
|
302
299
|
* @param country - optional country of the address - in a valid ISO 3166-1 alpha-2 format
|
|
303
300
|
*/
|
package/dist/models.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CustomerModel = exports.Currency = exports.ProvisionSubscriptionStatus = exports.METERED_DEFAULT_FALLBACK_ENTITLEMENT = exports.NUMERIC_DEFAULT_FALLBACK_ENTITLEMENT = exports.BOOLEAN_DEFAULT_FALLBACK_ENTITLEMENT = exports.MeterType = exports.FeatureType = exports.AccessDeniedReason = exports.EntitlementResetPeriod = exports.SubscriptionDecisionStrategy = exports.BillingModel = exports.TrialPeriodUnits = exports.SubscriptionStatus = exports.PromotionalEntitlementStatus = exports.ExperimentGroupType = exports.SubscriptionCancellationTime = exports.BillingPeriod = exports.ErrorCode = exports.PricingType = void 0;
|
|
4
4
|
const types_1 = require("./api/generated/types");
|
|
5
|
+
Object.defineProperty(exports, "Currency", { enumerable: true, get: function () { return types_1.Currency; } });
|
|
5
6
|
var types_2 = require("./api/generated/types");
|
|
6
7
|
Object.defineProperty(exports, "PricingType", { enumerable: true, get: function () { return types_2.PricingType; } });
|
|
7
8
|
Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return types_2.ErrorCode; } });
|
|
@@ -68,11 +69,6 @@ var ProvisionSubscriptionStatus;
|
|
|
68
69
|
ProvisionSubscriptionStatus["PaymentRequired"] = "PaymentRequired";
|
|
69
70
|
ProvisionSubscriptionStatus["Success"] = "Success";
|
|
70
71
|
})(ProvisionSubscriptionStatus = exports.ProvisionSubscriptionStatus || (exports.ProvisionSubscriptionStatus = {}));
|
|
71
|
-
var Currency;
|
|
72
|
-
(function (Currency) {
|
|
73
|
-
Currency["Ils"] = "ILS";
|
|
74
|
-
Currency["Usd"] = "USD";
|
|
75
|
-
})(Currency = exports.Currency || (exports.Currency = {}));
|
|
76
72
|
/** @hidden */
|
|
77
73
|
class CustomerModel {
|
|
78
74
|
constructor(state) {
|
|
@@ -89,4 +85,4 @@ class CustomerModel {
|
|
|
89
85
|
}
|
|
90
86
|
}
|
|
91
87
|
exports.CustomerModel = CustomerModel;
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFXK0I7QUErWHRCLHlGQWhZUCxnQkFBUSxPQWdZTztBQTdYakIsK0NBYStCO0FBWjdCLG9HQUFBLFdBQVcsT0FBQTtBQUNYLGtHQUFBLFNBQVMsT0FBQTtBQUNULHNHQUFBLGFBQWEsT0FBQTtBQUNiLHFIQUFBLDRCQUE0QixPQUFBO0FBRzVCLDRHQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLDRCQUE0QixPQUFBO0FBQzVCLDJHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHlHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHFHQUFBLFlBQVksT0FBQTtBQUNaLHFIQUFBLDRCQUE0QixPQUFBO0FBTzlCLElBQVksc0JBS1g7QUFMRCxXQUFZLHNCQUFzQjtJQUNoQyx5Q0FBZSxDQUFBO0lBQ2YsMkNBQWlCLENBQUE7SUFDakIsNkNBQW1CLENBQUE7SUFDbkIsMkNBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUxXLHNCQUFzQixHQUF0Qiw4QkFBc0IsS0FBdEIsOEJBQXNCLFFBS2pDO0FBRUQsSUFBWSxrQkFRWDtBQVJELFdBQVksa0JBQWtCO0lBQzVCLCtEQUF5QyxDQUFBO0lBQ3pDLDJEQUFxQyxDQUFBO0lBQ3JDLHlEQUFtQyxDQUFBO0lBQ25DLHFFQUErQyxDQUFBO0lBQy9DLHFGQUErRCxDQUFBO0lBQy9ELCtFQUF5RCxDQUFBO0lBQ3pELHlDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFSVyxrQkFBa0IsR0FBbEIsMEJBQWtCLEtBQWxCLDBCQUFrQixRQVE3QjtBQUVELElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixrQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFHdEI7QUFFRCxJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsd0NBQTJCLENBQUE7SUFDM0Isd0NBQTJCLENBQUE7SUFDM0IsMEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUlwQjtBQWdERCxnQkFBZ0I7QUFDSCxRQUFBLG9DQUFvQyxHQUF1QjtJQUN0RSxVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsS0FBSztJQUNoQixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO0NBQy9DLENBQUM7QUFFRixnQkFBZ0I7QUFDSCxRQUFBLG9DQUFvQyxHQUF1QjtJQUN0RSxVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsS0FBSztJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO0NBQy9DLENBQUM7QUFFRixnQkFBZ0I7QUFDSCxRQUFBLG9DQUFvQyxHQUF1QjtJQUN0RSxVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsS0FBSztJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixZQUFZLEVBQUUsQ0FBQztJQUNmLGNBQWMsRUFBRSxDQUFDO0lBQ2pCLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLE9BQU87Q0FDL0MsQ0FBQztBQXdKRixJQUFZLDJCQUdYO0FBSEQsV0FBWSwyQkFBMkI7SUFDckMsa0VBQW1DLENBQUE7SUFDbkMsa0RBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUhXLDJCQUEyQixHQUEzQixtQ0FBMkIsS0FBM0IsbUNBQTJCLFFBR3RDO0FBcVVELGNBQWM7QUFDZCxNQUFhLGFBQWE7SUFTeEIsWUFBWSxLQUFvQjtRQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssMEJBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLDBCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxnQ0FBZ0M7UUFDOUIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLG9DQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RHLENBQUM7Q0FDRjtBQXhCRCxzQ0F3QkMifQ==
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ApolloQueryResult } from '@apollo/client/core';
|
|
2
|
-
import {
|
|
2
|
+
import { SdkConfigurationQuery } from '../api/generated/types';
|
|
3
|
+
import { GetEntitlementsQuery, GetPaywallQuery } from '@stigg/api-client-js/src/generated/sdk';
|
|
3
4
|
declare type EdgeApiClientConfiguration = {
|
|
4
5
|
apiKey: string;
|
|
5
6
|
baseEdgeUri: string;
|
|
@@ -35,4 +35,4 @@ class EdgeApiClient {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
exports.EdgeApiClient = EdgeApiClient;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRnZUFwaUNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9FZGdlQXBpQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUFxQztBQUNyQyxvREFBbUQ7QUFXbkQsTUFBYSxhQUFhO0lBR3hCLFlBQW9CLE1BQWtDO1FBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQztZQUM3QixPQUFPLEVBQUUsV0FBVztZQUNwQixPQUFPLEVBQUU7Z0JBQ1AsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLE1BQU0sRUFBRSwrQkFBZTthQUN4QjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWtDO1FBQzlDLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQsVUFBVSxDQUFDLFNBQWtCO1FBQzNCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBa0IsTUFBTSxNQUFNLGVBQWUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUF1QixTQUFTLFVBQVUsb0JBQW9CLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBd0IsMENBQTBDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sR0FBRyxDQUFJLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBdUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBbENELHNDQWtDQyJ9
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import CachedEntitlement from './cachedEntitlement';
|
|
2
2
|
export interface CacheService {
|
|
3
|
-
clearCache(): void
|
|
4
|
-
setCustomer(customerId: string, customerEntitlements: Map<string, CachedEntitlement>): void
|
|
5
|
-
getCustomerEntitlements(customerId: string): Map<string, CachedEntitlement> | null
|
|
6
|
-
setEntitlement(customerId: string, featureId: string, entitlement: CachedEntitlement): boolean;
|
|
7
|
-
validateFeature(featureId: string): boolean;
|
|
8
|
-
setFeatures(features: string[]): void;
|
|
3
|
+
clearCache(): void | Promise<void>;
|
|
4
|
+
setCustomer(environmentPrefix: string, customerId: string, customerEntitlements: Map<string, CachedEntitlement>, entitlementsTimestamp: number, usageTimestamp: Map<string, number>): void | Promise<void>;
|
|
5
|
+
getCustomerEntitlements(environmentPrefix: string, customerId: string): Map<string, CachedEntitlement> | null | Promise<Map<string, CachedEntitlement> | null>;
|
|
9
6
|
}
|
|
@@ -2,12 +2,9 @@ import { CacheService } from './cacheService';
|
|
|
2
2
|
import CachedEntitlement from './cachedEntitlement';
|
|
3
3
|
export declare class InMemoryCacheService implements CacheService {
|
|
4
4
|
private readonly entitlements;
|
|
5
|
-
private featureIds;
|
|
6
5
|
constructor();
|
|
7
|
-
validateFeature(featureId: string): boolean;
|
|
8
6
|
clearCache: () => void;
|
|
9
|
-
|
|
10
|
-
setCustomer(customerId: string, customerEntitlements: Map<string, CachedEntitlement>): void;
|
|
7
|
+
setCustomer(environmentPrefix: string, customerId: string, customerEntitlements: Map<string, CachedEntitlement>): void;
|
|
11
8
|
setEntitlement(customerId: string, featureId: string, entitlement: CachedEntitlement): boolean;
|
|
12
|
-
getCustomerEntitlements(customerId: string): Map<string, CachedEntitlement> | null;
|
|
9
|
+
getCustomerEntitlements(environmentId: string, customerId: string): Map<string, CachedEntitlement> | null;
|
|
13
10
|
}
|
|
@@ -5,16 +5,10 @@ class InMemoryCacheService {
|
|
|
5
5
|
constructor() {
|
|
6
6
|
this.clearCache = () => {
|
|
7
7
|
this.entitlements.clear();
|
|
8
|
-
this.featureIds.clear();
|
|
9
8
|
};
|
|
10
|
-
this.setFeatures = (featureIds) => (this.featureIds = new Set(featureIds));
|
|
11
9
|
this.entitlements = new Map();
|
|
12
|
-
this.featureIds = new Set();
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
return this.featureIds.has(featureId);
|
|
16
|
-
}
|
|
17
|
-
setCustomer(customerId, customerEntitlements) {
|
|
11
|
+
setCustomer(environmentPrefix, customerId, customerEntitlements) {
|
|
18
12
|
this.entitlements.set(customerId, customerEntitlements);
|
|
19
13
|
}
|
|
20
14
|
setEntitlement(customerId, featureId, entitlement) {
|
|
@@ -26,9 +20,9 @@ class InMemoryCacheService {
|
|
|
26
20
|
customerEntitlements.set(featureId, entitlement);
|
|
27
21
|
return true;
|
|
28
22
|
}
|
|
29
|
-
getCustomerEntitlements(customerId) {
|
|
23
|
+
getCustomerEntitlements(environmentId, customerId) {
|
|
30
24
|
return this.entitlements.get(customerId) || null;
|
|
31
25
|
}
|
|
32
26
|
}
|
|
33
27
|
exports.InMemoryCacheService = InMemoryCacheService;
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsTUFBYSxvQkFBb0I7SUFFL0I7UUFJQSxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBTEEsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUN4RSxDQUFDO0lBTUQsV0FBVyxDQUNULGlCQUF5QixFQUN6QixVQUFrQixFQUNsQixvQkFBb0Q7UUFFcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxVQUFrQixFQUFFLFNBQWlCLEVBQUUsV0FBOEI7UUFDbEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDekIsa0ZBQWtGO1lBQ2xGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVCQUF1QixDQUFDLGFBQXFCLEVBQUUsVUFBa0I7UUFDL0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBakNELG9EQWlDQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CacheService } from './cacheService';
|
|
2
|
+
import CachedEntitlement from './cachedEntitlement';
|
|
3
|
+
import { LoggerService } from '../loggerService';
|
|
4
|
+
import { StiggRedisOptions } from '../../configuration';
|
|
5
|
+
export declare class RedisCacheService implements CacheService {
|
|
6
|
+
private readonly loggerService;
|
|
7
|
+
private readonly environmentPrefix;
|
|
8
|
+
private readonly ttl;
|
|
9
|
+
private readonly redisClient;
|
|
10
|
+
private readonly redlock;
|
|
11
|
+
constructor(options: StiggRedisOptions, loggerService: LoggerService);
|
|
12
|
+
setCustomer(environmentPrefix: string, customerId: string, customerEntitlements: Map<string, CachedEntitlement>, entitlementsTimestamp: number, featureIdToUsageTimestamp: Map<string, number>): Promise<void>;
|
|
13
|
+
getCustomerEntitlements(environmentPrefix: string, customerId: string): Promise<Map<string, CachedEntitlement> | null>;
|
|
14
|
+
getCustomerEntitlementsWithUsage(environmentPrefix: string, customerId: string): Promise<Map<string, CachedEntitlement> | null>;
|
|
15
|
+
getFeatureUsage(environmentPrefix: string, customerId: string, featureId: string): Promise<string | null>;
|
|
16
|
+
private getFeaturesUsage;
|
|
17
|
+
clearCache(): void | Promise<void>;
|
|
18
|
+
private buildCustomerKey;
|
|
19
|
+
private buildUsageKey;
|
|
20
|
+
private updateKey;
|
|
21
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RedisCacheService = void 0;
|
|
7
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
|
+
const types_1 = require("../../api/generated/types");
|
|
10
|
+
const redlock_1 = __importDefault(require("redlock"));
|
|
11
|
+
const TIMESTAMP_SUFFIX = 'timestamp';
|
|
12
|
+
const LOCK_DURATION = 5000;
|
|
13
|
+
const DEFAULT_TTL_SECS = 7 * 24 * 60 * 60;
|
|
14
|
+
class RedisCacheService {
|
|
15
|
+
constructor(options, loggerService) {
|
|
16
|
+
this.loggerService = loggerService;
|
|
17
|
+
this.redisClient = new ioredis_1.default(options);
|
|
18
|
+
this.redlock = new redlock_1.default([this.redisClient]);
|
|
19
|
+
this.environmentPrefix = options.environmentPrefix;
|
|
20
|
+
this.ttl = options.ttl || DEFAULT_TTL_SECS;
|
|
21
|
+
this.redlock.on('clientError', (err) => this.loggerService.error('Redis client ran into an issue: ', err));
|
|
22
|
+
}
|
|
23
|
+
async setCustomer(environmentPrefix, customerId, customerEntitlements, entitlementsTimestamp, featureIdToUsageTimestamp) {
|
|
24
|
+
const entitlementsDbKey = this.buildCustomerKey(environmentPrefix, customerId);
|
|
25
|
+
const customerEntitlementsAsObject = Object.fromEntries(customerEntitlements);
|
|
26
|
+
await this.redlock.using([environmentPrefix, customerId], LOCK_DURATION, async () => {
|
|
27
|
+
await this.updateKey(new Date(entitlementsTimestamp), entitlementsDbKey, customerEntitlementsAsObject);
|
|
28
|
+
const entitlements = new Array(...customerEntitlements.values());
|
|
29
|
+
const updateUsagesPromises = entitlements
|
|
30
|
+
.filter((entitlement) => {
|
|
31
|
+
var _a, _b;
|
|
32
|
+
return ((_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.meterType) &&
|
|
33
|
+
((_b = entitlement.calculatedEntitlement.feature) === null || _b === void 0 ? void 0 : _b.meterType) !== types_1.MeterType.None;
|
|
34
|
+
})
|
|
35
|
+
.map((entitlement) => {
|
|
36
|
+
const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, nextResetDate }, } = entitlement;
|
|
37
|
+
const featureId = (feature === null || feature === void 0 ? void 0 : feature.id) || '';
|
|
38
|
+
const entitlementUsageKey = this.buildUsageKey(environmentPrefix, customerId, featureId);
|
|
39
|
+
const usageValue = {
|
|
40
|
+
currentUsage,
|
|
41
|
+
nextResetDate,
|
|
42
|
+
};
|
|
43
|
+
const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
|
|
44
|
+
if (featureUsageTimestamp) {
|
|
45
|
+
return this.updateKey(new Date(featureUsageTimestamp), entitlementUsageKey, usageValue);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.loggerService.error(`Failed to find usage timestamp for feature with id: ${featureId}`);
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// TODO: Partial success is not covered yet, it awaits transactions
|
|
53
|
+
const updateUsagesResult = await Promise.allSettled(updateUsagesPromises);
|
|
54
|
+
updateUsagesResult
|
|
55
|
+
.filter((result) => result.status === 'rejected')
|
|
56
|
+
.forEach((result) => console.log(`Failed to update feature usage result: ${result.reason}`));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async getCustomerEntitlements(environmentPrefix, customerId) {
|
|
60
|
+
const entitlements = await this.redisClient.get(this.buildCustomerKey(environmentPrefix, customerId));
|
|
61
|
+
if (entitlements === null || (0, lodash_1.isEmpty)(entitlements)) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
this.loggerService.debug(`Found entitlements in persisted cache for customer`, { customerId });
|
|
65
|
+
return new Map(Object.entries(JSON.parse(entitlements)));
|
|
66
|
+
}
|
|
67
|
+
async getCustomerEntitlementsWithUsage(environmentPrefix, customerId) {
|
|
68
|
+
const cachedEntitlements = await this.getCustomerEntitlements(environmentPrefix, customerId);
|
|
69
|
+
if (cachedEntitlements === null) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const meteredEntitlementsIds = Array.from(cachedEntitlements === null || cachedEntitlements === void 0 ? void 0 : cachedEntitlements.values())
|
|
73
|
+
.filter((entitlement) => {
|
|
74
|
+
var _a, _b;
|
|
75
|
+
return ((_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.meterType) &&
|
|
76
|
+
((_b = entitlement.calculatedEntitlement.feature) === null || _b === void 0 ? void 0 : _b.meterType) !== types_1.MeterType.None;
|
|
77
|
+
})
|
|
78
|
+
.map((entitlement) => entitlement.calculatedEntitlement.feature.id);
|
|
79
|
+
const featuresUsageByFeatureId = await this.getFeaturesUsage(environmentPrefix, customerId, meteredEntitlementsIds);
|
|
80
|
+
featuresUsageByFeatureId.forEach((usageValue, featureId) => {
|
|
81
|
+
const cachedEntitlement = cachedEntitlements.get(featureId);
|
|
82
|
+
if (cachedEntitlement) {
|
|
83
|
+
const { calculatedEntitlement, featureUsage } = cachedEntitlement;
|
|
84
|
+
cachedEntitlements.set(featureId, { calculatedEntitlement, featureUsage: Object.assign(Object.assign({}, featureUsage), usageValue) });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
|
|
88
|
+
customerId: customerId,
|
|
89
|
+
featureId,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return cachedEntitlements;
|
|
94
|
+
}
|
|
95
|
+
async getFeatureUsage(environmentPrefix, customerId, featureId) {
|
|
96
|
+
return this.redisClient.get(this.buildUsageKey(environmentPrefix, customerId, featureId));
|
|
97
|
+
}
|
|
98
|
+
async getFeaturesUsage(environmentPrefix, customerId, featureIds) {
|
|
99
|
+
const keysToFetch = featureIds.map((featureId) => this.buildUsageKey(environmentPrefix, customerId, featureId));
|
|
100
|
+
const usageValues = await this.redisClient.mget(keysToFetch);
|
|
101
|
+
const featureIdToFeatureUsage = new Map();
|
|
102
|
+
// Redis guarantees returning values in the same order of the keys so this is legit!
|
|
103
|
+
featureIds.forEach((featureId, index) => {
|
|
104
|
+
const featureUsageValue = usageValues[index];
|
|
105
|
+
if (featureUsageValue === null) {
|
|
106
|
+
this.loggerService.log(`Failed to find usage for metered feature: ${featureId}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
featureIdToFeatureUsage.set(featureId, JSON.parse(featureUsageValue));
|
|
110
|
+
});
|
|
111
|
+
return featureIdToFeatureUsage;
|
|
112
|
+
}
|
|
113
|
+
clearCache() {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
buildCustomerKey(environmentPrefix, customerId) {
|
|
117
|
+
return `${environmentPrefix}:${customerId}`;
|
|
118
|
+
}
|
|
119
|
+
buildUsageKey(environmentPrefix, customerId, featureId) {
|
|
120
|
+
return `${environmentPrefix}:${customerId}:${featureId}`;
|
|
121
|
+
}
|
|
122
|
+
async updateKey(timestamp, key, value) {
|
|
123
|
+
const latestTimestampValue = await this.redisClient.get(`${key}#${TIMESTAMP_SUFFIX}`);
|
|
124
|
+
const latestTimestamp = latestTimestampValue !== null && parseInt(latestTimestampValue, 10) !== Number.NaN
|
|
125
|
+
? new Date(parseInt(latestTimestampValue, 10))
|
|
126
|
+
: undefined;
|
|
127
|
+
const messageTimestamp = timestamp.getTime();
|
|
128
|
+
if (!latestTimestamp || (latestTimestamp === null || latestTimestamp === void 0 ? void 0 : latestTimestamp.getTime()) < messageTimestamp) {
|
|
129
|
+
const writeableValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
130
|
+
await this.redisClient
|
|
131
|
+
.multi()
|
|
132
|
+
.set(key, writeableValue, 'EX', this.ttl)
|
|
133
|
+
.set(`${key}#${TIMESTAMP_SUFFIX}`, messageTimestamp, 'EX', this.ttl)
|
|
134
|
+
.exec();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.loggerService.log('Cache data timestamp is after message timestamp', { messageTimestamp, latestTimestamp });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.RedisCacheService = RedisCacheService;
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsc0RBQTRCO0FBQzVCLG1DQUFpQztBQUNqQyxxREFBc0Q7QUFFdEQsc0RBQThCO0FBRzlCLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUUxQyxNQUFhLGlCQUFpQjtJQUs1QixZQUFZLE9BQTBCLEVBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25GLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksZ0JBQWdCLENBQUM7UUFFM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUNmLGlCQUF5QixFQUN6QixVQUFrQixFQUNsQixvQkFBb0QsRUFDcEQscUJBQTZCLEVBQzdCLHlCQUE4QztRQUU5QyxNQUFNLGlCQUFpQixHQUFHLElBQUks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
|
|
@@ -1,40 +1,38 @@
|
|
|
1
|
-
import
|
|
1
|
+
import EntitlementsApi from '../api/entitlements/entitlementsApi';
|
|
2
|
+
import { LoggerService } from './loggerService';
|
|
2
3
|
import { ApolloClient, FetchResult, NormalizedCacheObject } from '@apollo/client/core';
|
|
3
4
|
import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions } from '../models';
|
|
4
|
-
import {
|
|
5
|
+
import { CreateUsageMeasurementMutation, EntitlementCheckResult } from '../api/generated/types';
|
|
6
|
+
import { ModelMapper } from '../utils/ModelMapper';
|
|
5
7
|
import CachedEntitlement from './cache/cachedEntitlement';
|
|
6
|
-
import {
|
|
7
|
-
import { TypedEventEmitter } from './eventEmitter';
|
|
8
|
+
import { CacheService } from './cache/cacheService';
|
|
8
9
|
import { EdgeApiClient } from './EdgeApiClient';
|
|
9
|
-
export declare class EntitlementsService {
|
|
10
|
-
private
|
|
11
|
-
|
|
12
|
-
private readonly
|
|
13
|
-
|
|
10
|
+
export declare abstract class EntitlementsService {
|
|
11
|
+
private client;
|
|
12
|
+
protected readonly loggerService: LoggerService;
|
|
13
|
+
private readonly batchedGraphqlClient;
|
|
14
|
+
protected readonly cacheService: CacheService;
|
|
15
|
+
protected readonly environmentPrefix: string;
|
|
14
16
|
private readonly entitlementCheckReportingService;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
constructor(cacheService: CacheService, client: ApolloClient<NormalizedCacheObject>, batchedGraphqlClient: ApolloClient<NormalizedCacheObject>, edgeApiClient: EdgeApiClient | null, eventEmitter: TypedEventEmitter, loggerService: LoggerService);
|
|
19
|
-
subscribeToUpdates(): void;
|
|
20
|
-
private websocketErrorHandling;
|
|
21
|
-
unsubscribeFromUpdates(): void;
|
|
22
|
-
refetchEntitlements(customerRefId: string): Promise<{
|
|
23
|
-
entitlements: Map<string, CachedEntitlement> | null;
|
|
24
|
-
customerExists: boolean;
|
|
25
|
-
}>;
|
|
17
|
+
protected readonly entitlementsApi: EntitlementsApi;
|
|
18
|
+
protected readonly modelMapper: ModelMapper;
|
|
19
|
+
protected constructor(client: ApolloClient<NormalizedCacheObject>, loggerService: LoggerService, batchedGraphqlClient: ApolloClient<NormalizedCacheObject>, edgeApiClient: EdgeApiClient | null, cacheService: CacheService, environmentPrefix: string);
|
|
26
20
|
getBooleanEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: BooleanEntitlement, options?: BooleanEntitlementOptions): Promise<BooleanEntitlement>;
|
|
27
21
|
getNumericEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: NumericEntitlement, options?: NumericEntitlementOptions): Promise<NumericEntitlement>;
|
|
28
22
|
getMeteredEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: MeteredEntitlement, options?: MeteredEntitlementOptions): Promise<MeteredEntitlement>;
|
|
23
|
+
getCustomerEntitlementsWithUsage(customerRefId: string): Promise<import("../models").Entitlement[]>;
|
|
29
24
|
getCustomerEntitlements(customerRefId: string): Promise<import("../models").Entitlement[]>;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
abstract clearCache(): void | Promise<void>;
|
|
26
|
+
abstract init(): void | Promise<void>;
|
|
27
|
+
abstract cleanup(): void | Promise<void>;
|
|
28
|
+
createUsageMeasurement(input: CreateUsageMeasurement): Promise<FetchResult<CreateUsageMeasurementMutation>>;
|
|
29
|
+
protected tryGetCacheCustomerAndEntitlement(featureRefId: string, customerRefId: string): Promise<{
|
|
30
|
+
customerExists: boolean;
|
|
31
|
+
entitlement: CachedEntitlement | null;
|
|
32
|
+
}>;
|
|
33
|
+
refetchEntitlements(customerRefId: string, skipEdge?: boolean): Promise<{
|
|
34
|
+
entitlements: Map<string, CachedEntitlement> | null;
|
|
35
|
+
customerExists: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
protected tryTrackEntitlementCheck(shouldTrack: boolean, featureRefId: string, customerRefId: string, result: EntitlementCheckResult, requestedUsage?: number): void;
|
|
36
38
|
}
|
|
37
|
-
export declare type GetEntitlementResult = {
|
|
38
|
-
entitlement: CachedEntitlement | null;
|
|
39
|
-
decision: Decision;
|
|
40
|
-
};
|