express-storage 2.0.1 → 2.0.3

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 (113) hide show
  1. package/dist/cjs/drivers/azure.driver.d.ts.map +1 -0
  2. package/dist/cjs/drivers/azure.driver.js +396 -0
  3. package/dist/cjs/drivers/azure.driver.js.map +1 -0
  4. package/dist/cjs/drivers/base.driver.d.ts.map +1 -0
  5. package/dist/cjs/drivers/base.driver.js +354 -0
  6. package/dist/cjs/drivers/base.driver.js.map +1 -0
  7. package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -0
  8. package/dist/cjs/drivers/gcs.driver.js +359 -0
  9. package/dist/cjs/drivers/gcs.driver.js.map +1 -0
  10. package/dist/cjs/drivers/local.driver.d.ts.map +1 -0
  11. package/dist/cjs/drivers/local.driver.js +628 -0
  12. package/dist/cjs/drivers/local.driver.js.map +1 -0
  13. package/dist/cjs/drivers/s3.driver.d.ts.map +1 -0
  14. package/dist/cjs/drivers/s3.driver.js +392 -0
  15. package/dist/cjs/drivers/s3.driver.js.map +1 -0
  16. package/dist/cjs/factory/driver.factory.d.ts.map +1 -0
  17. package/dist/cjs/factory/driver.factory.js +181 -0
  18. package/dist/cjs/factory/driver.factory.js.map +1 -0
  19. package/dist/cjs/index.d.ts.map +1 -0
  20. package/dist/cjs/index.js +64 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/package.json +1 -0
  23. package/dist/cjs/storage-manager.d.ts.map +1 -0
  24. package/dist/cjs/storage-manager.js +719 -0
  25. package/dist/cjs/storage-manager.js.map +1 -0
  26. package/dist/cjs/types/storage.types.d.ts.map +1 -0
  27. package/dist/cjs/types/storage.types.js +3 -0
  28. package/dist/cjs/types/storage.types.js.map +1 -0
  29. package/dist/cjs/utils/config.utils.d.ts.map +1 -0
  30. package/dist/cjs/utils/config.utils.js +213 -0
  31. package/dist/cjs/utils/config.utils.js.map +1 -0
  32. package/dist/cjs/utils/file.utils.d.ts.map +1 -0
  33. package/dist/cjs/utils/file.utils.js +297 -0
  34. package/dist/cjs/utils/file.utils.js.map +1 -0
  35. package/dist/esm/drivers/azure.driver.d.ts +88 -0
  36. package/dist/esm/drivers/azure.driver.d.ts.map +1 -0
  37. package/dist/esm/drivers/azure.driver.js.map +1 -0
  38. package/dist/esm/drivers/base.driver.d.ts +170 -0
  39. package/dist/esm/drivers/base.driver.d.ts.map +1 -0
  40. package/dist/esm/drivers/base.driver.js.map +1 -0
  41. package/dist/esm/drivers/gcs.driver.d.ts +86 -0
  42. package/dist/esm/drivers/gcs.driver.d.ts.map +1 -0
  43. package/dist/esm/drivers/gcs.driver.js.map +1 -0
  44. package/dist/esm/drivers/local.driver.d.ts +107 -0
  45. package/dist/esm/drivers/local.driver.d.ts.map +1 -0
  46. package/dist/esm/drivers/local.driver.js.map +1 -0
  47. package/dist/esm/drivers/s3.driver.d.ts +89 -0
  48. package/dist/esm/drivers/s3.driver.d.ts.map +1 -0
  49. package/dist/esm/drivers/s3.driver.js.map +1 -0
  50. package/dist/esm/factory/driver.factory.d.ts +62 -0
  51. package/dist/esm/factory/driver.factory.d.ts.map +1 -0
  52. package/dist/esm/factory/driver.factory.js.map +1 -0
  53. package/dist/esm/index.d.ts +30 -0
  54. package/dist/esm/index.d.ts.map +1 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/package.json +1 -0
  57. package/dist/esm/storage-manager.d.ts +228 -0
  58. package/dist/esm/storage-manager.d.ts.map +1 -0
  59. package/dist/esm/storage-manager.js.map +1 -0
  60. package/dist/esm/types/storage.types.d.ts +295 -0
  61. package/dist/esm/types/storage.types.d.ts.map +1 -0
  62. package/dist/esm/types/storage.types.js.map +1 -0
  63. package/dist/esm/utils/config.utils.d.ts +45 -0
  64. package/dist/esm/utils/config.utils.d.ts.map +1 -0
  65. package/dist/esm/utils/config.utils.js.map +1 -0
  66. package/dist/esm/utils/file.utils.d.ts +142 -0
  67. package/dist/esm/utils/file.utils.d.ts.map +1 -0
  68. package/dist/esm/utils/file.utils.js.map +1 -0
  69. package/package.json +13 -8
  70. package/dist/drivers/azure.driver.d.ts.map +0 -1
  71. package/dist/drivers/azure.driver.js.map +0 -1
  72. package/dist/drivers/base.driver.d.ts.map +0 -1
  73. package/dist/drivers/base.driver.js.map +0 -1
  74. package/dist/drivers/gcs.driver.d.ts.map +0 -1
  75. package/dist/drivers/gcs.driver.js.map +0 -1
  76. package/dist/drivers/local.driver.d.ts.map +0 -1
  77. package/dist/drivers/local.driver.js.map +0 -1
  78. package/dist/drivers/s3.driver.d.ts.map +0 -1
  79. package/dist/drivers/s3.driver.js.map +0 -1
  80. package/dist/factory/driver.factory.d.ts.map +0 -1
  81. package/dist/factory/driver.factory.js.map +0 -1
  82. package/dist/index.d.ts.map +0 -1
  83. package/dist/index.js.map +0 -1
  84. package/dist/storage-manager.d.ts.map +0 -1
  85. package/dist/storage-manager.js.map +0 -1
  86. package/dist/types/storage.types.d.ts.map +0 -1
  87. package/dist/types/storage.types.js.map +0 -1
  88. package/dist/utils/config.utils.d.ts.map +0 -1
  89. package/dist/utils/config.utils.js.map +0 -1
  90. package/dist/utils/file.utils.d.ts.map +0 -1
  91. package/dist/utils/file.utils.js.map +0 -1
  92. /package/dist/{drivers → cjs/drivers}/azure.driver.d.ts +0 -0
  93. /package/dist/{drivers → cjs/drivers}/base.driver.d.ts +0 -0
  94. /package/dist/{drivers → cjs/drivers}/gcs.driver.d.ts +0 -0
  95. /package/dist/{drivers → cjs/drivers}/local.driver.d.ts +0 -0
  96. /package/dist/{drivers → cjs/drivers}/s3.driver.d.ts +0 -0
  97. /package/dist/{factory → cjs/factory}/driver.factory.d.ts +0 -0
  98. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  99. /package/dist/{storage-manager.d.ts → cjs/storage-manager.d.ts} +0 -0
  100. /package/dist/{types → cjs/types}/storage.types.d.ts +0 -0
  101. /package/dist/{utils → cjs/utils}/config.utils.d.ts +0 -0
  102. /package/dist/{utils → cjs/utils}/file.utils.d.ts +0 -0
  103. /package/dist/{drivers → esm/drivers}/azure.driver.js +0 -0
  104. /package/dist/{drivers → esm/drivers}/base.driver.js +0 -0
  105. /package/dist/{drivers → esm/drivers}/gcs.driver.js +0 -0
  106. /package/dist/{drivers → esm/drivers}/local.driver.js +0 -0
  107. /package/dist/{drivers → esm/drivers}/s3.driver.js +0 -0
  108. /package/dist/{factory → esm/factory}/driver.factory.js +0 -0
  109. /package/dist/{index.js → esm/index.js} +0 -0
  110. /package/dist/{storage-manager.js → esm/storage-manager.js} +0 -0
  111. /package/dist/{types → esm/types}/storage.types.js +0 -0
  112. /package/dist/{utils → esm/utils}/config.utils.js +0 -0
  113. /package/dist/{utils → esm/utils}/file.utils.js +0 -0
