@stigg/node-server-sdk 3.77.0 → 3.78.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/services/EdgeApiClient.js +4 -2
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +3 -4
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +8 -9
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.d.ts +0 -3
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.js +2 -4
- package/dist/services/cache/redis/distributedLocks.d.ts +14 -0
- package/dist/services/cache/redis/distributedLocks.js +75 -0
- package/dist/services/cache/redisCacheService.constants.d.ts +0 -1
- package/dist/services/cache/redisCacheService.constants.js +2 -3
- package/dist/services/cache/redisCacheService.d.ts +1 -1
- package/dist/services/cache/redisCacheService.js +12 -16
- package/package.json +2 -2
|
@@ -101,7 +101,9 @@ class EdgeApiClient {
|
|
|
101
101
|
retryCondition: (error) => this.canRetryRequest(error),
|
|
102
102
|
retryDelay: (retryNumber, error) => axios_retry_1.default.exponentialDelay(retryNumber, error, 2000),
|
|
103
103
|
shouldResetTimeout: false,
|
|
104
|
-
onRetry: async (retryCount, error, requestConfig) => this.loggerService.log(`Retrying request ${requestConfig.url} - attempt ${retryCount}
|
|
104
|
+
onRetry: async (retryCount, error, requestConfig) => this.loggerService.log(`Retrying request ${requestConfig.url} - attempt ${retryCount}`, {
|
|
105
|
+
previousError: error.message,
|
|
106
|
+
}),
|
|
105
107
|
});
|
|
106
108
|
}
|
|
107
109
|
canRetryRequest(error) {
|
|
@@ -110,4 +112,4 @@ class EdgeApiClient {
|
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
exports.EdgeApiClient = EdgeApiClient;
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRnZUFwaUNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9FZGdlQXBpQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBb0Y7QUFDcEYsOENBQXFFO0FBUXJFLDREQUE4RDtBQUU5RCw4REFBcUM7QUFDckMsMkNBQTZCO0FBQzdCLDZDQUErQjtBQUMvQixtQ0FBb0Q7QUFFcEQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFVOUIsTUFBYSxhQUFhO0lBR3hCLFlBQ21CLE1BQWtDLEVBQ2xDLGFBQTRCO1FBRDVCLFdBQU0sR0FBTixNQUFNLENBQTRCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRTdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBa0MsRUFBRSxhQUE0QjtRQUM1RSxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCxVQUFVLENBQ1IsU0FBa0IsRUFDbEIsa0JBQTJCLEVBQzNCLHVCQUFpQyxFQUNqQyxrQkFBNEI7UUFFNUIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxpQ0FBaUMsR0FBRywyQkFBMkIsdUJBQXVCLEVBQUUsQ0FBQztRQUUvRixJQUFJLEdBQUcsR0FBRyxNQUFNLE1BQU0saUJBQWlCLGlDQUFpQyxFQUFF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
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import Redis from 'ioredis';
|
|
2
|
-
import Redlock from 'redlock';
|
|
3
2
|
import { LoggerService } from '../../loggerService';
|
|
4
3
|
import { OperationContext, NotificationContext } from './RedisSingleExecution.utils';
|
|
5
4
|
import { CacheInstrumentation } from '../../cacheInstrumentation';
|
|
5
|
+
import { DistributedLocks } from '../redis/distributedLocks';
|
|
6
6
|
/**
|
|
7
7
|
* This class manages the execution of operations in a distributed environment (using Redis).
|
|
8
8
|
* It ensures that an operation is executed only once across multiple processes, and handles notifications between processes.
|
|
@@ -12,15 +12,14 @@ export declare class RedisSingleExecutionService {
|
|
|
12
12
|
private readonly environmentPrefix;
|
|
13
13
|
private readonly notificationTimeoutMs;
|
|
14
14
|
private readonly redisClient;
|
|
15
|
-
private readonly
|
|
15
|
+
private readonly distributedLocks;
|
|
16
16
|
private readonly loggerService;
|
|
17
17
|
private readonly cacheInstrumentation;
|
|
18
18
|
private readonly subscribeClient;
|
|
19
19
|
private readonly pendingNotifications;
|
|
20
|
-
constructor(operationName: string, environmentPrefix: string, notificationTimeoutMs: number, redisClient: Redis,
|
|
20
|
+
constructor(operationName: string, environmentPrefix: string, notificationTimeoutMs: number, redisClient: Redis, distributedLocks: DistributedLocks, loggerService: LoggerService, cacheInstrumentation: CacheInstrumentation);
|
|
21
21
|
executeOnceAcrossMultipleProcesses<Response>(context: OperationContext<Response>): Promise<Response>;
|
|
22
22
|
waitForNotificationAndLoadFromCache<Response>({ customerId, resourceId, reloadFromApi, loadFromCache }: OperationContext<Response>, { cancelNotificationSubscription, notificationPromise }: NotificationContext): Promise<Response>;
|
|
23
|
-
private isLockTakenByAnotherClientError;
|
|
24
23
|
private subscribeForNotification;
|
|
25
24
|
private createNotificationPromise;
|
|
26
25
|
private unsubscribeChannel;
|
|
@@ -7,7 +7,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.RedisSingleExecutionService = void 0;
|
|
10
|
-
const redlock_1 = require("redlock");
|
|
11
10
|
const cacheKeysHelpers_1 = require("../../../utils/cacheKeysHelpers");
|
|
12
11
|
const lodash_1 = require("lodash");
|
|
13
12
|
const ReuseOngoingExecution_1 = require("../../../utils/decorators/ReuseOngoingExecution");
|
|
@@ -20,12 +19,12 @@ class RedisSingleExecutionService {
|
|
|
20
19
|
constructor(operationName, environmentPrefix,
|
|
21
20
|
// This timeout duration should be slightly longer than the total
|
|
22
21
|
// elapsed time of all retry attempts for the API data fetch request.
|
|
23
|
-
notificationTimeoutMs, redisClient,
|
|
22
|
+
notificationTimeoutMs, redisClient, distributedLocks, loggerService, cacheInstrumentation) {
|
|
24
23
|
this.operationName = operationName;
|
|
25
24
|
this.environmentPrefix = environmentPrefix;
|
|
26
25
|
this.notificationTimeoutMs = notificationTimeoutMs;
|
|
27
26
|
this.redisClient = redisClient;
|
|
28
|
-
this.
|
|
27
|
+
this.distributedLocks = distributedLocks;
|
|
29
28
|
this.loggerService = loggerService;
|
|
30
29
|
this.cacheInstrumentation = cacheInstrumentation;
|
|
31
30
|
this.pendingNotifications = new Map();
|
|
@@ -44,7 +43,7 @@ class RedisSingleExecutionService {
|
|
|
44
43
|
const { notify, cancelNotificationSubscription } = notificationContext;
|
|
45
44
|
const lockKey = (0, cacheKeysHelpers_1.buildLockKey)(this.environmentPrefix, customerId, resourceId, this.operationName);
|
|
46
45
|
try {
|
|
47
|
-
const response = await this.
|
|
46
|
+
const response = await this.distributedLocks.usingSingleAttempt(lockKey, async () => {
|
|
48
47
|
// At this point, this process has the responsibility to fetch data from
|
|
49
48
|
// the API, cache it, and then notify other clients to continue their execution.
|
|
50
49
|
// no need to listen anymore as this process is the one who will notify later
|
|
@@ -57,7 +56,10 @@ class RedisSingleExecutionService {
|
|
|
57
56
|
return response;
|
|
58
57
|
}
|
|
59
58
|
catch (err) {
|
|
60
|
-
if (this.
|
|
59
|
+
if (await this.distributedLocks.isReadOnlyReplicaError(err)) {
|
|
60
|
+
throw new Error(`Redis is read-only. Cannot ${this.operationName}`);
|
|
61
|
+
}
|
|
62
|
+
if (this.distributedLocks.isLockTakenByAnotherClientError(err)) {
|
|
61
63
|
// At this point, another process is responsible for fetching data from
|
|
62
64
|
// the API and caching it. This process waits until the data fetching and
|
|
63
65
|
// caching is complete, then retrieves the data from the cache.
|
|
@@ -84,9 +86,6 @@ class RedisSingleExecutionService {
|
|
|
84
86
|
throw err;
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
|
-
isLockTakenByAnotherClientError(err) {
|
|
88
|
-
return err instanceof redlock_1.ExecutionError && err.message.includes('unable to achieve a quorum');
|
|
89
|
-
}
|
|
90
89
|
async subscribeForNotification(context) {
|
|
91
90
|
const { customerId, resourceId } = context;
|
|
92
91
|
const notificationChannel = (0, lodash_1.compact)([this.environmentPrefix, this.operationName, customerId, resourceId]).join(':');
|
|
@@ -181,4 +180,4 @@ __decorate([
|
|
|
181
180
|
(0, ReuseOngoingExecution_1.ReuseOngoingExecution)(({ customerId, resourceId }) => (0, lodash_1.compact)([customerId, resourceId]).join(':'))
|
|
182
181
|
], RedisSingleExecutionService.prototype, "executeOnceAcrossMultipleProcesses", null);
|
|
183
182
|
exports.RedisSingleExecutionService = RedisSingleExecutionService;
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVkaXNTaW5nbGVFeGVjdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvUmVkaXNTaW5nbGVFeGVjdXRpb25TZXJ2aWNlL1JlZGlzU2luZ2xlRXhlY3V0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBLHNFQUErRDtBQUMvRCxtQ0FBaUM7QUFDakMsMkZBQXdGO0FBQ3hGLDZFQU9zQztBQUl0Qzs7O0dBR0c7QUFDSCxNQUFhLDJCQUEyQjtJQUl0QyxZQUNtQixhQUFxQixFQUNyQixpQkFBeUI7SUFDMUMsaUVBQWlFO0lBQ2pFLHFFQUFxRTtJQUNwRCxxQkFBNkIsRUFDN0IsV0FBa0IsRUFDbEIsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLG9CQUEwQztRQVIxQyxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUFHekIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFRO1FBQzdCLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQVg1Qyx5QkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQWEzRSxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVB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
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { OptionalPromise } from '../../../types';
|
|
2
|
-
import { Settings } from 'redlock';
|
|
3
2
|
export declare type OperationContext<Response> = {
|
|
4
3
|
customerId: string;
|
|
5
4
|
resourceId: string | undefined;
|
|
@@ -15,8 +14,6 @@ export declare type NotificationPayload = {
|
|
|
15
14
|
error?: string;
|
|
16
15
|
};
|
|
17
16
|
export declare type CallbackFn = (payload: NotificationPayload) => void;
|
|
18
|
-
export declare const LOCK_DURATION = 5000;
|
|
19
|
-
export declare const LOCK_NO_RETRY_SETTINGS: Partial<Settings>;
|
|
20
17
|
export declare class TimeoutError extends Error {
|
|
21
18
|
constructor();
|
|
22
19
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RemoteExecutionError = exports.TimeoutError =
|
|
4
|
-
exports.LOCK_DURATION = 5000;
|
|
5
|
-
exports.LOCK_NO_RETRY_SETTINGS = { retryCount: 0 };
|
|
3
|
+
exports.RemoteExecutionError = exports.TimeoutError = void 0;
|
|
6
4
|
class TimeoutError extends Error {
|
|
7
5
|
constructor() {
|
|
8
6
|
super('Waiting for notification timed out');
|
|
@@ -15,4 +13,4 @@ class RemoteExecutionError extends Error {
|
|
|
15
13
|
}
|
|
16
14
|
}
|
|
17
15
|
exports.RemoteExecutionError = RemoteExecutionError;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVkaXNTaW5nbGVFeGVjdXRpb24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvUmVkaXNTaW5nbGVFeGVjdXRpb25TZXJ2aWNlL1JlZGlzU2luZ2xlRXhlY3V0aW9uLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNCQSxNQUFhLFlBQWEsU0FBUSxLQUFLO0lBQ3JDO1FBQ0UsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBSkQsb0NBSUM7QUFFRCxNQUFhLG9CQUFxQixTQUFRLEtBQUs7SUFDN0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyx5Q0FBeUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUFKRCxvREFJQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Redis from 'ioredis';
|
|
2
|
+
import { LoggerService } from '../../loggerService';
|
|
3
|
+
import { CacheInstrumentation } from '../../cacheInstrumentation';
|
|
4
|
+
export declare class DistributedLocks {
|
|
5
|
+
private readonly redisClient;
|
|
6
|
+
private readonly loggerService;
|
|
7
|
+
private readonly redlock;
|
|
8
|
+
constructor(redisClient: Redis, loggerService: LoggerService, cacheInstrumentation: CacheInstrumentation);
|
|
9
|
+
usingSingleAttempt<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
10
|
+
using<T>(lockKey: string, handler: () => Promise<T>): Promise<T>;
|
|
11
|
+
isLockTakenByAnotherClientError(err: any): boolean;
|
|
12
|
+
isReadOnlyReplicaError(err: any): Promise<boolean | "" | undefined>;
|
|
13
|
+
cleanup(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.DistributedLocks = void 0;
|
|
23
|
+
const redlock_1 = __importStar(require("redlock"));
|
|
24
|
+
const LOCK_DURATION = 5000;
|
|
25
|
+
const LOCK_NO_RETRY_SETTINGS = { retryCount: 0 };
|
|
26
|
+
class DistributedLocks {
|
|
27
|
+
constructor(redisClient, loggerService, cacheInstrumentation) {
|
|
28
|
+
this.redisClient = redisClient;
|
|
29
|
+
this.loggerService = loggerService;
|
|
30
|
+
this.redlock = new redlock_1.default([redisClient]);
|
|
31
|
+
this.redlock.on('clientError', (err) => {
|
|
32
|
+
this.loggerService.error('Redis client error: ', err);
|
|
33
|
+
cacheInstrumentation.trackRedisClientError({ error: err, clientName: 'redlock' });
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async usingSingleAttempt(lockKey, handler) {
|
|
37
|
+
return this.redlock.using([lockKey], LOCK_DURATION, LOCK_NO_RETRY_SETTINGS, handler);
|
|
38
|
+
}
|
|
39
|
+
async using(lockKey, handler) {
|
|
40
|
+
try {
|
|
41
|
+
// first - try to acquire the lock without retrying in order to identify
|
|
42
|
+
// cases that the redis instance is read-only
|
|
43
|
+
return await this.usingSingleAttempt(lockKey, handler);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// if first attempt failed on redis instance is read-only,
|
|
47
|
+
// then we don't want to wait for it
|
|
48
|
+
if (await this.isReadOnlyReplicaError(error)) {
|
|
49
|
+
throw new Error(`Redis is read-only. Cannot acquire distributed lock`);
|
|
50
|
+
}
|
|
51
|
+
// if the lock is acquired, now wait for it to be available
|
|
52
|
+
if (this.isLockTakenByAnotherClientError(error)) {
|
|
53
|
+
return this.redlock.using([lockKey], LOCK_DURATION, handler);
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
isLockTakenByAnotherClientError(err) {
|
|
59
|
+
return err instanceof redlock_1.ExecutionError && err.message.includes('unable to achieve a quorum');
|
|
60
|
+
}
|
|
61
|
+
async isReadOnlyReplicaError(err) {
|
|
62
|
+
var _a;
|
|
63
|
+
if (!(err instanceof redlock_1.ExecutionError)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const { votesAgainst } = await err.attempts[0];
|
|
67
|
+
const message = (_a = votesAgainst.get(this.redisClient)) === null || _a === void 0 ? void 0 : _a.message;
|
|
68
|
+
return message && message.includes(`You can't write against a read only replica`);
|
|
69
|
+
}
|
|
70
|
+
async cleanup() {
|
|
71
|
+
await this.redlock.quit();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.DistributedLocks = DistributedLocks;
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdHJpYnV0ZWRMb2Nrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS9yZWRpcy9kaXN0cmlidXRlZExvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBNEQ7QUFLNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sc0JBQXNCLEdBQXNCLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRXBFLE1BQWEsZ0JBQWdCO0lBRzNCLFlBQ21CLFdBQWtCLEVBQ2xCLGFBQTRCLEVBQzdDLG9CQUEwQztRQUZ6QixnQkFBVyxHQUFYLFdBQVcsQ0FBTztRQUNsQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUc3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEQsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBSSxPQUFlLEVBQUUsT0FBeUI7UUFDcEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBSSxPQUFlLEVBQUUsT0FBeUI7UUFDdkQsSUFBSTtZQUNGLHdFQUF3RTtZQUN4RSw2Q0FBNkM7WUFDN0MsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDeEQ7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLDBEQUEwRDtZQUMxRCxvQ0FBb0M7WUFDcEMsSUFBSSxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO2FBQ3hFO1lBRUQsMkRBQTJEO1lBQzNELElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzlEO1lBRUQsTUFBTSxLQUFLLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxHQUFRO1FBQ3RDLE9BQU8sR0FBRyxZQUFZLHdCQUFjLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEdBQVE7O1FBQ25DLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSx3QkFBYyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLEdBQUcsTUFBQSxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsMENBQUUsT0FBTyxDQUFDO1FBQzVELE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBekRELDRDQXlEQyJ9
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export declare const TIMESTAMP_SUFFIX = "timestamp";
|
|
2
|
-
export declare const LOCK_DURATION = 5000;
|
|
3
2
|
export declare const DEFAULT_TTL_SECS: number;
|
|
4
3
|
export declare const REFETCH_OPERATION_NAME = "refetchEntityEntitlementsAfterCacheMiss";
|
|
5
4
|
export declare const REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REFETCH_NOTIFICATION_BUFFER_MS = exports.REFETCH_OPERATION_NAME = exports.DEFAULT_TTL_SECS = exports.
|
|
3
|
+
exports.REFETCH_NOTIFICATION_BUFFER_MS = exports.REFETCH_OPERATION_NAME = exports.DEFAULT_TTL_SECS = exports.TIMESTAMP_SUFFIX = void 0;
|
|
4
4
|
exports.TIMESTAMP_SUFFIX = 'timestamp';
|
|
5
|
-
exports.LOCK_DURATION = 5000;
|
|
6
5
|
exports.DEFAULT_TTL_SECS = 7 * 24 * 60 * 60;
|
|
7
6
|
exports.REFETCH_OPERATION_NAME = 'refetchEntityEntitlementsAfterCacheMiss';
|
|
8
7
|
exports.REFETCH_NOTIFICATION_BUFFER_MS = 500;
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NhY2hlL3JlZGlzQ2FjaGVTZXJ2aWNlLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixRQUFBLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVwQyxRQUFBLHNCQUFzQixHQUFHLHlDQUF5QyxDQUFDO0FBQ25FLFFBQUEsOEJBQThCLEdBQUcsR0FBRyxDQUFDIn0=
|
|
@@ -11,7 +11,7 @@ export declare class RedisCacheService implements CacheService {
|
|
|
11
11
|
private readonly environmentPrefix;
|
|
12
12
|
private readonly ttl;
|
|
13
13
|
private readonly redisClient;
|
|
14
|
-
private readonly
|
|
14
|
+
private readonly distributedLocks;
|
|
15
15
|
readonly distributedRefetchEntitlementsService: RedisSingleExecutionService | undefined;
|
|
16
16
|
constructor(options: Required<ClientConfiguration>, loggerService: LoggerService, cacheInstrumentation: CacheInstrumentation);
|
|
17
17
|
/**
|
|
@@ -7,12 +7,12 @@ exports.RedisCacheService = void 0;
|
|
|
7
7
|
const cachedEntitlement_1 = __importDefault(require("./cachedEntitlement"));
|
|
8
8
|
const ioredis_1 = __importDefault(require("ioredis"));
|
|
9
9
|
const lodash_1 = require("lodash");
|
|
10
|
-
const redlock_1 = __importDefault(require("redlock"));
|
|
11
10
|
const cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
|
|
12
11
|
const RedisSingleExecutionService_1 = require("./RedisSingleExecutionService");
|
|
13
12
|
const entitlementsService_utils_1 = require("../entitlementsService.utils");
|
|
14
13
|
const redisCacheService_constants_1 = require("./redisCacheService.constants");
|
|
15
14
|
const featureTypes_1 = require("../../utils/featureTypes");
|
|
15
|
+
const distributedLocks_1 = require("./redis/distributedLocks");
|
|
16
16
|
const GRACE_CONNECT_TIMEOUT_MS = 250;
|
|
17
17
|
const READY_STATUSES = ['connect', 'ready'];
|
|
18
18
|
class RedisCacheService {
|
|
@@ -22,13 +22,9 @@ class RedisCacheService {
|
|
|
22
22
|
const { redis: redisOptions, entitlementsTimeout } = options;
|
|
23
23
|
const { environmentPrefix, ttl = redisCacheService_constants_1.DEFAULT_TTL_SECS, distributedEntitlementsFetching = {} } = redisOptions;
|
|
24
24
|
this.redisClient = new ioredis_1.default(redisOptions);
|
|
25
|
-
this.
|
|
25
|
+
this.distributedLocks = new distributedLocks_1.DistributedLocks(this.redisClient, loggerService, cacheInstrumentation);
|
|
26
26
|
this.environmentPrefix = environmentPrefix;
|
|
27
27
|
this.ttl = ttl;
|
|
28
|
-
this.redlock.on('clientError', (err) => {
|
|
29
|
-
this.loggerService.error('Redis client error: ', err);
|
|
30
|
-
this.cacheInstrumentation.trackRedisClientError({ error: err, clientName: 'redlock' });
|
|
31
|
-
});
|
|
32
28
|
this.redisClient.on('error', (err) => {
|
|
33
29
|
this.loggerService.error('Redis client error: ', err);
|
|
34
30
|
this.cacheInstrumentation.trackRedisClientError({ error: err, clientName: 'redis' });
|
|
@@ -42,7 +38,7 @@ class RedisCacheService {
|
|
|
42
38
|
if (!distributedEntitlementsFetching.disabled) {
|
|
43
39
|
const { notificationBufferMs = redisCacheService_constants_1.REFETCH_NOTIFICATION_BUFFER_MS } = distributedEntitlementsFetching;
|
|
44
40
|
const notificationTimeoutMs = entitlementsTimeout + notificationBufferMs;
|
|
45
|
-
this.distributedRefetchEntitlementsService = new RedisSingleExecutionService_1.RedisSingleExecutionService(redisCacheService_constants_1.REFETCH_OPERATION_NAME, this.environmentPrefix, notificationTimeoutMs, this.redisClient, this.
|
|
41
|
+
this.distributedRefetchEntitlementsService = new RedisSingleExecutionService_1.RedisSingleExecutionService(redisCacheService_constants_1.REFETCH_OPERATION_NAME, this.environmentPrefix, notificationTimeoutMs, this.redisClient, this.distributedLocks, this.loggerService, this.cacheInstrumentation);
|
|
46
42
|
}
|
|
47
43
|
}
|
|
48
44
|
/**
|
|
@@ -87,7 +83,7 @@ class RedisCacheService {
|
|
|
87
83
|
return READY_STATUSES.includes(this.redisClient.status);
|
|
88
84
|
}
|
|
89
85
|
async updateFeatureUsage(params) {
|
|
90
|
-
return this.executeSafely(false, async () => {
|
|
86
|
+
return this.executeSafely('updateFeatureUsage', false, async () => {
|
|
91
87
|
const item = this.getFeatureUsageItemToUpdate(params);
|
|
92
88
|
await this.updateCacheItems([item]);
|
|
93
89
|
return true;
|
|
@@ -106,9 +102,9 @@ class RedisCacheService {
|
|
|
106
102
|
};
|
|
107
103
|
}
|
|
108
104
|
async setCustomer(customerId, customerEntitlements, resourceId, entitlementsTimestamp, featureIdToUsageTimestamp) {
|
|
109
|
-
return this.executeSafely(undefined, async () => {
|
|
105
|
+
return this.executeSafely('setCustomer', undefined, async () => {
|
|
110
106
|
const lockKey = (0, cacheKeysHelpers_1.buildLockKey)(this.environmentPrefix, customerId, resourceId);
|
|
111
|
-
await this.
|
|
107
|
+
await this.distributedLocks.using(lockKey, async () => {
|
|
112
108
|
const entitlementsItem = {
|
|
113
109
|
messageTimestamp: new Date(entitlementsTimestamp),
|
|
114
110
|
key: (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId),
|
|
@@ -204,7 +200,7 @@ class RedisCacheService {
|
|
|
204
200
|
return true;
|
|
205
201
|
}
|
|
206
202
|
async getCustomerEntitlements(customerId, resourceId) {
|
|
207
|
-
return this.executeSafely(entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss(), async () => {
|
|
203
|
+
return this.executeSafely('getCustomerEntitlements', entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss(), async () => {
|
|
208
204
|
const response = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
|
|
209
205
|
if (response.cacheMiss) {
|
|
210
206
|
return response;
|
|
@@ -314,11 +310,11 @@ class RedisCacheService {
|
|
|
314
310
|
}
|
|
315
311
|
async cleanup() {
|
|
316
312
|
var _a;
|
|
317
|
-
await this.
|
|
313
|
+
await this.distributedLocks.cleanup();
|
|
318
314
|
await ((_a = this.distributedRefetchEntitlementsService) === null || _a === void 0 ? void 0 : _a.cleanup());
|
|
319
315
|
}
|
|
320
316
|
async getCustomerEntitlement(featureId, customerId, resourceId) {
|
|
321
|
-
return this.executeSafely({
|
|
317
|
+
return this.executeSafely('getCustomerEntitlement', {
|
|
322
318
|
cacheMiss: true,
|
|
323
319
|
customerExists: false,
|
|
324
320
|
entitlement: null,
|
|
@@ -355,7 +351,7 @@ class RedisCacheService {
|
|
|
355
351
|
}
|
|
356
352
|
return new cachedEntitlement_1.default(calculatedEntitlement, Object.assign(Object.assign({}, featureUsage), cachedUsage));
|
|
357
353
|
}
|
|
358
|
-
async executeSafely(defaultValue, operation) {
|
|
354
|
+
async executeSafely(operationName, defaultValue, operation) {
|
|
359
355
|
if (!this.isClientConnected()) {
|
|
360
356
|
return defaultValue;
|
|
361
357
|
}
|
|
@@ -363,10 +359,10 @@ class RedisCacheService {
|
|
|
363
359
|
return await operation();
|
|
364
360
|
}
|
|
365
361
|
catch (error) {
|
|
366
|
-
this.loggerService.error(
|
|
362
|
+
this.loggerService.error(`Redis cache service: got error during ${operationName} (silent ignore it)`, error.stack);
|
|
367
363
|
return defaultValue;
|
|
368
364
|
}
|
|
369
365
|
}
|
|
370
366
|
}
|
|
371
367
|
exports.RedisCacheService = RedisCacheService;
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNEVBQXNFO0FBQ3RFLHNEQUE0QjtBQUM1QixtQ0FBb0Y7QUFFcEYsc0RBQThCO0FBRTlCLG1FQUE2RjtBQUM3RiwrRUFBNEU7QUFDNUUsNEVBS3NDO0FBQ3RDLCtFQU11QztBQUN2QywyREFBcUQ7QUFjckQsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFBTSxjQUFjLEdBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFdEQsTUFBYSxpQkFBaUI7SUFRNUIsWUFDRSxPQUFzQyxFQUNyQixhQUE0QixFQUM1QixvQkFBMEM7UUFEMUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUUzRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM3RCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxHQUFHLDhDQUFnQixFQUFFLCtCQUErQixHQUFHLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUV6RyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JD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
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNEVBQXNFO0FBQ3RFLHNEQUE0QjtBQUM1QixtQ0FBb0Y7QUFHcEYsbUVBQTZGO0FBQzdGLCtFQUE0RTtBQUM1RSw0RUFLc0M7QUFDdEMsK0VBS3VDO0FBQ3ZDLDJEQUFxRDtBQUVyRCwrREFBNEQ7QUFhNUQsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFBTSxjQUFjLEdBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFdEQsTUFBYSxpQkFBaUI7SUFRNUIsWUFDRSxPQUFzQyxFQUNyQixhQUE0QixFQUM1QixvQkFBMEM7UUFEMUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUUzRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM3RCxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxHQUFHLDhDQUFnQixFQUFFLCtCQUErQixHQUFHLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUV6RyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigg/node-server-sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.78.0",
|
|
4
4
|
"description": "Stigg server-side node SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"npm-run-all": "^4.1.5",
|
|
76
76
|
"prettier": "^2.1.1",
|
|
77
77
|
"pretty-quick": "^3.1.3",
|
|
78
|
-
"redis-memory-server": "^0.
|
|
78
|
+
"redis-memory-server": "^0.12.1",
|
|
79
79
|
"standard-version": "^9.0.0",
|
|
80
80
|
"ts-jest": "^27.0.7",
|
|
81
81
|
"ts-node": "^9.0.0",
|