bunqueue 1.9.7 → 1.9.9
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/application/backgroundTasks.d.ts +3 -6
- package/dist/application/backgroundTasks.d.ts.map +1 -1
- package/dist/application/backgroundTasks.js +10 -179
- package/dist/application/backgroundTasks.js.map +1 -1
- package/dist/application/cleanupTasks.d.ts +1 -1
- package/dist/application/cleanupTasks.d.ts.map +1 -1
- package/dist/application/cleanupTasks.js +61 -22
- package/dist/application/cleanupTasks.js.map +1 -1
- package/dist/application/clientTracking.d.ts +22 -0
- package/dist/application/clientTracking.d.ts.map +1 -0
- package/dist/application/clientTracking.js +118 -0
- package/dist/application/clientTracking.js.map +1 -0
- package/dist/application/contextFactory.d.ts +97 -0
- package/dist/application/contextFactory.d.ts.map +1 -0
- package/dist/application/contextFactory.js +170 -0
- package/dist/application/contextFactory.js.map +1 -0
- package/dist/application/dependencyProcessor.d.ts +11 -0
- package/dist/application/dependencyProcessor.d.ts.map +1 -0
- package/dist/application/dependencyProcessor.js +69 -0
- package/dist/application/dependencyProcessor.js.map +1 -0
- package/dist/application/dlqManager.d.ts +12 -0
- package/dist/application/dlqManager.d.ts.map +1 -1
- package/dist/application/dlqManager.js +36 -0
- package/dist/application/dlqManager.js.map +1 -1
- package/dist/application/lockManager.d.ts +3 -49
- package/dist/application/lockManager.d.ts.map +1 -1
- package/dist/application/lockManager.js +101 -272
- package/dist/application/lockManager.js.map +1 -1
- package/dist/application/lockOperations.d.ts +39 -0
- package/dist/application/lockOperations.d.ts.map +1 -0
- package/dist/application/lockOperations.js +101 -0
- package/dist/application/lockOperations.js.map +1 -0
- package/dist/application/operations/ack.d.ts +1 -5
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js +43 -259
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/ackHelpers.d.ts +79 -0
- package/dist/application/operations/ackHelpers.d.ts.map +1 -0
- package/dist/application/operations/ackHelpers.js +173 -0
- package/dist/application/operations/ackHelpers.js.map +1 -0
- package/dist/application/operations/jobManagement.d.ts +2 -0
- package/dist/application/operations/jobManagement.d.ts.map +1 -1
- package/dist/application/operations/jobManagement.js +8 -0
- package/dist/application/operations/jobManagement.js.map +1 -1
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +20 -6
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/operations/queryOperations.d.ts +11 -0
- package/dist/application/operations/queryOperations.d.ts.map +1 -1
- package/dist/application/operations/queryOperations.js +32 -0
- package/dist/application/operations/queryOperations.js.map +1 -1
- package/dist/application/queueManager.d.ts +3 -11
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +98 -244
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/stallDetection.d.ts +11 -0
- package/dist/application/stallDetection.d.ts.map +1 -0
- package/dist/application/stallDetection.js +128 -0
- package/dist/application/stallDetection.js.map +1 -0
- package/dist/application/types.js +1 -1
- package/dist/application/types.js.map +1 -1
- package/dist/cli/client.d.ts +3 -5
- package/dist/cli/client.d.ts.map +1 -1
- package/dist/cli/client.js +31 -27
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/core.js +3 -3
- package/dist/cli/commands/core.js.map +1 -1
- package/dist/cli/commands/job.js +14 -14
- package/dist/cli/commands/job.js.map +1 -1
- package/dist/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +5 -29
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/client/events.d.ts +0 -1
- package/dist/client/events.d.ts.map +1 -1
- package/dist/client/events.js +4 -7
- package/dist/client/events.js.map +1 -1
- package/dist/client/flow.d.ts +23 -1
- package/dist/client/flow.d.ts.map +1 -1
- package/dist/client/flow.js +166 -68
- package/dist/client/flow.js.map +1 -1
- package/dist/client/queue/queue.d.ts.map +1 -1
- package/dist/client/queue/queue.js +3 -1
- package/dist/client/queue/queue.js.map +1 -1
- package/dist/client/sandboxed/types.d.ts +1 -0
- package/dist/client/sandboxed/types.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.d.ts +1 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.js +31 -8
- package/dist/client/sandboxed/worker.js.map +1 -1
- package/dist/client/sandboxed/wrapper.d.ts.map +1 -1
- package/dist/client/sandboxed/wrapper.js +10 -1
- package/dist/client/sandboxed/wrapper.js.map +1 -1
- package/dist/client/tcp/client.d.ts +4 -1
- package/dist/client/tcp/client.d.ts.map +1 -1
- package/dist/client/tcp/client.js +26 -8
- package/dist/client/tcp/client.js.map +1 -1
- package/dist/client/tcp/connection.d.ts +6 -8
- package/dist/client/tcp/connection.d.ts.map +1 -1
- package/dist/client/tcp/connection.js +24 -22
- package/dist/client/tcp/connection.js.map +1 -1
- package/dist/client/tcp/index.d.ts +0 -1
- package/dist/client/tcp/index.d.ts.map +1 -1
- package/dist/client/tcp/index.js +0 -1
- package/dist/client/tcp/index.js.map +1 -1
- package/dist/client/tcp/types.d.ts +8 -13
- package/dist/client/tcp/types.d.ts.map +1 -1
- package/dist/client/tcp/types.js +0 -1
- package/dist/client/tcp/types.js.map +1 -1
- package/dist/client/tcpPool.d.ts.map +1 -1
- package/dist/client/tcpPool.js +0 -6
- package/dist/client/tcpPool.js.map +1 -1
- package/dist/client/worker/ackBatcher.d.ts +1 -1
- package/dist/client/worker/ackBatcher.d.ts.map +1 -1
- package/dist/client/worker/ackBatcher.js +20 -18
- package/dist/client/worker/ackBatcher.js.map +1 -1
- package/dist/client/worker/jobParser.d.ts.map +1 -1
- package/dist/client/worker/jobParser.js +8 -7
- package/dist/client/worker/jobParser.js.map +1 -1
- package/dist/client/worker/processor.d.ts.map +1 -1
- package/dist/client/worker/processor.js +10 -6
- package/dist/client/worker/processor.js.map +1 -1
- package/dist/domain/queue/dependencyTracker.d.ts +74 -0
- package/dist/domain/queue/dependencyTracker.d.ts.map +1 -0
- package/dist/domain/queue/dependencyTracker.js +126 -0
- package/dist/domain/queue/dependencyTracker.js.map +1 -0
- package/dist/domain/queue/dlqShard.d.ts +61 -0
- package/dist/domain/queue/dlqShard.d.ts.map +1 -0
- package/dist/domain/queue/dlqShard.js +175 -0
- package/dist/domain/queue/dlqShard.js.map +1 -0
- package/dist/domain/queue/limiterManager.d.ts +44 -0
- package/dist/domain/queue/limiterManager.d.ts.map +1 -0
- package/dist/domain/queue/limiterManager.js +99 -0
- package/dist/domain/queue/limiterManager.js.map +1 -0
- package/dist/domain/queue/shard.d.ts +33 -124
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +157 -427
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/queue/temporalManager.d.ts +82 -0
- package/dist/domain/queue/temporalManager.d.ts.map +1 -0
- package/dist/domain/queue/temporalManager.js +150 -0
- package/dist/domain/queue/temporalManager.js.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts +32 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.js +87 -0
- package/dist/domain/queue/uniqueKeyManager.js.map +1 -0
- package/dist/domain/types/command.d.ts +6 -0
- package/dist/domain/types/command.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.d.ts +3 -40
- package/dist/infrastructure/backup/s3Backup.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.js +10 -182
- package/dist/infrastructure/backup/s3Backup.js.map +1 -1
- package/dist/infrastructure/backup/s3BackupConfig.d.ts +67 -0
- package/dist/infrastructure/backup/s3BackupConfig.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupConfig.js +48 -0
- package/dist/infrastructure/backup/s3BackupConfig.js.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts +23 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.js +170 -0
- package/dist/infrastructure/backup/s3BackupOperations.js.map +1 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +6 -13
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +28 -179
- package/dist/infrastructure/persistence/sqlite.js.map +1 -1
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +38 -0
- package/dist/infrastructure/persistence/sqliteBatch.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteBatch.js +124 -0
- package/dist/infrastructure/persistence/sqliteBatch.js.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts +17 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js +81 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js.map +1 -0
- package/dist/infrastructure/persistence/statements.d.ts +1 -1
- package/dist/infrastructure/persistence/statements.d.ts.map +1 -1
- package/dist/infrastructure/persistence/statements.js +3 -2
- package/dist/infrastructure/persistence/statements.js.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +7 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.js +23 -3
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
- package/dist/infrastructure/server/handler.d.ts.map +1 -1
- package/dist/infrastructure/server/handler.js +1 -186
- package/dist/infrastructure/server/handler.js.map +1 -1
- package/dist/infrastructure/server/handlerRoutes.d.ts +23 -0
- package/dist/infrastructure/server/handlerRoutes.d.ts.map +1 -0
- package/dist/infrastructure/server/handlerRoutes.js +190 -0
- package/dist/infrastructure/server/handlerRoutes.js.map +1 -0
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/core.js +26 -19
- package/dist/infrastructure/server/handlers/core.js.map +1 -1
- package/dist/infrastructure/server/http.d.ts +4 -25
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +68 -285
- package/dist/infrastructure/server/http.js.map +1 -1
- package/dist/infrastructure/server/httpEndpoints.d.ts +19 -0
- package/dist/infrastructure/server/httpEndpoints.d.ts.map +1 -0
- package/dist/infrastructure/server/httpEndpoints.js +151 -0
- package/dist/infrastructure/server/httpEndpoints.js.map +1 -0
- package/dist/infrastructure/server/protocol.d.ts +15 -1
- package/dist/infrastructure/server/protocol.d.ts.map +1 -1
- package/dist/infrastructure/server/protocol.js +37 -3
- package/dist/infrastructure/server/protocol.js.map +1 -1
- package/dist/infrastructure/server/sseHandler.d.ts +27 -0
- package/dist/infrastructure/server/sseHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/sseHandler.js +77 -0
- package/dist/infrastructure/server/sseHandler.js.map +1 -0
- package/dist/infrastructure/server/tcp.d.ts +8 -10
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +51 -42
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/infrastructure/server/wsHandler.d.ts +31 -0
- package/dist/infrastructure/server/wsHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/wsHandler.js +63 -0
- package/dist/infrastructure/server/wsHandler.js.map +1 -0
- package/dist/main.js +2 -4
- package/dist/main.js.map +1 -1
- package/dist/mcp/index.js +3 -465
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcpHandlers.d.ts +129 -0
- package/dist/mcp/mcpHandlers.d.ts.map +1 -0
- package/dist/mcp/mcpHandlers.js +204 -0
- package/dist/mcp/mcpHandlers.js.map +1 -0
- package/dist/mcp/mcpTools.d.ts +15 -0
- package/dist/mcp/mcpTools.d.ts.map +1 -0
- package/dist/mcp/mcpTools.js +277 -0
- package/dist/mcp/mcpTools.js.map +1 -0
- package/dist/shared/lru.d.ts +23 -0
- package/dist/shared/lru.d.ts.map +1 -1
- package/dist/shared/lru.js +61 -3
- package/dist/shared/lru.js.map +1 -1
- package/dist/shared/skipList.d.ts +10 -2
- package/dist/shared/skipList.d.ts.map +1 -1
- package/dist/shared/skipList.js +22 -1
- package/dist/shared/skipList.js.map +1 -1
- package/package.json +2 -2
- package/dist/cli/dashboard.d.ts +0 -32
- package/dist/cli/dashboard.d.ts.map +0 -1
- package/dist/cli/dashboard.js +0 -183
- package/dist/cli/dashboard.js.map +0 -1
- package/dist/client/tcp/lineBuffer.d.ts +0 -17
- package/dist/client/tcp/lineBuffer.d.ts.map +0 -1
- package/dist/client/tcp/lineBuffer.js +0 -32
- package/dist/client/tcp/lineBuffer.js.map +0 -1
|
@@ -6,14 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { S3Client } from 'bun';
|
|
8
8
|
import { backupLog } from '../../shared/logger';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
const DEFAULTS = {
|
|
12
|
-
intervalMs: 6 * 60 * 60 * 1000, // 6 hours
|
|
13
|
-
retention: 7,
|
|
14
|
-
prefix: 'backups/',
|
|
15
|
-
region: 'us-east-1',
|
|
16
|
-
};
|
|
9
|
+
import { DEFAULTS, configFromEnv, validateConfig, } from './s3BackupConfig';
|
|
10
|
+
import { performBackup, listBackups, restoreBackup, cleanupOldBackups } from './s3BackupOperations';
|
|
17
11
|
/**
|
|
18
12
|
* S3 Backup Manager
|
|
19
13
|
* Handles automated and manual backups to S3-compatible storage
|
|
@@ -50,37 +44,13 @@ export class S3BackupManager {
|
|
|
50
44
|
* Create configuration from environment variables
|
|
51
45
|
*/
|
|
52
46
|
static fromEnv(databasePath) {
|
|
53
|
-
return
|
|
54
|
-
enabled: process.env.S3_BACKUP_ENABLED === '1' || process.env.S3_BACKUP_ENABLED === 'true',
|
|
55
|
-
accessKeyId: process.env.S3_ACCESS_KEY_ID ?? process.env.AWS_ACCESS_KEY_ID ?? '',
|
|
56
|
-
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY ?? process.env.AWS_SECRET_ACCESS_KEY ?? '',
|
|
57
|
-
bucket: process.env.S3_BUCKET ?? process.env.AWS_BUCKET ?? '',
|
|
58
|
-
endpoint: process.env.S3_ENDPOINT ?? process.env.AWS_ENDPOINT,
|
|
59
|
-
region: process.env.S3_REGION ?? process.env.AWS_REGION ?? DEFAULTS.region,
|
|
60
|
-
intervalMs: parseInt(process.env.S3_BACKUP_INTERVAL ?? '', 10) || DEFAULTS.intervalMs,
|
|
61
|
-
retention: parseInt(process.env.S3_BACKUP_RETENTION ?? '', 10) || DEFAULTS.retention,
|
|
62
|
-
prefix: process.env.S3_BACKUP_PREFIX ?? DEFAULTS.prefix,
|
|
63
|
-
databasePath,
|
|
64
|
-
};
|
|
47
|
+
return configFromEnv(databasePath);
|
|
65
48
|
}
|
|
66
49
|
/**
|
|
67
50
|
* Validate configuration
|
|
68
51
|
*/
|
|
69
52
|
validate() {
|
|
70
|
-
|
|
71
|
-
if (!this.config.accessKeyId) {
|
|
72
|
-
errors.push('S3_ACCESS_KEY_ID is required');
|
|
73
|
-
}
|
|
74
|
-
if (!this.config.secretAccessKey) {
|
|
75
|
-
errors.push('S3_SECRET_ACCESS_KEY is required');
|
|
76
|
-
}
|
|
77
|
-
if (!this.config.bucket) {
|
|
78
|
-
errors.push('S3_BUCKET is required');
|
|
79
|
-
}
|
|
80
|
-
if (!this.config.databasePath) {
|
|
81
|
-
errors.push('Database path is required');
|
|
82
|
-
}
|
|
83
|
-
return { valid: errors.length === 0, errors };
|
|
53
|
+
return validateConfig(this.config);
|
|
84
54
|
}
|
|
85
55
|
/**
|
|
86
56
|
* Start automated backup scheduler
|
|
@@ -138,55 +108,12 @@ export class S3BackupManager {
|
|
|
138
108
|
return { success: false, error: 'Backup already in progress' };
|
|
139
109
|
}
|
|
140
110
|
this.isBackupInProgress = true;
|
|
141
|
-
const startTime = Date.now();
|
|
142
111
|
try {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (!exists) {
|
|
147
|
-
throw new Error(`Database file not found: ${this.config.databasePath}`);
|
|
112
|
+
const result = await performBackup(this.config, this.client);
|
|
113
|
+
if (result.success) {
|
|
114
|
+
await cleanupOldBackups(this.config, this.client);
|
|
148
115
|
}
|
|
149
|
-
|
|
150
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
151
|
-
const key = `${this.config.prefix}bunqueue-${timestamp}.db`;
|
|
152
|
-
// Read database file
|
|
153
|
-
const data = await dbFile.arrayBuffer();
|
|
154
|
-
const size = data.byteLength;
|
|
155
|
-
// Calculate checksum
|
|
156
|
-
const hasher = new Bun.CryptoHasher('sha256');
|
|
157
|
-
hasher.update(new Uint8Array(data));
|
|
158
|
-
const checksum = hasher.digest('hex');
|
|
159
|
-
// Upload to S3
|
|
160
|
-
const s3File = this.client.file(key);
|
|
161
|
-
await s3File.write(new Uint8Array(data), {
|
|
162
|
-
type: 'application/x-sqlite3',
|
|
163
|
-
});
|
|
164
|
-
// Upload metadata
|
|
165
|
-
const metadata = {
|
|
166
|
-
timestamp: new Date().toISOString(),
|
|
167
|
-
version: VERSION,
|
|
168
|
-
size,
|
|
169
|
-
checksum,
|
|
170
|
-
};
|
|
171
|
-
const metadataKey = `${key}.meta.json`;
|
|
172
|
-
await this.client.file(metadataKey).write(JSON.stringify(metadata, null, 2), {
|
|
173
|
-
type: 'application/json',
|
|
174
|
-
});
|
|
175
|
-
const duration = Date.now() - startTime;
|
|
176
|
-
backupLog.info('Backup completed', {
|
|
177
|
-
key,
|
|
178
|
-
size: `${(size / 1024 / 1024).toFixed(2)} MB`,
|
|
179
|
-
duration: `${duration}ms`,
|
|
180
|
-
checksum: checksum.substring(0, 16) + '...',
|
|
181
|
-
});
|
|
182
|
-
// Clean up old backups
|
|
183
|
-
await this.cleanupOldBackups();
|
|
184
|
-
return { success: true, key, size, duration };
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
188
|
-
backupLog.error('Backup failed', { error: message });
|
|
189
|
-
return { success: false, error: message };
|
|
116
|
+
return result;
|
|
190
117
|
}
|
|
191
118
|
finally {
|
|
192
119
|
this.isBackupInProgress = false;
|
|
@@ -196,112 +123,13 @@ export class S3BackupManager {
|
|
|
196
123
|
* List available backups
|
|
197
124
|
*/
|
|
198
125
|
async listBackups() {
|
|
199
|
-
|
|
200
|
-
const result = await this.client.list({
|
|
201
|
-
prefix: this.config.prefix,
|
|
202
|
-
maxKeys: 100,
|
|
203
|
-
});
|
|
204
|
-
if (!result.contents) {
|
|
205
|
-
return [];
|
|
206
|
-
}
|
|
207
|
-
return result.contents
|
|
208
|
-
.filter((item) => typeof item.key === 'string' &&
|
|
209
|
-
item.key.endsWith('.db') &&
|
|
210
|
-
!item.key.endsWith('.meta.json'))
|
|
211
|
-
.map((item) => {
|
|
212
|
-
const lastMod = item.lastModified;
|
|
213
|
-
// Handle both Date and string types from S3 response
|
|
214
|
-
const lastModDate = lastMod ? new Date(lastMod) : new Date();
|
|
215
|
-
return {
|
|
216
|
-
key: item.key,
|
|
217
|
-
size: item.size ?? 0,
|
|
218
|
-
lastModified: lastModDate,
|
|
219
|
-
};
|
|
220
|
-
})
|
|
221
|
-
.sort((a, b) => b.lastModified.getTime() - a.lastModified.getTime());
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
backupLog.error('Failed to list backups', { error: String(error) });
|
|
225
|
-
return [];
|
|
226
|
-
}
|
|
126
|
+
return listBackups(this.config, this.client);
|
|
227
127
|
}
|
|
228
128
|
/**
|
|
229
129
|
* Restore from a backup
|
|
230
130
|
*/
|
|
231
131
|
async restore(key) {
|
|
232
|
-
|
|
233
|
-
try {
|
|
234
|
-
// Verify backup exists
|
|
235
|
-
const s3File = this.client.file(key);
|
|
236
|
-
const exists = await s3File.exists();
|
|
237
|
-
if (!exists) {
|
|
238
|
-
throw new Error(`Backup not found: ${key}`);
|
|
239
|
-
}
|
|
240
|
-
// Download backup
|
|
241
|
-
const data = await s3File.arrayBuffer();
|
|
242
|
-
// Verify checksum if metadata exists
|
|
243
|
-
const metadataKey = `${key}.meta.json`;
|
|
244
|
-
const metadataFile = this.client.file(metadataKey);
|
|
245
|
-
const metadataExists = await metadataFile.exists();
|
|
246
|
-
if (metadataExists) {
|
|
247
|
-
const metadataRaw = (await metadataFile.json());
|
|
248
|
-
const hasher = new Bun.CryptoHasher('sha256');
|
|
249
|
-
hasher.update(new Uint8Array(data));
|
|
250
|
-
const checksum = hasher.digest('hex');
|
|
251
|
-
if (checksum !== metadataRaw.checksum) {
|
|
252
|
-
throw new Error('Backup checksum mismatch - file may be corrupted');
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// Write to database path
|
|
256
|
-
await Bun.write(this.config.databasePath, new Uint8Array(data));
|
|
257
|
-
const duration = Date.now() - startTime;
|
|
258
|
-
backupLog.info('Restore completed', {
|
|
259
|
-
key,
|
|
260
|
-
size: `${(data.byteLength / 1024 / 1024).toFixed(2)} MB`,
|
|
261
|
-
duration: `${duration}ms`,
|
|
262
|
-
});
|
|
263
|
-
return { success: true, key, size: data.byteLength, duration };
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
267
|
-
backupLog.error('Restore failed', { error: message });
|
|
268
|
-
return { success: false, error: message };
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Clean up old backups based on retention policy
|
|
273
|
-
*/
|
|
274
|
-
async cleanupOldBackups() {
|
|
275
|
-
try {
|
|
276
|
-
const backups = await this.listBackups();
|
|
277
|
-
if (backups.length <= this.config.retention) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
// Sort by date (newest first) and get backups to delete
|
|
281
|
-
const toDelete = backups.slice(this.config.retention);
|
|
282
|
-
for (const backup of toDelete) {
|
|
283
|
-
try {
|
|
284
|
-
// Delete backup file
|
|
285
|
-
await this.client.delete(backup.key);
|
|
286
|
-
// Delete metadata file if exists
|
|
287
|
-
const metadataKey = `${backup.key}.meta.json`;
|
|
288
|
-
const metadataFile = this.client.file(metadataKey);
|
|
289
|
-
if (await metadataFile.exists()) {
|
|
290
|
-
await this.client.delete(metadataKey);
|
|
291
|
-
}
|
|
292
|
-
backupLog.info('Deleted old backup', { key: backup.key });
|
|
293
|
-
}
|
|
294
|
-
catch (err) {
|
|
295
|
-
backupLog.warn('Failed to delete old backup', {
|
|
296
|
-
key: backup.key,
|
|
297
|
-
error: String(err),
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
catch (error) {
|
|
303
|
-
backupLog.warn('Failed to cleanup old backups', { error: String(error) });
|
|
304
|
-
}
|
|
132
|
+
return restoreBackup(key, this.config, this.client);
|
|
305
133
|
}
|
|
306
134
|
/**
|
|
307
135
|
* Get backup status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3Backup.js","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3Backup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"s3Backup.js","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3Backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Configuration
|
|
3
|
+
* Types and configuration factory
|
|
4
|
+
*/
|
|
5
|
+
/** S3 Backup configuration */
|
|
6
|
+
export interface S3BackupConfig {
|
|
7
|
+
/** Enable S3 backup */
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** S3 access key ID */
|
|
10
|
+
accessKeyId: string;
|
|
11
|
+
/** S3 secret access key */
|
|
12
|
+
secretAccessKey: string;
|
|
13
|
+
/** S3 bucket name */
|
|
14
|
+
bucket: string;
|
|
15
|
+
/** S3 endpoint (optional, for non-AWS S3-compatible services) */
|
|
16
|
+
endpoint?: string;
|
|
17
|
+
/** S3 region (optional, default: us-east-1) */
|
|
18
|
+
region?: string;
|
|
19
|
+
/** Backup interval in milliseconds (default: 6 hours) */
|
|
20
|
+
intervalMs: number;
|
|
21
|
+
/** Number of backups to retain (default: 7) */
|
|
22
|
+
retention: number;
|
|
23
|
+
/** Prefix for backup files (default: 'backups/') */
|
|
24
|
+
prefix: string;
|
|
25
|
+
/** Path to the SQLite database file */
|
|
26
|
+
databasePath: string;
|
|
27
|
+
}
|
|
28
|
+
/** Backup result */
|
|
29
|
+
export interface BackupResult {
|
|
30
|
+
success: boolean;
|
|
31
|
+
key?: string;
|
|
32
|
+
size?: number;
|
|
33
|
+
duration?: number;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Backup metadata stored in S3 */
|
|
37
|
+
export interface BackupMetadata {
|
|
38
|
+
timestamp: string;
|
|
39
|
+
version: string;
|
|
40
|
+
size: number;
|
|
41
|
+
checksum: string;
|
|
42
|
+
}
|
|
43
|
+
/** Backup list item */
|
|
44
|
+
export interface BackupItem {
|
|
45
|
+
key: string;
|
|
46
|
+
size: number;
|
|
47
|
+
lastModified: Date;
|
|
48
|
+
}
|
|
49
|
+
/** Default configuration values */
|
|
50
|
+
export declare const DEFAULTS: {
|
|
51
|
+
readonly intervalMs: number;
|
|
52
|
+
readonly retention: 7;
|
|
53
|
+
readonly prefix: "backups/";
|
|
54
|
+
readonly region: "us-east-1";
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Create configuration from environment variables
|
|
58
|
+
*/
|
|
59
|
+
export declare function configFromEnv(databasePath: string): S3BackupConfig;
|
|
60
|
+
/**
|
|
61
|
+
* Validate configuration
|
|
62
|
+
*/
|
|
63
|
+
export declare function validateConfig(config: S3BackupConfig): {
|
|
64
|
+
valid: boolean;
|
|
65
|
+
errors: string[];
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=s3BackupConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3BackupConfig.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3BackupConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uBAAuB;AACvB,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,mCAAmC;AACnC,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,CAalE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAiB3F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Configuration
|
|
3
|
+
* Types and configuration factory
|
|
4
|
+
*/
|
|
5
|
+
/** Default configuration values */
|
|
6
|
+
export const DEFAULTS = {
|
|
7
|
+
intervalMs: 6 * 60 * 60 * 1000, // 6 hours
|
|
8
|
+
retention: 7,
|
|
9
|
+
prefix: 'backups/',
|
|
10
|
+
region: 'us-east-1',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Create configuration from environment variables
|
|
14
|
+
*/
|
|
15
|
+
export function configFromEnv(databasePath) {
|
|
16
|
+
return {
|
|
17
|
+
enabled: process.env.S3_BACKUP_ENABLED === '1' || process.env.S3_BACKUP_ENABLED === 'true',
|
|
18
|
+
accessKeyId: process.env.S3_ACCESS_KEY_ID ?? process.env.AWS_ACCESS_KEY_ID ?? '',
|
|
19
|
+
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY ?? process.env.AWS_SECRET_ACCESS_KEY ?? '',
|
|
20
|
+
bucket: process.env.S3_BUCKET ?? process.env.AWS_BUCKET ?? '',
|
|
21
|
+
endpoint: process.env.S3_ENDPOINT ?? process.env.AWS_ENDPOINT,
|
|
22
|
+
region: process.env.S3_REGION ?? process.env.AWS_REGION ?? DEFAULTS.region,
|
|
23
|
+
intervalMs: parseInt(process.env.S3_BACKUP_INTERVAL ?? '', 10) || DEFAULTS.intervalMs,
|
|
24
|
+
retention: parseInt(process.env.S3_BACKUP_RETENTION ?? '', 10) || DEFAULTS.retention,
|
|
25
|
+
prefix: process.env.S3_BACKUP_PREFIX ?? DEFAULTS.prefix,
|
|
26
|
+
databasePath,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate configuration
|
|
31
|
+
*/
|
|
32
|
+
export function validateConfig(config) {
|
|
33
|
+
const errors = [];
|
|
34
|
+
if (!config.accessKeyId) {
|
|
35
|
+
errors.push('S3_ACCESS_KEY_ID is required');
|
|
36
|
+
}
|
|
37
|
+
if (!config.secretAccessKey) {
|
|
38
|
+
errors.push('S3_SECRET_ACCESS_KEY is required');
|
|
39
|
+
}
|
|
40
|
+
if (!config.bucket) {
|
|
41
|
+
errors.push('S3_BUCKET is required');
|
|
42
|
+
}
|
|
43
|
+
if (!config.databasePath) {
|
|
44
|
+
errors.push('Database path is required');
|
|
45
|
+
}
|
|
46
|
+
return { valid: errors.length === 0, errors };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=s3BackupConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3BackupConfig.js","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3BackupConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkDH,mCAAmC;AACnC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;IAC1C,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,WAAW;CACX,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB;IAChD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;QAC1F,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;QAChF,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QAC5F,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;QAC7D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAC7D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM;QAC1E,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,UAAU;QACrF,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS;QACpF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM;QACvD,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Operations
|
|
3
|
+
* Core backup, restore, list, and cleanup operations
|
|
4
|
+
*/
|
|
5
|
+
import type { S3Client } from 'bun';
|
|
6
|
+
import type { S3BackupConfig, BackupResult, BackupItem } from './s3BackupConfig';
|
|
7
|
+
/**
|
|
8
|
+
* Perform a backup to S3
|
|
9
|
+
*/
|
|
10
|
+
export declare function performBackup(config: S3BackupConfig, client: S3Client): Promise<BackupResult>;
|
|
11
|
+
/**
|
|
12
|
+
* List available backups
|
|
13
|
+
*/
|
|
14
|
+
export declare function listBackups(config: S3BackupConfig, client: S3Client): Promise<BackupItem[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Restore from a backup
|
|
17
|
+
*/
|
|
18
|
+
export declare function restoreBackup(key: string, config: S3BackupConfig, client: S3Client): Promise<BackupResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Clean up old backups based on retention policy
|
|
21
|
+
*/
|
|
22
|
+
export declare function cleanupOldBackups(config: S3BackupConfig, client: S3Client): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=s3BackupOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3BackupOperations.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3BackupOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAkB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjG;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgCjG;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,YAAY,CAAC,CAgDvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/F"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Operations
|
|
3
|
+
* Core backup, restore, list, and cleanup operations
|
|
4
|
+
*/
|
|
5
|
+
import { backupLog } from '../../shared/logger';
|
|
6
|
+
import { VERSION } from '../../shared/version';
|
|
7
|
+
/**
|
|
8
|
+
* Perform a backup to S3
|
|
9
|
+
*/
|
|
10
|
+
export async function performBackup(config, client) {
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
try {
|
|
13
|
+
// Check if database file exists
|
|
14
|
+
const dbFile = Bun.file(config.databasePath);
|
|
15
|
+
const exists = await dbFile.exists();
|
|
16
|
+
if (!exists) {
|
|
17
|
+
throw new Error(`Database file not found: ${config.databasePath}`);
|
|
18
|
+
}
|
|
19
|
+
// Generate backup key with timestamp
|
|
20
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
21
|
+
const key = `${config.prefix}bunqueue-${timestamp}.db`;
|
|
22
|
+
// Read database file
|
|
23
|
+
const data = await dbFile.arrayBuffer();
|
|
24
|
+
const size = data.byteLength;
|
|
25
|
+
// Calculate checksum
|
|
26
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
27
|
+
hasher.update(new Uint8Array(data));
|
|
28
|
+
const checksum = hasher.digest('hex');
|
|
29
|
+
// Upload to S3
|
|
30
|
+
const s3File = client.file(key);
|
|
31
|
+
await s3File.write(new Uint8Array(data), {
|
|
32
|
+
type: 'application/x-sqlite3',
|
|
33
|
+
});
|
|
34
|
+
// Upload metadata
|
|
35
|
+
const metadata = {
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
version: VERSION,
|
|
38
|
+
size,
|
|
39
|
+
checksum,
|
|
40
|
+
};
|
|
41
|
+
const metadataKey = `${key}.meta.json`;
|
|
42
|
+
await client.file(metadataKey).write(JSON.stringify(metadata, null, 2), {
|
|
43
|
+
type: 'application/json',
|
|
44
|
+
});
|
|
45
|
+
const duration = Date.now() - startTime;
|
|
46
|
+
backupLog.info('Backup completed', {
|
|
47
|
+
key,
|
|
48
|
+
size: `${(size / 1024 / 1024).toFixed(2)} MB`,
|
|
49
|
+
duration: `${duration}ms`,
|
|
50
|
+
checksum: checksum.substring(0, 16) + '...',
|
|
51
|
+
});
|
|
52
|
+
return { success: true, key, size, duration };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
+
backupLog.error('Backup failed', { error: message });
|
|
57
|
+
return { success: false, error: message };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* List available backups
|
|
62
|
+
*/
|
|
63
|
+
export async function listBackups(config, client) {
|
|
64
|
+
try {
|
|
65
|
+
const result = await client.list({
|
|
66
|
+
prefix: config.prefix,
|
|
67
|
+
maxKeys: 100,
|
|
68
|
+
});
|
|
69
|
+
if (!result.contents) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
return result.contents
|
|
73
|
+
.filter((item) => typeof item.key === 'string' &&
|
|
74
|
+
item.key.endsWith('.db') &&
|
|
75
|
+
!item.key.endsWith('.meta.json'))
|
|
76
|
+
.map((item) => {
|
|
77
|
+
const lastMod = item.lastModified;
|
|
78
|
+
const lastModDate = lastMod ? new Date(lastMod) : new Date();
|
|
79
|
+
return {
|
|
80
|
+
key: item.key,
|
|
81
|
+
size: item.size ?? 0,
|
|
82
|
+
lastModified: lastModDate,
|
|
83
|
+
};
|
|
84
|
+
})
|
|
85
|
+
.sort((a, b) => b.lastModified.getTime() - a.lastModified.getTime());
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
backupLog.error('Failed to list backups', { error: String(error) });
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Restore from a backup
|
|
94
|
+
*/
|
|
95
|
+
export async function restoreBackup(key, config, client) {
|
|
96
|
+
const startTime = Date.now();
|
|
97
|
+
try {
|
|
98
|
+
// Verify backup exists
|
|
99
|
+
const s3File = client.file(key);
|
|
100
|
+
const exists = await s3File.exists();
|
|
101
|
+
if (!exists) {
|
|
102
|
+
throw new Error(`Backup not found: ${key}`);
|
|
103
|
+
}
|
|
104
|
+
// Download backup
|
|
105
|
+
const data = await s3File.arrayBuffer();
|
|
106
|
+
// Verify checksum if metadata exists
|
|
107
|
+
const metadataKey = `${key}.meta.json`;
|
|
108
|
+
const metadataFile = client.file(metadataKey);
|
|
109
|
+
const metadataExists = await metadataFile.exists();
|
|
110
|
+
if (metadataExists) {
|
|
111
|
+
const metadataRaw = (await metadataFile.json());
|
|
112
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
113
|
+
hasher.update(new Uint8Array(data));
|
|
114
|
+
const checksum = hasher.digest('hex');
|
|
115
|
+
if (checksum !== metadataRaw.checksum) {
|
|
116
|
+
throw new Error('Backup checksum mismatch - file may be corrupted');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Write to database path
|
|
120
|
+
await Bun.write(config.databasePath, new Uint8Array(data));
|
|
121
|
+
const duration = Date.now() - startTime;
|
|
122
|
+
backupLog.info('Restore completed', {
|
|
123
|
+
key,
|
|
124
|
+
size: `${(data.byteLength / 1024 / 1024).toFixed(2)} MB`,
|
|
125
|
+
duration: `${duration}ms`,
|
|
126
|
+
});
|
|
127
|
+
return { success: true, key, size: data.byteLength, duration };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
backupLog.error('Restore failed', { error: message });
|
|
132
|
+
return { success: false, error: message };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clean up old backups based on retention policy
|
|
137
|
+
*/
|
|
138
|
+
export async function cleanupOldBackups(config, client) {
|
|
139
|
+
try {
|
|
140
|
+
const backups = await listBackups(config, client);
|
|
141
|
+
if (backups.length <= config.retention) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Sort by date (newest first) and get backups to delete
|
|
145
|
+
const toDelete = backups.slice(config.retention);
|
|
146
|
+
for (const backup of toDelete) {
|
|
147
|
+
try {
|
|
148
|
+
// Delete backup file
|
|
149
|
+
await client.delete(backup.key);
|
|
150
|
+
// Delete metadata file if exists
|
|
151
|
+
const metadataKey = `${backup.key}.meta.json`;
|
|
152
|
+
const metadataFile = client.file(metadataKey);
|
|
153
|
+
if (await metadataFile.exists()) {
|
|
154
|
+
await client.delete(metadataKey);
|
|
155
|
+
}
|
|
156
|
+
backupLog.info('Deleted old backup', { key: backup.key });
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
backupLog.warn('Failed to delete old backup', {
|
|
160
|
+
key: backup.key,
|
|
161
|
+
error: String(err),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
backupLog.warn('Failed to cleanup old backups', { error: String(error) });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=s3BackupOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3BackupOperations.js","sourceRoot":"","sources":["../../../src/infrastructure/backup/s3BackupOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Persistence layer using Bun's native SQLite
|
|
4
4
|
* Uses MessagePack for ~2-3x faster serialization than JSON
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import type { Job, JobId } from '../../domain/types/job';
|
|
7
7
|
import type { CronJob } from '../../domain/types/cron';
|
|
8
8
|
import type { DlqEntry } from '../../domain/types/dlq';
|
|
9
9
|
/** SQLite configuration */
|
|
@@ -23,12 +23,10 @@ export interface SqliteConfig {
|
|
|
23
23
|
export declare class SqliteStorage {
|
|
24
24
|
private readonly db;
|
|
25
25
|
private readonly statements;
|
|
26
|
-
private
|
|
27
|
-
private readonly
|
|
28
|
-
private writeBufferTimer;
|
|
29
|
-
private readonly batchInsertCache;
|
|
26
|
+
private readonly batchManager;
|
|
27
|
+
private readonly writeBuffer;
|
|
30
28
|
constructor(config: SqliteConfig);
|
|
31
|
-
/** Flush write buffer to disk. Returns number of jobs flushed
|
|
29
|
+
/** Flush write buffer to disk. Returns number of jobs flushed. */
|
|
32
30
|
flushWriteBuffer(): number;
|
|
33
31
|
private migrate;
|
|
34
32
|
/**
|
|
@@ -57,18 +55,13 @@ export declare class SqliteStorage {
|
|
|
57
55
|
getResult(jobId: JobId): unknown;
|
|
58
56
|
/** Insert batch of jobs (adds to buffer) */
|
|
59
57
|
insertJobsBatch(jobs: Job[]): void;
|
|
60
|
-
/** Internal: Insert batch directly using multi-row INSERT for 50-100x speedup */
|
|
61
|
-
private insertJobsBatchInternal;
|
|
62
|
-
/** Get or create cached prepared statement for batch insert */
|
|
63
|
-
private getBatchInsertStmt;
|
|
64
|
-
/** Insert a chunk of jobs with single multi-row INSERT */
|
|
65
|
-
private insertJobsChunk;
|
|
66
58
|
loadPendingJobs(): Job[];
|
|
67
59
|
loadActiveJobs(): Job[];
|
|
68
60
|
saveCron(cron: CronJob): void;
|
|
69
61
|
loadCronJobs(): CronJob[];
|
|
70
62
|
deleteCron(name: string): void;
|
|
71
|
-
|
|
63
|
+
/** Update cron job execution state (executions count and next run time) */
|
|
64
|
+
updateCron(name: string, executions: number, nextRun: number): void;
|
|
72
65
|
close(): void;
|
|
73
66
|
getSize(): number;
|
|
74
67
|
}
|