@@ -0,0 +1,628 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalStorageDriver = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const base_driver_js_1 = require("./base.driver.js");
10
+ const file_utils_js_1 = require("../utils/file.utils.js");
11
+ /**
12
+ * Magic byte signatures for common file types.
13
+ * Used to detect actual file content type regardless of extension.
14
+ * This provides security against extension spoofing attacks.
15
+ */
16
+ const MAGIC_BYTES = [
17
+ // Images
18
+ { bytes: [0xFF, 0xD8, 0xFF], mimeType: 'image/jpeg' },
19
+ { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], mimeType: 'image/png' },
20
+ { bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], mimeType: 'image/gif' }, // GIF87a
21
+ { bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], mimeType: 'image/gif' }, // GIF89a
22
+ { bytes: [0x52, 0x49, 0x46, 0x46], mimeType: 'image/webp' }, // RIFF (WebP container)
23
+ { bytes: [0x42, 0x4D], mimeType: 'image/bmp' },
24
+ // Documents
25
+ { bytes: [0x25, 0x50, 0x44, 0x46], mimeType: 'application/pdf' }, // %PDF
26
+ { bytes: [0x50, 0x4B, 0x03, 0x04], mimeType: 'application/zip' }, // ZIP (also docx, xlsx, etc.)
27
+ { bytes: [0x50, 0x4B, 0x05, 0x06], mimeType: 'application/zip' }, // Empty ZIP
28
+ { bytes: [0x50, 0x4B, 0x07, 0x08], mimeType: 'application/zip' }, // Spanned ZIP
29
+ // Archives
30
+ { bytes: [0x1F, 0x8B], mimeType: 'application/gzip' },
31
+ { bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07], mimeType: 'application/vnd.rar' }, // RAR
32
+ { bytes: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], mimeType: 'application/x-7z-compressed' }, // 7z
33
+ // Audio/Video
34
+ { bytes: [0x49, 0x44, 0x33], mimeType: 'audio/mpeg' }, // ID3 (MP3)
35
+ { bytes: [0xFF, 0xFB], mimeType: 'audio/mpeg' }, // MP3 without ID3
36
+ { bytes: [0xFF, 0xFA], mimeType: 'audio/mpeg' }, // MP3 without ID3
37
+ { bytes: [0x4F, 0x67, 0x67, 0x53], mimeType: 'audio/ogg' }, // OGG
38
+ { bytes: [0x66, 0x74, 0x79, 0x70], mimeType: 'video/mp4', offset: 4 }, // ftyp (MP4/M4A)
39
+ // Executables (for security detection)
40
+ { bytes: [0x4D, 0x5A], mimeType: 'application/x-msdownload' }, // EXE/DLL
41
+ { bytes: [0x7F, 0x45, 0x4C, 0x46], mimeType: 'application/x-executable' }, // ELF
42
+ ];
43
+ /**
44
+ * Detects MIME type from file content using magic bytes.
45
+ * Returns undefined if no match is found (falls back to extension-based detection).
46
+ *
47
+ * @param filePath - Path to the file to analyze
48
+ * @returns Detected MIME type or undefined
49
+ */
50
+ function detectMimeTypeFromMagicBytes(filePath) {
51
+ try {
52
+ // Read first 16 bytes (enough for most magic numbers)
53
+ const fd = fs_1.default.openSync(filePath, 'r');
54
+ const buffer = Buffer.alloc(16);
55
+ const bytesRead = fs_1.default.readSync(fd, buffer, 0, 16, 0);
56
+ fs_1.default.closeSync(fd);
57
+ if (bytesRead === 0) {
58
+ return undefined;
59
+ }
60
+ for (const signature of MAGIC_BYTES) {
61
+ const offset = signature.offset || 0;
62
+ if (offset + signature.bytes.length > bytesRead) {
63
+ continue;
64
+ }
65
+ let matches = true;
66
+ for (let i = 0; i < signature.bytes.length; i++) {
67
+ if (buffer[offset + i] !== signature.bytes[i]) {
68
+ matches = false;
69
+ break;
70
+ }
71
+ }
72
+ if (matches) {
73
+ return signature.mimeType;
74
+ }
75
+ }
76
+ return undefined;
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ }
82
+ /**
83
+ * Maps file extensions to MIME types.
84
+ * Used as fallback when magic byte detection doesn't match.
85
+ */
86
+ const EXTENSION_MIME_MAP = {
87
+ // Images
88
+ '.jpg': 'image/jpeg',
89
+ '.jpeg': 'image/jpeg',
90
+ '.png': 'image/png',
91
+ '.gif': 'image/gif',
92
+ '.webp': 'image/webp',
93
+ '.svg': 'image/svg+xml',
94
+ '.ico': 'image/x-icon',
95
+ '.bmp': 'image/bmp',
96
+ '.tiff': 'image/tiff',
97
+ '.tif': 'image/tiff',
98
+ // Documents
99
+ '.pdf': 'application/pdf',
100
+ '.doc': 'application/msword',
101
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
102
+ '.xls': 'application/vnd.ms-excel',
103
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
104
+ '.ppt': 'application/vnd.ms-powerpoint',
105
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
106
+ '.txt': 'text/plain',
107
+ '.csv': 'text/csv',
108
+ '.json': 'application/json',
109
+ '.xml': 'application/xml',
110
+ // Audio
111
+ '.mp3': 'audio/mpeg',
112
+ '.wav': 'audio/wav',
113
+ '.ogg': 'audio/ogg',
114
+ '.m4a': 'audio/mp4',
115
+ // Video
116
+ '.mp4': 'video/mp4',
117
+ '.webm': 'video/webm',
118
+ '.avi': 'video/x-msvideo',
119
+ '.mov': 'video/quicktime',
120
+ '.mkv': 'video/x-matroska',
121
+ // Archives
122
+ '.zip': 'application/zip',
123
+ '.tar': 'application/x-tar',
124
+ '.gz': 'application/gzip',
125
+ '.rar': 'application/vnd.rar',
126
+ '.7z': 'application/x-7z-compressed',
127
+ // Web
128
+ '.html': 'text/html',
129
+ '.htm': 'text/html',
130
+ '.css': 'text/css',
131
+ '.js': 'application/javascript',
132
+ '.ts': 'application/typescript',
133
+ // Fonts
134
+ '.woff': 'font/woff',
135
+ '.woff2': 'font/woff2',
136
+ '.ttf': 'font/ttf',
137
+ '.otf': 'font/otf',
138
+ };
139
+ /**
140
+ * LocalStorageDriver - Saves files to your local filesystem.
141
+ *
142
+ * Great for development and small-scale applications.
143
+ * Files are organized by year/month folders automatically.
144
+ *
145
+ * **Security features:**
146
+ * - Path traversal prevention (blocks ../ and null bytes)
147
+ * - Symlinks are NOT followed or deleted (prevents directory escape attacks)
148
+ * - Magic byte detection for content-type validation (prevents extension spoofing)
149
+ * - Files stay within the configured base directory
150
+ *
151
+ * **Symlink behavior:** This driver explicitly rejects symlinks for security.
152
+ * If a file is a symlink, it will not be read, deleted, or listed. This prevents
153
+ * attackers from using symlinks to access files outside the storage directory.
154
+ *
155
+ * Note: Local storage doesn't support presigned URLs since
156
+ * there's no external service to sign requests against.
157
+ */
158
+ class LocalStorageDriver extends base_driver_js_1.BaseStorageDriver {
159
+ constructor(config) {
160
+ super(config);
161
+ this.basePath = config.localPath || 'public/express-storage';
162
+ }
163
+ /**
164
+ * Saves a file to the local filesystem.
165
+ *
166
+ * Files are automatically organized into YYYY/MM folders.
167
+ * For example, a file uploaded in January 2026 goes into:
168
+ * {basePath}/2026/01/{unique_filename}.jpg
169
+ *
170
+ * For large files (>100MB), uses streaming to reduce memory usage
171
+ * and prevent application crashes.
172
+ */
173
+ async upload(file, _options) {
174
+ try {
175
+ const validationErrors = this.validateFile(file);
176
+ if (validationErrors.length > 0) {
177
+ return this.createErrorResult(validationErrors.join(', '));
178
+ }
179
+ const fileName = this.generateFileName(file.originalname);
180
+ const monthPath = (0, file_utils_js_1.createMonthBasedPath)(this.basePath);
181
+ const fullDirPath = path_1.default.resolve(monthPath);
182
+ (0, file_utils_js_1.ensureDirectoryExists)(fullDirPath);
183
+ const filePath = path_1.default.join(fullDirPath, fileName);
184
+ // Use streaming for large files to reduce memory usage
185
+ if (this.shouldUseStreaming(file)) {
186
+ await this.uploadWithStream(file, filePath);
187
+ }
188
+ else {
189
+ const fileContent = this.getFileContent(file);
190
+ fs_1.default.writeFileSync(filePath, fileContent);
191
+ }
192
+ const fileUrl = this.generateFileUrl(filePath);
193
+ // Return relative path from basePath (e.g., '2026/01/filename.jpg')
194
+ const absoluteFilePath = path_1.default.resolve(filePath);
195
+ const absoluteBasePath = path_1.default.resolve(this.basePath);
196
+ const relativePath = this.normalizePathSeparators(path_1.default.relative(absoluteBasePath, absoluteFilePath));
197
+ return this.createSuccessResult(relativePath, fileUrl);
198
+ }
199
+ catch (error) {
200
+ return this.createErrorResult(error instanceof Error ? error.message : 'Failed to upload file');
201
+ }
202
+ }
203
+ /**
204
+ * Uploads a large file using streaming.
205
+ *
206
+ * This method pipes the file stream directly to disk, which is more
207
+ * memory-efficient for large files (>100MB).
208
+ */
209
+ async uploadWithStream(file, filePath) {
210
+ return new Promise((resolve, reject) => {
211
+ const readStream = this.getFileStream(file);
212
+ const writeStream = fs_1.default.createWriteStream(filePath);
213
+ readStream
214
+ .pipe(writeStream)
215
+ .on('finish', resolve)
216
+ .on('error', (err) => {
217
+ // Clean up partial file on error
218
+ try {
219
+ if (fs_1.default.existsSync(filePath)) {
220
+ fs_1.default.unlinkSync(filePath);
221
+ }
222
+ }
223
+ catch {
224
+ // Ignore cleanup errors
225
+ }
226
+ reject(err);
227
+ });
228
+ // Handle read stream errors
229
+ readStream.on('error', (err) => {
230
+ writeStream.destroy();
231
+ try {
232
+ if (fs_1.default.existsSync(filePath)) {
233
+ fs_1.default.unlinkSync(filePath);
234
+ }
235
+ }
236
+ catch {
237
+ // Ignore cleanup errors
238
+ }
239
+ reject(err);
240
+ });
241
+ });
242
+ }
243
+ /**
244
+ * Builds a URL for accessing the file.
245
+ *
246
+ * If your basePath starts with 'public/', we strip that prefix
247
+ * since Express.static('public') serves files from /
248
+ *
249
+ * Example: public/uploads/2026/01/photo.jpg -> /uploads/2026/01/photo.jpg
250
+ */
251
+ generateFileUrl(filePath) {
252
+ const absoluteFilePath = path_1.default.resolve(filePath);
253
+ const absoluteBasePath = path_1.default.resolve(this.basePath);
254
+ const relativeFromBase = this.normalizePathSeparators(path_1.default.relative(absoluteBasePath, absoluteFilePath));
255
+ const normalizedBasePath = this.normalizePathSeparators(this.basePath);
256
+ if (normalizedBasePath.startsWith('public/')) {
257
+ const webBasePath = normalizedBasePath.replace(/^public\//, '');
258
+ return this.normalizeUrl(`/${webBasePath}/${relativeFromBase}`);
259
+ }
260
+ return this.normalizeUrl(`/${normalizedBasePath}/${relativeFromBase}`);
261
+ }
262
+ /**
263
+ * Converts Windows backslashes to forward slashes.
264
+ */
265
+ normalizePathSeparators(pathStr) {
266
+ return pathStr.replace(/\\/g, '/');
267
+ }
268
+ /**
269
+ * Removes duplicate slashes from URLs.
270
+ */
271
+ normalizeUrl(url) {
272
+ return url.replace(/\/+/g, '/');
273
+ }
274
+ /**
275
+ * Local storage doesn't support presigned upload URLs.
276
+ */
277
+ async generateUploadUrl(_fileName, _contentType, _maxSize) {
278
+ return this.createPresignedErrorResult('Presigned URLs are not supported for local storage');
279
+ }
280
+ /**
281
+ * Local storage doesn't support presigned view URLs.
282
+ */
283
+ async generateViewUrl(_fileName) {
284
+ return this.createPresignedErrorResult('Presigned URLs are not supported for local storage');
285
+ }
286
+ /**
287
+ * Validates a local file exists and matches expected values.
288
+ *
289
+ * Content type detection uses a two-tier approach:
290
+ * 1. Magic byte detection (examines actual file content for security)
291
+ * 2. Extension-based fallback (when magic bytes don't match)
292
+ *
293
+ * This helps detect extension spoofing attacks where a malicious file
294
+ * is renamed with an innocent extension (e.g., malware.exe -> photo.jpg).
295
+ */
296
+ async validateAndConfirmUpload(reference, options) {
297
+ const deleteOnFailure = options?.deleteOnFailure !== false;
298
+ try {
299
+ const filePath = this.resolveFilePath(reference);
300
+ if (!filePath || !fs_1.default.existsSync(filePath)) {
301
+ return {
302
+ success: false,
303
+ error: 'File not found',
304
+ };
305
+ }
306
+ const stats = fs_1.default.statSync(filePath);
307
+ const fileUrl = this.generateFileUrl(filePath);
308
+ // Try magic byte detection first (more secure), fall back to extension
309
+ const magicMimeType = detectMimeTypeFromMagicBytes(filePath);
310
+ const ext = path_1.default.extname(reference).toLowerCase();
311
+ const extensionMimeType = ext && EXTENSION_MIME_MAP[ext] ? EXTENSION_MIME_MAP[ext] : undefined;
312
+ // Use magic bytes if detected, otherwise fall back to extension
313
+ const actualContentType = magicMimeType || extensionMimeType;
314
+ const actualFileSize = stats.size;
315
+ // Security check: warn if magic bytes differ from extension (potential spoofing)
316
+ const contentTypeMismatchWarning = magicMimeType && extensionMimeType &&
317
+ magicMimeType !== extensionMimeType;
318
+ // Validate content type if expected
319
+ if (options?.expectedContentType && actualContentType !== options.expectedContentType) {
320
+ if (deleteOnFailure) {
321
+ await this.delete(reference);
322
+ }
323
+ const mismatchDetail = contentTypeMismatchWarning
324
+ ? ` (Warning: file extension suggests '${extensionMimeType}' but actual content is '${magicMimeType}')`
325
+ : '';
326
+ const errorResult = {
327
+ success: false,
328
+ error: `Content type mismatch: expected '${options.expectedContentType}', got '${actualContentType || 'unknown'}'${mismatchDetail}${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
329
+ };
330
+ if (actualContentType)
331
+ errorResult.actualContentType = actualContentType;
332
+ errorResult.actualFileSize = actualFileSize;
333
+ return errorResult;
334
+ }
335
+ // Validate file size if expected
336
+ if (options?.expectedFileSize !== undefined && actualFileSize !== options.expectedFileSize) {
337
+ if (deleteOnFailure) {
338
+ await this.delete(reference);
339
+ }
340
+ const errorResult = {
341
+ success: false,
342
+ error: `File size mismatch: expected ${options.expectedFileSize} bytes, got ${actualFileSize} bytes${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
343
+ };
344
+ if (actualContentType)
345
+ errorResult.actualContentType = actualContentType;
346
+ errorResult.actualFileSize = actualFileSize;
347
+ return errorResult;
348
+ }
349
+ const result = {
350
+ success: true,
351
+ reference,
352
+ viewUrl: fileUrl,
353
+ actualFileSize,
354
+ };
355
+ if (actualContentType) {
356
+ result.actualContentType = actualContentType;
357
+ }
358
+ return result;
359
+ }
360
+ catch (error) {
361
+ return {
362
+ success: false,
363
+ error: error instanceof Error ? error.message : 'Failed to validate upload',
364
+ };
365
+ }
366
+ }
367
+ /**
368
+ * Deletes a file from local storage.
369
+ *
370
+ * Security checks:
371
+ * - Rejects path traversal attempts (../ sequences)
372
+ * - Rejects null bytes in paths
373
+ * - Verifies target stays within base directory
374
+ * - Won't follow or delete symlinks (security: prevents directory escape attacks)
375
+ * - Only deletes regular files (not directories)
376
+ *
377
+ * @param reference - The file path relative to the storage base directory
378
+ * @returns true if file was deleted, false if not found or security check failed
379
+ */
380
+ async delete(reference) {
381
+ try {
382
+ // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
383
+ let decodedReference;
384
+ try {
385
+ decodedReference = decodeURIComponent(reference);
386
+ }
387
+ catch {
388
+ return false;
389
+ }
390
+ if (decodedReference.includes('..') || decodedReference.includes('\0')) {
391
+ return false;
392
+ }
393
+ const baseDir = path_1.default.resolve(this.basePath);
394
+ const targetPath = path_1.default.join(baseDir, decodedReference);
395
+ const resolvedPath = path_1.default.resolve(targetPath);
396
+ // Make sure we're not escaping the base directory
397
+ if (!resolvedPath.startsWith(baseDir + path_1.default.sep) && resolvedPath !== baseDir) {
398
+ return false;
399
+ }
400
+ let stat;
401
+ try {
402
+ stat = fs_1.default.lstatSync(resolvedPath);
403
+ }
404
+ catch {
405
+ return false;
406
+ }
407
+ // Don't follow symlinks — security protection against:
408
+ // 1. Directory escape attacks (symlink pointing outside storage)
409
+ // 2. Unauthorized file deletion via symlink redirection
410
+ // 3. Race conditions where symlink is swapped after check
411
+ if (stat.isSymbolicLink()) {
412
+ return false;
413
+ }
414
+ if (!stat.isFile()) {
415
+ return false;
416
+ }
417
+ fs_1.default.unlinkSync(resolvedPath);
418
+ return true;
419
+ }
420
+ catch {
421
+ return false;
422
+ }
423
+ }
424
+ /**
425
+ * Safely resolves a reference to a file path within our base directory.
426
+ * Returns null for any suspicious input.
427
+ */
428
+ resolveFilePath(reference) {
429
+ const baseDir = path_1.default.resolve(this.basePath);
430
+ // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
431
+ let decodedReference;
432
+ try {
433
+ decodedReference = decodeURIComponent(reference);
434
+ }
435
+ catch {
436
+ return null;
437
+ }
438
+ if (decodedReference.includes('..') || decodedReference.includes('\0')) {
439
+ return null;
440
+ }
441
+ const directPath = path_1.default.join(baseDir, decodedReference);
442
+ const resolvedPath = path_1.default.resolve(directPath);
443
+ if (!resolvedPath.startsWith(baseDir + path_1.default.sep) && resolvedPath !== baseDir) {
444
+ return null;
445
+ }
446
+ try {
447
+ const stat = fs_1.default.lstatSync(directPath);
448
+ if (stat.isSymbolicLink()) {
449
+ return null;
450
+ }
451
+ if (stat.isFile()) {
452
+ return directPath;
453
+ }
454
+ }
455
+ catch {
456
+ return null;
457
+ }
458
+ return null;
459
+ }
460
+ /**
461
+ * Lists files in local storage with optional prefix filtering and pagination.
462
+ *
463
+ * Uses early termination to avoid loading all files into memory when possible.
464
+ * Files are collected in sorted order and iteration stops once we have enough
465
+ * results for the requested page.
466
+ */
467
+ async listFiles(prefix, maxResults = 1000, continuationToken) {
468
+ try {
469
+ // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
470
+ let decodedPrefix;
471
+ if (prefix) {
472
+ try {
473
+ decodedPrefix = decodeURIComponent(prefix);
474
+ }
475
+ catch {
476
+ return {
477
+ success: false,
478
+ error: 'Invalid prefix: malformed URL encoding',
479
+ };
480
+ }
481
+ }
482
+ if (decodedPrefix && (decodedPrefix.includes('..') || decodedPrefix.includes('\0'))) {
483
+ return {
484
+ success: false,
485
+ error: 'Invalid prefix: path traversal sequences are not allowed',
486
+ };
487
+ }
488
+ const validatedMaxResults = Math.floor(Math.max(1, Math.min(Number.isNaN(maxResults) ? 1000 : maxResults, 1000)));
489
+ const baseDir = path_1.default.resolve(this.basePath);
490
+ if (!fs_1.default.existsSync(baseDir)) {
491
+ return { success: true, files: [] };
492
+ }
493
+ const matchingFiles = [];
494
+ let hasMore = false;
495
+ // Maximum recursion depth to prevent stack overflow on deeply nested directories
496
+ const MAX_RECURSION_DEPTH = 100;
497
+ // Maximum files to collect before stopping (for memory protection)
498
+ // We collect a bit more than needed for accurate hasMore detection
499
+ const MAX_COLLECT = validatedMaxResults + 1;
500
+ // Use decoded prefix for file matching
501
+ const effectivePrefix = decodedPrefix;
502
+ // Skip directories that can't possibly contain matching files
503
+ const couldContainPrefix = (dirRelativePath, targetPrefix) => {
504
+ if (!targetPrefix)
505
+ return true;
506
+ return targetPrefix.startsWith(dirRelativePath) ||
507
+ dirRelativePath.startsWith(targetPrefix) ||
508
+ dirRelativePath === '';
509
+ };
510
+ // Check if we should skip this file based on continuation token
511
+ const isAfterToken = (filePath, token) => {
512
+ if (!token)
513
+ return true;
514
+ return filePath.localeCompare(token) > 0;
515
+ };
516
+ const collectFiles = (dir, dirRelativePath, depth = 0) => {
517
+ // Return true to continue, false to stop early
518
+ // Prevent stack overflow from extremely deep directory structures
519
+ if (depth > MAX_RECURSION_DEPTH) {
520
+ return true;
521
+ }
522
+ // Early termination: we have enough files
523
+ if (matchingFiles.length >= MAX_COLLECT) {
524
+ hasMore = true;
525
+ return false;
526
+ }
527
+ if (effectivePrefix && !couldContainPrefix(dirRelativePath, effectivePrefix)) {
528
+ return true;
529
+ }
530
+ let items;
531
+ try {
532
+ items = fs_1.default.readdirSync(dir);
533
+ }
534
+ catch {
535
+ return true;
536
+ }
537
+ // Sort items for consistent ordering
538
+ items.sort();
539
+ for (const item of items) {
540
+ // Check if we have enough files
541
+ if (matchingFiles.length >= MAX_COLLECT) {
542
+ hasMore = true;
543
+ return false;
544
+ }
545
+ const itemPath = path_1.default.join(dir, item);
546
+ const relativePath = dirRelativePath ? `${dirRelativePath}/${item}` : item;
547
+ let stat;
548
+ try {
549
+ stat = fs_1.default.lstatSync(itemPath);
550
+ }
551
+ catch {
552
+ continue;
553
+ }
554
+ // Skip symlinks for security reasons:
555
+ // 1. Symlinks could point outside the storage directory (directory escape)
556
+ // 2. Symlinks could create infinite loops in directory traversal
557
+ // 3. Symlinks could expose sensitive files from other locations
558
+ // If you need symlink support, use a different storage strategy
559
+ if (stat.isSymbolicLink()) {
560
+ continue;
561
+ }
562
+ if (stat.isDirectory()) {
563
+ // Skip directories that are lexicographically before our continuation token
564
+ // (they can't contain files we need)
565
+ if (continuationToken && !couldContainPrefix(relativePath, continuationToken.split('/')[0] || '')) {
566
+ // Only skip if this directory is completely before the token
567
+ if (relativePath.localeCompare(continuationToken) < 0 && !continuationToken.startsWith(relativePath + '/')) {
568
+ continue;
569
+ }
570
+ }
571
+ const shouldContinue = collectFiles(itemPath, relativePath, depth + 1);
572
+ if (!shouldContinue) {
573
+ return false;
574
+ }
575
+ }
576
+ else if (stat.isFile()) {
577
+ if (effectivePrefix && !relativePath.startsWith(effectivePrefix)) {
578
+ continue;
579
+ }
580
+ // Skip files at or before the continuation token
581
+ if (!isAfterToken(relativePath, continuationToken)) {
582
+ continue;
583
+ }
584
+ const fileInfo = {
585
+ name: relativePath,
586
+ size: stat.size,
587
+ lastModified: stat.mtime,
588
+ };
589
+ const ext = path_1.default.extname(relativePath).toLowerCase();
590
+ if (ext && EXTENSION_MIME_MAP[ext]) {
591
+ fileInfo.contentType = EXTENSION_MIME_MAP[ext];
592
+ }
593
+ else {
594
+ fileInfo.contentType = 'application/octet-stream';
595
+ }
596
+ matchingFiles.push(fileInfo);
597
+ }
598
+ }
599
+ return true;
600
+ };
601
+ collectFiles(baseDir, '');
602
+ // Sort results (should already be mostly sorted due to directory traversal order)
603
+ matchingFiles.sort((a, b) => a.name.localeCompare(b.name));
604
+ // Take only the requested number of results
605
+ const pageFiles = matchingFiles.slice(0, validatedMaxResults);
606
+ const result = {
607
+ success: true,
608
+ files: pageFiles,
609
+ };
610
+ // Set next token if there are more results
611
+ if (matchingFiles.length > validatedMaxResults || hasMore) {
612
+ const lastFile = pageFiles[pageFiles.length - 1];
613
+ if (lastFile) {
614
+ result.nextToken = lastFile.name;
615
+ }
616
+ }
617
+ return result;
618
+ }
619
+ catch (error) {
620
+ return {
621
+ success: false,
622
+ error: error instanceof Error ? error.message : 'Failed to list files',
623
+ };
624
+ }
625
+ }
626
+ }
627
+ exports.LocalStorageDriver = LocalStorageDriver;
628
+ //# sourceMappingURL=local.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.driver.js","sourceRoot":"","sources":["../../../src/drivers/local.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.driver.d.ts","sourceRoot":"","sources":["../../../src/drivers/s3.driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAY,MAAM,2BAA2B,CAAC;AAGvL;;;;;;;;;GASG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,aAAa;IAqBjC;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6D3F;;;;;;OAMG;YACW,gBAAgB;IAyD9B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+C/G;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgCpE;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwChD;;;;;OAKG;IACY,wBAAwB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAqEhC;;;;;OAKG;IACG,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,GAAE,MAAa,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,eAAe,CAAC;CAwC5B;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,eAAe;gBAC/C,MAAM,EAAE,aAAa;IAIjC;;;;;;;;;;OAUG;IACY,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA2BtG"}