@bernierllc/backoff-retry 0.1.1 → 0.3.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/CHANGELOG.md +13 -0
- package/README.md +110 -0
- package/dist/enhancement-manager.d.ts +205 -0
- package/dist/enhancement-manager.d.ts.map +1 -0
- package/dist/enhancement-manager.js +533 -0
- package/dist/enhancement-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/memory-protection.js +1 -1
- package/dist/memory-protection.js.map +1 -1
- package/dist/neveradmin/components/RetryAnalyticsPage.d.ts +15 -0
- package/dist/neveradmin/components/RetryAnalyticsPage.d.ts.map +1 -0
- package/dist/neveradmin/components/RetryAnalyticsPage.js +28 -0
- package/dist/neveradmin/components/RetryAnalyticsPage.js.map +1 -0
- package/dist/neveradmin/components/RetryConfigurationPage.d.ts +15 -0
- package/dist/neveradmin/components/RetryConfigurationPage.d.ts.map +1 -0
- package/dist/neveradmin/components/RetryConfigurationPage.js +28 -0
- package/dist/neveradmin/components/RetryConfigurationPage.js.map +1 -0
- package/dist/neveradmin/components/RetryEnhancementsPage.d.ts +15 -0
- package/dist/neveradmin/components/RetryEnhancementsPage.d.ts.map +1 -0
- package/dist/neveradmin/components/RetryEnhancementsPage.js +28 -0
- package/dist/neveradmin/components/RetryEnhancementsPage.js.map +1 -0
- package/dist/neveradmin/components/RetryOperationsPage.d.ts +15 -0
- package/dist/neveradmin/components/RetryOperationsPage.d.ts.map +1 -0
- package/dist/neveradmin/components/RetryOperationsPage.js +28 -0
- package/dist/neveradmin/components/RetryOperationsPage.js.map +1 -0
- package/dist/neveradmin/components/RetryOverviewPage.d.ts +15 -0
- package/dist/neveradmin/components/RetryOverviewPage.d.ts.map +1 -0
- package/dist/neveradmin/components/RetryOverviewPage.js +28 -0
- package/dist/neveradmin/components/RetryOverviewPage.js.map +1 -0
- package/dist/neveradmin/components/index.d.ts +7 -0
- package/dist/neveradmin/components/index.d.ts.map +1 -0
- package/dist/neveradmin/components/index.js +32 -0
- package/dist/neveradmin/components/index.js.map +1 -0
- package/dist/neveradmin/components/types.d.ts +64 -0
- package/dist/neveradmin/components/types.d.ts.map +1 -0
- package/dist/neveradmin/components/types.js +10 -0
- package/dist/neveradmin/components/types.js.map +1 -0
- package/dist/neveradmin/hooks/index.d.ts +5 -0
- package/dist/neveradmin/hooks/index.d.ts.map +1 -0
- package/dist/neveradmin/hooks/index.js +28 -0
- package/dist/neveradmin/hooks/index.js.map +1 -0
- package/dist/neveradmin/hooks/useRetryConfiguration.d.ts +23 -0
- package/dist/neveradmin/hooks/useRetryConfiguration.d.ts.map +1 -0
- package/dist/neveradmin/hooks/useRetryConfiguration.js +162 -0
- package/dist/neveradmin/hooks/useRetryConfiguration.js.map +1 -0
- package/dist/neveradmin/hooks/useRetryEnhancements.d.ts +39 -0
- package/dist/neveradmin/hooks/useRetryEnhancements.d.ts.map +1 -0
- package/dist/neveradmin/hooks/useRetryEnhancements.js +197 -0
- package/dist/neveradmin/hooks/useRetryEnhancements.js.map +1 -0
- package/dist/neveradmin/hooks/useRetryOperations.d.ts +28 -0
- package/dist/neveradmin/hooks/useRetryOperations.d.ts.map +1 -0
- package/dist/neveradmin/hooks/useRetryOperations.js +166 -0
- package/dist/neveradmin/hooks/useRetryOperations.js.map +1 -0
- package/dist/neveradmin/hooks/useRetryStats.d.ts +19 -0
- package/dist/neveradmin/hooks/useRetryStats.d.ts.map +1 -0
- package/dist/neveradmin/hooks/useRetryStats.js +81 -0
- package/dist/neveradmin/hooks/useRetryStats.js.map +1 -0
- package/dist/neveradmin/index.d.ts +6 -0
- package/dist/neveradmin/index.d.ts.map +1 -0
- package/dist/neveradmin/index.js +29 -0
- package/dist/neveradmin/index.js.map +1 -0
- package/dist/neveradmin/registration.d.ts +33 -0
- package/dist/neveradmin/registration.d.ts.map +1 -0
- package/dist/neveradmin/registration.js +96 -0
- package/dist/neveradmin/registration.js.map +1 -0
- package/dist/neveradmin/types.d.ts +88 -0
- package/dist/neveradmin/types.d.ts.map +1 -0
- package/dist/neveradmin/types.js +10 -0
- package/dist/neveradmin/types.js.map +1 -0
- package/dist/neveradmin/utils/formatting.d.ts +41 -0
- package/dist/neveradmin/utils/formatting.d.ts.map +1 -0
- package/dist/neveradmin/utils/formatting.js +142 -0
- package/dist/neveradmin/utils/formatting.js.map +1 -0
- package/dist/neveradmin/utils/index.d.ts +4 -0
- package/dist/neveradmin/utils/index.d.ts.map +1 -0
- package/dist/neveradmin/utils/index.js +27 -0
- package/dist/neveradmin/utils/index.js.map +1 -0
- package/dist/neveradmin/utils/permissions.d.ts +74 -0
- package/dist/neveradmin/utils/permissions.d.ts.map +1 -0
- package/dist/neveradmin/utils/permissions.js +152 -0
- package/dist/neveradmin/utils/permissions.js.map +1 -0
- package/dist/neveradmin/utils/validation.d.ts +38 -0
- package/dist/neveradmin/utils/validation.d.ts.map +1 -0
- package/dist/neveradmin/utils/validation.js +142 -0
- package/dist/neveradmin/utils/validation.js.map +1 -0
- package/dist/retry-manager.d.ts +32 -11
- package/dist/retry-manager.d.ts.map +1 -1
- package/dist/retry-manager.js +128 -82
- package/dist/retry-manager.js.map +1 -1
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +26 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/secure-storage.d.ts +61 -0
- package/dist/security/secure-storage.d.ts.map +1 -0
- package/dist/security/secure-storage.js +418 -0
- package/dist/security/secure-storage.js.map +1 -0
- package/dist/security/security-manager.d.ts +172 -0
- package/dist/security/security-manager.d.ts.map +1 -0
- package/dist/security/security-manager.js +417 -0
- package/dist/security/security-manager.js.map +1 -0
- package/dist/storage/backend-selector.d.ts +96 -0
- package/dist/storage/backend-selector.d.ts.map +1 -0
- package/dist/storage/backend-selector.js +466 -0
- package/dist/storage/backend-selector.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +30 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory-storage.d.ts +55 -0
- package/dist/storage/memory-storage.d.ts.map +1 -0
- package/dist/storage/memory-storage.js +106 -0
- package/dist/storage/memory-storage.js.map +1 -0
- package/dist/storage/postgresql-storage.d.ts +77 -0
- package/dist/storage/postgresql-storage.d.ts.map +1 -0
- package/dist/storage/postgresql-storage.js +314 -0
- package/dist/storage/postgresql-storage.js.map +1 -0
- package/dist/storage/redis-cluster-storage.d.ts +88 -0
- package/dist/storage/redis-cluster-storage.d.ts.map +1 -0
- package/dist/storage/redis-cluster-storage.js +414 -0
- package/dist/storage/redis-cluster-storage.js.map +1 -0
- package/dist/storage/redis-storage.d.ts +67 -0
- package/dist/storage/redis-storage.d.ts.map +1 -0
- package/dist/storage/redis-storage.js +236 -0
- package/dist/storage/redis-storage.js.map +1 -0
- package/dist/storage/types.d.ts +55 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +10 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types.d.ts +7 -32
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/package.json +15 -2
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.RedisClusterStorage = void 0;
|
|
44
|
+
/**
|
|
45
|
+
* Redis Cluster storage backend for retry states
|
|
46
|
+
*/
|
|
47
|
+
class RedisClusterStorage {
|
|
48
|
+
constructor(connectionString, options = {}) {
|
|
49
|
+
this.lastAccess = new Date();
|
|
50
|
+
this.lastWrite = new Date();
|
|
51
|
+
this.isInitialized = false;
|
|
52
|
+
this.connectionString = connectionString;
|
|
53
|
+
this.options = options;
|
|
54
|
+
this.prefix = options.prefix || 'backoff-retry:';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Initialize the Redis Cluster client
|
|
58
|
+
*/
|
|
59
|
+
async initializeClient() {
|
|
60
|
+
if (this.isInitialized)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
// Dynamic import to avoid requiring ioredis package if not used
|
|
64
|
+
const Redis = await Promise.resolve().then(() => __importStar(require('ioredis')));
|
|
65
|
+
this.cluster = new Redis.Cluster(this.parseClusterNodes(this.connectionString), {
|
|
66
|
+
redisOptions: {
|
|
67
|
+
...this.options,
|
|
68
|
+
lazyConnect: true,
|
|
69
|
+
maxRetriesPerRequest: 3,
|
|
70
|
+
enableReadyCheck: true,
|
|
71
|
+
},
|
|
72
|
+
clusterRetryStrategy: (times) => {
|
|
73
|
+
const delay = Math.min(times * 50, 2000);
|
|
74
|
+
return delay;
|
|
75
|
+
},
|
|
76
|
+
enableOfflineQueue: false,
|
|
77
|
+
maxRedirections: 16,
|
|
78
|
+
retryDelayOnFailover: 100,
|
|
79
|
+
...this.options
|
|
80
|
+
});
|
|
81
|
+
await this.cluster.connect();
|
|
82
|
+
this.isInitialized = true;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw new Error(`Failed to connect to Redis Cluster: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse cluster nodes from connection string
|
|
90
|
+
*/
|
|
91
|
+
parseClusterNodes(connectionString) {
|
|
92
|
+
if (connectionString.includes(',')) {
|
|
93
|
+
// Multiple nodes: redis://node1:6379,redis://node2:6379
|
|
94
|
+
return connectionString.split(',').map(node => node.trim());
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Single node: redis://cluster-node:6379
|
|
98
|
+
return [connectionString];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the full key name with prefix
|
|
103
|
+
*/
|
|
104
|
+
getFullKey(key) {
|
|
105
|
+
return `${this.prefix}${key}`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Store a retry state
|
|
109
|
+
*/
|
|
110
|
+
async set(key, value) {
|
|
111
|
+
await this.initializeClient();
|
|
112
|
+
const fullKey = this.getFullKey(key);
|
|
113
|
+
const serializedValue = JSON.stringify(value);
|
|
114
|
+
await this.cluster.set(fullKey, serializedValue);
|
|
115
|
+
this.lastWrite = new Date();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get a retry state
|
|
119
|
+
*/
|
|
120
|
+
async get(key) {
|
|
121
|
+
await this.initializeClient();
|
|
122
|
+
const fullKey = this.getFullKey(key);
|
|
123
|
+
const value = await this.cluster.get(fullKey);
|
|
124
|
+
this.lastAccess = new Date();
|
|
125
|
+
if (!value)
|
|
126
|
+
return null;
|
|
127
|
+
try {
|
|
128
|
+
return JSON.parse(value);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`Failed to parse retry state from Redis Cluster: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Delete a retry state
|
|
136
|
+
*/
|
|
137
|
+
async delete(key) {
|
|
138
|
+
await this.initializeClient();
|
|
139
|
+
const fullKey = this.getFullKey(key);
|
|
140
|
+
await this.cluster.del(fullKey);
|
|
141
|
+
this.lastWrite = new Date();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* List all retry states
|
|
145
|
+
*/
|
|
146
|
+
async list() {
|
|
147
|
+
await this.initializeClient();
|
|
148
|
+
const pattern = `${this.prefix}*`;
|
|
149
|
+
const keys = await this.cluster.keys(pattern);
|
|
150
|
+
this.lastAccess = new Date();
|
|
151
|
+
if (keys.length === 0)
|
|
152
|
+
return [];
|
|
153
|
+
const values = await Promise.all(keys.map(async (key) => {
|
|
154
|
+
const value = await this.cluster.get(key);
|
|
155
|
+
if (!value)
|
|
156
|
+
return null;
|
|
157
|
+
try {
|
|
158
|
+
return JSON.parse(value);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
return values.filter((value) => value !== null);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clear all retry states
|
|
168
|
+
*/
|
|
169
|
+
async clear() {
|
|
170
|
+
await this.initializeClient();
|
|
171
|
+
const pattern = `${this.prefix}*`;
|
|
172
|
+
const keys = await this.cluster.keys(pattern);
|
|
173
|
+
if (keys.length > 0) {
|
|
174
|
+
// Delete keys in batches to avoid overwhelming the cluster
|
|
175
|
+
const batchSize = 100;
|
|
176
|
+
for (let i = 0; i < keys.length; i += batchSize) {
|
|
177
|
+
const batch = keys.slice(i, i + batchSize);
|
|
178
|
+
await this.cluster.del(...batch);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
this.lastWrite = new Date();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get storage statistics
|
|
185
|
+
*/
|
|
186
|
+
async getStats() {
|
|
187
|
+
await this.initializeClient();
|
|
188
|
+
const pattern = `${this.prefix}*`;
|
|
189
|
+
const keys = await this.cluster.keys(pattern);
|
|
190
|
+
if (keys.length === 0) {
|
|
191
|
+
return {
|
|
192
|
+
totalKeys: 0,
|
|
193
|
+
totalSize: 0,
|
|
194
|
+
averageKeySize: 0,
|
|
195
|
+
lastAccess: this.lastAccess,
|
|
196
|
+
lastWrite: this.lastWrite
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Get values for size calculation
|
|
200
|
+
const values = await Promise.all(keys.map(async (key) => {
|
|
201
|
+
const value = await this.cluster.get(key);
|
|
202
|
+
return value ? value.length : 0;
|
|
203
|
+
}));
|
|
204
|
+
const totalSize = values.reduce((sum, size) => sum + size, 0);
|
|
205
|
+
return {
|
|
206
|
+
totalKeys: keys.length,
|
|
207
|
+
totalSize,
|
|
208
|
+
averageKeySize: keys.length > 0 ? totalSize / keys.length : 0,
|
|
209
|
+
oldestKey: keys.length > 0 ? keys[0] : undefined,
|
|
210
|
+
newestKey: keys.length > 0 ? keys[keys.length - 1] : undefined,
|
|
211
|
+
lastAccess: this.lastAccess,
|
|
212
|
+
lastWrite: this.lastWrite
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Test the connection
|
|
217
|
+
*/
|
|
218
|
+
async testConnection() {
|
|
219
|
+
try {
|
|
220
|
+
await this.initializeClient();
|
|
221
|
+
await this.cluster.ping();
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Close the connection
|
|
230
|
+
*/
|
|
231
|
+
async close() {
|
|
232
|
+
if (this.cluster) {
|
|
233
|
+
await this.cluster.quit();
|
|
234
|
+
this.cluster = null;
|
|
235
|
+
this.isInitialized = false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get cluster information
|
|
240
|
+
*/
|
|
241
|
+
async getClusterInfo() {
|
|
242
|
+
await this.initializeClient();
|
|
243
|
+
try {
|
|
244
|
+
const info = await this.cluster.info();
|
|
245
|
+
const nodes = await this.cluster.nodes();
|
|
246
|
+
const slots = await this.cluster.slots();
|
|
247
|
+
return {
|
|
248
|
+
info,
|
|
249
|
+
nodes: nodes.map((node) => ({
|
|
250
|
+
id: node.id,
|
|
251
|
+
host: node.host,
|
|
252
|
+
port: node.port,
|
|
253
|
+
flags: node.flags,
|
|
254
|
+
pingSent: node.pingSent,
|
|
255
|
+
pongRecv: node.pongRecv,
|
|
256
|
+
configEpoch: node.configEpoch,
|
|
257
|
+
linkState: node.linkState,
|
|
258
|
+
slots: node.slots
|
|
259
|
+
})),
|
|
260
|
+
slots,
|
|
261
|
+
totalNodes: nodes.length,
|
|
262
|
+
masterNodes: nodes.filter((node) => node.flags.includes('master')).length,
|
|
263
|
+
slaveNodes: nodes.filter((node) => node.flags.includes('slave')).length
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
return { error: error instanceof Error ? error.message : 'Unknown error' };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Set expiration for a key
|
|
272
|
+
*/
|
|
273
|
+
async setExpiration(key, seconds) {
|
|
274
|
+
await this.initializeClient();
|
|
275
|
+
const fullKey = this.getFullKey(key);
|
|
276
|
+
await this.cluster.expire(fullKey, seconds);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get time to live for a key
|
|
280
|
+
*/
|
|
281
|
+
async getTTL(key) {
|
|
282
|
+
await this.initializeClient();
|
|
283
|
+
const fullKey = this.getFullKey(key);
|
|
284
|
+
return await this.cluster.ttl(fullKey);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get retry states with pagination
|
|
288
|
+
*/
|
|
289
|
+
async listPaginated(limit = 100, offset = 0) {
|
|
290
|
+
await this.initializeClient();
|
|
291
|
+
const pattern = `${this.prefix}*`;
|
|
292
|
+
const keys = await this.cluster.keys(pattern);
|
|
293
|
+
// Sort keys for consistent pagination
|
|
294
|
+
keys.sort();
|
|
295
|
+
const paginatedKeys = keys.slice(offset, offset + limit);
|
|
296
|
+
if (paginatedKeys.length === 0)
|
|
297
|
+
return [];
|
|
298
|
+
const values = await Promise.all(paginatedKeys.map(async (key) => {
|
|
299
|
+
const value = await this.cluster.get(key);
|
|
300
|
+
if (!value)
|
|
301
|
+
return null;
|
|
302
|
+
try {
|
|
303
|
+
return JSON.parse(value);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
}));
|
|
309
|
+
this.lastAccess = new Date();
|
|
310
|
+
return values.filter((value) => value !== null);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get retry states by status using SCAN
|
|
314
|
+
*/
|
|
315
|
+
async listByStatus(status) {
|
|
316
|
+
await this.initializeClient();
|
|
317
|
+
const pattern = `${this.prefix}*`;
|
|
318
|
+
const retryStates = [];
|
|
319
|
+
let cursor = '0';
|
|
320
|
+
do {
|
|
321
|
+
const [newCursor, keys] = await this.cluster.scan(cursor, 'MATCH', pattern, 'COUNT', '100');
|
|
322
|
+
cursor = newCursor;
|
|
323
|
+
if (keys.length > 0) {
|
|
324
|
+
const values = await Promise.all(keys.map(async (key) => {
|
|
325
|
+
const value = await this.cluster.get(key);
|
|
326
|
+
if (!value)
|
|
327
|
+
return null;
|
|
328
|
+
try {
|
|
329
|
+
const parsed = JSON.parse(value);
|
|
330
|
+
return parsed.status === status ? parsed : null;
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}));
|
|
336
|
+
retryStates.push(...values.filter((value) => value !== null));
|
|
337
|
+
}
|
|
338
|
+
} while (cursor !== '0');
|
|
339
|
+
this.lastAccess = new Date();
|
|
340
|
+
return retryStates;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Clean up old retry states using SCAN
|
|
344
|
+
*/
|
|
345
|
+
async cleanupOldStates(maxAgeHours = 24) {
|
|
346
|
+
await this.initializeClient();
|
|
347
|
+
const pattern = `${this.prefix}*`;
|
|
348
|
+
const cutoffTime = Date.now() - (maxAgeHours * 60 * 60 * 1000);
|
|
349
|
+
let deletedCount = 0;
|
|
350
|
+
let cursor = '0';
|
|
351
|
+
do {
|
|
352
|
+
const [newCursor, keys] = await this.cluster.scan(cursor, 'MATCH', pattern, 'COUNT', '100');
|
|
353
|
+
cursor = newCursor;
|
|
354
|
+
if (keys.length > 0) {
|
|
355
|
+
const keysToDelete = [];
|
|
356
|
+
for (const key of keys) {
|
|
357
|
+
const value = await this.cluster.get(key);
|
|
358
|
+
if (!value)
|
|
359
|
+
continue;
|
|
360
|
+
try {
|
|
361
|
+
const parsed = JSON.parse(value);
|
|
362
|
+
const lastAttempt = parsed.lastAttempt ? new Date(parsed.lastAttempt).getTime() : 0;
|
|
363
|
+
if (lastAttempt < cutoffTime) {
|
|
364
|
+
keysToDelete.push(key);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
// Invalid JSON, delete it
|
|
369
|
+
keysToDelete.push(key);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (keysToDelete.length > 0) {
|
|
373
|
+
await this.cluster.del(...keysToDelete);
|
|
374
|
+
deletedCount += keysToDelete.length;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
} while (cursor !== '0');
|
|
378
|
+
this.lastWrite = new Date();
|
|
379
|
+
return deletedCount;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Get cluster health status
|
|
383
|
+
*/
|
|
384
|
+
async getClusterHealth() {
|
|
385
|
+
await this.initializeClient();
|
|
386
|
+
try {
|
|
387
|
+
const nodes = await this.cluster.nodes();
|
|
388
|
+
const masters = nodes.filter((node) => node.flags.includes('master'));
|
|
389
|
+
const slaves = nodes.filter((node) => node.flags.includes('slave'));
|
|
390
|
+
return {
|
|
391
|
+
totalNodes: nodes.length,
|
|
392
|
+
masterNodes: masters.length,
|
|
393
|
+
slaveNodes: slaves.length,
|
|
394
|
+
healthy: masters.length > 0 && slaves.length >= masters.length,
|
|
395
|
+
replicationFactor: slaves.length / Math.max(masters.length, 1),
|
|
396
|
+
nodes: nodes.map((node) => ({
|
|
397
|
+
id: node.id,
|
|
398
|
+
role: node.flags.includes('master') ? 'master' : 'slave',
|
|
399
|
+
host: node.host,
|
|
400
|
+
port: node.port,
|
|
401
|
+
connected: node.linkState === 'connected'
|
|
402
|
+
}))
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
return {
|
|
407
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
408
|
+
healthy: false
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
exports.RedisClusterStorage = RedisClusterStorage;
|
|
414
|
+
//# sourceMappingURL=redis-cluster-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-cluster-storage.js","sourceRoot":"","sources":["../../src/storage/redis-cluster-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { RetryState } from '../types';
|
|
2
|
+
import { StorageBackend, StorageStats } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Redis storage backend for retry states
|
|
5
|
+
*/
|
|
6
|
+
export declare class RedisStorage implements StorageBackend {
|
|
7
|
+
private client;
|
|
8
|
+
private connectionString;
|
|
9
|
+
private options;
|
|
10
|
+
private prefix;
|
|
11
|
+
private lastAccess;
|
|
12
|
+
private lastWrite;
|
|
13
|
+
constructor(connectionString: string, options?: Record<string, any>);
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the Redis client
|
|
16
|
+
*/
|
|
17
|
+
private initializeClient;
|
|
18
|
+
/**
|
|
19
|
+
* Get the full key name with prefix
|
|
20
|
+
*/
|
|
21
|
+
private getFullKey;
|
|
22
|
+
/**
|
|
23
|
+
* Store a retry state
|
|
24
|
+
*/
|
|
25
|
+
set(key: string, value: RetryState): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get a retry state
|
|
28
|
+
*/
|
|
29
|
+
get(key: string): Promise<RetryState | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete a retry state
|
|
32
|
+
*/
|
|
33
|
+
delete(key: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* List all retry states
|
|
36
|
+
*/
|
|
37
|
+
list(): Promise<RetryState[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Clear all retry states
|
|
40
|
+
*/
|
|
41
|
+
clear(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get storage statistics
|
|
44
|
+
*/
|
|
45
|
+
getStats(): Promise<StorageStats>;
|
|
46
|
+
/**
|
|
47
|
+
* Test the connection
|
|
48
|
+
*/
|
|
49
|
+
testConnection(): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Close the connection
|
|
52
|
+
*/
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Get Redis client info
|
|
56
|
+
*/
|
|
57
|
+
getClientInfo(): Promise<Record<string, any>>;
|
|
58
|
+
/**
|
|
59
|
+
* Set expiration for a key
|
|
60
|
+
*/
|
|
61
|
+
setExpiration(key: string, seconds: number): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Get time to live for a key
|
|
64
|
+
*/
|
|
65
|
+
getTTL(key: string): Promise<number>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=redis-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-storage.d.ts","sourceRoot":"","sources":["../../src/storage/redis-storage.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvD;;GAEG;AACH,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAoB;gBAEzB,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAMvE;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiBlD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA0BnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAqCvC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAWnD;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAM3C"}
|