@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,466 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.StorageBackendSelector = void 0;
|
|
11
|
+
const memory_storage_1 = require("./memory-storage");
|
|
12
|
+
const redis_storage_1 = require("./redis-storage");
|
|
13
|
+
const postgresql_storage_1 = require("./postgresql-storage");
|
|
14
|
+
const redis_cluster_storage_1 = require("./redis-cluster-storage");
|
|
15
|
+
/**
|
|
16
|
+
* Storage backend selector that implements priority-based fallback logic
|
|
17
|
+
*/
|
|
18
|
+
class StorageBackendSelector {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.backendInfo = [];
|
|
21
|
+
this.config = this.getDefaultConfig();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the default storage backend configuration with priority order
|
|
25
|
+
*/
|
|
26
|
+
getDefaultConfig() {
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
priority: 1,
|
|
30
|
+
type: 'postgresql',
|
|
31
|
+
enabled: true,
|
|
32
|
+
fallbackTo: ['mongodb', 'redis-cluster', 'redis', 'memory']
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
priority: 2,
|
|
36
|
+
type: 'mongodb',
|
|
37
|
+
enabled: true,
|
|
38
|
+
fallbackTo: ['redis-cluster', 'redis', 'memory']
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
priority: 3,
|
|
42
|
+
type: 'redis-cluster',
|
|
43
|
+
enabled: true,
|
|
44
|
+
fallbackTo: ['redis', 'memory']
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
priority: 4,
|
|
48
|
+
type: 'redis',
|
|
49
|
+
enabled: true,
|
|
50
|
+
fallbackTo: ['memory']
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
priority: 5,
|
|
54
|
+
type: 'memory',
|
|
55
|
+
enabled: true,
|
|
56
|
+
fallbackTo: []
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Detect environment variables for each backend type
|
|
62
|
+
*/
|
|
63
|
+
detectEnvironmentVariables() {
|
|
64
|
+
// PostgreSQL detection
|
|
65
|
+
const postgresqlConfig = this.config.find(c => c.type === 'postgresql');
|
|
66
|
+
if (postgresqlConfig) {
|
|
67
|
+
const envVars = ['DATABASE_URL', 'POSTGRES_URL', 'POSTGRES_CONNECTION_STRING'];
|
|
68
|
+
for (const envVar of envVars) {
|
|
69
|
+
if (process.env[envVar]) {
|
|
70
|
+
postgresqlConfig.connectionString = process.env[envVar];
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// MongoDB detection
|
|
76
|
+
const mongodbConfig = this.config.find(c => c.type === 'mongodb');
|
|
77
|
+
if (mongodbConfig) {
|
|
78
|
+
const envVars = ['MONGODB_URL', 'MONGO_URL', 'MONGODB_CONNECTION_STRING'];
|
|
79
|
+
for (const envVar of envVars) {
|
|
80
|
+
if (process.env[envVar]) {
|
|
81
|
+
mongodbConfig.connectionString = process.env[envVar];
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Redis Cluster detection
|
|
87
|
+
const redisClusterConfig = this.config.find(c => c.type === 'redis-cluster');
|
|
88
|
+
if (redisClusterConfig) {
|
|
89
|
+
const envVars = ['REDIS_CLUSTER_URL', 'REDIS_CLUSTER_NODES'];
|
|
90
|
+
for (const envVar of envVars) {
|
|
91
|
+
if (process.env[envVar]) {
|
|
92
|
+
redisClusterConfig.connectionString = process.env[envVar];
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Redis detection
|
|
98
|
+
const redisConfig = this.config.find(c => c.type === 'redis');
|
|
99
|
+
if (redisConfig) {
|
|
100
|
+
const envVars = ['REDIS_URL', 'REDIS_CONNECTION_STRING'];
|
|
101
|
+
for (const envVar of envVars) {
|
|
102
|
+
if (process.env[envVar]) {
|
|
103
|
+
redisConfig.connectionString = process.env[envVar];
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Handle manual overrides
|
|
109
|
+
this.handleManualOverrides();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Handle manual override environment variables
|
|
113
|
+
*/
|
|
114
|
+
handleManualOverrides() {
|
|
115
|
+
// Force specific storage type
|
|
116
|
+
if (process.env.BACKOFF_RETRY_STORAGE_TYPE) {
|
|
117
|
+
const forcedType = process.env.BACKOFF_RETRY_STORAGE_TYPE;
|
|
118
|
+
this.config.forEach(config => {
|
|
119
|
+
config.enabled = config.type === forcedType;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Override priority order
|
|
123
|
+
if (process.env.BACKOFF_RETRY_STORAGE_PRIORITY) {
|
|
124
|
+
const priorityOrder = process.env.BACKOFF_RETRY_STORAGE_PRIORITY.split(',');
|
|
125
|
+
// First, set priorities for mentioned types
|
|
126
|
+
priorityOrder.forEach((type, index) => {
|
|
127
|
+
const config = this.config.find(c => c.type === type.trim());
|
|
128
|
+
if (config) {
|
|
129
|
+
config.priority = index + 1;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Then, set lower priorities for types not mentioned
|
|
133
|
+
const mentionedTypes = priorityOrder.map(t => t.trim());
|
|
134
|
+
let nextPriority = priorityOrder.length + 1;
|
|
135
|
+
this.config.forEach(config => {
|
|
136
|
+
if (!mentionedTypes.includes(config.type)) {
|
|
137
|
+
config.priority = nextPriority++;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// Disable specific backends
|
|
142
|
+
if (process.env.BACKOFF_RETRY_STORAGE_DISABLE) {
|
|
143
|
+
const disabledTypes = process.env.BACKOFF_RETRY_STORAGE_DISABLE.split(',');
|
|
144
|
+
disabledTypes.forEach(type => {
|
|
145
|
+
const config = this.config.find(c => c.type === type.trim());
|
|
146
|
+
if (config) {
|
|
147
|
+
config.enabled = false;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Test connection to a storage backend
|
|
154
|
+
*/
|
|
155
|
+
async testConnection(backend) {
|
|
156
|
+
const startTime = Date.now();
|
|
157
|
+
try {
|
|
158
|
+
switch (backend.type) {
|
|
159
|
+
case 'postgresql':
|
|
160
|
+
return await this.testPostgreSQLConnection(backend);
|
|
161
|
+
case 'mongodb':
|
|
162
|
+
return await this.testMongoDBConnection(backend);
|
|
163
|
+
case 'redis-cluster':
|
|
164
|
+
return await this.testRedisClusterConnection(backend);
|
|
165
|
+
case 'redis':
|
|
166
|
+
return await this.testRedisConnection(backend);
|
|
167
|
+
case 'memory':
|
|
168
|
+
return await this.testMemoryConnection(backend);
|
|
169
|
+
default:
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
error: `Unknown backend type: ${backend.type}`
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
180
|
+
latency: Date.now() - startTime
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Test PostgreSQL connection
|
|
186
|
+
*/
|
|
187
|
+
async testPostgreSQLConnection(backend) {
|
|
188
|
+
if (!backend.connectionString) {
|
|
189
|
+
return {
|
|
190
|
+
success: false,
|
|
191
|
+
error: 'No PostgreSQL connection string provided'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
// Validate the connection string format
|
|
196
|
+
const isValidUrl = backend.connectionString.startsWith('postgresql://') ||
|
|
197
|
+
backend.connectionString.startsWith('postgres://');
|
|
198
|
+
if (!isValidUrl) {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
error: 'Invalid PostgreSQL connection string format'
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Test actual connection by creating a temporary storage instance
|
|
205
|
+
const tempStorage = new postgresql_storage_1.PostgreSQLStorage(backend.connectionString, backend.options);
|
|
206
|
+
const isConnected = await tempStorage.testConnection();
|
|
207
|
+
await tempStorage.close();
|
|
208
|
+
if (!isConnected) {
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
error: 'Failed to connect to PostgreSQL database'
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
success: true,
|
|
216
|
+
latency: 0,
|
|
217
|
+
capabilities: ['persistent', 'acid', 'transactions', 'advanced-querying', 'jsonb', 'indexing']
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return {
|
|
222
|
+
success: false,
|
|
223
|
+
error: error instanceof Error ? error.message : 'PostgreSQL connection test failed'
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Test MongoDB connection
|
|
229
|
+
*/
|
|
230
|
+
async testMongoDBConnection(backend) {
|
|
231
|
+
if (!backend.connectionString) {
|
|
232
|
+
return {
|
|
233
|
+
success: false,
|
|
234
|
+
error: 'No MongoDB connection string provided'
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
// Validate connection string format
|
|
239
|
+
const isValidUrl = backend.connectionString.startsWith('mongodb://') ||
|
|
240
|
+
backend.connectionString.startsWith('mongodb+srv://');
|
|
241
|
+
if (!isValidUrl) {
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
error: 'Invalid MongoDB connection string format'
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
success: true,
|
|
249
|
+
latency: 0,
|
|
250
|
+
capabilities: ['persistent', 'flexible-schema', 'horizontal-scaling', 'aggregation']
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
return {
|
|
255
|
+
success: false,
|
|
256
|
+
error: error instanceof Error ? error.message : 'MongoDB connection test failed'
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Test Redis Cluster connection
|
|
262
|
+
*/
|
|
263
|
+
async testRedisClusterConnection(backend) {
|
|
264
|
+
if (!backend.connectionString) {
|
|
265
|
+
return {
|
|
266
|
+
success: false,
|
|
267
|
+
error: 'No Redis Cluster connection string provided'
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
// Validate connection string format
|
|
272
|
+
const isValidUrl = backend.connectionString.startsWith('redis://') ||
|
|
273
|
+
backend.connectionString.startsWith('rediss://');
|
|
274
|
+
if (!isValidUrl) {
|
|
275
|
+
return {
|
|
276
|
+
success: false,
|
|
277
|
+
error: 'Invalid Redis Cluster connection string format'
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Test actual connection by creating a temporary storage instance
|
|
281
|
+
const tempStorage = new redis_cluster_storage_1.RedisClusterStorage(backend.connectionString, backend.options);
|
|
282
|
+
const isConnected = await tempStorage.testConnection();
|
|
283
|
+
await tempStorage.close();
|
|
284
|
+
if (!isConnected) {
|
|
285
|
+
return {
|
|
286
|
+
success: false,
|
|
287
|
+
error: 'Failed to connect to Redis Cluster'
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
success: true,
|
|
292
|
+
latency: 0,
|
|
293
|
+
capabilities: ['persistent', 'high-availability', 'distributed', 'fast-access', 'auto-failover', 'load-balancing']
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
return {
|
|
298
|
+
success: false,
|
|
299
|
+
error: error instanceof Error ? error.message : 'Redis Cluster connection test failed'
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Test Redis connection
|
|
305
|
+
*/
|
|
306
|
+
async testRedisConnection(backend) {
|
|
307
|
+
if (!backend.connectionString) {
|
|
308
|
+
return {
|
|
309
|
+
success: false,
|
|
310
|
+
error: 'No Redis connection string provided'
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
// Validate connection string format
|
|
315
|
+
const isValidUrl = backend.connectionString.startsWith('redis://') ||
|
|
316
|
+
backend.connectionString.startsWith('rediss://');
|
|
317
|
+
if (!isValidUrl) {
|
|
318
|
+
return {
|
|
319
|
+
success: false,
|
|
320
|
+
error: 'Invalid Redis connection string format'
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
success: true,
|
|
325
|
+
latency: 0,
|
|
326
|
+
capabilities: ['persistent', 'fast-access', 'simple-setup']
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
return {
|
|
331
|
+
success: false,
|
|
332
|
+
error: error instanceof Error ? error.message : 'Redis connection test failed'
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Test Memory connection (always available)
|
|
338
|
+
*/
|
|
339
|
+
async testMemoryConnection(backend) {
|
|
340
|
+
return {
|
|
341
|
+
success: true,
|
|
342
|
+
latency: 0,
|
|
343
|
+
capabilities: ['fast-access', 'simple-setup', 'no-persistence']
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Select the best available storage backend
|
|
348
|
+
*/
|
|
349
|
+
async selectBackend() {
|
|
350
|
+
// Detect environment variables
|
|
351
|
+
this.detectEnvironmentVariables();
|
|
352
|
+
// Sort by priority (lowest number = highest priority)
|
|
353
|
+
const sortedConfig = this.config.sort((a, b) => a.priority - b.priority);
|
|
354
|
+
// Test each backend in priority order
|
|
355
|
+
for (const backend of sortedConfig) {
|
|
356
|
+
if (!backend.enabled) {
|
|
357
|
+
this.backendInfo.push({
|
|
358
|
+
type: backend.type,
|
|
359
|
+
priority: backend.priority,
|
|
360
|
+
available: false,
|
|
361
|
+
connectionString: backend.connectionString,
|
|
362
|
+
testResult: {
|
|
363
|
+
success: false,
|
|
364
|
+
error: 'Backend disabled'
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const testResult = await this.testConnection(backend);
|
|
370
|
+
this.backendInfo.push({
|
|
371
|
+
type: backend.type,
|
|
372
|
+
priority: backend.priority,
|
|
373
|
+
available: testResult.success,
|
|
374
|
+
connectionString: backend.connectionString,
|
|
375
|
+
testResult
|
|
376
|
+
});
|
|
377
|
+
if (testResult.success) {
|
|
378
|
+
const createdBackend = await this.createBackend(backend);
|
|
379
|
+
if (createdBackend) {
|
|
380
|
+
this.selectedBackend = createdBackend;
|
|
381
|
+
return this.selectedBackend;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
// Backend test passed but creation failed (not implemented)
|
|
385
|
+
this.backendInfo[this.backendInfo.length - 1].available = false;
|
|
386
|
+
this.backendInfo[this.backendInfo.length - 1].testResult = {
|
|
387
|
+
success: false,
|
|
388
|
+
error: `${backend.type} storage not yet implemented`
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// If no backend is available, create memory backend as fallback
|
|
394
|
+
this.selectedBackend = new memory_storage_1.MemoryStorage();
|
|
395
|
+
return this.selectedBackend;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Create a storage backend instance
|
|
399
|
+
*/
|
|
400
|
+
async createBackend(backend) {
|
|
401
|
+
switch (backend.type) {
|
|
402
|
+
case 'postgresql':
|
|
403
|
+
if (!backend.connectionString) {
|
|
404
|
+
throw new Error('PostgreSQL connection string required');
|
|
405
|
+
}
|
|
406
|
+
return new postgresql_storage_1.PostgreSQLStorage(backend.connectionString, backend.options);
|
|
407
|
+
case 'mongodb':
|
|
408
|
+
// TODO: Implement MongoDB storage
|
|
409
|
+
// For now, return null to indicate this backend is not available
|
|
410
|
+
return null;
|
|
411
|
+
case 'redis-cluster':
|
|
412
|
+
if (!backend.connectionString) {
|
|
413
|
+
throw new Error('Redis Cluster connection string required');
|
|
414
|
+
}
|
|
415
|
+
return new redis_cluster_storage_1.RedisClusterStorage(backend.connectionString, backend.options);
|
|
416
|
+
case 'redis':
|
|
417
|
+
if (!backend.connectionString) {
|
|
418
|
+
throw new Error('Redis connection string required');
|
|
419
|
+
}
|
|
420
|
+
return new redis_storage_1.RedisStorage(backend.connectionString, backend.options);
|
|
421
|
+
case 'memory':
|
|
422
|
+
return new memory_storage_1.MemoryStorage();
|
|
423
|
+
default:
|
|
424
|
+
throw new Error(`Unknown backend type: ${backend.type}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Get information about all tested backends
|
|
429
|
+
*/
|
|
430
|
+
getBackendInfo() {
|
|
431
|
+
return this.backendInfo;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Get the currently selected backend
|
|
435
|
+
*/
|
|
436
|
+
getSelectedBackend() {
|
|
437
|
+
return this.selectedBackend;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Get the configuration for all backends
|
|
441
|
+
*/
|
|
442
|
+
getConfig() {
|
|
443
|
+
return this.config;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Update the configuration for a specific backend
|
|
447
|
+
*/
|
|
448
|
+
updateConfig(type, updates) {
|
|
449
|
+
const config = this.config.find(c => c.type === type);
|
|
450
|
+
if (config) {
|
|
451
|
+
Object.assign(config, updates);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Cleanup resources and close connections
|
|
456
|
+
*/
|
|
457
|
+
async cleanup() {
|
|
458
|
+
if (this.selectedBackend) {
|
|
459
|
+
await this.selectedBackend.close();
|
|
460
|
+
this.selectedBackend = undefined;
|
|
461
|
+
}
|
|
462
|
+
this.backendInfo = [];
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
exports.StorageBackendSelector = StorageBackendSelector;
|
|
466
|
+
//# sourceMappingURL=backend-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-selector.js","sourceRoot":"","sources":["../../src/storage/backend-selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAQA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./memory-storage"), exports);
|
|
25
|
+
__exportStar(require("./redis-storage"), exports);
|
|
26
|
+
__exportStar(require("./postgresql-storage"), exports);
|
|
27
|
+
__exportStar(require("./redis-cluster-storage"), exports);
|
|
28
|
+
__exportStar(require("./backend-selector"), exports);
|
|
29
|
+
__exportStar(require("./types"), exports);
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;;;;;;;;;;;;;;AAEF,mDAAiC;AACjC,kDAAgC;AAChC,uDAAqC;AACrC,0DAAwC;AACxC,qDAAmC;AACnC,0CAAwB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { RetryState } from '../types';
|
|
2
|
+
import { StorageBackend, StorageStats } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory storage backend for retry states
|
|
5
|
+
*/
|
|
6
|
+
export declare class MemoryStorage implements StorageBackend {
|
|
7
|
+
private storage;
|
|
8
|
+
private lastAccess;
|
|
9
|
+
private lastWrite;
|
|
10
|
+
/**
|
|
11
|
+
* Store a retry state
|
|
12
|
+
*/
|
|
13
|
+
set(key: string, value: RetryState): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a retry state
|
|
16
|
+
*/
|
|
17
|
+
get(key: string): Promise<RetryState | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Delete a retry state
|
|
20
|
+
*/
|
|
21
|
+
delete(key: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* List all retry states
|
|
24
|
+
*/
|
|
25
|
+
list(): Promise<RetryState[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Clear all retry states
|
|
28
|
+
*/
|
|
29
|
+
clear(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get storage statistics
|
|
32
|
+
*/
|
|
33
|
+
getStats(): Promise<StorageStats>;
|
|
34
|
+
/**
|
|
35
|
+
* Test the connection (always true for memory storage)
|
|
36
|
+
*/
|
|
37
|
+
testConnection(): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Close the connection (no-op for memory storage)
|
|
40
|
+
*/
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get the underlying Map for direct access (use with caution)
|
|
44
|
+
*/
|
|
45
|
+
getStorageMap(): Map<string, RetryState>;
|
|
46
|
+
/**
|
|
47
|
+
* Get the number of stored items
|
|
48
|
+
*/
|
|
49
|
+
getSize(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a key exists
|
|
52
|
+
*/
|
|
53
|
+
has(key: string): boolean;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=memory-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../../src/storage/memory-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,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAoB;IAErC;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKlD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBvC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAIxC;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG1B"}
|