@stigg/node-server-sdk 0.72.0 → 0.73.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.
@@ -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
- setFeatures: (featureIds: string[]) => Set<string>;
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
- validateFeature(featureId) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvaW5NZW1vcnlDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsTUFBYSxvQkFBb0I7SUFHL0I7UUFTQSxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUM7UUFFRixnQkFBVyxHQUFHLENBQUMsVUFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxDQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFidEYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztRQUN0RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxTQUFpQjtRQUMvQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFTRCxXQUFXLENBQUMsVUFBa0IsRUFBRSxvQkFBb0Q7UUFDbEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxVQUFrQixFQUFFLFNBQWlCLEVBQUUsV0FBOEI7UUFDbEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDekIsa0ZBQWtGO1lBQ2xGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVCQUF1QixDQUFDLFVBQWtCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQXRDRCxvREFzQ0MifQ==
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 { CacheService } from './cache/cacheService';
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 { Decision } from './entitlementDecisionService';
5
+ import { CreateUsageMeasurementMutation, EntitlementCheckResult } from '../api/generated/types';
6
+ import { ModelMapper } from '../utils/ModelMapper';
5
7
  import CachedEntitlement from './cache/cachedEntitlement';
6
- import { LoggerService } from './loggerService';
7
- import { TypedEventEmitter } from './eventEmitter';
8
+ import { CacheService } from './cache/cacheService';
8
9
  import { EdgeApiClient } from './EdgeApiClient';
9
- export declare class EntitlementsService {
10
- private readonly cacheService;
11
- private readonly eventEmitter;
12
- private readonly loggerService;
13
- private readonly entitlementsApi;
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
- private readonly modelMapper;
16
- private entitlementsSubscription;
17
- private usageSubscription;
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
- private isErrorRecoverable;
31
- private onEntitlementsUpdated;
32
- private onUsageUpdated;
33
- private tryGetCacheCustomerAndEntitlement;
34
- createUsageMeasurement(input: CreateUsageMeasurement): Promise<FetchResult<import("../api/generated/types").CreateUsageMeasurementMutation, Record<string, any>, Record<string, any>>>;
35
- private tryTrackEntitlementCheck;
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
- };
@@ -4,98 +4,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.EntitlementsService = void 0;
7
+ const entitlementCheckReportingService_1 = require("./entitlementCheckReportingService");
7
8
  const entitlementsApi_1 = __importDefault(require("../api/entitlements/entitlementsApi"));
8
- const ModelMapper_1 = require("../utils/ModelMapper");
9
9
  const models_1 = require("../models");
10
+ const ModelMapper_1 = require("../utils/ModelMapper");
10
11
  const entitlementDecisionService_1 = require("./entitlementDecisionService");
11
- const entitlementCheckReportingService_1 = require("./entitlementCheckReportingService");
12
12
  const lodash_1 = require("lodash");
