@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,106 @@
|
|
|
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.MemoryStorage = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* In-memory storage backend for retry states
|
|
13
|
+
*/
|
|
14
|
+
class MemoryStorage {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.storage = new Map();
|
|
17
|
+
this.lastAccess = new Date();
|
|
18
|
+
this.lastWrite = new Date();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Store a retry state
|
|
22
|
+
*/
|
|
23
|
+
async set(key, value) {
|
|
24
|
+
this.storage.set(key, value);
|
|
25
|
+
this.lastWrite = new Date();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get a retry state
|
|
29
|
+
*/
|
|
30
|
+
async get(key) {
|
|
31
|
+
this.lastAccess = new Date();
|
|
32
|
+
return this.storage.get(key) || null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Delete a retry state
|
|
36
|
+
*/
|
|
37
|
+
async delete(key) {
|
|
38
|
+
this.storage.delete(key);
|
|
39
|
+
this.lastWrite = new Date();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* List all retry states
|
|
43
|
+
*/
|
|
44
|
+
async list() {
|
|
45
|
+
this.lastAccess = new Date();
|
|
46
|
+
return Array.from(this.storage.values());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Clear all retry states
|
|
50
|
+
*/
|
|
51
|
+
async clear() {
|
|
52
|
+
this.storage.clear();
|
|
53
|
+
this.lastWrite = new Date();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get storage statistics
|
|
57
|
+
*/
|
|
58
|
+
async getStats() {
|
|
59
|
+
const keys = Array.from(this.storage.keys());
|
|
60
|
+
const values = Array.from(this.storage.values());
|
|
61
|
+
const totalSize = values.reduce((size, value) => {
|
|
62
|
+
return size + JSON.stringify(value).length;
|
|
63
|
+
}, 0);
|
|
64
|
+
return {
|
|
65
|
+
totalKeys: keys.length,
|
|
66
|
+
totalSize,
|
|
67
|
+
averageKeySize: keys.length > 0 ? totalSize / keys.length : 0,
|
|
68
|
+
oldestKey: keys.length > 0 ? keys[0] : undefined,
|
|
69
|
+
newestKey: keys.length > 0 ? keys[keys.length - 1] : undefined,
|
|
70
|
+
lastAccess: this.lastAccess,
|
|
71
|
+
lastWrite: this.lastWrite
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Test the connection (always true for memory storage)
|
|
76
|
+
*/
|
|
77
|
+
async testConnection() {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Close the connection (no-op for memory storage)
|
|
82
|
+
*/
|
|
83
|
+
async close() {
|
|
84
|
+
// No cleanup needed for memory storage
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the underlying Map for direct access (use with caution)
|
|
88
|
+
*/
|
|
89
|
+
getStorageMap() {
|
|
90
|
+
return this.storage;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the number of stored items
|
|
94
|
+
*/
|
|
95
|
+
getSize() {
|
|
96
|
+
return this.storage.size;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if a key exists
|
|
100
|
+
*/
|
|
101
|
+
has(key) {
|
|
102
|
+
return this.storage.has(key);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.MemoryStorage = MemoryStorage;
|
|
106
|
+
//# sourceMappingURL=memory-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { RetryState } from '../types';
|
|
2
|
+
import { StorageBackend, StorageStats } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* PostgreSQL storage backend for retry states
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostgreSQLStorage implements StorageBackend {
|
|
7
|
+
private client;
|
|
8
|
+
private pool;
|
|
9
|
+
private connectionString;
|
|
10
|
+
private options;
|
|
11
|
+
private tableName;
|
|
12
|
+
private lastAccess;
|
|
13
|
+
private lastWrite;
|
|
14
|
+
private isInitialized;
|
|
15
|
+
constructor(connectionString: string, options?: Record<string, any>);
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the PostgreSQL client and create table if needed
|
|
18
|
+
*/
|
|
19
|
+
private initializeClient;
|
|
20
|
+
/**
|
|
21
|
+
* Create the retry_states table if it doesn't exist
|
|
22
|
+
*/
|
|
23
|
+
private createTableIfNotExists;
|
|
24
|
+
/**
|
|
25
|
+
* Store a retry state
|
|
26
|
+
*/
|
|
27
|
+
set(key: string, value: RetryState): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a retry state
|
|
30
|
+
*/
|
|
31
|
+
get(key: string): Promise<RetryState | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a retry state
|
|
34
|
+
*/
|
|
35
|
+
delete(key: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* List all retry states
|
|
38
|
+
*/
|
|
39
|
+
list(): Promise<RetryState[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Clear all retry states
|
|
42
|
+
*/
|
|
43
|
+
clear(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get storage statistics
|
|
46
|
+
*/
|
|
47
|
+
getStats(): Promise<StorageStats>;
|
|
48
|
+
/**
|
|
49
|
+
* Test the connection
|
|
50
|
+
*/
|
|
51
|
+
testConnection(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Close the connection
|
|
54
|
+
*/
|
|
55
|
+
close(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Get PostgreSQL server info
|
|
58
|
+
*/
|
|
59
|
+
getServerInfo(): Promise<Record<string, any>>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute a transaction
|
|
62
|
+
*/
|
|
63
|
+
executeTransaction<T>(callback: (client: any) => Promise<T>): Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Get retry states with pagination
|
|
66
|
+
*/
|
|
67
|
+
listPaginated(limit?: number, offset?: number): Promise<RetryState[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Get retry states by status
|
|
70
|
+
*/
|
|
71
|
+
listByStatus(status: string): Promise<RetryState[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Clean up old retry states
|
|
74
|
+
*/
|
|
75
|
+
cleanupOldStates(maxAgeHours?: number): Promise<number>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=postgresql-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql-storage.d.ts","sourceRoot":"","sources":["../../src/storage/postgresql-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,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAMvE;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;YACW,sBAAsB;IAgBpC;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqBlD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAenC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAiCvC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAiBnD;;OAEG;IACG,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkB9E;;OAEG;IACG,aAAa,CAAC,KAAK,GAAE,MAAY,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBnF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBzD;;OAEG;IACG,gBAAgB,CAAC,WAAW,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAalE"}
|
|
@@ -0,0 +1,314 @@
|
|
|
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.PostgreSQLStorage = void 0;
|
|
44
|
+
/**
|
|
45
|
+
* PostgreSQL storage backend for retry states
|
|
46
|
+
*/
|
|
47
|
+
class PostgreSQLStorage {
|
|
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.tableName = options.tableName || 'retry_states';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Initialize the PostgreSQL client and create table if needed
|
|
58
|
+
*/
|
|
59
|
+
async initializeClient() {
|
|
60
|
+
if (this.isInitialized)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
// Dynamic import to avoid requiring pg package if not used
|
|
64
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require('pg')));
|
|
65
|
+
this.pool = new Pool({
|
|
66
|
+
connectionString: this.connectionString,
|
|
67
|
+
max: this.options.maxConnections || 10,
|
|
68
|
+
idleTimeoutMillis: this.options.idleTimeoutMillis || 30000,
|
|
69
|
+
connectionTimeoutMillis: this.options.connectionTimeoutMillis || 2000,
|
|
70
|
+
...this.options
|
|
71
|
+
});
|
|
72
|
+
// Test connection and create table
|
|
73
|
+
await this.createTableIfNotExists();
|
|
74
|
+
this.isInitialized = true;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new Error(`Failed to connect to PostgreSQL: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create the retry_states table if it doesn't exist
|
|
82
|
+
*/
|
|
83
|
+
async createTableIfNotExists() {
|
|
84
|
+
const createTableQuery = `
|
|
85
|
+
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
86
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
87
|
+
state JSONB NOT NULL,
|
|
88
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
89
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_created_at ON ${this.tableName}(created_at);
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_updated_at ON ${this.tableName}(updated_at);
|
|
94
|
+
`;
|
|
95
|
+
await this.pool.query(createTableQuery);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Store a retry state
|
|
99
|
+
*/
|
|
100
|
+
async set(key, value) {
|
|
101
|
+
await this.initializeClient();
|
|
102
|
+
const query = `
|
|
103
|
+
INSERT INTO ${this.tableName} (id, state, updated_at)
|
|
104
|
+
VALUES ($1, $2, NOW())
|
|
105
|
+
ON CONFLICT (id)
|
|
106
|
+
DO UPDATE SET
|
|
107
|
+
state = $2,
|
|
108
|
+
updated_at = NOW()
|
|
109
|
+
`;
|
|
110
|
+
await this.pool.query(query, [key, JSON.stringify(value)]);
|
|
111
|
+
this.lastWrite = new Date();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get a retry state
|
|
115
|
+
*/
|
|
116
|
+
async get(key) {
|
|
117
|
+
await this.initializeClient();
|
|
118
|
+
const query = `SELECT state FROM ${this.tableName} WHERE id = $1`;
|
|
119
|
+
const result = await this.pool.query(query, [key]);
|
|
120
|
+
this.lastAccess = new Date();
|
|
121
|
+
if (result.rows.length === 0)
|
|
122
|
+
return null;
|
|
123
|
+
try {
|
|
124
|
+
const state = result.rows[0].state;
|
|
125
|
+
if (!state) {
|
|
126
|
+
throw new Error('Retry state is null or undefined');
|
|
127
|
+
}
|
|
128
|
+
return typeof state === 'string' ? JSON.parse(state) : state;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`Failed to parse retry state from PostgreSQL: ${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 query = `DELETE FROM ${this.tableName} WHERE id = $1`;
|
|
140
|
+
await this.pool.query(query, [key]);
|
|
141
|
+
this.lastWrite = new Date();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* List all retry states
|
|
145
|
+
*/
|
|
146
|
+
async list() {
|
|
147
|
+
await this.initializeClient();
|
|
148
|
+
const query = `SELECT state FROM ${this.tableName} ORDER BY created_at ASC`;
|
|
149
|
+
const result = await this.pool.query(query);
|
|
150
|
+
this.lastAccess = new Date();
|
|
151
|
+
return result.rows.map((row) => {
|
|
152
|
+
const state = row.state;
|
|
153
|
+
if (!state)
|
|
154
|
+
return null;
|
|
155
|
+
return typeof state === 'string' ? JSON.parse(state) : state;
|
|
156
|
+
}).filter((state) => state !== null);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clear all retry states
|
|
160
|
+
*/
|
|
161
|
+
async clear() {
|
|
162
|
+
await this.initializeClient();
|
|
163
|
+
const query = `DELETE FROM ${this.tableName}`;
|
|
164
|
+
await this.pool.query(query);
|
|
165
|
+
this.lastWrite = new Date();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get storage statistics
|
|
169
|
+
*/
|
|
170
|
+
async getStats() {
|
|
171
|
+
await this.initializeClient();
|
|
172
|
+
const countQuery = `SELECT COUNT(*) as total FROM ${this.tableName}`;
|
|
173
|
+
const sizeQuery = `
|
|
174
|
+
SELECT
|
|
175
|
+
pg_total_relation_size('${this.tableName}') as total_size,
|
|
176
|
+
pg_relation_size('${this.tableName}') as table_size
|
|
177
|
+
`;
|
|
178
|
+
const oldestQuery = `SELECT id, created_at FROM ${this.tableName} ORDER BY created_at ASC LIMIT 1`;
|
|
179
|
+
const newestQuery = `SELECT id, created_at FROM ${this.tableName} ORDER BY created_at DESC LIMIT 1`;
|
|
180
|
+
const [countResult, sizeResult, oldestResult, newestResult] = await Promise.all([
|
|
181
|
+
this.pool.query(countQuery),
|
|
182
|
+
this.pool.query(sizeQuery),
|
|
183
|
+
this.pool.query(oldestQuery),
|
|
184
|
+
this.pool.query(newestQuery)
|
|
185
|
+
]);
|
|
186
|
+
const totalKeys = parseInt(countResult.rows[0].total);
|
|
187
|
+
const totalSize = parseInt(sizeResult.rows[0].total_size);
|
|
188
|
+
return {
|
|
189
|
+
totalKeys,
|
|
190
|
+
totalSize,
|
|
191
|
+
averageKeySize: totalKeys > 0 ? totalSize / totalKeys : 0,
|
|
192
|
+
oldestKey: oldestResult.rows.length > 0 ? oldestResult.rows[0].id : undefined,
|
|
193
|
+
newestKey: newestResult.rows.length > 0 ? newestResult.rows[0].id : undefined,
|
|
194
|
+
lastAccess: this.lastAccess,
|
|
195
|
+
lastWrite: this.lastWrite
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Test the connection
|
|
200
|
+
*/
|
|
201
|
+
async testConnection() {
|
|
202
|
+
try {
|
|
203
|
+
await this.initializeClient();
|
|
204
|
+
await this.pool.query('SELECT 1');
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Close the connection
|
|
213
|
+
*/
|
|
214
|
+
async close() {
|
|
215
|
+
if (this.pool) {
|
|
216
|
+
await this.pool.end();
|
|
217
|
+
this.pool = null;
|
|
218
|
+
this.isInitialized = false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get PostgreSQL server info
|
|
223
|
+
*/
|
|
224
|
+
async getServerInfo() {
|
|
225
|
+
await this.initializeClient();
|
|
226
|
+
try {
|
|
227
|
+
const versionQuery = 'SELECT version() as version';
|
|
228
|
+
const result = await this.pool.query(versionQuery);
|
|
229
|
+
return {
|
|
230
|
+
version: result.rows[0].version,
|
|
231
|
+
tableName: this.tableName,
|
|
232
|
+
connectionString: this.connectionString.replace(/:[^:@]*@/, ':***@') // Hide password
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
return { error: error instanceof Error ? error.message : 'Unknown error' };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Execute a transaction
|
|
241
|
+
*/
|
|
242
|
+
async executeTransaction(callback) {
|
|
243
|
+
await this.initializeClient();
|
|
244
|
+
const client = await this.pool.connect();
|
|
245
|
+
try {
|
|
246
|
+
await client.query('BEGIN');
|
|
247
|
+
const result = await callback(client);
|
|
248
|
+
await client.query('COMMIT');
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
await client.query('ROLLBACK');
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
client.release();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get retry states with pagination
|
|
261
|
+
*/
|
|
262
|
+
async listPaginated(limit = 100, offset = 0) {
|
|
263
|
+
await this.initializeClient();
|
|
264
|
+
const query = `
|
|
265
|
+
SELECT state
|
|
266
|
+
FROM ${this.tableName}
|
|
267
|
+
ORDER BY created_at ASC
|
|
268
|
+
LIMIT $1 OFFSET $2
|
|
269
|
+
`;
|
|
270
|
+
const result = await this.pool.query(query, [limit, offset]);
|
|
271
|
+
this.lastAccess = new Date();
|
|
272
|
+
return result.rows.map((row) => {
|
|
273
|
+
const state = row.state;
|
|
274
|
+
if (!state)
|
|
275
|
+
return null;
|
|
276
|
+
return typeof state === 'string' ? JSON.parse(state) : state;
|
|
277
|
+
}).filter((state) => state !== null);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get retry states by status
|
|
281
|
+
*/
|
|
282
|
+
async listByStatus(status) {
|
|
283
|
+
await this.initializeClient();
|
|
284
|
+
const query = `
|
|
285
|
+
SELECT state
|
|
286
|
+
FROM ${this.tableName}
|
|
287
|
+
WHERE state->>'status' = $1
|
|
288
|
+
ORDER BY created_at ASC
|
|
289
|
+
`;
|
|
290
|
+
const result = await this.pool.query(query, [status]);
|
|
291
|
+
this.lastAccess = new Date();
|
|
292
|
+
return result.rows.map((row) => {
|
|
293
|
+
const state = row.state;
|
|
294
|
+
if (!state)
|
|
295
|
+
return null;
|
|
296
|
+
return typeof state === 'string' ? JSON.parse(state) : state;
|
|
297
|
+
}).filter((state) => state !== null);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Clean up old retry states
|
|
301
|
+
*/
|
|
302
|
+
async cleanupOldStates(maxAgeHours = 24) {
|
|
303
|
+
await this.initializeClient();
|
|
304
|
+
const query = `
|
|
305
|
+
DELETE FROM ${this.tableName}
|
|
306
|
+
WHERE updated_at < NOW() - INTERVAL '${maxAgeHours} hours'
|
|
307
|
+
`;
|
|
308
|
+
const result = await this.pool.query(query);
|
|
309
|
+
this.lastWrite = new Date();
|
|
310
|
+
return result.rowCount;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
exports.PostgreSQLStorage = PostgreSQLStorage;
|
|
314
|
+
//# sourceMappingURL=postgresql-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql-storage.js","sourceRoot":"","sources":["../../src/storage/postgresql-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { RetryState } from '../types';
|
|
2
|
+
import { StorageBackend, StorageStats } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Redis Cluster storage backend for retry states
|
|
5
|
+
*/
|
|
6
|
+
export declare class RedisClusterStorage implements StorageBackend {
|
|
7
|
+
private cluster;
|
|
8
|
+
private connectionString;
|
|
9
|
+
private options;
|
|
10
|
+
private prefix;
|
|
11
|
+
private lastAccess;
|
|
12
|
+
private lastWrite;
|
|
13
|
+
private isInitialized;
|
|
14
|
+
constructor(connectionString: string, options?: Record<string, any>);
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the Redis Cluster client
|
|
17
|
+
*/
|
|
18
|
+
private initializeClient;
|
|
19
|
+
/**
|
|
20
|
+
* Parse cluster nodes from connection string
|
|
21
|
+
*/
|
|
22
|
+
private parseClusterNodes;
|
|
23
|
+
/**
|
|
24
|
+
* Get the full key name with prefix
|
|
25
|
+
*/
|
|
26
|
+
private getFullKey;
|
|
27
|
+
/**
|
|
28
|
+
* Store a retry state
|
|
29
|
+
*/
|
|
30
|
+
set(key: string, value: RetryState): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get a retry state
|
|
33
|
+
*/
|
|
34
|
+
get(key: string): Promise<RetryState | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a retry state
|
|
37
|
+
*/
|
|
38
|
+
delete(key: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* List all retry states
|
|
41
|
+
*/
|
|
42
|
+
list(): Promise<RetryState[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Clear all retry states
|
|
45
|
+
*/
|
|
46
|
+
clear(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Get storage statistics
|
|
49
|
+
*/
|
|
50
|
+
getStats(): Promise<StorageStats>;
|
|
51
|
+
/**
|
|
52
|
+
* Test the connection
|
|
53
|
+
*/
|
|
54
|
+
testConnection(): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Close the connection
|
|
57
|
+
*/
|
|
58
|
+
close(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get cluster information
|
|
61
|
+
*/
|
|
62
|
+
getClusterInfo(): Promise<Record<string, any>>;
|
|
63
|
+
/**
|
|
64
|
+
* Set expiration for a key
|
|
65
|
+
*/
|
|
66
|
+
setExpiration(key: string, seconds: number): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get time to live for a key
|
|
69
|
+
*/
|
|
70
|
+
getTTL(key: string): Promise<number>;
|
|
71
|
+
/**
|
|
72
|
+
* Get retry states with pagination
|
|
73
|
+
*/
|
|
74
|
+
listPaginated(limit?: number, offset?: number): Promise<RetryState[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Get retry states by status using SCAN
|
|
77
|
+
*/
|
|
78
|
+
listByStatus(status: string): Promise<RetryState[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Clean up old retry states using SCAN
|
|
81
|
+
*/
|
|
82
|
+
cleanupOldStates(maxAgeHours?: number): Promise<number>;
|
|
83
|
+
/**
|
|
84
|
+
* Get cluster health status
|
|
85
|
+
*/
|
|
86
|
+
getClusterHealth(): Promise<Record<string, any>>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=redis-cluster-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-cluster-storage.d.ts","sourceRoot":"","sources":["../../src/storage/redis-cluster-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,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAMvE;;OAEG;YACW,gBAAgB;IAkC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;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;IAkB5B;;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;IAQ5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IA+BpD;;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;IAO1C;;OAEG;IACG,aAAa,CAAC,KAAK,GAAE,MAAY,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA8BnF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCzD;;OAEG;IACG,gBAAgB,CAAC,WAAW,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA2CjE;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CA6BvD"}
|