@stigg/cache-runtime 2.0.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.
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.EntitlementsService = void 0;
15
+ const nanoid_1 = require("nanoid");
16
+ const cache_core_1 = require("@stigg/cache-core");
17
+ const lodash_1 = require("lodash");
18
+ class EntitlementsService {
19
+ constructor(entitlementsApi, loggerService, cacheService, entitlementsTimeout, evaluator, offline, errorHandler) {
20
+ this.entitlementsApi = entitlementsApi;
21
+ this.loggerService = loggerService;
22
+ this.cacheService = cacheService;
23
+ this.entitlementsTimeout = entitlementsTimeout;
24
+ this.evaluator = evaluator;
25
+ this.offline = offline;
26
+ this.errorHandler = errorHandler;
27
+ this.isInitialized = false;
28
+ }
29
+ async getBooleanEntitlement(customerId, featureRefId, resourceId, options) {
30
+ return this.errorHandler.readOrFallback('Failed to get boolean entitlement, using fallback entitlement', () => this.readBooleanEntitlement(customerId, featureRefId, resourceId, options), () => this.evaluator.fallbacks.forBoolean(featureRefId, options));
31
+ }
32
+ async readBooleanEntitlement(customerId, featureRefId, resourceId, options) {
33
+ if (this.offline) {
34
+ return this.evaluator.fallbacks.forBoolean(featureRefId, options);
35
+ }
36
+ const query = { type: cache_core_1.EntitlementType.Feature, id: featureRefId };
37
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, 'getBooleanEntitlement');
38
+ const evaluation = this.evaluator.evaluateBoolean(query, entitlement, accessDeniedReason, options);
39
+ if (!entitlement) {
40
+ this.loggerService.log(`No entitlement for boolean feature found`, {
41
+ customerId,
42
+ resourceId,
43
+ featureRefId,
44
+ accessDeniedReason: evaluation.accessDeniedReason,
45
+ });
46
+ }
47
+ return evaluation;
48
+ }
49
+ async getNumericEntitlement(customerId, featureRefId, resourceId, options) {
50
+ return this.errorHandler.readOrFallback('Failed to get numeric entitlement, using fallback entitlement', () => this.readNumericEntitlement(customerId, featureRefId, resourceId, options), () => this.evaluator.fallbacks.forNumeric(featureRefId, options));
51
+ }
52
+ async readNumericEntitlement(customerId, featureRefId, resourceId, options) {
53
+ if (this.offline) {
54
+ return this.evaluator.fallbacks.forNumeric(featureRefId, options);
55
+ }
56
+ const query = { type: cache_core_1.EntitlementType.Feature, id: featureRefId };
57
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, 'getNumericEntitlement');
58
+ const evaluation = this.evaluator.evaluateNumeric(query, entitlement, accessDeniedReason, options);
59
+ if (!entitlement) {
60
+ this.loggerService.log(`No entitlement for numeric feature found`, {
61
+ customerId,
62
+ resourceId,
63
+ featureRefId,
64
+ accessDeniedReason: evaluation.accessDeniedReason,
65
+ });
66
+ }
67
+ return evaluation;
68
+ }
69
+ async getMeteredEntitlement(customerId, featureRefId, resourceId, options) {
70
+ return this.errorHandler.readOrFallback('Failed to get metered entitlement, using fallback entitlement', () => this.readMeteredEntitlement(customerId, featureRefId, resourceId, options), () => this.evaluator.fallbacks.forMetered(featureRefId, options));
71
+ }
72
+ async readMeteredEntitlement(customerId, featureRefId, resourceId, options) {
73
+ if (this.offline) {
74
+ return this.evaluator.fallbacks.forMetered(featureRefId, options);
75
+ }
76
+ const query = { type: cache_core_1.EntitlementType.Feature, id: featureRefId };
77
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, 'getMeteredEntitlement');
78
+ const evaluation = this.evaluator.evaluateMetered(query, entitlement, accessDeniedReason, options);
79
+ if (!entitlement) {
80
+ this.loggerService.log(`No entitlement for metered feature found`, {
81
+ customerId,
82
+ resourceId,
83
+ featureRefId,
84
+ accessDeniedReason: evaluation.accessDeniedReason,
85
+ });
86
+ }
87
+ return evaluation;
88
+ }
89
+ async getEnumEntitlement(customerId, featureRefId, resourceId, options) {
90
+ return this.errorHandler.readOrFallback('Failed to get enum entitlement, using fallback entitlement', () => this.readEnumEntitlement(customerId, featureRefId, resourceId, options), () => this.evaluator.fallbacks.forEnum(featureRefId, options));
91
+ }
92
+ async readEnumEntitlement(customerId, featureRefId, resourceId, options) {
93
+ if (this.offline) {
94
+ return this.evaluator.fallbacks.forEnum(featureRefId, options);
95
+ }
96
+ const query = { type: cache_core_1.EntitlementType.Feature, id: featureRefId };
97
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, 'getEnumEntitlement');
98
+ const evaluation = this.evaluator.evaluateEnum(query, entitlement, accessDeniedReason, options);
99
+ if (!entitlement) {
100
+ this.loggerService.log(`No entitlement for enum feature found`, {
101
+ customerId,
102
+ resourceId,
103
+ featureRefId,
104
+ accessDeniedReason: evaluation.accessDeniedReason,
105
+ });
106
+ }
107
+ return evaluation;
108
+ }
109
+ async getCreditEntitlement(customerId, currencyId, resourceId, options) {
110
+ return this.errorHandler.readOrFallback('Failed to get credit entitlement, using fallback entitlement', () => this.readCreditEntitlement(customerId, currencyId, resourceId, options), () => this.evaluator.fallbacks.forCredit(currencyId, options));
111
+ }
112
+ async readCreditEntitlement(customerId, currencyId, resourceId, options) {
113
+ if (this.offline) {
114
+ return this.evaluator.fallbacks.forCredit(currencyId, options);
115
+ }
116
+ const query = { type: cache_core_1.EntitlementType.Credit, id: currencyId };
117
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, 'getCreditEntitlement');
118
+ const evaluation = this.evaluator.evaluateCredit(query, entitlement, accessDeniedReason, options);
119
+ if (!entitlement) {
120
+ this.loggerService.log(`No entitlement for credit currency found`, {
121
+ customerId,
122
+ resourceId,
123
+ currencyId,
124
+ accessDeniedReason: evaluation.accessDeniedReason,
125
+ });
126
+ }
127
+ return evaluation;
128
+ }
129
+ async getEntitlement(entitlementReference, customerRefId, resourceId, options) {
130
+ return this.errorHandler.readOrFallback('Failed to get entitlement, using fallback entitlement', () => this.readEntitlement(entitlementReference, customerRefId, resourceId, options), () => this.evaluator.fallbacks.forQuery(entitlementReference, options));
131
+ }
132
+ async readEntitlement(entitlementReference, customerRefId, resourceId, options) {
133
+ if (this.offline) {
134
+ return this.evaluator.fallbacks.forQuery(entitlementReference, options);
135
+ }
136
+ const { entitlement, accessDeniedReason } = await this.getCustomerAndEntitlementFromCacheOrRefetch(entitlementReference, customerRefId, resourceId, 'getEntitlement');
137
+ const evaluation = this.evaluator.evaluate(entitlementReference, entitlement, accessDeniedReason, options);
138
+ if (!entitlement) {
139
+ this.loggerService.log(`No entitlement found for reference`, {
140
+ customerRefId,
141
+ resourceId,
142
+ entitlementReference,
143
+ accessDeniedReason: evaluation.accessDeniedReason,
144
+ });
145
+ }
146
+ return evaluation;
147
+ }
148
+ async getCustomerAndEntitlementFromCacheOrRefetch(query, customerId, resourceId, triggeredBy) {
149
+ var _a, _b;
150
+ const result = await this.cacheService.getCustomerEntitlement({ query, customerId, resourceId });
151
+ let { entitlement, accessDeniedReason } = result;
152
+ const shouldRefetch = result.cacheMiss || !this.isInitialized || this.isEntitlementExpired(entitlement);
153
+ if (shouldRefetch) {
154
+ const postMissResult = await this.refetchEntitlementsAfterCacheMiss({
155
+ customerId,
156
+ resourceId,
157
+ refetchGlobalCustomer: result.globalCustomerMissing,
158
+ triggeredBy,
159
+ });
160
+ entitlement = (_b = (_a = postMissResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(query)) !== null && _b !== void 0 ? _b : null;
161
+ accessDeniedReason = postMissResult.accessDeniedReason;
162
+ }
163
+ return { entitlement, accessDeniedReason };
164
+ }
165
+ async getCustomerEntitlements(customerId, resourceId) {
166
+ return this.errorHandler.readOrFallback('Failed to get customer entitlements, using fallback entitlements', () => this.readCustomerEntitlements(customerId, resourceId), () => ({ entitlements: this.evaluator.fallbacks.forAllConfigured(), accessDeniedReason: null }));
167
+ }
168
+ async readCustomerEntitlements(customerId, resourceId) {
169
+ if (this.offline) {
170
+ return { entitlements: this.evaluator.fallbacks.forAllConfigured(), accessDeniedReason: null };
171
+ }
172
+ const result = await this.cacheService.getCustomerEntitlements({ customerId, resourceId });
173
+ let { entitlements, accessDeniedReason } = result;
174
+ const shouldRefetch = result.cacheMiss || !this.isInitialized || this.areEntitlementsExpired(entitlements);
175
+ if (shouldRefetch) {
176
+ ({ entitlements, accessDeniedReason } = await this.refetchEntitlementsAfterCacheMiss({
177
+ customerId,
178
+ resourceId,
179
+ refetchGlobalCustomer: result.globalCustomerMissing,
180
+ triggeredBy: 'getCustomerEntitlements',
181
+ }));
182
+ }
183
+ if (!entitlements) {
184
+ return { entitlements: [], accessDeniedReason: accessDeniedReason !== null && accessDeniedReason !== void 0 ? accessDeniedReason : null };
185
+ }
186
+ return {
187
+ entitlements: entitlements
188
+ .values()
189
+ .map((value) => this.evaluator.evaluate(value.getEntitlementQuery(), value, accessDeniedReason)),
190
+ accessDeniedReason: accessDeniedReason !== null && accessDeniedReason !== void 0 ? accessDeniedReason : null,
191
+ };
192
+ }
193
+ /** Offline never reaches the API, so the measurement is acknowledged locally instead. */
194
+ offlineMeasurement({ customerId, resourceId, featureId }) {
195
+ return { id: (0, nanoid_1.nanoid)(), customerId, resourceId, featureId, timestamp: Date.now() };
196
+ }
197
+ async reportUsage(input) {
198
+ if (this.offline) {
199
+ return this.offlineMeasurement(input);
200
+ }
201
+ return this.errorHandler.runOrThrow('Failed to report usage', async () => {
202
+ const result = await this.entitlementsApi.reportUsage(input);
203
+ await this.updateFeatureUsage(result);
204
+ return result;
205
+ });
206
+ }
207
+ async reportUsageBulk(input) {
208
+ if (this.offline) {
209
+ return input.usages.map((usage) => this.offlineMeasurement(usage));
210
+ }
211
+ return this.errorHandler.runOrThrow('Failed to bulk report usage', async () => {
212
+ const results = await this.entitlementsApi.reportUsageBulk(input);
213
+ for (const measurement of results) {
214
+ await this.updateFeatureUsage(measurement);
215
+ }
216
+ return results;
217
+ });
218
+ }
219
+ /** Passes through: an event has no cache state to maintain, unlike a usage measurement. */
220
+ async reportEvent(events) {
221
+ if (this.offline) {
222
+ return;
223
+ }
224
+ await this.errorHandler.runOrThrow('Failed to report usage event', () => this.entitlementsApi.reportEvent(events));
225
+ }
226
+ /** Passes through: the balance is settled server-side, so there is nothing to write through. */
227
+ async consumeCreditsAsync(consumptions) {
228
+ if (this.offline) {
229
+ return;
230
+ }
231
+ await this.errorHandler.runOrThrow('Failed to consume credits', () => this.entitlementsApi.consumeCreditsAsync(consumptions));
232
+ }
233
+ async consumeCredits(input) {
234
+ if (this.offline) {
235
+ const { customerId, currencyId, resourceId, amount } = input;
236
+ return { customerId, currencyId, resourceId, amount, timestamp: Date.now() };
237
+ }
238
+ return this.errorHandler.runOrThrow('Failed to consume credits', async () => {
239
+ const result = await this.entitlementsApi.consumeCredits(input);
240
+ if (result.credit) {
241
+ await this.updateCreditBalance({
242
+ customerId: result.customerId,
243
+ resourceId: result.resourceId,
244
+ credit: result.credit,
245
+ });
246
+ }
247
+ return result;
248
+ });
249
+ }
250
+ async refetchEntitlementsAfterCacheMiss(params) {
251
+ const { customerId, resourceId, triggeredBy, refetchGlobalCustomer } = params;
252
+ const refetchPromise = this.refetchEntityEntitlementsAfterCacheMiss(params);
253
+ if ((0, lodash_1.isNil)(resourceId) || !refetchGlobalCustomer) {
254
+ return refetchPromise;
255
+ }
256
+ const globalCustomerRefetchPromise = this.refetchEntityEntitlementsAfterCacheMiss({
257
+ customerId,
258
+ resourceId: undefined,
259
+ triggeredBy,
260
+ });
261
+ const [resourceResult] = await Promise.all([refetchPromise, globalCustomerRefetchPromise]);
262
+ return resourceResult;
263
+ }
264
+ /**
265
+ * Force a refetch and report whether the entitled entity exists at all. `NoActiveSubscription`
266
+ * still counts as existing — the customer is known, they just have nothing active.
267
+ *
268
+ * A failure answers `false` rather than throwing: not knowing and knowing there is nothing are
269
+ * the same answer to the caller, and both hosts wanted it.
270
+ */
271
+ async reloadEntitlements(customerId, resourceId) {
272
+ if (this.offline) {
273
+ return { entitledEntityExists: true };
274
+ }
275
+ return this.errorHandler.readOrFallback('Failed to reload customer entitlements', async () => {
276
+ if (!customerId || typeof customerId !== 'string') {
277
+ throw new Error('Invalid argument: customerId');
278
+ }
279
+ const response = await this.refetchEntitlements({
280
+ customerId,
281
+ resourceId,
282
+ skipEdge: true,
283
+ triggeredBy: 'reloadEntitlements',
284
+ });
285
+ if (response == null) {
286
+ return { entitledEntityExists: false };
287
+ }
288
+ return {
289
+ entitledEntityExists: response.accessDeniedReason == null ||
290
+ response.accessDeniedReason === cache_core_1.AccessDeniedReason.NoActiveSubscription,
291
+ };
292
+ }, () => ({ entitledEntityExists: false }));
293
+ }
294
+ async refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }) {
295
+ this.loggerService.log(`Re-fetching entitlements`, {
296
+ customerId,
297
+ resourceId,
298
+ skipEdge,
299
+ triggeredBy,
300
+ });
301
+ const { entitlements, accessDeniedReason } = await this.entitlementsApi.getEntitlementsState(customerId, resourceId, skipEdge, this.entitlementsTimeout);
302
+ // State-level and entitlement-level reasons are distinct vocabularies; the cache stores
303
+ // the former and answers reads with the latter.
304
+ const localAccessDeniedReason = (0, cache_core_1.mapAccessDeniedReason)(accessDeniedReason);
305
+ const updatedEntitlements = await this.setEntitlements({
306
+ entitlements,
307
+ accessDeniedReason,
308
+ customerId,
309
+ resourceId,
310
+ });
311
+ return cache_core_1.entitlementsResponseMapper.cacheHit(updatedEntitlements, localAccessDeniedReason);
312
+ }
313
+ async setEntitlementsIfExists(options) {
314
+ const { entitlements } = options, rest = __rest(options, ["entitlements"]);
315
+ if ((0, lodash_1.isNil)(entitlements)) {
316
+ return Promise.resolve(null);
317
+ }
318
+ return this.setEntitlements(Object.assign({ entitlements, accessDeniedReason: null }, rest));
319
+ }
320
+ async setEntitlements(params) {
321
+ const { entitlements, accessDeniedReason, customerId, resourceId } = params;
322
+ const entitlementsUpdatedAtTimestamp = this.getEntitlementsUpdatedAtTimestamp({
323
+ entitlements,
324
+ customerId,
325
+ resourceId,
326
+ });
327
+ return this.cacheService.setCustomer({
328
+ customerId,
329
+ resourceId,
330
+ entitlements,
331
+ accessDeniedReason,
332
+ entitlementsTimestamp: entitlementsUpdatedAtTimestamp.getTime(),
333
+ });
334
+ }
335
+ getEntitlementsUpdatedAtTimestamp({ entitlements, customerId, resourceId, }) {
336
+ if ((0, lodash_1.isEmpty)(entitlements)) {
337
+ // empty entitlements means we don't have a timestamp
338
+ return cache_core_1.DATE_IN_FAR_PAST;
339
+ }
340
+ const entitlementsUpdatedAt = entitlements
341
+ .map(({ entitlementUpdatedAt }) => entitlementUpdatedAt)
342
+ // Cast preserves today's quirk: isValidDate(null) is true (epoch 0), so a null here is
343
+ // "found" and then rejected by the falsy check below, while undefined is skipped outright.
344
+ // Both land on new Date(); narrowing it properly is a behaviour change, so not here.
345
+ .find((entitlementUpdatedAt) => (0, cache_core_1.isValidDate)(entitlementUpdatedAt));
346
+ if (!entitlementsUpdatedAt) {
347
+ this.loggerService.error(`Failed to find entitlements updated at timestamp for customer`, {
348
+ customerId,
349
+ resourceId,
350
+ });
351
+ return new Date();
352
+ }
353
+ return new Date(entitlementsUpdatedAt);
354
+ }
355
+ async updateFeatureUsage({ featureId, customerId, resourceId, currentUsage, usagePeriodStart, usagePeriodEnd, credit, timestamp, }) {
356
+ var _a;
357
+ if (!(0, lodash_1.isNil)(currentUsage)) {
358
+ await this.cacheService.updateUsage({
359
+ customerId,
360
+ resourceId,
361
+ entitlementReference: {
362
+ type: cache_core_1.EntitlementType.Feature,
363
+ id: featureId,
364
+ },
365
+ usageTimestamp: (_a = (0, cache_core_1.mapDate)(timestamp)) !== null && _a !== void 0 ? _a : new Date(),
366
+ usage: {
367
+ currentUsage,
368
+ usagePeriodStart: (0, cache_core_1.toEpochMs)(usagePeriodStart),
369
+ usagePeriodEnd: (0, cache_core_1.toEpochMs)(usagePeriodEnd),
370
+ },
371
+ });
372
+ }
373
+ // For credit-backed features, also update the optimistic balance of the credit entitlement,
374
+ // keyed by its currency and reconciled by the credit's own grant-version timestamp.
375
+ if (credit) {
376
+ await this.updateCreditBalance({ customerId, resourceId, credit });
377
+ }
378
+ }
379
+ // Writes the optimistic credit balance into the cache, keyed by its currency and reconciled
380
+ // by the credit's own grant-version timestamp. Shared by reportUsage (credit-backed features)
381
+ // and direct credit consumption.
382
+ async updateCreditBalance({ customerId, resourceId, credit, }) {
383
+ var _a;
384
+ await this.cacheService.updateUsage({
385
+ customerId,
386
+ resourceId: resourceId !== null && resourceId !== void 0 ? resourceId : undefined,
387
+ entitlementReference: {
388
+ type: cache_core_1.EntitlementType.Credit,
389
+ id: credit.currencyId,
390
+ },
391
+ usageTimestamp: (_a = (0, cache_core_1.mapDate)(credit.timestamp)) !== null && _a !== void 0 ? _a : new Date(),
392
+ usage: {
393
+ currentUsage: credit.currentUsage,
394
+ // Credits have no period start; carry the reset date through so the cached
395
+ // credit entitlement's usagePeriodEnd isn't wiped by the usage update.
396
+ usagePeriodStart: null,
397
+ usagePeriodEnd: (0, cache_core_1.toEpochMs)(credit.usagePeriodEnd),
398
+ },
399
+ });
400
+ }
401
+ /**
402
+ * Reports only whether the cache store is readable. `CacheRuntime`'s method of the same name is
403
+ * the one that reports whether startup as a whole succeeded.
404
+ */
405
+ async waitForInitialization() {
406
+ await this.cacheService.waitForInitialization();
407
+ }
408
+ isEntitlementExpired(entitlement) {
409
+ if (!entitlement) {
410
+ return false;
411
+ }
412
+ const { validUntil } = entitlement.calculatedEntitlement;
413
+ return validUntil ? validUntil <= new Date().valueOf() : false;
414
+ }
415
+ areEntitlementsExpired(entitlements) {
416
+ if (!entitlements) {
417
+ return false;
418
+ }
419
+ return entitlements.values().some((entitlement) => this.isEntitlementExpired(entitlement));
420
+ }
421
+ }
422
+ exports.EntitlementsService = EntitlementsService;
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWdDO0FBV2hDLGtEQWlCMkI7QUFDM0IsbUNBQXdDO0FBcUJ4QyxNQUFzQixtQkFBbUI7SUFHdkMsWUFDcUIsZUFBZ0UsRUFDaEUsYUFBeUIsRUFDekIsWUFBaUMsRUFDbkMsbUJBQTJCLEVBQ3pCLFNBQStCLEVBQ2pDLE9BQWdCLEVBQ2hCLFlBQWlDO1FBTi9CLG9CQUFlLEdBQWYsZUFBZSxDQUFpRDtRQUNoRSxrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUN6QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDbkMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFRO1FBQ3pCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQ2pDLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBVDFDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBVTdCLENBQUM7SUFFSixLQUFLLENBQUMscUJBQXFCLENBQ3pCLFVBQWtCLEVBQ2xCLFlBQW9CLEVBQ3BCLFVBQW1CLEVBQ25CLE9BQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQ3JDLCtEQUErRCxFQUMvRCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQ2hGLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRVMsS0FBSyxDQUFDLHNCQUFzQixDQUNwQyxVQUFrQixFQUNsQixZQUFvQixFQUNwQixVQUFtQixF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
@@ -0,0 +1,16 @@
1
+ export type GetEntitlementsOperations = 'getBooleanEntitlement' | 'getNumericEntitlement' | 'getMeteredEntitlement' | 'getEnumEntitlement' | 'getCreditEntitlement' | 'getEntitlement' | 'getCustomerEntitlements';
2
+ export type RefetchEntitlementsTriggeredBy = GetEntitlementsOperations | 'updateSubscription' | 'cancelSubscription' | 'createSubscription' | 'reloadEntitlements';
3
+ export type RefetchEntityEntitlementsAfterCacheMissParams = {
4
+ customerId: string;
5
+ resourceId: string | undefined;
6
+ triggeredBy: GetEntitlementsOperations;
7
+ };
8
+ export type RefetchEntitlementsAfterCacheMissParams = RefetchEntityEntitlementsAfterCacheMissParams & {
9
+ refetchGlobalCustomer: boolean;
10
+ };
11
+ export type RefetchEntitlementsParams = {
12
+ customerId: string;
13
+ resourceId: string | undefined;
14
+ skipEdge?: boolean;
15
+ triggeredBy: RefetchEntitlementsTriggeredBy;
16
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,23 @@
1
+ import { RuntimeErrorHandler } from './runtimeErrorHandler';
2
+ import { EntitlementsService } from './entitlementsService';
3
+ import { InMemoryCacheService, SlimLogger } from '@stigg/cache-core';
4
+ import { EntitlementEvaluator } from '@stigg/entitlements-runtime';
5
+ import { CacheableInput, EntitlementsRuntimeHooks, EntitlementsTransport } from '../types/transport';
6
+ import { RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
7
+ export declare class InMemoryEntitlementsService<Input extends CacheableInput, TPackagePublished = unknown> extends EntitlementsService<Input, TPackagePublished> {
8
+ protected readonly cacheService: InMemoryCacheService<Input>;
9
+ private readonly hooks;
10
+ private entitlementsSubscription;
11
+ private usageSubscription;
12
+ private packagePublishedSubscription;
13
+ constructor(cacheService: InMemoryCacheService<Input>, entitlementsApi: EntitlementsTransport<Input, TPackagePublished>, hooks: EntitlementsRuntimeHooks<Input, TPackagePublished>, loggerService: SlimLogger, entitlementsTimeout: number, evaluator: EntitlementEvaluator, offline: boolean, errorHandler: RuntimeErrorHandler);
14
+ init(): void;
15
+ private websocketErrorHandling;
16
+ cleanup(): void;
17
+ private onEntitlementsUpdated;
18
+ private onUsageUpdated;
19
+ private isErrorRecoverable;
20
+ clearCache(): void;
21
+ private onPackagePublished;
22
+ protected refetchEntityEntitlementsAfterCacheMiss(params: RefetchEntityEntitlementsAfterCacheMissParams): Promise<import("@stigg/cache-core").EntitlementsResponseCacheHit>;
23
+ }