13
13
  class EntitlementsService {
14
- constructor(cacheService, client, batchedGraphqlClient, edgeApiClient, eventEmitter, loggerService) {
15
- this.cacheService = cacheService;
16
- this.eventEmitter = eventEmitter;
14
+ constructor(client, loggerService, batchedGraphqlClient, edgeApiClient, cacheService, environmentPrefix) {
15
+ this.client = client;
17
16
  this.loggerService = loggerService;
18
- this.entitlementsSubscription = null;
19
- this.usageSubscription = null;
20
- this.onEntitlementsUpdated = (result) => {
21
- if (result.errors || !result.data) {
22
- this.loggerService.error(`Failed to handle entitlements updated event. Errors: ${result.errors}`, {
23
- errors: JSON.stringify(result.errors),
24
- });
25
- return;
26
- }
27
- const entitlementsUpdated = result.data.entitlementsUpdated;
28
- this.loggerService.debug(`Entitlements updated event arrived.`, {
29
- customerId: entitlementsUpdated.customerId,
30
- entitlements: entitlementsUpdated.entitlements,
31
- });
32
- const entitlements = this.modelMapper.mapCachedEntitlements(entitlementsUpdated.entitlements);
33
- this.cacheService.setCustomer(entitlementsUpdated.customerId, entitlements);
34
- this.eventEmitter.emit('entitlementsUpdated', entitlementsUpdated);
35
- };
36
- this.onUsageUpdated = (result) => {
37
- if (result.errors || !result.data) {
38
- this.loggerService.error(`Failed to handle usage updated event. Errors: ${result.errors}`, {
39
- errors: JSON.stringify(result.errors),
40
- });
41
- return;
42
- }
43
- const { usage: { customerId, featureId, currentUsage, nextResetDate }, entitlement, } = result.data.usageUpdated;
44
- this.loggerService.debug(`Usage updated event arrived.`, {
45
- customerId: customerId,
46
- featureId: featureId,
47
- currentUsage: currentUsage,
48
- nextResetDate: nextResetDate,
49
- });
50
- const wasSet = this.cacheService.setEntitlement(customerId, featureId, this.modelMapper.mapCachedEntitlement(entitlement, currentUsage, nextResetDate));
51
- if (wasSet) {
52
- this.eventEmitter.emit('usageUpdated', result.data.usageUpdated);
53
- }
54
- };
55
- this.entitlementsApi = new entitlementsApi_1.default(client, edgeApiClient);
56
- this.entitlementCheckReportingService = new entitlementCheckReportingService_1.EntitlementCheckReportingService(new entitlementsApi_1.default(batchedGraphqlClient, edgeApiClient), this.loggerService);
17
+ this.batchedGraphqlClient = batchedGraphqlClient;
18
+ this.cacheService = cacheService;
19
+ this.environmentPrefix = environmentPrefix;
20
+ this.modelMapper = new ModelMapper_1.ModelMapper();
21
+ this.entitlementsApi = new entitlementsApi_1.default(client, edgeApiClient, loggerService);
22
+ this.entitlementCheckReportingService = new entitlementCheckReportingService_1.EntitlementCheckReportingService(new entitlementsApi_1.default(batchedGraphqlClient, edgeApiClient, loggerService), this.loggerService);
57
23
  this.modelMapper = new ModelMapper_1.ModelMapper();
58
- }
59
- subscribeToUpdates() {
60
- this.loggerService.log('Subscribing to real-time updates');
61
- this.unsubscribeFromUpdates();
62
- this.entitlementsSubscription = this.entitlementsApi.subscribeEntitlementsUpdated().subscribe((value) => this.onEntitlementsUpdated(value), (err) => this.websocketErrorHandling(err));
63
- this.usageSubscription = this.entitlementsApi.subscribeUsageUpdated().subscribe((value) => this.onUsageUpdated(value), (err) => this.websocketErrorHandling(err));
64
- }
65
- websocketErrorHandling(err) {
66
- const isErrorRecoverable = this.isErrorRecoverable(err);
67
- const actionDescription = isErrorRecoverable ? 'retrying to connect' : 'giving up permanently';
68
- const errorReason = err.message || err.reason;
69
- this.loggerService.error(`Received error while handling entitlements updated event. Error: ${errorReason} - ${actionDescription}`);
70
- if (isErrorRecoverable) {
71
- this.subscribeToUpdates();
72
- }
73
- }
74
- unsubscribeFromUpdates() {
75
- var _a, _b;
76
- (_a = this.entitlementsSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
77
- this.entitlementsSubscription = null;
78
- (_b = this.usageSubscription) === null || _b === void 0 ? void 0 : _b.unsubscribe();
79
- this.usageSubscription = null;
80
- this.cacheService.clearCache();
81
- }
82
- async refetchEntitlements(customerRefId) {
83
- let cachedEntitlements = null;
84
- let customerExists = false;
85
- this.loggerService.log(`Customer with id: ${customerRefId} not found in cache`, { customerRefId });
86
- const entitlementsResult = await this.entitlementsApi.getEntitlements(customerRefId);
87
- const entitlements = entitlementsResult.data.entitlements;
88
- if (!(0, lodash_1.isEmpty)(entitlements)) {
89
- cachedEntitlements = this.modelMapper.mapCachedEntitlements(entitlements);
90
- this.cacheService.setCustomer(customerRefId, cachedEntitlements);
91
- customerExists = true;
92
- }
93
- return { entitlements: cachedEntitlements, customerExists };
94
24
  }
95
25
  async getBooleanEntitlement(customerRefId, featureRefId, fallbackEntitlement, options) {
96
26
  var _a, _b;
97
27
  const shouldTrack = (options === null || options === void 0 ? void 0 : options.shouldTrack) || false;
98
- let { entitlement, customerExists } = this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
28
+ let { entitlement, customerExists } = await this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
99
29
  if (!entitlement) {
100
30
  const refetchResult = await this.refetchEntitlements(customerRefId);
101
31
  entitlement = ((_a = refetchResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(featureRefId)) || null;
@@ -121,7 +51,7 @@ class EntitlementsService {
121
51
  async getNumericEntitlement(customerRefId, featureRefId, fallbackEntitlement, options) {
122
52
  var _a, _b;
123
53
  const shouldTrack = (options === null || options === void 0 ? void 0 : options.shouldTrack) || false;
124
- let { entitlement, customerExists } = this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
54
+ let { entitlement, customerExists } = await this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
125
55
  if (!entitlement) {
126
56
  const refetchResult = await this.refetchEntitlements(customerRefId);
127
57
  entitlement = ((_a = refetchResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(featureRefId)) || null;
@@ -148,7 +78,7 @@ class EntitlementsService {
148
78
  var _a, _b, _c;
149
79
  const shouldTrack = (options === null || options === void 0 ? void 0 : options.shouldTrack) || false;
150
80
  const requestUsage = options === null || options === void 0 ? void 0 : options.requestedUsage;
151
- let { entitlement, customerExists } = this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
81
+ let { entitlement, customerExists } = await this.tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId);
152
82
  if (!entitlement) {
153
83
  const refetchResult = await this.refetchEntitlements(customerRefId);
154
84
  entitlement = ((_a = refetchResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(featureRefId)) || null;
@@ -172,32 +102,55 @@ class EntitlementsService {
172
102
  this.tryTrackEntitlementCheck(shouldTrack, featureRefId, customerRefId, entitlementResult, requestUsage);
173
103
  return this.modelMapper.mapMeteredEntitlement(entitlement, decision, requestUsage);
174
104
  }
105
+ async getCustomerEntitlementsWithUsage(customerRefId) {
106
+ return this.getCustomerEntitlements(customerRefId);
107
+ }
175
108
  async getCustomerEntitlements(customerRefId) {
176
- const entitlements = this.cacheService.getCustomerEntitlements(customerRefId);
109
+ const entitlements = this.cacheService.getCustomerEntitlements(this.environmentPrefix, customerRefId);
177
110
  if (!entitlements) {
178
111
  await this.refetchEntitlements(customerRefId);
179
112
  // todo currently there is no good way to find out if the customer exists or not
180
113
  }
181
- const cachedEntitlements = this.cacheService.getCustomerEntitlements(customerRefId) || [];
114
+ const cachedEntitlements = (await this.cacheService.getCustomerEntitlements(this.environmentPrefix, customerRefId)) || [];
182
115
  return Array.from(cachedEntitlements.values()).map((entitlement) => {
183
116
  const decision = entitlementDecisionService_1.EntitlementDecisionService.decideEntitlementPolicy(true, entitlement);
184
117
  return this.modelMapper.mapEntitlement(entitlement, decision);
185
118
  });
186
119
  }
187
- isErrorRecoverable(err) {
188
- const isInvalidAPIKeyError = err.reason === 'Invalid API key';
189
- return !isInvalidAPIKeyError;
120
+ createUsageMeasurement(input) {
121
+ return this.entitlementsApi.createUsageMeasurement(input);
190
122
  }
191
- tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId) {
192
- const customer = this.cacheService.getCustomerEntitlements(customerRefId);
123
+ async tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId) {
124
+ const customer = await this.cacheService.getCustomerEntitlements(this.environmentPrefix, customerRefId);
193
125
  if (!customer) {
194
126
  return { customerExists: false, entitlement: null };
195
127
  }
196
128
  const entitlement = customer.get(featureRefId) || null;
197
129
  return { customerExists: true, entitlement };
198
130
  }
199
- async createUsageMeasurement(input) {
200
- return this.entitlementsApi.createUsageMeasurement(input);
131
+ async refetchEntitlements(customerRefId, skipEdge = false) {
132
+ var _a;
133
+ let cachedEntitlements = null;
134
+ let customerExists = false;
135
+ this.loggerService.log(`Customer with id: ${customerRefId} not found in cache`, { customerRefId });
136
+ const entitlementsResult = await this.entitlementsApi.getEntitlements(customerRefId, skipEdge);
137
+ const entitlements = entitlementsResult.data.entitlements;
138
+ if (!(0, lodash_1.isEmpty)(entitlements)) {
139
+ const entitlementsUpdatedAtTimestamp = ((_a = entitlements.find((entitlement) => Number.isInteger(entitlement === null || entitlement === void 0 ? void 0 : entitlement.entitlementUpdatedAt))) === null || _a === void 0 ? void 0 : _a.entitlementUpdatedAt) || new Date().getTime();
140
+ const featureIdToUsageTimestamp = new Map(entitlements
141
+ .filter((entitlement) => {
142
+ var _a, _b;
143
+ return ((_a = entitlement === null || entitlement === void 0 ? void 0 : entitlement.feature) === null || _a === void 0 ? void 0 : _a.meterType) &&
144
+ ((_b = entitlement === null || entitlement === void 0 ? void 0 : entitlement.feature) === null || _b === void 0 ? void 0 : _b.meterType) !== models_1.MeterType.None &&
145
+ (entitlement === null || entitlement === void 0 ? void 0 : entitlement.feature.refId) &&
146
+ Number.isInteger(entitlement.usageUpdatedAt);
147
+ })
148
+ .map((entitlement) => [entitlement.feature.refId, entitlement.usageUpdatedAt]));
149
+ cachedEntitlements = this.modelMapper.mapCachedEntitlements(entitlements);
150
+ await this.cacheService.setCustomer(this.environmentPrefix, customerRefId, cachedEntitlements, entitlementsUpdatedAtTimestamp, featureIdToUsageTimestamp);
151
+ customerExists = true;
152
+ }
153
+ return { entitlements: cachedEntitlements, customerExists };
201
154
  }
202
155
  tryTrackEntitlementCheck(shouldTrack, featureRefId, customerRefId, result, requestedUsage) {
203
156
  if (!shouldTrack) {
@@ -207,4 +160,4 @@ class EntitlementsService {
207
160
  }
208
161
  }
209
162
  exports.EntitlementsService = EntitlementsService;
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLDBGQUFrRTtBQUNsRSxzREFBbUQ7QUFDbkQsc0NBVW1CO0FBQ25CLDZFQUFvRjtBQVFwRix5RkFBc0Y7QUFDdEYsbUNBQWlDO0FBSWpDLE1BQWEsbUJBQW1CO0lBUTlCLFlBQ21CLFlBQTBCLEVBQzNDLE1BQTJDLEVBQzNDLG9CQUF5RCxFQUN6RCxhQUFtQyxFQUNsQixZQUErQixFQUMvQixhQUE0QjtRQUw1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUkxQixpQkFBWSxHQUFaLFlBQVksQ0FBbUI7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFUdkMsNkJBQXdCLEdBQXNDLElBQUksQ0FBQztRQUNuRSxzQkFBaUIsR0FBc0MsSUFBSSxDQUFDO1FBOE41RCwwQkFBcUIsR0FBRyxDQUFDLE1BQW9ELEVBQUUsRUFBRTtZQUN2RixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyx3REFBd0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNoRyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBRUQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBRTVELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO2dCQUM5RCxVQUFVLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtnQkFDMUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLFlBQVk7YUFDL0MsQ0FBQyxDQUFD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
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlGQUFzRjtBQUN0RiwwRkFBa0U7QUFHbEUsc0NBVW1CO0FBRW5CLHNEQUFtRDtBQUNuRCw2RUFBMEU7QUFHMUUsbUNBQWlDO0FBR2pDLE1BQXNCLG1CQUFtQjtJQUt2QyxZQUNVLE1BQTJDLEVBQ2hDLGFBQTRCLEVBQzlCLG9CQUF5RCxFQUMxRSxhQUFtQyxFQUNoQixZQUEwQixFQUMxQixpQkFBeUI7UUFMcEMsV0FBTSxHQUFOLE1BQU0sQ0FBcUM7UUFDaEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDOUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQztRQUV2RCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUFFNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLG1FQUFnQyxDQUMxRSxJQUFJLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RSxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUN6QixhQUFxQixFQUNyQixZQUFvQixFQUNwQixtQkFBdUMsRUFDdkMsT0FBbUM7O1FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFF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
@@ -0,0 +1,20 @@
1
+ import { ApolloClient, NormalizedCacheObject } from '@apollo/client/core';
2
+ import { LoggerService } from './loggerService';
3
+ import { TypedEventEmitter } from './eventEmitter';
4
+ import { EntitlementsService } from './entitlementsService';
5
+ import { InMemoryCacheService } from './cache/inMemoryCacheService';
6
+ import { EdgeApiClient } from './EdgeApiClient';
7
+ export declare class InMemoryEntitlementsService extends EntitlementsService {
8
+ protected readonly cacheService: InMemoryCacheService;
9
+ private readonly eventEmitter;
10
+ private entitlementsSubscription;
11
+ private usageSubscription;
12
+ constructor(cacheService: InMemoryCacheService, client: ApolloClient<NormalizedCacheObject>, batchedGraphqlClient: ApolloClient<NormalizedCacheObject>, eventEmitter: TypedEventEmitter, loggerService: LoggerService, edgeApiClient: EdgeApiClient | null);
13
+ init(): void;
14
+ private websocketErrorHandling;
15
+ cleanup(): void;
16
+ private onEntitlementsUpdated;
17
+ private onUsageUpdated;
18
+ private isErrorRecoverable;
19
+ clearCache(): void;
20
+ }