dbdock 1.1.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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +596 -0
  3. package/dist/alerts/alert-templates.d.ts +3 -0
  4. package/dist/alerts/alert-templates.js +95 -0
  5. package/dist/alerts/alert-templates.js.map +1 -0
  6. package/dist/alerts/alert.module.d.ts +2 -0
  7. package/dist/alerts/alert.module.js +23 -0
  8. package/dist/alerts/alert.module.js.map +1 -0
  9. package/dist/alerts/alert.service.d.ts +23 -0
  10. package/dist/alerts/alert.service.js +210 -0
  11. package/dist/alerts/alert.service.js.map +1 -0
  12. package/dist/alerts/alert.types.d.ts +24 -0
  13. package/dist/alerts/alert.types.js +11 -0
  14. package/dist/alerts/alert.types.js.map +1 -0
  15. package/dist/app.module.d.ts +2 -0
  16. package/dist/app.module.js +34 -0
  17. package/dist/app.module.js.map +1 -0
  18. package/dist/backup/backup.module.d.ts +2 -0
  19. package/dist/backup/backup.module.js +26 -0
  20. package/dist/backup/backup.module.js.map +1 -0
  21. package/dist/backup/backup.service.d.ts +23 -0
  22. package/dist/backup/backup.service.js +303 -0
  23. package/dist/backup/backup.service.js.map +1 -0
  24. package/dist/backup/backup.types.d.ts +42 -0
  25. package/dist/backup/backup.types.js +16 -0
  26. package/dist/backup/backup.types.js.map +1 -0
  27. package/dist/backup/compression.service.d.ts +6 -0
  28. package/dist/backup/compression.service.js +30 -0
  29. package/dist/backup/compression.service.js.map +1 -0
  30. package/dist/cli/commands/backup.d.ts +8 -0
  31. package/dist/cli/commands/backup.js +198 -0
  32. package/dist/cli/commands/backup.js.map +1 -0
  33. package/dist/cli/commands/cleanup.d.ts +6 -0
  34. package/dist/cli/commands/cleanup.js +160 -0
  35. package/dist/cli/commands/cleanup.js.map +1 -0
  36. package/dist/cli/commands/delete.d.ts +6 -0
  37. package/dist/cli/commands/delete.js +252 -0
  38. package/dist/cli/commands/delete.js.map +1 -0
  39. package/dist/cli/commands/init.d.ts +1 -0
  40. package/dist/cli/commands/init.js +534 -0
  41. package/dist/cli/commands/init.js.map +1 -0
  42. package/dist/cli/commands/list.d.ts +8 -0
  43. package/dist/cli/commands/list.js +288 -0
  44. package/dist/cli/commands/list.js.map +1 -0
  45. package/dist/cli/commands/restore.d.ts +1 -0
  46. package/dist/cli/commands/restore.js +637 -0
  47. package/dist/cli/commands/restore.js.map +1 -0
  48. package/dist/cli/commands/schedule.d.ts +1 -0
  49. package/dist/cli/commands/schedule.js +197 -0
  50. package/dist/cli/commands/schedule.js.map +1 -0
  51. package/dist/cli/commands/start.d.ts +7 -0
  52. package/dist/cli/commands/start.js +267 -0
  53. package/dist/cli/commands/start.js.map +1 -0
  54. package/dist/cli/commands/status.d.ts +1 -0
  55. package/dist/cli/commands/status.js +46 -0
  56. package/dist/cli/commands/status.js.map +1 -0
  57. package/dist/cli/commands/test.d.ts +1 -0
  58. package/dist/cli/commands/test.js +212 -0
  59. package/dist/cli/commands/test.js.map +1 -0
  60. package/dist/cli/index.d.ts +2 -0
  61. package/dist/cli/index.js +78 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/utils/config.d.ts +80 -0
  64. package/dist/cli/utils/config.js +29 -0
  65. package/dist/cli/utils/config.js.map +1 -0
  66. package/dist/cli/utils/logger.d.ts +7 -0
  67. package/dist/cli/utils/logger.js +15 -0
  68. package/dist/cli/utils/logger.js.map +1 -0
  69. package/dist/cli/utils/progress.d.ts +21 -0
  70. package/dist/cli/utils/progress.js +130 -0
  71. package/dist/cli/utils/progress.js.map +1 -0
  72. package/dist/cli/utils/retention.d.ts +26 -0
  73. package/dist/cli/utils/retention.js +118 -0
  74. package/dist/cli/utils/retention.js.map +1 -0
  75. package/dist/config/config.module.d.ts +2 -0
  76. package/dist/config/config.module.js +29 -0
  77. package/dist/config/config.module.js.map +1 -0
  78. package/dist/config/config.schema.d.ts +56 -0
  79. package/dist/config/config.schema.js +219 -0
  80. package/dist/config/config.schema.js.map +1 -0
  81. package/dist/config/config.service.d.ts +13 -0
  82. package/dist/config/config.service.js +160 -0
  83. package/dist/config/config.service.js.map +1 -0
  84. package/dist/crypto/crypto.module.d.ts +2 -0
  85. package/dist/crypto/crypto.module.js +21 -0
  86. package/dist/crypto/crypto.module.js.map +1 -0
  87. package/dist/crypto/crypto.service.d.ts +22 -0
  88. package/dist/crypto/crypto.service.js +187 -0
  89. package/dist/crypto/crypto.service.js.map +1 -0
  90. package/dist/dbdock.d.ts +10 -0
  91. package/dist/dbdock.js +36 -0
  92. package/dist/dbdock.js.map +1 -0
  93. package/dist/index.d.ts +33 -0
  94. package/dist/index.js +77 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/main.d.ts +1 -0
  97. package/dist/main.js +10 -0
  98. package/dist/main.js.map +1 -0
  99. package/dist/scheduler/schedule-manager.d.ts +22 -0
  100. package/dist/scheduler/schedule-manager.js +126 -0
  101. package/dist/scheduler/schedule-manager.js.map +1 -0
  102. package/dist/scheduler/scheduler.module.d.ts +2 -0
  103. package/dist/scheduler/scheduler.module.js +25 -0
  104. package/dist/scheduler/scheduler.module.js.map +1 -0
  105. package/dist/scheduler/scheduler.service.d.ts +28 -0
  106. package/dist/scheduler/scheduler.service.js +171 -0
  107. package/dist/scheduler/scheduler.service.js.map +1 -0
  108. package/dist/standalone/backup-standalone.d.ts +14 -0
  109. package/dist/standalone/backup-standalone.js +364 -0
  110. package/dist/standalone/backup-standalone.js.map +1 -0
  111. package/dist/storage/adapters/cloudinary.adapter.d.ts +23 -0
  112. package/dist/storage/adapters/cloudinary.adapter.js +215 -0
  113. package/dist/storage/adapters/cloudinary.adapter.js.map +1 -0
  114. package/dist/storage/adapters/local.adapter.d.ts +20 -0
  115. package/dist/storage/adapters/local.adapter.js +214 -0
  116. package/dist/storage/adapters/local.adapter.js.map +1 -0
  117. package/dist/storage/adapters/r2.adapter.d.ts +10 -0
  118. package/dist/storage/adapters/r2.adapter.js +33 -0
  119. package/dist/storage/adapters/r2.adapter.js.map +1 -0
  120. package/dist/storage/adapters/s3.adapter.d.ts +26 -0
  121. package/dist/storage/adapters/s3.adapter.js +199 -0
  122. package/dist/storage/adapters/s3.adapter.js.map +1 -0
  123. package/dist/storage/storage.interface.d.ts +38 -0
  124. package/dist/storage/storage.interface.js +3 -0
  125. package/dist/storage/storage.interface.js.map +1 -0
  126. package/dist/storage/storage.module.d.ts +2 -0
  127. package/dist/storage/storage.module.js +21 -0
  128. package/dist/storage/storage.module.js.map +1 -0
  129. package/dist/storage/storage.service.d.ts +10 -0
  130. package/dist/storage/storage.service.js +89 -0
  131. package/dist/storage/storage.service.js.map +1 -0
  132. package/dist/utils/logger.d.ts +12 -0
  133. package/dist/utils/logger.js +41 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/dist/utils/stream.pipe.d.ts +17 -0
  136. package/dist/utils/stream.pipe.js +54 -0
  137. package/dist/utils/stream.pipe.js.map +1 -0
  138. package/dist/wal/postgres-config.helper.d.ts +5 -0
  139. package/dist/wal/postgres-config.helper.js +117 -0
  140. package/dist/wal/postgres-config.helper.js.map +1 -0
  141. package/dist/wal/retention.service.d.ts +23 -0
  142. package/dist/wal/retention.service.js +158 -0
  143. package/dist/wal/retention.service.js.map +1 -0
  144. package/dist/wal/retention.types.d.ts +20 -0
  145. package/dist/wal/retention.types.js +3 -0
  146. package/dist/wal/retention.types.js.map +1 -0
  147. package/dist/wal/wal-archiver.service.d.ts +28 -0
  148. package/dist/wal/wal-archiver.service.js +263 -0
  149. package/dist/wal/wal-archiver.service.js.map +1 -0
  150. package/dist/wal/wal.module.d.ts +2 -0
  151. package/dist/wal/wal.module.js +26 -0
  152. package/dist/wal/wal.module.js.map +1 -0
  153. package/dist/wal/wal.types.d.ts +27 -0
  154. package/dist/wal/wal.types.js +11 -0
  155. package/dist/wal/wal.types.js.map +1 -0
  156. package/package.json +155 -0
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SchedulerService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SchedulerService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const schedule_1 = require("@nestjs/schedule");
16
+ const config_service_1 = require("../config/config.service");
17
+ const backup_service_1 = require("../backup/backup.service");
18
+ const retention_service_1 = require("../wal/retention.service");
19
+ const fs_1 = require("fs");
20
+ const path_1 = require("path");
21
+ let SchedulerService = SchedulerService_1 = class SchedulerService {
22
+ configService;
23
+ backupService;
24
+ retentionService;
25
+ schedulerRegistry;
26
+ logger = new common_1.Logger(SchedulerService_1.name);
27
+ scheduledBackupsEnabled = false;
28
+ retentionCleanupEnabled = true;
29
+ registeredJobs = new Map();
30
+ constructor(configService, backupService, retentionService, schedulerRegistry) {
31
+ this.configService = configService;
32
+ this.backupService = backupService;
33
+ this.retentionService = retentionService;
34
+ this.schedulerRegistry = schedulerRegistry;
35
+ }
36
+ onModuleInit() {
37
+ this.loadAndRegisterSchedules();
38
+ if (this.retentionCleanupEnabled) {
39
+ this.logger.log('Retention cleanup scheduler enabled');
40
+ }
41
+ }
42
+ loadAndRegisterSchedules() {
43
+ try {
44
+ const configPath = (0, path_1.join)(process.cwd(), 'dbdock.config.json');
45
+ const configFile = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf-8'));
46
+ const schedules = configFile.backup?.schedules || [];
47
+ if (schedules.length === 0) {
48
+ this.logger.log('No backup schedules configured');
49
+ return;
50
+ }
51
+ const enabledSchedules = schedules.filter((s) => s.enabled !== false);
52
+ if (enabledSchedules.length === 0) {
53
+ this.logger.log('All backup schedules are disabled');
54
+ return;
55
+ }
56
+ enabledSchedules.forEach((schedule) => {
57
+ this.registerSchedule(schedule);
58
+ });
59
+ this.logger.log(`Registered ${enabledSchedules.length} backup schedule(s)`);
60
+ }
61
+ catch (error) {
62
+ this.logger.error(`Failed to load schedules: ${error instanceof Error ? error.message : String(error)}`);
63
+ }
64
+ }
65
+ registerSchedule(schedule) {
66
+ try {
67
+ const { CronJob } = require('cron');
68
+ const job = new CronJob(schedule.cron, async () => {
69
+ await this.executeScheduledBackup(schedule.name);
70
+ });
71
+ this.schedulerRegistry.addCronJob(schedule.name, job);
72
+ job.start();
73
+ this.registeredJobs.set(schedule.name, job);
74
+ this.logger.log(`Registered schedule: ${schedule.name} (${schedule.cron})`);
75
+ }
76
+ catch (error) {
77
+ this.logger.error(`Failed to register schedule "${schedule.name}": ${error instanceof Error ? error.message : String(error)}`);
78
+ }
79
+ }
80
+ async executeScheduledBackup(scheduleName) {
81
+ this.logger.log(`Executing scheduled backup: ${scheduleName}`);
82
+ try {
83
+ const result = await this.backupService.createBackup({
84
+ compress: true,
85
+ encrypt: true,
86
+ });
87
+ this.logger.log(`Scheduled backup "${scheduleName}" completed: ${result.metadata.id} (${result.metadata.size} bytes)`);
88
+ }
89
+ catch (error) {
90
+ this.logger.error(`Scheduled backup "${scheduleName}" failed: ${error instanceof Error ? error.message : String(error)}`);
91
+ }
92
+ }
93
+ reloadSchedules() {
94
+ this.registeredJobs.forEach((job, name) => {
95
+ job.stop();
96
+ this.schedulerRegistry.deleteCronJob(name);
97
+ });
98
+ this.registeredJobs.clear();
99
+ this.loadAndRegisterSchedules();
100
+ }
101
+ async handleDailyRetentionCleanup() {
102
+ if (!this.retentionCleanupEnabled) {
103
+ return;
104
+ }
105
+ this.logger.log('Running scheduled retention cleanup');
106
+ try {
107
+ const result = await this.retentionService.applyRetentionPolicy();
108
+ this.logger.log(`Retention cleanup completed: ${result.backupsDeleted} backups, ${result.walFilesDeleted} WAL files deleted`);
109
+ if (result.errors.length > 0) {
110
+ this.logger.warn(`Retention cleanup had ${result.errors.length} errors`);
111
+ result.errors.forEach((error) => this.logger.error(error));
112
+ }
113
+ }
114
+ catch (error) {
115
+ this.logger.error(`Retention cleanup failed: ${error.message}`);
116
+ }
117
+ }
118
+ async triggerScheduledBackup() {
119
+ const scheduleConfig = this.configService.get('schedule');
120
+ if (!scheduleConfig) {
121
+ throw new Error('Scheduled backups are not configured');
122
+ }
123
+ this.logger.log('Running scheduled backup');
124
+ try {
125
+ const result = await this.backupService.createBackup({
126
+ compress: true,
127
+ encrypt: true,
128
+ });
129
+ this.logger.log(`Scheduled backup completed: ${result.metadata.id} (${result.metadata.size} bytes)`);
130
+ }
131
+ catch (error) {
132
+ this.logger.error(`Scheduled backup failed: ${error.message}`);
133
+ throw error;
134
+ }
135
+ }
136
+ async manualRetentionCleanup() {
137
+ this.logger.log('Running manual retention cleanup');
138
+ await this.handleDailyRetentionCleanup();
139
+ }
140
+ enableScheduledBackups() {
141
+ this.scheduledBackupsEnabled = true;
142
+ this.logger.log('Scheduled backups enabled');
143
+ }
144
+ disableScheduledBackups() {
145
+ this.scheduledBackupsEnabled = false;
146
+ this.logger.log('Scheduled backups disabled');
147
+ }
148
+ enableRetentionCleanup() {
149
+ this.retentionCleanupEnabled = true;
150
+ this.logger.log('Retention cleanup enabled');
151
+ }
152
+ disableRetentionCleanup() {
153
+ this.retentionCleanupEnabled = false;
154
+ this.logger.log('Retention cleanup disabled');
155
+ }
156
+ };
157
+ exports.SchedulerService = SchedulerService;
158
+ __decorate([
159
+ (0, schedule_1.Cron)(schedule_1.CronExpression.EVERY_DAY_AT_3AM),
160
+ __metadata("design:type", Function),
161
+ __metadata("design:paramtypes", []),
162
+ __metadata("design:returntype", Promise)
163
+ ], SchedulerService.prototype, "handleDailyRetentionCleanup", null);
164
+ exports.SchedulerService = SchedulerService = SchedulerService_1 = __decorate([
165
+ (0, common_1.Injectable)(),
166
+ __metadata("design:paramtypes", [config_service_1.DBDockConfigService,
167
+ backup_service_1.BackupService,
168
+ retention_service_1.RetentionService,
169
+ schedule_1.SchedulerRegistry])
170
+ ], SchedulerService);
171
+ //# sourceMappingURL=scheduler.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CLIConfig } from '../cli/utils/config';
2
+ interface BackupResult {
3
+ backupId: string;
4
+ storageKey: string;
5
+ size: number;
6
+ duration: number;
7
+ downloadUrl?: string;
8
+ }
9
+ export interface BackupProgressCallback {
10
+ onProgress?: (bytesProcessed: number) => void;
11
+ onStage?: (stage: string) => void;
12
+ }
13
+ export declare function createBackupStandalone(config: CLIConfig, callbacks?: BackupProgressCallback): Promise<BackupResult>;
14
+ export {};
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBackupStandalone = createBackupStandalone;
4
+ const child_process_1 = require("child_process");
5
+ const stream_1 = require("stream");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const crypto_1 = require("crypto");
9
+ const zlib_1 = require("zlib");
10
+ const client_s3_1 = require("@aws-sdk/client-s3");
11
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
12
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
13
+ const cloudinary_1 = require("cloudinary");
14
+ async function createBackupStandalone(config, callbacks) {
15
+ const startTime = Date.now();
16
+ const backupId = (0, crypto_1.randomBytes)(16).toString('hex');
17
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
18
+ const format = config.backup?.format || 'custom';
19
+ const extensionMap = {
20
+ custom: 'sql',
21
+ plain: 'sql',
22
+ directory: 'dir',
23
+ tar: 'tar',
24
+ };
25
+ const extension = extensionMap[format] || 'sql';
26
+ const filename = `backup-${timestamp}-${backupId}.${extension}`;
27
+ let storageKey = config.storage.provider === 'local'
28
+ ? (0, path_1.join)(config.storage.local?.path || './backups', filename)
29
+ : `dbdock_backups/${filename}`;
30
+ if (config.storage.provider === 'local') {
31
+ const dir = (0, path_1.dirname)(storageKey);
32
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
33
+ }
34
+ const dbConfig = config.database;
35
+ const formatMap = {
36
+ custom: 'c',
37
+ plain: 'p',
38
+ directory: 'd',
39
+ tar: 't',
40
+ };
41
+ const pgDumpArgs = [
42
+ '-h',
43
+ dbConfig.host || 'localhost',
44
+ '-p',
45
+ String(dbConfig.port || 5432),
46
+ '-U',
47
+ dbConfig.username || 'postgres',
48
+ '-d',
49
+ dbConfig.database || 'postgres',
50
+ '-F',
51
+ formatMap[format] || 'c',
52
+ '--no-password',
53
+ ];
54
+ const env = {
55
+ ...process.env,
56
+ PGPASSWORD: dbConfig.password,
57
+ };
58
+ if (callbacks?.onStage) {
59
+ callbacks.onStage('Dumping database');
60
+ }
61
+ const pgDumpProcess = (0, child_process_1.spawn)('pg_dump', pgDumpArgs, { env });
62
+ let stream = pgDumpProcess.stdout;
63
+ const streams = [stream];
64
+ const pgDumpErrorMessages = [];
65
+ let pgDumpExitCode = null;
66
+ pgDumpProcess.stderr.on('data', (data) => {
67
+ const message = data.toString().trim();
68
+ if (!message.includes('NOTICE') && message) {
69
+ pgDumpErrorMessages.push(message);
70
+ }
71
+ });
72
+ pgDumpProcess.on('close', (code) => {
73
+ pgDumpExitCode = code;
74
+ });
75
+ if (config.backup?.compression?.enabled) {
76
+ if (callbacks?.onStage) {
77
+ callbacks.onStage('Compressing backup');
78
+ }
79
+ const compressStream = (0, zlib_1.createBrotliCompress)({
80
+ params: {
81
+ [0]: config.backup.compression.level || 6,
82
+ },
83
+ });
84
+ stream = stream.pipe(compressStream);
85
+ streams.push(compressStream);
86
+ }
87
+ if (config.backup?.encryption?.enabled && config.backup.encryption.key) {
88
+ if (callbacks?.onStage) {
89
+ callbacks.onStage('Encrypting backup');
90
+ }
91
+ const keyBuffer = Buffer.from(config.backup.encryption.key, 'hex');
92
+ if (keyBuffer.length !== 32) {
93
+ throw new Error(`Invalid encryption key length: ${keyBuffer.length} bytes (expected 32 bytes)\n\n` +
94
+ `Your key: "${config.backup.encryption.key}" (${config.backup.encryption.key.length} characters)\n\n` +
95
+ `Please fix:\n` +
96
+ ` • Encryption key must be exactly 64 hexadecimal characters (32 bytes)\n` +
97
+ ` • Generate a valid key: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"\n` +
98
+ ` • Update the "backup.encryption.key" in your dbdock.config.json`);
99
+ }
100
+ const iv = Buffer.alloc(16);
101
+ const cipher = (0, crypto_1.createCipheriv)('aes-256-cbc', keyBuffer, iv);
102
+ stream = stream.pipe(cipher);
103
+ streams.push(cipher);
104
+ }
105
+ let totalSize = 0;
106
+ stream.on('data', (chunk) => {
107
+ totalSize += chunk.length;
108
+ if (callbacks?.onProgress) {
109
+ callbacks.onProgress(totalSize);
110
+ }
111
+ });
112
+ if (config.storage.provider === 'local') {
113
+ if (callbacks?.onStage) {
114
+ callbacks.onStage('Writing to local storage');
115
+ }
116
+ const writeStream = (0, fs_1.createWriteStream)(storageKey);
117
+ stream.pipe(writeStream);
118
+ await new Promise((resolve, reject) => {
119
+ writeStream.on('finish', () => {
120
+ if (pgDumpExitCode !== null && pgDumpExitCode !== 0) {
121
+ reject(new Error(formatPgDumpError(pgDumpExitCode, pgDumpErrorMessages, dbConfig)));
122
+ }
123
+ else if (pgDumpErrorMessages.length > 0 && totalSize === 0) {
124
+ reject(new Error(formatPgDumpError(1, pgDumpErrorMessages, dbConfig)));
125
+ }
126
+ else {
127
+ resolve();
128
+ }
129
+ });
130
+ writeStream.on('error', reject);
131
+ pgDumpProcess.on('error', (err) => {
132
+ reject(new Error(`Failed to execute pg_dump: ${err.message}\n\nPlease ensure PostgreSQL client tools are installed:\n macOS: brew install postgresql\n Ubuntu/Debian: sudo apt-get install postgresql-client`));
133
+ });
134
+ });
135
+ }
136
+ else if (config.storage.provider === 's3' ||
137
+ config.storage.provider === 'r2') {
138
+ if (callbacks?.onStage) {
139
+ callbacks.onStage(`Uploading to ${config.storage.provider.toUpperCase()}`);
140
+ }
141
+ const s3Config = config.storage.s3;
142
+ if (!s3Config) {
143
+ throw new Error('S3/R2 configuration is required');
144
+ }
145
+ const s3Client = new client_s3_1.S3Client({
146
+ region: s3Config.region || 'us-east-1',
147
+ credentials: {
148
+ accessKeyId: s3Config.accessKeyId,
149
+ secretAccessKey: s3Config.secretAccessKey,
150
+ },
151
+ ...(s3Config.endpoint && { endpoint: s3Config.endpoint }),
152
+ });
153
+ const passThrough = new stream_1.PassThrough();
154
+ stream.pipe(passThrough);
155
+ const upload = new lib_storage_1.Upload({
156
+ client: s3Client,
157
+ params: {
158
+ Bucket: s3Config.bucket,
159
+ Key: storageKey,
160
+ Body: passThrough,
161
+ },
162
+ });
163
+ await new Promise((resolve, reject) => {
164
+ let uploadCompleted = false;
165
+ upload
166
+ .done()
167
+ .then(() => {
168
+ uploadCompleted = true;
169
+ if (pgDumpExitCode !== null && pgDumpExitCode !== 0) {
170
+ reject(new Error(formatPgDumpError(pgDumpExitCode, pgDumpErrorMessages, dbConfig)));
171
+ }
172
+ else if (pgDumpErrorMessages.length > 0 && totalSize === 0) {
173
+ reject(new Error(formatPgDumpError(1, pgDumpErrorMessages, dbConfig)));
174
+ }
175
+ else {
176
+ resolve();
177
+ }
178
+ })
179
+ .catch(reject);
180
+ pgDumpProcess.on('error', (err) => {
181
+ reject(new Error(`Failed to execute pg_dump: ${err.message}\n\nPlease ensure PostgreSQL client tools are installed:\n macOS: brew install postgresql\n Ubuntu/Debian: sudo apt-get install postgresql-client`));
182
+ });
183
+ pgDumpProcess.on('close', (code) => {
184
+ if (code !== null && code !== 0 && !uploadCompleted) {
185
+ setTimeout(() => {
186
+ if (!uploadCompleted) {
187
+ reject(new Error(formatPgDumpError(code, pgDumpErrorMessages, dbConfig)));
188
+ }
189
+ }, 1000);
190
+ }
191
+ });
192
+ });
193
+ }
194
+ else if (config.storage.provider === 'cloudinary') {
195
+ if (callbacks?.onStage) {
196
+ callbacks.onStage('Uploading to Cloudinary');
197
+ }
198
+ const cloudinaryConfig = config.storage.cloudinary;
199
+ if (!cloudinaryConfig) {
200
+ throw new Error('Cloudinary configuration is required');
201
+ }
202
+ cloudinary_1.v2.config({
203
+ cloud_name: cloudinaryConfig.cloudName,
204
+ api_key: cloudinaryConfig.apiKey,
205
+ api_secret: cloudinaryConfig.apiSecret,
206
+ });
207
+ await new Promise((resolve, reject) => {
208
+ let uploadCompleted = false;
209
+ const uploadStream = cloudinary_1.v2.uploader.upload_stream({
210
+ resource_type: 'raw',
211
+ folder: 'dbdock_backups',
212
+ public_id: `backup-${timestamp}-${backupId}`,
213
+ }, (error, result) => {
214
+ uploadCompleted = true;
215
+ if (error) {
216
+ reject(new Error(error.message));
217
+ }
218
+ else if (pgDumpExitCode !== null && pgDumpExitCode !== 0) {
219
+ reject(new Error(formatPgDumpError(pgDumpExitCode, pgDumpErrorMessages, dbConfig)));
220
+ }
221
+ else if (pgDumpErrorMessages.length > 0 && totalSize === 0) {
222
+ reject(new Error(formatPgDumpError(1, pgDumpErrorMessages, dbConfig)));
223
+ }
224
+ else {
225
+ if (result?.public_id) {
226
+ storageKey = result.public_id;
227
+ }
228
+ resolve();
229
+ }
230
+ });
231
+ stream.pipe(uploadStream);
232
+ pgDumpProcess.on('error', (err) => {
233
+ reject(new Error(`Failed to execute pg_dump: ${err.message}\n\nPlease ensure PostgreSQL client tools are installed:\n macOS: brew install postgresql\n Ubuntu/Debian: sudo apt-get install postgresql-client`));
234
+ });
235
+ pgDumpProcess.on('close', (code) => {
236
+ if (code !== null && code !== 0 && !uploadCompleted) {
237
+ setTimeout(() => {
238
+ if (!uploadCompleted) {
239
+ reject(new Error(formatPgDumpError(code, pgDumpErrorMessages, dbConfig)));
240
+ }
241
+ }, 1000);
242
+ }
243
+ });
244
+ });
245
+ }
246
+ else {
247
+ throw new Error(`Storage provider ${config.storage.provider} not yet implemented in standalone mode`);
248
+ }
249
+ const duration = Date.now() - startTime;
250
+ let downloadUrl;
251
+ if (config.storage.provider === 's3' || config.storage.provider === 'r2') {
252
+ try {
253
+ const s3Config = config.storage.s3;
254
+ if (s3Config) {
255
+ const s3Client = new client_s3_1.S3Client({
256
+ region: s3Config.region || 'us-east-1',
257
+ credentials: {
258
+ accessKeyId: s3Config.accessKeyId,
259
+ secretAccessKey: s3Config.secretAccessKey,
260
+ },
261
+ ...(s3Config.endpoint && { endpoint: s3Config.endpoint }),
262
+ });
263
+ const command = new client_s3_1.GetObjectCommand({
264
+ Bucket: s3Config.bucket,
265
+ Key: storageKey,
266
+ });
267
+ downloadUrl = await (0, s3_request_presigner_1.getSignedUrl)(s3Client, command, {
268
+ expiresIn: 604800,
269
+ });
270
+ }
271
+ }
272
+ catch {
273
+ downloadUrl = undefined;
274
+ }
275
+ }
276
+ else if (config.storage.provider === 'cloudinary') {
277
+ downloadUrl = cloudinary_1.v2.url(storageKey, {
278
+ resource_type: 'raw',
279
+ type: 'upload',
280
+ });
281
+ }
282
+ return {
283
+ backupId,
284
+ storageKey,
285
+ size: totalSize,
286
+ duration,
287
+ downloadUrl,
288
+ };
289
+ }
290
+ function formatPgDumpError(exitCode, errorMessages, dbConfig) {
291
+ const errorMessage = errorMessages.join('\n');
292
+ const host = dbConfig.host || 'localhost';
293
+ const port = dbConfig.port || 5432;
294
+ const username = dbConfig.username || 'postgres';
295
+ const database = dbConfig.database || 'postgres';
296
+ if (errorMessage.includes('database') &&
297
+ errorMessage.includes('does not exist')) {
298
+ const dbMatch = errorMessage.match(/database "([^"]+)" does not exist/);
299
+ const dbName = dbMatch ? dbMatch[1] : database;
300
+ return (`Database "${dbName}" does not exist\n\n` +
301
+ `Connection details:\n` +
302
+ ` Host: ${host}\n` +
303
+ ` Port: ${port}\n` +
304
+ ` Database: ${dbName}\n\n` +
305
+ `Please verify:\n` +
306
+ ` • Database name is correct in dbdock.config.json\n` +
307
+ ` • Database exists on the server\n` +
308
+ ` • You can connect: psql -h ${host} -p ${port} -U ${username} -d ${dbName}`);
309
+ }
310
+ if (errorMessage.includes('could not connect') ||
311
+ errorMessage.includes('Connection refused') ||
312
+ errorMessage.includes('ECONNREFUSED')) {
313
+ return (`Cannot connect to PostgreSQL server\n\n` +
314
+ `Connection details:\n` +
315
+ ` Host: ${host}\n` +
316
+ ` Port: ${port}\n\n` +
317
+ `Please verify:\n` +
318
+ ` • PostgreSQL server is running\n` +
319
+ ` • Host and port are correct in dbdock.config.json\n` +
320
+ ` • Network/firewall allows connection\n` +
321
+ ` • Test connection: psql -h ${host} -p ${port} -U ${username} -d ${database}`);
322
+ }
323
+ if (errorMessage.includes('authentication failed') ||
324
+ errorMessage.includes('password authentication failed')) {
325
+ return (`Authentication failed for user "${username}"\n\n` +
326
+ `Connection details:\n` +
327
+ ` Host: ${host}\n` +
328
+ ` Port: ${port}\n` +
329
+ ` Username: ${username}\n` +
330
+ ` Database: ${database}\n\n` +
331
+ `Please verify:\n` +
332
+ ` • Username is correct in dbdock.config.json\n` +
333
+ ` • Password is correct in dbdock.config.json\n` +
334
+ ` • User exists and has access to the database\n` +
335
+ ` • Test connection: psql -h ${host} -p ${port} -U ${username} -d ${database}`);
336
+ }
337
+ if (errorMessage.includes('permission denied')) {
338
+ return (`Permission denied for user "${username}"\n\n` +
339
+ `The user does not have sufficient privileges to perform backup.\n\n` +
340
+ `Please verify:\n` +
341
+ ` • User has read permissions on the database\n` +
342
+ ` • User has necessary privileges for pg_dump\n` +
343
+ ` • Grant access: GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${username};`);
344
+ }
345
+ if (errorMessage.includes('no password supplied')) {
346
+ return (`No password provided for user "${username}"\n\n` +
347
+ `Please add the database password to dbdock.config.json:\n` +
348
+ ` "database": {\n` +
349
+ ` "password": "your-database-password"\n` +
350
+ ` }`);
351
+ }
352
+ if (errorMessages.length > 0) {
353
+ return (`pg_dump failed with exit code ${exitCode}\n\n` +
354
+ `Error details:\n${errorMessage}\n\n` +
355
+ `Connection settings:\n` +
356
+ ` Host: ${host}\n` +
357
+ ` Port: ${port}\n` +
358
+ ` Username: ${username}\n` +
359
+ ` Database: ${database}\n\n` +
360
+ `Please check your configuration and database connection.`);
361
+ }
362
+ return `pg_dump failed with exit code ${exitCode}. Please check your database configuration.`;
363
+ }
364
+ //# sourceMappingURL=backup-standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-standalone.js","sourceRoot":"","sources":["../../src/standalone/backup-standalone.ts"],"names":[],"mappings":";;AAyBA,wDA2WC;AAnYD,iDAAsC;AACtC,mCAA0D;AAC1D,2BAAkD;AAClD,+BAAqC;AACrC,mCAAqD;AACrD,+BAA4C;AAC5C,kDAAgE;AAChE,wEAA6D;AAC7D,sDAA8C;AAC9C,2CAA8C;AAevC,KAAK,UAAU,sBAAsB,CAC1C,MAAiB,EACjB,SAAkC;IAElC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,QAAQ,CAAC;IACjD,MAAM,YAAY,GAA2B;QAC3C,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;QAChB,GAAG,EAAE,KAAK;KACX,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;IAChD,MAAM,QAAQ,GAAG,UAAU,SAAS,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;IAEhE,IAAI,UAAU,GACZ,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjC,CAAC,CAAC,IAAA,WAAI,EAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,IAAI,WAAW,EAAE,QAAQ,CAAC;QAC3D,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC;IAEnC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,UAAU,CAAC,CAAC;QAChC,IAAA,cAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,MAAM,SAAS,GAA2B;QACxC,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,GAAG;QACV,SAAS,EAAE,GAAG;QACd,GAAG,EAAE,GAAG;KACT,CAAC;IAEF,MAAM,UAAU,GAAG;QACjB,IAAI;QACJ,QAAQ,CAAC,IAAI,IAAI,WAAW;QAC5B,IAAI;QACJ,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;QAC7B,IAAI;QACJ,QAAQ,CAAC,QAAQ,IAAI,UAAU;QAC/B,IAAI;QACJ,QAAQ,CAAC,QAAQ,IAAI,UAAU;QAC/B,IAAI;QACJ,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG;QACxB,eAAe;KAChB,CAAC;IAEF,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,UAAU,EAAE,QAAQ,CAAC,QAAQ;KAC9B,CAAC;IAEF,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,qBAAK,EAAC,SAAS,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAE5D,IAAI,MAAM,GAAyB,aAAa,CAAC,MAAM,CAAC;IACxD,MAAM,OAAO,GAA6B,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,IAAI,cAAc,GAAkB,IAAI,CAAC;IAEzC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACvC,MAAM,OAAO,GAAI,IAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;YAC3C,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QACxC,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,cAAc,GAAG,IAAA,2BAAoB,EAAC;YAC1C,MAAM,EAAE;gBACN,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;aAC1C;SACF,CAAC,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACvE,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEnE,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,kCAAkC,SAAS,CAAC,MAAM,gCAAgC;gBAChF,cAAc,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,kBAAkB;gBACrG,eAAe;gBACf,2EAA2E;gBAC3E,sGAAsG;gBACtG,mEAAmE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QAClC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,SAAS,EAAE,UAAU,EAAE,CAAC;YAC1B,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,sBAAiB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAC5B,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;oBACpD,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,CAAC,cAAc,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CACjE,CACF,CAAC;gBACJ,CAAC;qBAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBAC7D,MAAM,CACJ,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAC/D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,MAAM,CACJ,IAAI,KAAK,CACP,8BAA8B,GAAG,CAAC,OAAO,qJAAqJ,CAC/L,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,IACL,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;QAChC,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,EAChC,CAAC;QACD,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,CACf,gBAAgB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CACxD,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC;YAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,WAAW;YACtC,WAAW,EAAE;gBACX,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;aAC1C;YACD,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;SAC1D,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,oBAAW,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC;YACxB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE;gBACN,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,WAAW;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,eAAe,GAAG,KAAK,CAAC;YAE5B,MAAM;iBACH,IAAI,EAAE;iBACN,IAAI,CAAC,GAAG,EAAE;gBACT,eAAe,GAAG,IAAI,CAAC;gBACvB,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;oBACpD,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,CACf,cAAc,EACd,mBAAmB,EACnB,QAAQ,CACT,CACF,CACF,CAAC;gBACJ,CAAC;qBAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBAC7D,MAAM,CACJ,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAC/D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,MAAM,CAAC,CAAC;YAEjB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,MAAM,CACJ,IAAI,KAAK,CACP,8BAA8B,GAAG,CAAC,OAAO,qJAAqJ,CAC/L,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBACpD,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,eAAe,EAAE,CAAC;4BACrB,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CACvD,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACpD,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,eAAU,CAAC,MAAM,CAAC;YAChB,UAAU,EAAE,gBAAgB,CAAC,SAAS;YACtC,OAAO,EAAE,gBAAgB,CAAC,MAAM;YAChC,UAAU,EAAE,gBAAgB,CAAC,SAAS;SACvC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,eAAe,GAAG,KAAK,CAAC;YAE5B,MAAM,YAAY,GAAG,eAAU,CAAC,QAAQ,CAAC,aAAa,CACpD;gBACE,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,gBAAgB;gBACxB,SAAS,EAAE,UAAU,SAAS,IAAI,QAAQ,EAAE;aAC7C,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChB,eAAe,GAAG,IAAI,CAAC;gBACvB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnC,CAAC;qBAAM,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;oBAC3D,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,CACf,cAAc,EACd,mBAAmB,EACnB,QAAQ,CACT,CACF,CACF,CAAC;gBACJ,CAAC;qBAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBAC7D,MAAM,CACJ,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAC/D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;wBACtB,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;oBAChC,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CACF,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,MAAM,CACJ,IAAI,KAAK,CACP,8BAA8B,GAAG,CAAC,OAAO,qJAAqJ,CAC/L,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBACpD,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,eAAe,EAAE,CAAC;4BACrB,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CACvD,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,oBAAoB,MAAM,CAAC,OAAO,CAAC,QAAQ,yCAAyC,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,IAAI,WAA+B,CAAC;IAEpC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC;oBAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,WAAW;oBACtC,WAAW,EAAE;wBACX,WAAW,EAAE,QAAQ,CAAC,WAAW;wBACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;qBAC1C;oBACD,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;iBAC1D,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,IAAI,4BAAgB,CAAC;oBACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,GAAG,EAAE,UAAU;iBAChB,CAAC,CAAC;gBAEH,WAAW,GAAG,MAAM,IAAA,mCAAY,EAAC,QAAQ,EAAE,OAAO,EAAE;oBAClD,SAAS,EAAE,MAAM;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACpD,WAAW,GAAG,eAAU,CAAC,GAAG,CAAC,UAAU,EAAE;YACvC,aAAa,EAAE,KAAK;YACpB,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,QAAQ;QACR,UAAU;QACV,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,aAAuB,EACvB,QAA+B;IAE/B,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,UAAU,CAAC;IACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,UAAU,CAAC;IAEjD,IACE,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QACjC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACvC,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/C,OAAO,CACL,aAAa,MAAM,sBAAsB;YACzC,uBAAuB;YACvB,WAAW,IAAI,IAAI;YACnB,WAAW,IAAI,IAAI;YACnB,eAAe,MAAM,MAAM;YAC3B,kBAAkB;YAClB,sDAAsD;YACtD,qCAAqC;YACrC,gCAAgC,IAAI,OAAO,IAAI,OAAO,QAAQ,OAAO,MAAM,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,IACE,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1C,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC3C,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EACrC,CAAC;QACD,OAAO,CACL,yCAAyC;YACzC,uBAAuB;YACvB,WAAW,IAAI,IAAI;YACnB,WAAW,IAAI,MAAM;YACrB,kBAAkB;YAClB,oCAAoC;YACpC,uDAAuD;YACvD,0CAA0C;YAC1C,gCAAgC,IAAI,OAAO,IAAI,OAAO,QAAQ,OAAO,QAAQ,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,IACE,YAAY,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC9C,YAAY,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EACvD,CAAC;QACD,OAAO,CACL,mCAAmC,QAAQ,OAAO;YAClD,uBAAuB;YACvB,WAAW,IAAI,IAAI;YACnB,WAAW,IAAI,IAAI;YACnB,eAAe,QAAQ,IAAI;YAC3B,eAAe,QAAQ,MAAM;YAC7B,kBAAkB;YAClB,iDAAiD;YACjD,iDAAiD;YACjD,kDAAkD;YAClD,gCAAgC,IAAI,OAAO,IAAI,OAAO,QAAQ,OAAO,QAAQ,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC/C,OAAO,CACL,+BAA+B,QAAQ,OAAO;YAC9C,qEAAqE;YACrE,kBAAkB;YAClB,iDAAiD;YACjD,iDAAiD;YACjD,oEAAoE,QAAQ,GAAG,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAClD,OAAO,CACL,kCAAkC,QAAQ,OAAO;YACjD,2DAA2D;YAC3D,mBAAmB;YACnB,4CAA4C;YAC5C,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CACL,iCAAiC,QAAQ,MAAM;YAC/C,mBAAmB,YAAY,MAAM;YACrC,wBAAwB;YACxB,WAAW,IAAI,IAAI;YACnB,WAAW,IAAI,IAAI;YACnB,eAAe,QAAQ,IAAI;YAC3B,eAAe,QAAQ,MAAM;YAC7B,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,OAAO,iCAAiC,QAAQ,6CAA6C,CAAC;AAChG,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, PresignedUrlOptions } from '../storage.interface';
2
+ import { Readable } from 'stream';
3
+ export interface CloudinaryConfig {
4
+ cloudName: string;
5
+ apiKey: string;
6
+ apiSecret: string;
7
+ folder?: string;
8
+ }
9
+ export declare class CloudinaryStorageAdapter implements IStorageAdapter {
10
+ private readonly logger;
11
+ private readonly folder;
12
+ constructor(config: CloudinaryConfig);
13
+ uploadStream(stream: Readable, options: UploadOptions): Promise<{
14
+ key: string;
15
+ etag?: string;
16
+ }>;
17
+ downloadStream(options: DownloadOptions): Promise<Readable>;
18
+ listObjects(options?: ListOptions): Promise<StorageObject[]>;
19
+ deleteObject(options: DeleteOptions): Promise<void>;
20
+ generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
21
+ objectExists(key: string): Promise<boolean>;
22
+ private getFriendlyError;
23
+ }