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,215 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var CloudinaryStorageAdapter_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.CloudinaryStorageAdapter = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const cloudinary_1 = require("cloudinary");
49
+ let CloudinaryStorageAdapter = CloudinaryStorageAdapter_1 = class CloudinaryStorageAdapter {
50
+ logger = new common_1.Logger(CloudinaryStorageAdapter_1.name);
51
+ folder;
52
+ constructor(config) {
53
+ this.folder = config.folder || 'dbdock';
54
+ cloudinary_1.v2.config({
55
+ cloud_name: config.cloudName,
56
+ api_key: config.apiKey,
57
+ api_secret: config.apiSecret,
58
+ });
59
+ this.logger.log(`Cloudinary adapter initialized for folder: ${this.folder}`);
60
+ }
61
+ async uploadStream(stream, options) {
62
+ return new Promise((resolve, reject) => {
63
+ const publicId = options.key.replace(/^dbdock_backups\//, '');
64
+ const uploadStream = cloudinary_1.v2.uploader.upload_stream({
65
+ folder: this.folder,
66
+ public_id: publicId,
67
+ resource_type: 'raw',
68
+ context: options.metadata,
69
+ }, (error, result) => {
70
+ if (error) {
71
+ const friendlyMessage = this.getFriendlyError(error);
72
+ this.logger.error(`Failed to upload ${options.key}: ${friendlyMessage}`);
73
+ const cleanError = new Error(friendlyMessage);
74
+ cleanError.name = 'StorageConfigurationError';
75
+ reject(cleanError);
76
+ }
77
+ else if (result) {
78
+ this.logger.log(`Uploaded ${options.key} to Cloudinary`);
79
+ resolve({
80
+ key: result.public_id,
81
+ etag: result.etag,
82
+ });
83
+ }
84
+ else {
85
+ reject(new Error('Upload failed with no result'));
86
+ }
87
+ });
88
+ stream.pipe(uploadStream);
89
+ });
90
+ }
91
+ async downloadStream(options) {
92
+ try {
93
+ const { default: fetch } = await Promise.resolve().then(() => __importStar(require('node-fetch')));
94
+ const { PassThrough } = await Promise.resolve().then(() => __importStar(require('stream')));
95
+ const url = cloudinary_1.v2.url(options.key, {
96
+ resource_type: 'raw',
97
+ type: 'upload',
98
+ });
99
+ const response = await fetch(url);
100
+ if (!response.ok) {
101
+ throw new Error(`Failed to download: ${response.statusText} (${response.status})`);
102
+ }
103
+ if (!response.body) {
104
+ throw new Error('No response body received from Cloudinary');
105
+ }
106
+ const passThrough = new PassThrough();
107
+ response.body.pipe(passThrough);
108
+ return passThrough;
109
+ }
110
+ catch (error) {
111
+ const friendlyMessage = this.getFriendlyError(error);
112
+ this.logger.error(`Failed to download ${options.key}: ${friendlyMessage}`);
113
+ const cleanError = new Error(friendlyMessage);
114
+ cleanError.name = 'StorageConfigurationError';
115
+ throw cleanError;
116
+ }
117
+ }
118
+ async listObjects(options) {
119
+ try {
120
+ const searchPrefix = options?.prefix ? `${this.folder}/${options.prefix}` : this.folder;
121
+ const result = await cloudinary_1.v2.api.resources({
122
+ type: 'upload',
123
+ resource_type: 'raw',
124
+ prefix: searchPrefix,
125
+ max_results: options?.maxKeys || 500,
126
+ next_cursor: options?.startAfter,
127
+ });
128
+ if (!result.resources || result.resources.length === 0) {
129
+ this.logger.warn(`No resources found with prefix: ${searchPrefix}`);
130
+ return [];
131
+ }
132
+ return result.resources.map((resource) => ({
133
+ key: resource.public_id,
134
+ size: resource.bytes,
135
+ lastModified: new Date(resource.created_at),
136
+ }));
137
+ }
138
+ catch (error) {
139
+ const friendlyMessage = this.getFriendlyError(error);
140
+ this.logger.error(`Failed to list objects: ${friendlyMessage}`);
141
+ const cleanError = new Error(friendlyMessage);
142
+ cleanError.name = 'StorageConfigurationError';
143
+ throw cleanError;
144
+ }
145
+ }
146
+ async deleteObject(options) {
147
+ try {
148
+ await cloudinary_1.v2.uploader.destroy(options.key, {
149
+ resource_type: 'raw',
150
+ });
151
+ this.logger.log(`Deleted ${options.key} from Cloudinary`);
152
+ }
153
+ catch (error) {
154
+ const friendlyMessage = this.getFriendlyError(error);
155
+ this.logger.error(`Failed to delete ${options.key}: ${friendlyMessage}`);
156
+ const cleanError = new Error(friendlyMessage);
157
+ cleanError.name = 'StorageConfigurationError';
158
+ throw cleanError;
159
+ }
160
+ }
161
+ async generatePresignedUrl(options) {
162
+ try {
163
+ const url = cloudinary_1.v2.url(options.key, {
164
+ resource_type: 'raw',
165
+ type: 'upload',
166
+ });
167
+ return url;
168
+ }
169
+ catch (error) {
170
+ const friendlyMessage = this.getFriendlyError(error);
171
+ this.logger.error(`Failed to generate presigned URL for ${options.key}: ${friendlyMessage}`);
172
+ const cleanError = new Error(friendlyMessage);
173
+ cleanError.name = 'StorageConfigurationError';
174
+ throw cleanError;
175
+ }
176
+ }
177
+ async objectExists(key) {
178
+ try {
179
+ await cloudinary_1.v2.api.resource(key, {
180
+ resource_type: 'raw',
181
+ });
182
+ return true;
183
+ }
184
+ catch (error) {
185
+ if (error.error?.http_code === 404) {
186
+ return false;
187
+ }
188
+ throw error;
189
+ }
190
+ }
191
+ getFriendlyError(error) {
192
+ const err = error;
193
+ const message = err?.message || '';
194
+ const httpCode = err?.error?.http_code;
195
+ if (httpCode === 401 || message.includes('Invalid API key') || message.includes('authentication')) {
196
+ return 'Invalid storage configuration: Authentication failed. Please verify your Cloudinary API key and secret are correct.';
197
+ }
198
+ if (httpCode === 403) {
199
+ return 'Invalid storage configuration: Access denied. Please verify your Cloudinary credentials have the necessary permissions.';
200
+ }
201
+ if (message.includes('cloud_name')) {
202
+ return 'Invalid storage configuration: Cloud name is invalid. Please verify your Cloudinary cloud name is correct.';
203
+ }
204
+ if (message.includes('ENOTFOUND') || message.includes('getaddrinfo')) {
205
+ return 'Invalid storage configuration: Could not connect to Cloudinary. Please verify your internet connection and cloud name.';
206
+ }
207
+ return message || 'Unknown storage error occurred';
208
+ }
209
+ };
210
+ exports.CloudinaryStorageAdapter = CloudinaryStorageAdapter;
211
+ exports.CloudinaryStorageAdapter = CloudinaryStorageAdapter = CloudinaryStorageAdapter_1 = __decorate([
212
+ (0, common_1.Injectable)(),
213
+ __metadata("design:paramtypes", [Object])
214
+ ], CloudinaryStorageAdapter);
215
+ //# sourceMappingURL=cloudinary.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudinary.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/cloudinary.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, PresignedUrlOptions } from '../storage.interface';
2
+ import { Readable } from 'stream';
3
+ export declare class LocalStorageAdapter implements IStorageAdapter {
4
+ private readonly logger;
5
+ private readonly basePath;
6
+ constructor(basePath: string);
7
+ private ensureBasePathExists;
8
+ private getFullPath;
9
+ private getMetadataPath;
10
+ uploadStream(stream: Readable, options: UploadOptions): Promise<{
11
+ key: string;
12
+ etag?: string;
13
+ }>;
14
+ downloadStream(options: DownloadOptions): Promise<Readable>;
15
+ listObjects(options?: ListOptions): Promise<StorageObject[]>;
16
+ private walkDirectory;
17
+ deleteObject(options: DeleteOptions): Promise<void>;
18
+ generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
19
+ objectExists(key: string): Promise<boolean>;
20
+ }
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var LocalStorageAdapter_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.LocalStorageAdapter = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const util_1 = require("util");
51
+ const mkdir = (0, util_1.promisify)(fs.mkdir);
52
+ const unlink = (0, util_1.promisify)(fs.unlink);
53
+ const stat = (0, util_1.promisify)(fs.stat);
54
+ const readdir = (0, util_1.promisify)(fs.readdir);
55
+ let LocalStorageAdapter = LocalStorageAdapter_1 = class LocalStorageAdapter {
56
+ logger = new common_1.Logger(LocalStorageAdapter_1.name);
57
+ basePath;
58
+ constructor(basePath) {
59
+ this.basePath = basePath;
60
+ this.ensureBasePathExists();
61
+ }
62
+ async ensureBasePathExists() {
63
+ try {
64
+ await mkdir(this.basePath, { recursive: true });
65
+ }
66
+ catch (error) {
67
+ this.logger.error(`Failed to create base path: ${error.message}`);
68
+ throw error;
69
+ }
70
+ }
71
+ getFullPath(key) {
72
+ return path.join(this.basePath, key);
73
+ }
74
+ getMetadataPath(key) {
75
+ return `${this.getFullPath(key)}.metadata.json`;
76
+ }
77
+ async uploadStream(stream, options) {
78
+ const fullPath = this.getFullPath(options.key);
79
+ const dir = path.dirname(fullPath);
80
+ await mkdir(dir, { recursive: true });
81
+ const writeStream = fs.createWriteStream(fullPath);
82
+ return new Promise((resolve, reject) => {
83
+ let finished = false;
84
+ let hasError = false;
85
+ const cleanup = () => {
86
+ if (!finished) {
87
+ finished = true;
88
+ stream.removeAllListeners();
89
+ writeStream.removeAllListeners();
90
+ }
91
+ };
92
+ const handleError = (error) => {
93
+ if (hasError)
94
+ return;
95
+ hasError = true;
96
+ cleanup();
97
+ this.logger.error(`Failed to upload ${options.key}: ${error.message}`);
98
+ if (!writeStream.destroyed) {
99
+ writeStream.destroy();
100
+ }
101
+ reject(error);
102
+ };
103
+ const handleFinish = async () => {
104
+ if (hasError || finished)
105
+ return;
106
+ finished = true;
107
+ cleanup();
108
+ try {
109
+ if (options.metadata) {
110
+ await fs.promises.writeFile(this.getMetadataPath(options.key), JSON.stringify(options.metadata), 'utf-8');
111
+ }
112
+ this.logger.log(`Uploaded ${options.key} to local storage`);
113
+ resolve({ key: options.key });
114
+ }
115
+ catch (error) {
116
+ reject(error);
117
+ }
118
+ };
119
+ stream.on('error', handleError);
120
+ writeStream.on('error', handleError);
121
+ writeStream.on('finish', handleFinish);
122
+ writeStream.on('close', () => {
123
+ if (!finished && !hasError) {
124
+ this.logger.warn('WriteStream closed without finish event');
125
+ handleFinish();
126
+ }
127
+ });
128
+ const pipe = stream.pipe(writeStream);
129
+ pipe.on('error', (error) => {
130
+ this.logger.error(`Pipe error: ${error.message}`);
131
+ handleError(error);
132
+ });
133
+ });
134
+ }
135
+ async downloadStream(options) {
136
+ const fullPath = this.getFullPath(options.key);
137
+ if (!fs.existsSync(fullPath)) {
138
+ throw new Error(`Object not found: ${options.key}`);
139
+ }
140
+ return fs.createReadStream(fullPath);
141
+ }
142
+ async listObjects(options) {
143
+ const prefix = options?.prefix || '';
144
+ const maxKeys = options?.maxKeys || 1000;
145
+ const startAfter = options?.startAfter || '';
146
+ const objects = [];
147
+ if (!fs.existsSync(this.basePath)) {
148
+ return [];
149
+ }
150
+ await this.walkDirectory(this.basePath, objects, this.basePath, maxKeys);
151
+ let filteredObjects = objects;
152
+ if (prefix) {
153
+ filteredObjects = objects.filter((obj) => obj.key.includes(prefix));
154
+ }
155
+ return filteredObjects
156
+ .filter((obj) => obj.key > startAfter)
157
+ .sort((a, b) => a.key.localeCompare(b.key))
158
+ .slice(0, maxKeys);
159
+ }
160
+ async walkDirectory(dir, objects, basePath, maxKeys) {
161
+ if (objects.length >= maxKeys)
162
+ return;
163
+ const entries = await readdir(dir, { withFileTypes: true });
164
+ for (const entry of entries) {
165
+ if (objects.length >= maxKeys)
166
+ break;
167
+ const fullPath = path.join(dir, entry.name);
168
+ if (entry.isDirectory()) {
169
+ await this.walkDirectory(fullPath, objects, basePath, maxKeys);
170
+ }
171
+ else if (!entry.name.endsWith('.metadata.json')) {
172
+ const stats = await stat(fullPath);
173
+ const key = path.relative(basePath, fullPath);
174
+ let metadata;
175
+ const metadataPath = `${fullPath}.metadata.json`;
176
+ if (fs.existsSync(metadataPath)) {
177
+ const metadataContent = await fs.promises.readFile(metadataPath, 'utf-8');
178
+ metadata = JSON.parse(metadataContent);
179
+ }
180
+ objects.push({
181
+ key,
182
+ size: stats.size,
183
+ lastModified: stats.mtime,
184
+ metadata,
185
+ });
186
+ }
187
+ }
188
+ }
189
+ async deleteObject(options) {
190
+ const fullPath = this.getFullPath(options.key);
191
+ const metadataPath = this.getMetadataPath(options.key);
192
+ if (fs.existsSync(fullPath)) {
193
+ await unlink(fullPath);
194
+ this.logger.log(`Deleted ${options.key} from local storage`);
195
+ }
196
+ if (fs.existsSync(metadataPath)) {
197
+ await unlink(metadataPath);
198
+ }
199
+ }
200
+ async generatePresignedUrl(options) {
201
+ const fullPath = this.getFullPath(options.key);
202
+ return `file://${fullPath}`;
203
+ }
204
+ async objectExists(key) {
205
+ const fullPath = this.getFullPath(key);
206
+ return fs.existsSync(fullPath);
207
+ }
208
+ };
209
+ exports.LocalStorageAdapter = LocalStorageAdapter;
210
+ exports.LocalStorageAdapter = LocalStorageAdapter = LocalStorageAdapter_1 = __decorate([
211
+ (0, common_1.Injectable)(),
212
+ __metadata("design:paramtypes", [String])
213
+ ], LocalStorageAdapter);
214
+ //# sourceMappingURL=local.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/local.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { S3StorageAdapter } from './s3.adapter';
2
+ export interface R2Config {
3
+ accountId: string;
4
+ bucket: string;
5
+ accessKeyId: string;
6
+ secretAccessKey: string;
7
+ }
8
+ export declare class R2StorageAdapter extends S3StorageAdapter {
9
+ constructor(config: R2Config);
10
+ }
@@ -0,0 +1,33 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.R2StorageAdapter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const s3_adapter_1 = require("./s3.adapter");
15
+ let R2StorageAdapter = class R2StorageAdapter extends s3_adapter_1.S3StorageAdapter {
16
+ constructor(config) {
17
+ const s3Config = {
18
+ endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,
19
+ region: 'auto',
20
+ bucket: config.bucket,
21
+ accessKeyId: config.accessKeyId,
22
+ secretAccessKey: config.secretAccessKey,
23
+ forcePathStyle: false,
24
+ };
25
+ super(s3Config);
26
+ }
27
+ };
28
+ exports.R2StorageAdapter = R2StorageAdapter;
29
+ exports.R2StorageAdapter = R2StorageAdapter = __decorate([
30
+ (0, common_1.Injectable)(),
31
+ __metadata("design:paramtypes", [Object])
32
+ ], R2StorageAdapter);
33
+ //# sourceMappingURL=r2.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/r2.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAA0D;AAUnD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,6BAAgB;IACpD,YAAY,MAAgB;QAC1B,MAAM,QAAQ,GAAa;YACzB,QAAQ,EAAE,WAAW,MAAM,CAAC,SAAS,2BAA2B;YAChE,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,cAAc,EAAE,KAAK;SACtB,CAAC;QAEF,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;CACF,CAAA;AAbY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;;GACA,gBAAgB,CAa5B"}
@@ -0,0 +1,26 @@
1
+ import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, PresignedUrlOptions } from '../storage.interface';
2
+ import { Readable } from 'stream';
3
+ export interface S3Config {
4
+ endpoint?: string;
5
+ region?: string;
6
+ bucket: string;
7
+ accessKeyId: string;
8
+ secretAccessKey: string;
9
+ forcePathStyle?: boolean;
10
+ }
11
+ export declare class S3StorageAdapter implements IStorageAdapter {
12
+ private readonly logger;
13
+ private readonly client;
14
+ private readonly bucket;
15
+ constructor(config: S3Config);
16
+ uploadStream(stream: Readable, options: UploadOptions): Promise<{
17
+ key: string;
18
+ etag?: string;
19
+ }>;
20
+ downloadStream(options: DownloadOptions): Promise<Readable>;
21
+ listObjects(options?: ListOptions): Promise<StorageObject[]>;
22
+ deleteObject(options: DeleteOptions): Promise<void>;
23
+ generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
24
+ objectExists(key: string): Promise<boolean>;
25
+ private getFriendlyError;
26
+ }