@dotdo/postgres 0.1.0 → 0.1.2
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/backup/backup-manager.d.ts +244 -0
- package/dist/backup/backup-manager.d.ts.map +1 -0
- package/dist/backup/backup-manager.js +726 -0
- package/dist/backup/backup-manager.js.map +1 -0
- package/dist/observability/production-metrics.d.ts +318 -0
- package/dist/observability/production-metrics.d.ts.map +1 -0
- package/dist/observability/production-metrics.js +747 -0
- package/dist/observability/production-metrics.js.map +1 -0
- package/dist/pglite-assets/pglite.data +0 -0
- package/dist/pglite-assets/pglite.wasm +0 -0
- package/dist/pitr/pitr-manager.d.ts +240 -0
- package/dist/pitr/pitr-manager.d.ts.map +1 -0
- package/dist/pitr/pitr-manager.js +837 -0
- package/dist/pitr/pitr-manager.js.map +1 -0
- package/dist/streaming/cdc-iceberg-connector.d.ts +1 -1
- package/dist/streaming/cdc-iceberg-connector.js +1 -1
- package/dist/streaming/live-cdc-stream.d.ts +1 -1
- package/dist/streaming/live-cdc-stream.js +1 -1
- package/dist/worker/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +16 -6
- package/dist/worker/auth.js.map +1 -1
- package/dist/worker/entry.d.ts.map +1 -1
- package/dist/worker/entry.js +108 -26
- package/dist/worker/entry.js.map +1 -1
- package/package.json +7 -6
- package/src/__tests__/backup.test.ts +944 -0
- package/src/__tests__/observability.test.ts +1089 -0
- package/src/__tests__/pitr.test.ts +1240 -0
- package/src/backup/backup-manager.ts +1006 -0
- package/src/observability/production-metrics.ts +1054 -0
- package/src/pglite-assets/pglite.data +0 -0
- package/src/pglite-assets/pglite.wasm +0 -0
- package/src/pitr/pitr-manager.ts +1136 -0
- package/src/worker/auth.ts +17 -6
- package/src/worker/entry.ts +112 -30
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated Backup Manager for PostgreSQL Durable Objects
|
|
3
|
+
*
|
|
4
|
+
* Provides scheduled full and incremental backups to R2 storage,
|
|
5
|
+
* backup manifest management, restore capabilities, and retention policies.
|
|
6
|
+
*/
|
|
7
|
+
/** Configuration for the BackupManager instance */
|
|
8
|
+
export interface BackupConfig {
|
|
9
|
+
/** R2 bucket for backup storage */
|
|
10
|
+
bucket: R2Bucket;
|
|
11
|
+
/** Durable Object identifier */
|
|
12
|
+
doId: string;
|
|
13
|
+
/** Key prefix for all backup objects in R2 */
|
|
14
|
+
prefix: string;
|
|
15
|
+
/** Backup scheduling configuration */
|
|
16
|
+
schedule?: BackupSchedule;
|
|
17
|
+
/** Retention policy for automated pruning */
|
|
18
|
+
retention?: BackupRetentionPolicy;
|
|
19
|
+
/** Whether to compress backup data before upload */
|
|
20
|
+
compression?: boolean;
|
|
21
|
+
/** Checksum algorithm to use for integrity verification */
|
|
22
|
+
checksumAlgorithm?: 'sha-256' | 'sha-1' | 'md5';
|
|
23
|
+
/** Maximum number of concurrent R2 upload operations */
|
|
24
|
+
maxConcurrentUploads?: number;
|
|
25
|
+
}
|
|
26
|
+
/** Schedule configuration for automated backups */
|
|
27
|
+
export interface BackupSchedule {
|
|
28
|
+
/** Interval between backup executions in milliseconds */
|
|
29
|
+
intervalMs: number;
|
|
30
|
+
/** Type of backup to create on each interval */
|
|
31
|
+
type: 'full' | 'incremental';
|
|
32
|
+
/** Interval for forcing a full backup even when incremental is configured */
|
|
33
|
+
fullBackupIntervalMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Retention policy controlling backup pruning behavior */
|
|
36
|
+
export interface BackupRetentionPolicy {
|
|
37
|
+
/** Maximum number of backups to retain */
|
|
38
|
+
maxBackups: number;
|
|
39
|
+
/** Maximum age of backups in days before eligible for pruning */
|
|
40
|
+
maxAgeDays: number;
|
|
41
|
+
/** Minimum number of full backups to always preserve */
|
|
42
|
+
keepMinFullBackups: number;
|
|
43
|
+
}
|
|
44
|
+
/** Represents a single backup entry in the manifest */
|
|
45
|
+
export interface BackupEntry {
|
|
46
|
+
backupId: string;
|
|
47
|
+
type: 'full' | 'incremental';
|
|
48
|
+
timestamp: number;
|
|
49
|
+
sizeBytes: number;
|
|
50
|
+
checksum?: string;
|
|
51
|
+
checksumAlgorithm?: string;
|
|
52
|
+
compressed?: boolean;
|
|
53
|
+
baseBackupId?: string;
|
|
54
|
+
parentChain?: string[];
|
|
55
|
+
tables?: string[];
|
|
56
|
+
r2Key: string;
|
|
57
|
+
}
|
|
58
|
+
/** Manifest tracking all backup entries for a Durable Object */
|
|
59
|
+
export interface BackupManifest {
|
|
60
|
+
doId: string;
|
|
61
|
+
version: string;
|
|
62
|
+
entries: BackupEntry[];
|
|
63
|
+
totalSizeBytes: number;
|
|
64
|
+
checksum: string;
|
|
65
|
+
lastUpdated: number;
|
|
66
|
+
}
|
|
67
|
+
/** Result of a backup creation operation */
|
|
68
|
+
export interface BackupResult {
|
|
69
|
+
success: boolean;
|
|
70
|
+
type: 'full' | 'incremental';
|
|
71
|
+
backupId: string;
|
|
72
|
+
sizeBytes: number;
|
|
73
|
+
timestamp: number;
|
|
74
|
+
checksum?: string;
|
|
75
|
+
checksumAlgorithm?: string;
|
|
76
|
+
compressed?: boolean;
|
|
77
|
+
uncompressedSizeBytes?: number;
|
|
78
|
+
tables?: string[];
|
|
79
|
+
durationMs: number;
|
|
80
|
+
error?: string;
|
|
81
|
+
baseBackupId?: string;
|
|
82
|
+
parentChain?: string[];
|
|
83
|
+
changedPages?: number;
|
|
84
|
+
}
|
|
85
|
+
/** Result of a restore operation */
|
|
86
|
+
export interface RestoreResult {
|
|
87
|
+
success: boolean;
|
|
88
|
+
restoredFromBackupId: string;
|
|
89
|
+
tablesRestored?: string[];
|
|
90
|
+
backupsApplied?: number;
|
|
91
|
+
durationMs: number;
|
|
92
|
+
error?: string;
|
|
93
|
+
}
|
|
94
|
+
/** Aggregate statistics for backup operations */
|
|
95
|
+
export interface BackupStats {
|
|
96
|
+
totalBackups: number;
|
|
97
|
+
totalSizeBytes: number;
|
|
98
|
+
lastBackupTimestamp: number;
|
|
99
|
+
successCount: number;
|
|
100
|
+
failureCount: number;
|
|
101
|
+
avgDurationMs: number;
|
|
102
|
+
fullBackupCount: number;
|
|
103
|
+
incrementalBackupCount: number;
|
|
104
|
+
}
|
|
105
|
+
/** Tracks the state needed for incremental backup chains */
|
|
106
|
+
export interface IncrementalBackupState {
|
|
107
|
+
lastBackupLsn: string;
|
|
108
|
+
lastBackupTimestamp: number;
|
|
109
|
+
baseBackupId: string;
|
|
110
|
+
}
|
|
111
|
+
/** Options for restore operations */
|
|
112
|
+
export interface RestoreOptions {
|
|
113
|
+
/** Whether to validate checksums during restore */
|
|
114
|
+
validateChecksum?: boolean;
|
|
115
|
+
/** Callback for restore progress updates */
|
|
116
|
+
onProgress?: (event: RestoreProgressEvent) => void;
|
|
117
|
+
}
|
|
118
|
+
/** Progress event emitted during restore operations */
|
|
119
|
+
interface RestoreProgressEvent {
|
|
120
|
+
phase: string;
|
|
121
|
+
progress: number;
|
|
122
|
+
}
|
|
123
|
+
interface AlarmResult {
|
|
124
|
+
backupCreated: boolean;
|
|
125
|
+
type?: 'full' | 'incremental';
|
|
126
|
+
nextAlarmMs?: number;
|
|
127
|
+
}
|
|
128
|
+
interface PruneResult {
|
|
129
|
+
pruned: number;
|
|
130
|
+
remaining: number;
|
|
131
|
+
deletedBackupIds: string[];
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Minimal interface for a PGLite-compatible database instance.
|
|
135
|
+
* Used to decouple from the concrete PGLite implementation.
|
|
136
|
+
*/
|
|
137
|
+
interface PGLiteInstance {
|
|
138
|
+
query(sql: string): Promise<{
|
|
139
|
+
rows: Record<string, unknown>[];
|
|
140
|
+
}>;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Manages automated backups (full and incremental) of PostgreSQL Durable Objects to R2 storage.
|
|
144
|
+
* Handles manifest tracking, restore operations, retention policies, and scheduling.
|
|
145
|
+
*/
|
|
146
|
+
export declare class BackupManager {
|
|
147
|
+
private config;
|
|
148
|
+
private manifest;
|
|
149
|
+
private stats;
|
|
150
|
+
private incrementalState;
|
|
151
|
+
private backupInProgress;
|
|
152
|
+
private lastFullBackupTime;
|
|
153
|
+
private backupSequence;
|
|
154
|
+
constructor(config: BackupConfig);
|
|
155
|
+
private createEmptyManifest;
|
|
156
|
+
private createEmptyStats;
|
|
157
|
+
/**
|
|
158
|
+
* Creates a full backup of the database, serializing table data and uploading to R2.
|
|
159
|
+
* Only one backup operation can run at a time.
|
|
160
|
+
*/
|
|
161
|
+
createFullBackup(pglite: PGLiteInstance): Promise<BackupResult>;
|
|
162
|
+
/** Stores the last failure result for internal signaling between helper methods */
|
|
163
|
+
private lastFailureResult;
|
|
164
|
+
/** Stores the last upload error message */
|
|
165
|
+
private lastUploadError;
|
|
166
|
+
/**
|
|
167
|
+
* Queries user tables from PGLite, returning null and setting lastFailureResult on error.
|
|
168
|
+
* This pattern avoids duplicating the failure-result construction.
|
|
169
|
+
*/
|
|
170
|
+
private queryUserTables;
|
|
171
|
+
/** Applies compression if configured, returning the final data and compression flag */
|
|
172
|
+
private applyCompression;
|
|
173
|
+
/** Builds the R2 object key for a backup */
|
|
174
|
+
private buildR2Key;
|
|
175
|
+
/**
|
|
176
|
+
* Uploads data to R2 with a microtask-based timeout to detect hung operations.
|
|
177
|
+
* Returns true on success, false on failure (sets lastUploadError).
|
|
178
|
+
*/
|
|
179
|
+
private uploadWithTimeout;
|
|
180
|
+
/** Adds an entry to the manifest and updates aggregate metadata */
|
|
181
|
+
private addManifestEntry;
|
|
182
|
+
/**
|
|
183
|
+
* Creates an incremental backup capturing changes since the last backup.
|
|
184
|
+
* Requires a prior full backup to establish the incremental chain.
|
|
185
|
+
*/
|
|
186
|
+
createIncrementalBackup(pglite: PGLiteInstance): Promise<BackupResult>;
|
|
187
|
+
/** Fetches the current WAL LSN from PGLite, falling back to a simulated value */
|
|
188
|
+
private getCurrentLsn;
|
|
189
|
+
/**
|
|
190
|
+
* Restores the database from a specific backup, applying the full incremental chain if necessary.
|
|
191
|
+
* Supports checksum validation and progress reporting via options.
|
|
192
|
+
*/
|
|
193
|
+
restoreFromBackup(backupId: string, _pglite: PGLiteInstance, options?: RestoreOptions): Promise<RestoreResult>;
|
|
194
|
+
/** Checks if a backup exists in R2 under either the full or incremental prefix */
|
|
195
|
+
private backupExistsInR2;
|
|
196
|
+
/** Creates a standardized failed RestoreResult */
|
|
197
|
+
private createFailedRestoreResult;
|
|
198
|
+
/** Restores a single backup entry, validating its checksum if required */
|
|
199
|
+
private restoreAndValidateEntry;
|
|
200
|
+
/** Verifies that the checksum of the given data matches the expected value */
|
|
201
|
+
private verifyChecksum;
|
|
202
|
+
/** Restores from the most recent backup in the manifest */
|
|
203
|
+
restoreFromLatest(pglite: PGLiteInstance): Promise<RestoreResult>;
|
|
204
|
+
/** Retrieves the backup manifest, loading from R2 if no local entries exist */
|
|
205
|
+
getManifest(): Promise<BackupManifest>;
|
|
206
|
+
/** Validates the manifest by checking R2 or local state for parseable data */
|
|
207
|
+
validateManifest(): Promise<boolean>;
|
|
208
|
+
/** Returns a copy of all backup entries in the manifest */
|
|
209
|
+
listBackups(): Promise<BackupEntry[]>;
|
|
210
|
+
/** Verifies that a backup exists in R2 by checking its object head */
|
|
211
|
+
verifyBackup(backupId: string): Promise<boolean>;
|
|
212
|
+
/** Returns the timestamp for the next scheduled backup */
|
|
213
|
+
getNextBackupTime(): number;
|
|
214
|
+
/** Determines whether a full backup is required based on the configured interval */
|
|
215
|
+
needsFullBackup(): boolean;
|
|
216
|
+
/** Returns the type of backup to create on the next scheduled execution */
|
|
217
|
+
getScheduledBackupType(): 'full' | 'incremental';
|
|
218
|
+
/** Handles a Durable Object alarm, creating the appropriate backup type */
|
|
219
|
+
handleAlarm(pglite: PGLiteInstance): Promise<AlarmResult>;
|
|
220
|
+
/** Returns the current backup schedule configuration, or defaults */
|
|
221
|
+
getSchedule(): BackupSchedule;
|
|
222
|
+
/** Prunes old backups according to the retention policy, preserving minimum full backups */
|
|
223
|
+
pruneBackups(): Promise<PruneResult>;
|
|
224
|
+
/** Returns a snapshot of backup statistics */
|
|
225
|
+
getStats(): BackupStats;
|
|
226
|
+
/** Resets all backup statistics to zero */
|
|
227
|
+
resetStats(): void;
|
|
228
|
+
/** Returns the current incremental backup chain state, or null if no full backup exists */
|
|
229
|
+
getIncrementalState(): IncrementalBackupState | null;
|
|
230
|
+
/** Returns the R2 key for the manifest file */
|
|
231
|
+
private getManifestKey;
|
|
232
|
+
/** Persists the current manifest to R2 */
|
|
233
|
+
private saveManifest;
|
|
234
|
+
/** Builds the parent chain of backup IDs from the base full backup to the given ID */
|
|
235
|
+
private buildParentChain;
|
|
236
|
+
/** Gets the ordered chain of backup entries needed to restore to the given backup ID */
|
|
237
|
+
private getRestoreChain;
|
|
238
|
+
/** Updates aggregate statistics after a backup operation completes */
|
|
239
|
+
private updateStats;
|
|
240
|
+
}
|
|
241
|
+
/** Creates a BackupManager instance, validating required configuration */
|
|
242
|
+
export declare function createBackupManager(config: BackupConfig): BackupManager;
|
|
243
|
+
export {};
|
|
244
|
+
//# sourceMappingURL=backup-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-manager.d.ts","sourceRoot":"","sources":["../../src/backup/backup-manager.ts"],"names":[],"mappings":"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"}
|