express-storage 2.0.3 → 3.0.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 (125) hide show
  1. package/README.md +366 -34
  2. package/dist/cjs/config/index.d.ts +10 -0
  3. package/dist/cjs/config/index.d.ts.map +1 -0
  4. package/dist/cjs/config/index.js +19 -0
  5. package/dist/cjs/config/index.js.map +1 -0
  6. package/dist/cjs/drivers/azure.driver.d.ts +27 -42
  7. package/dist/cjs/drivers/azure.driver.d.ts.map +1 -1
  8. package/dist/cjs/drivers/azure.driver.js +206 -212
  9. package/dist/cjs/drivers/azure.driver.js.map +1 -1
  10. package/dist/cjs/drivers/base.driver.d.ts +69 -103
  11. package/dist/cjs/drivers/base.driver.d.ts.map +1 -1
  12. package/dist/cjs/drivers/base.driver.js +170 -167
  13. package/dist/cjs/drivers/base.driver.js.map +1 -1
  14. package/dist/cjs/drivers/gcs.driver.d.ts +20 -38
  15. package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -1
  16. package/dist/cjs/drivers/gcs.driver.js +160 -176
  17. package/dist/cjs/drivers/gcs.driver.js.map +1 -1
  18. package/dist/cjs/drivers/index.d.ts +15 -0
  19. package/dist/cjs/drivers/index.d.ts.map +1 -0
  20. package/dist/cjs/drivers/index.js +26 -0
  21. package/dist/cjs/drivers/index.js.map +1 -0
  22. package/dist/cjs/drivers/local.driver.d.ts +24 -45
  23. package/dist/cjs/drivers/local.driver.d.ts.map +1 -1
  24. package/dist/cjs/drivers/local.driver.js +266 -338
  25. package/dist/cjs/drivers/local.driver.js.map +1 -1
  26. package/dist/cjs/drivers/s3.driver.d.ts +19 -39
  27. package/dist/cjs/drivers/s3.driver.d.ts.map +1 -1
  28. package/dist/cjs/drivers/s3.driver.js +205 -197
  29. package/dist/cjs/drivers/s3.driver.js.map +1 -1
  30. package/dist/cjs/factory/driver.factory.d.ts +32 -51
  31. package/dist/cjs/factory/driver.factory.d.ts.map +1 -1
  32. package/dist/cjs/factory/driver.factory.js +75 -155
  33. package/dist/cjs/factory/driver.factory.js.map +1 -1
  34. package/dist/cjs/index.d.ts +11 -15
  35. package/dist/cjs/index.d.ts.map +1 -1
  36. package/dist/cjs/index.js +14 -47
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/storage-manager.d.ts +107 -125
  39. package/dist/cjs/storage-manager.d.ts.map +1 -1
  40. package/dist/cjs/storage-manager.js +346 -416
  41. package/dist/cjs/storage-manager.js.map +1 -1
  42. package/dist/cjs/types/storage.types.d.ts +250 -107
  43. package/dist/cjs/types/storage.types.d.ts.map +1 -1
  44. package/dist/cjs/utils/file.utils.d.ts +62 -8
  45. package/dist/cjs/utils/file.utils.d.ts.map +1 -1
  46. package/dist/cjs/utils/file.utils.js +196 -29
  47. package/dist/cjs/utils/file.utils.js.map +1 -1
  48. package/dist/cjs/utils/index.d.ts +12 -0
  49. package/dist/cjs/utils/index.d.ts.map +1 -0
  50. package/dist/cjs/utils/index.js +36 -0
  51. package/dist/cjs/utils/index.js.map +1 -0
  52. package/dist/cjs/utils/rate-limiter.d.ts +40 -0
  53. package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
  54. package/dist/cjs/utils/rate-limiter.js +87 -0
  55. package/dist/cjs/utils/rate-limiter.js.map +1 -0
  56. package/dist/esm/config/index.d.ts +10 -0
  57. package/dist/esm/config/index.d.ts.map +1 -0
  58. package/dist/esm/config/index.js +10 -0
  59. package/dist/esm/config/index.js.map +1 -0
  60. package/dist/esm/drivers/azure.driver.d.ts +27 -42
  61. package/dist/esm/drivers/azure.driver.d.ts.map +1 -1
  62. package/dist/esm/drivers/azure.driver.js +172 -210
  63. package/dist/esm/drivers/azure.driver.js.map +1 -1
  64. package/dist/esm/drivers/base.driver.d.ts +69 -103
  65. package/dist/esm/drivers/base.driver.d.ts.map +1 -1
  66. package/dist/esm/drivers/base.driver.js +171 -168
  67. package/dist/esm/drivers/base.driver.js.map +1 -1
  68. package/dist/esm/drivers/gcs.driver.d.ts +20 -38
  69. package/dist/esm/drivers/gcs.driver.d.ts.map +1 -1
  70. package/dist/esm/drivers/gcs.driver.js +126 -174
  71. package/dist/esm/drivers/gcs.driver.js.map +1 -1
  72. package/dist/esm/drivers/index.d.ts +15 -0
  73. package/dist/esm/drivers/index.d.ts.map +1 -0
  74. package/dist/esm/drivers/index.js +15 -0
  75. package/dist/esm/drivers/index.js.map +1 -0
  76. package/dist/esm/drivers/local.driver.d.ts +24 -45
  77. package/dist/esm/drivers/local.driver.d.ts.map +1 -1
  78. package/dist/esm/drivers/local.driver.js +266 -338
  79. package/dist/esm/drivers/local.driver.js.map +1 -1
  80. package/dist/esm/drivers/s3.driver.d.ts +19 -39
  81. package/dist/esm/drivers/s3.driver.d.ts.map +1 -1
  82. package/dist/esm/drivers/s3.driver.js +171 -195
  83. package/dist/esm/drivers/s3.driver.js.map +1 -1
  84. package/dist/esm/factory/driver.factory.d.ts +32 -51
  85. package/dist/esm/factory/driver.factory.d.ts.map +1 -1
  86. package/dist/esm/factory/driver.factory.js +73 -158
  87. package/dist/esm/factory/driver.factory.js.map +1 -1
  88. package/dist/esm/index.d.ts +11 -15
  89. package/dist/esm/index.d.ts.map +1 -1
  90. package/dist/esm/index.js +12 -19
  91. package/dist/esm/index.js.map +1 -1
  92. package/dist/esm/storage-manager.d.ts +107 -125
  93. package/dist/esm/storage-manager.d.ts.map +1 -1
  94. package/dist/esm/storage-manager.js +348 -418
  95. package/dist/esm/storage-manager.js.map +1 -1
  96. package/dist/esm/types/storage.types.d.ts +250 -107
  97. package/dist/esm/types/storage.types.d.ts.map +1 -1
  98. package/dist/esm/utils/file.utils.d.ts +62 -8
  99. package/dist/esm/utils/file.utils.d.ts.map +1 -1
  100. package/dist/esm/utils/file.utils.js +190 -29
  101. package/dist/esm/utils/file.utils.js.map +1 -1
  102. package/dist/esm/utils/index.d.ts +12 -0
  103. package/dist/esm/utils/index.d.ts.map +1 -0
  104. package/dist/esm/utils/index.js +11 -0
  105. package/dist/esm/utils/index.js.map +1 -0
  106. package/dist/esm/utils/rate-limiter.d.ts +40 -0
  107. package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
  108. package/dist/esm/utils/rate-limiter.js +82 -0
  109. package/dist/esm/utils/rate-limiter.js.map +1 -0
  110. package/package.json +83 -48
  111. package/src/config/index.ts +17 -0
  112. package/src/drivers/azure.driver.ts +434 -0
  113. package/src/drivers/base.driver.ts +436 -0
  114. package/src/drivers/gcs.driver.ts +366 -0
  115. package/src/drivers/index.ts +15 -0
  116. package/src/drivers/local.driver.ts +626 -0
  117. package/src/drivers/s3.driver.ts +459 -0
  118. package/src/factory/driver.factory.ts +101 -0
  119. package/src/index.ts +72 -0
  120. package/src/storage-manager.ts +801 -0
  121. package/src/types/storage.types.ts +561 -0
  122. package/src/utils/config.utils.ts +229 -0
  123. package/src/utils/file.utils.ts +536 -0
  124. package/src/utils/index.ts +35 -0
  125. package/src/utils/rate-limiter.ts +94 -0
@@ -1,5 +1,23 @@
1
- import { Storage } from '@google-cloud/storage';
2
1
  import { BaseStorageDriver } from './base.driver.js';
2
+ import { encodePathSegments } from '../utils/file.utils.js';
3
+ function parseGcsFileSize(size) {
4
+ if (size === undefined || size === null)
5
+ return undefined;
6
+ const parsed = typeof size === 'string' ? parseInt(size, 10) : Number(size);
7
+ return Number.isNaN(parsed) ? undefined : parsed;
8
+ }
9
+ // Lazy SDK loader — module is imported on first use, not at import time.
10
+ let _gcsMod;
11
+ function loadGCSSDK() {
12
+ if (!_gcsMod) {
13
+ _gcsMod = import('@google-cloud/storage').catch(() => {
14
+ _gcsMod = undefined;
15
+ throw new Error('@google-cloud/storage is required for GCS storage.\n' +
16
+ 'Install: npm install @google-cloud/storage');
17
+ });
18
+ }
19
+ return _gcsMod;
20
+ }
3
21
  /**
4
22
  * GCSStorageDriver - Handles file operations with Google Cloud Storage.
5
23
  *
@@ -9,37 +27,65 @@ import { BaseStorageDriver } from './base.driver.js';
9
27
  *
10
28
  * If you're running on GCP (Cloud Run, GKE, etc.), you usually don't need
11
29
  * to provide credentials — the SDK picks them up automatically.
30
+ *
31
+ * When driver is 'gcs-presigned', upload() returns presigned URLs
32
+ * instead of uploading directly.
33
+ *
34
+ * Required package: @google-cloud/storage
12
35
  */
13
36
  export class GCSStorageDriver extends BaseStorageDriver {
37
+ _storage;
38
+ _bucket;
39
+ bucketName;
40
+ projectId;
14
41
  constructor(config) {
15
42
  super(config);
43
+ if (!config.bucketName) {
44
+ throw new Error('bucketName is required for GCS. Set BUCKET_NAME environment variable or pass bucketName in credentials.');
45
+ }
46
+ if (!config.gcsProjectId) {
47
+ throw new Error('gcsProjectId is required for GCS. Set GCS_PROJECT_ID environment variable or pass gcsProjectId in credentials.');
48
+ }
16
49
  this.bucketName = config.bucketName;
17
50
  this.projectId = config.gcsProjectId;
51
+ }
52
+ async ensureBucket() {
53
+ if (this._bucket)
54
+ return this._bucket;
55
+ const { Storage } = await loadGCSSDK();
18
56
  const storageOptions = {
19
57
  projectId: this.projectId,
20
58
  };
21
- if (config.gcsCredentials) {
22
- storageOptions.keyFilename = config.gcsCredentials;
59
+ if (this.config.gcsCredentials) {
60
+ storageOptions.keyFilename = this.config.gcsCredentials;
23
61
  }
24
- this.storage = new Storage(storageOptions);
25
- this.bucket = this.storage.bucket(this.bucketName);
62
+ this._storage = new Storage(storageOptions);
63
+ this._bucket = this._storage.bucket(this.bucketName);
64
+ return this._bucket;
65
+ }
66
+ destroy() {
67
+ this._storage = undefined;
68
+ this._bucket = undefined;
26
69
  }
27
70
  /**
28
- * Uploads a file directly to GCS.
29
- * Handles both memory and disk storage from Multer.
71
+ * Uploads a file to GCS, or returns a presigned URL when in presigned mode.
30
72
  *
31
73
  * For large files (>100MB), uses streaming upload to reduce
32
74
  * memory usage and improve reliability.
33
75
  */
34
76
  async upload(file, options) {
77
+ if (this.presignedMode) {
78
+ return this.presignedUpload(file);
79
+ }
35
80
  try {
36
- const validationErrors = this.validateFile(file);
81
+ const { errors: validationErrors, resolvedSize } = await this.validateFile(file);
37
82
  if (validationErrors.length > 0) {
38
- return this.createErrorResult(validationErrors.join(', '));
83
+ return this.createErrorResult(validationErrors.join(', '), 'VALIDATION_FAILED');
39
84
  }
40
85
  const fileName = this.generateFileName(file.originalname);
41
86
  const filePath = this.buildFilePath(fileName);
42
- const gcsFile = this.bucket.file(filePath);
87
+ const bucket = await this.ensureBucket();
88
+ const gcsFile = bucket.file(filePath);
43
89
  const metadata = {
44
90
  contentType: options?.contentType || file.mimetype,
45
91
  };
@@ -52,38 +98,33 @@ export class GCSStorageDriver extends BaseStorageDriver {
52
98
  if (options?.metadata) {
53
99
  metadata.metadata = options.metadata;
54
100
  }
55
- // Use streaming upload for large files to reduce memory usage
56
- if (this.shouldUseStreaming(file)) {
101
+ options?.signal?.throwIfAborted();
102
+ if (this.shouldUseStreaming(resolvedSize)) {
57
103
  await this.uploadWithStream(gcsFile, file, metadata);
58
104
  }
59
105
  else {
60
- const fileContent = this.getFileContent(file);
106
+ const fileContent = await this.getFileContent(file);
61
107
  await gcsFile.save(fileContent, { metadata });
62
108
  }
63
- // Build the public URL with proper encoding
64
- const encodedPath = filePath.split('/').map(segment => encodeURIComponent(segment)).join('/');
65
- const fileUrl = `https://storage.googleapis.com/${this.bucketName}/${encodedPath}`;
109
+ const fileUrl = `https://storage.googleapis.com/${this.bucketName}/${encodePathSegments(filePath)}`;
66
110
  return this.createSuccessResult(filePath, fileUrl);
67
111
  }
68
112
  catch (error) {
113
+ await this.cleanupTempFile(file);
69
114
  return this.createErrorResult(error instanceof Error ? error.message : 'Failed to upload file to GCS');
70
115
  }
71
116
  }
72
117
  /**
73
118
  * Uploads a large file using streaming.
74
- *
75
- * This method pipes the file stream directly to GCS, which is more
76
- * memory-efficient for large files.
119
+ * Pipes the file stream directly to GCS for memory efficiency.
77
120
  */
78
121
  async uploadWithStream(gcsFile, file, metadata) {
79
122
  return new Promise((resolve, reject) => {
80
123
  const fileStream = this.getFileStream(file);
81
124
  const writeStream = gcsFile.createWriteStream({
82
125
  metadata,
83
- resumable: true, // Enable resumable uploads for reliability
126
+ resumable: true,
84
127
  });
85
- // Handle errors from the source stream (fileStream) explicitly
86
- // to ensure they propagate and don't get silently dropped
87
128
  fileStream.on('error', reject);
88
129
  fileStream
89
130
  .pipe(writeStream)
@@ -97,24 +138,12 @@ export class GCSStorageDriver extends BaseStorageDriver {
97
138
  * The URL enforces:
98
139
  * - Exact content type
99
140
  * - Exact file size (via x-goog-content-length-range header)
100
- *
101
- * Clients that try to upload different content will get a 403.
102
141
  */
103
142
  async generateUploadUrl(fileName, contentType, fileSize) {
104
- // Security: Defense-in-depth validation (StorageManager also validates)
105
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
106
- let decodedFileName;
107
143
  try {
108
- decodedFileName = decodeURIComponent(fileName);
109
- }
110
- catch {
111
- return this.createPresignedErrorResult('Invalid fileName: malformed URL encoding');
112
- }
113
- if (decodedFileName.includes('..') || decodedFileName.includes('\0')) {
114
- return this.createPresignedErrorResult('Invalid fileName: path traversal sequences are not allowed');
115
- }
116
- try {
117
- const gcsFile = this.bucket.file(decodedFileName);
144
+ const decodedFileName = this.decodeFileName(fileName);
145
+ const bucket = await this.ensureBucket();
146
+ const gcsFile = bucket.file(decodedFileName);
118
147
  const resolvedContentType = contentType || 'application/octet-stream';
119
148
  const expiresOn = new Date(Date.now() + (this.getPresignedUrlExpiry() * 1000));
120
149
  const options = {
@@ -123,7 +152,6 @@ export class GCSStorageDriver extends BaseStorageDriver {
123
152
  expires: expiresOn,
124
153
  contentType: resolvedContentType,
125
154
  };
126
- // GCS enforces exact file size via this header
127
155
  if (fileSize !== undefined) {
128
156
  options.extensionHeaders = {
129
157
  'x-goog-content-length-range': `${fileSize},${fileSize}`,
@@ -140,20 +168,10 @@ export class GCSStorageDriver extends BaseStorageDriver {
140
168
  * Creates a presigned URL for downloading/viewing a file.
141
169
  */
142
170
  async generateViewUrl(fileName) {
143
- // Security: Defense-in-depth validation
144
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
145
- let decodedFileName;
146
171
  try {
147
- decodedFileName = decodeURIComponent(fileName);
148
- }
149
- catch {
150
- return this.createPresignedErrorResult('Invalid fileName: malformed URL encoding');
151
- }
152
- if (decodedFileName.includes('..') || decodedFileName.includes('\0')) {
153
- return this.createPresignedErrorResult('Invalid fileName: path traversal sequences are not allowed');
154
- }
155
- try {
156
- const gcsFile = this.bucket.file(decodedFileName);
172
+ const decodedFileName = this.decodeFileName(fileName);
173
+ const bucket = await this.ensureBucket();
174
+ const gcsFile = bucket.file(decodedFileName);
157
175
  const expiresOn = new Date(Date.now() + (this.getPresignedUrlExpiry() * 1000));
158
176
  const [viewUrl] = await gcsFile.getSignedUrl({
159
177
  version: 'v4',
@@ -168,107 +186,83 @@ export class GCSStorageDriver extends BaseStorageDriver {
168
186
  }
169
187
  /**
170
188
  * Deletes a file from GCS.
171
- * Returns false if the file doesn't exist, throws on real errors.
172
189
  */
173
190
  async delete(fileName) {
174
- // Security: Defense-in-depth validation
175
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
176
- let decodedFileName;
177
191
  try {
178
- decodedFileName = decodeURIComponent(fileName);
179
- }
180
- catch {
181
- return false;
182
- }
183
- if (decodedFileName.includes('..') || decodedFileName.includes('\0')) {
184
- return false;
192
+ const decodedFileName = this.decodeFileName(fileName);
193
+ const bucket = await this.ensureBucket();
194
+ const gcsFile = bucket.file(decodedFileName);
195
+ const [exists] = await gcsFile.exists();
196
+ if (!exists) {
197
+ return { success: false, reference: fileName, error: 'File not found', code: 'FILE_NOT_FOUND' };
198
+ }
199
+ await gcsFile.delete();
200
+ return { success: true, reference: fileName };
185
201
  }
186
- const gcsFile = this.bucket.file(decodedFileName);
187
- const [exists] = await gcsFile.exists();
188
- if (!exists) {
189
- return false;
202
+ catch (error) {
203
+ return { success: false, reference: fileName, error: error instanceof Error ? error.message : 'Failed to delete file', code: 'PROVIDER_ERROR' };
190
204
  }
191
- await gcsFile.delete();
192
- return true;
193
205
  }
194
206
  /**
195
207
  * Confirms an upload and optionally validates the file.
196
- *
197
- * For GCS, validation is optional since constraints are enforced at URL level.
198
- * But you can still use this to verify the file matches expectations.
208
+ * Uses shared validation logic from BaseStorageDriver.
199
209
  */
200
210
  async validateAndConfirmUpload(reference, options) {
201
- const deleteOnFailure = options?.deleteOnFailure !== false;
202
211
  try {
203
- const gcsFile = this.bucket.file(reference);
212
+ const bucket = await this.ensureBucket();
213
+ const gcsFile = bucket.file(reference);
204
214
  const [metadata] = await gcsFile.getMetadata();
205
- const actualContentType = metadata.contentType;
206
- let actualFileSize;
207
- if (metadata.size !== undefined) {
208
- const parsed = typeof metadata.size === 'string' ? parseInt(metadata.size, 10) : metadata.size;
209
- actualFileSize = Number.isNaN(parsed) ? undefined : parsed;
210
- }
211
- // Validate content type if expected
212
- if (options?.expectedContentType && actualContentType !== options.expectedContentType) {
213
- if (deleteOnFailure) {
214
- await this.delete(reference);
215
- }
216
- const errorResult = {
217
- success: false,
218
- error: `Content type mismatch: expected '${options.expectedContentType}', got '${actualContentType}'${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
219
- };
220
- if (actualContentType)
221
- errorResult.actualContentType = actualContentType;
222
- if (actualFileSize !== undefined)
223
- errorResult.actualFileSize = actualFileSize;
224
- return errorResult;
225
- }
226
- // Validate file size if expected
227
- if (options?.expectedFileSize !== undefined && actualFileSize !== options.expectedFileSize) {
228
- if (deleteOnFailure) {
229
- await this.delete(reference);
230
- }
231
- const errorResult = {
232
- success: false,
233
- error: `File size mismatch: expected ${options.expectedFileSize} bytes, got ${actualFileSize} bytes${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
234
- };
235
- if (actualContentType)
236
- errorResult.actualContentType = actualContentType;
237
- if (actualFileSize !== undefined)
238
- errorResult.actualFileSize = actualFileSize;
239
- return errorResult;
240
- }
241
- const viewResult = await this.generateViewUrl(reference);
242
- const result = {
243
- success: true,
244
- reference,
245
- expiresIn: this.getPresignedUrlExpiry(),
215
+ const actual = {
216
+ contentType: metadata.contentType,
217
+ fileSize: parseGcsFileSize(metadata.size),
246
218
  };
247
- if (viewResult.viewUrl) {
248
- result.viewUrl = viewResult.viewUrl;
249
- }
250
- if (actualContentType) {
251
- result.actualContentType = actualContentType;
252
- }
253
- if (actualFileSize !== undefined) {
254
- result.actualFileSize = actualFileSize;
255
- }
256
- return result;
219
+ const validationError = await this.checkUploadedFileMetadata(reference, actual, options);
220
+ if (validationError)
221
+ return validationError;
222
+ const viewResult = await this.generateViewUrl(reference);
223
+ return this.buildValidationSuccess(reference, viewResult.success ? viewResult.viewUrl : undefined, actual.contentType, actual.fileSize);
257
224
  }
258
225
  catch (error) {
259
- const errorMessage = error instanceof Error ? error.message : 'File not found or access denied';
260
226
  return {
261
227
  success: false,
262
- error: errorMessage,
228
+ error: error instanceof Error ? error.message : 'File not found or access denied',
229
+ code: 'FILE_NOT_FOUND',
263
230
  };
264
231
  }
265
232
  }
233
+ /**
234
+ * Returns metadata about a file from GCS without downloading it.
235
+ */
236
+ async getMetadata(reference) {
237
+ try {
238
+ const decoded = this.decodeFileName(reference);
239
+ const bucket = await this.ensureBucket();
240
+ const gcsFile = bucket.file(decoded);
241
+ const [exists] = await gcsFile.exists();
242
+ if (!exists)
243
+ return null;
244
+ const [metadata] = await gcsFile.getMetadata();
245
+ const info = { name: reference };
246
+ const size = parseGcsFileSize(metadata.size);
247
+ if (size !== undefined)
248
+ info.size = size;
249
+ if (metadata.contentType)
250
+ info.contentType = metadata.contentType;
251
+ if (metadata.updated)
252
+ info.lastModified = new Date(metadata.updated);
253
+ return info;
254
+ }
255
+ catch {
256
+ return null;
257
+ }
258
+ }
266
259
  /**
267
260
  * Lists files in the bucket with optional prefix filtering and pagination.
268
261
  */
269
262
  async listFiles(prefix, maxResults = 1000, continuationToken) {
270
263
  try {
271
- const validatedMaxResults = Math.floor(Math.max(1, Math.min(Number.isNaN(maxResults) ? 1000 : maxResults, 1000)));
264
+ const validatedMaxResults = this.validateMaxResults(maxResults);
265
+ const bucket = await this.ensureBucket();
272
266
  const options = {
273
267
  maxResults: validatedMaxResults,
274
268
  };
@@ -276,15 +270,12 @@ export class GCSStorageDriver extends BaseStorageDriver {
276
270
  options.prefix = prefix;
277
271
  if (continuationToken)
278
272
  options.pageToken = continuationToken;
279
- const [files, , apiResponse] = await this.bucket.getFiles(options);
273
+ const [files, , apiResponse] = await bucket.getFiles(options);
280
274
  const fileList = files.map((file) => {
281
275
  const fileInfo = { name: file.name };
282
- if (file.metadata.size) {
283
- const parsed = parseInt(String(file.metadata.size), 10);
284
- if (!Number.isNaN(parsed)) {
285
- fileInfo.size = parsed;
286
- }
287
- }
276
+ const size = parseGcsFileSize(file.metadata.size);
277
+ if (size !== undefined)
278
+ fileInfo.size = size;
288
279
  if (file.metadata.contentType) {
289
280
  fileInfo.contentType = file.metadata.contentType;
290
281
  }
@@ -307,48 +298,9 @@ export class GCSStorageDriver extends BaseStorageDriver {
307
298
  return {
308
299
  success: false,
309
300
  error: error instanceof Error ? error.message : 'Failed to list files',
301
+ code: 'PROVIDER_ERROR',
310
302
  };
311
303
  }
312
304
  }
313
305
  }
314
- /**
315
- * GCSPresignedStorageDriver - GCS driver that returns presigned URLs from upload().
316
- *
317
- * Use this when you want clients to upload directly to GCS without
318
- * the file passing through your server.
319
- */
320
- export class GCSPresignedStorageDriver extends GCSStorageDriver {
321
- constructor(config) {
322
- super(config);
323
- }
324
- /**
325
- * Instead of uploading the file, returns a presigned URL for the client to use.
326
- *
327
- * The returned fileUrl is the presigned upload URL.
328
- * After the client uploads, use validateAndConfirmUpload() to get a view URL.
329
- *
330
- * Note: The `options` parameter (metadata, cacheControl, etc.) is NOT applied
331
- * when using presigned uploads. These options must be set by the client when
332
- * making the actual upload request to GCS, or configured via bucket settings.
333
- * For server-side uploads with full options support, use the regular 'gcs' driver.
334
- */
335
- async upload(file, _options) {
336
- try {
337
- const validationErrors = this.validateFile(file);
338
- if (validationErrors.length > 0) {
339
- return this.createErrorResult(validationErrors.join(', '));
340
- }
341
- const fileName = this.generateFileName(file.originalname);
342
- const filePath = this.buildFilePath(fileName);
343
- const presignedResult = await this.generateUploadUrl(filePath, file.mimetype, file.size);
344
- if (!presignedResult.success) {
345
- return this.createErrorResult(presignedResult.error || 'Failed to generate presigned URL');
346
- }
347
- return this.createSuccessResult(filePath, presignedResult.uploadUrl);
348
- }
349
- catch (error) {
350
- return this.createErrorResult(error instanceof Error ? error.message : 'Failed to generate presigned URL');
351
- }
352
- }
353
- }
354
306
  //# sourceMappingURL=gcs.driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gcs.driver.js","sourceRoot":"","sources":["../../../src/drivers/gcs.driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gcs.driver.js","sourceRoot":"","sources":["../../../src/drivers/gcs.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * express-storage/drivers
3
+ *
4
+ * Driver classes, factory, and base class for custom driver implementations.
5
+ *
6
+ * @example
7
+ * import { BaseStorageDriver, createDriver } from 'express-storage/drivers';
8
+ */
9
+ export { BaseStorageDriver } from './base.driver.js';
10
+ export { LocalStorageDriver } from './local.driver.js';
11
+ export { S3StorageDriver } from './s3.driver.js';
12
+ export { GCSStorageDriver } from './gcs.driver.js';
13
+ export { AzureStorageDriver } from './azure.driver.js';
14
+ export { StorageDriverFactory, createDriver, getAvailableDrivers } from '../factory/driver.factory.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * express-storage/drivers
3
+ *
4
+ * Driver classes, factory, and base class for custom driver implementations.
5
+ *
6
+ * @example
7
+ * import { BaseStorageDriver, createDriver } from 'express-storage/drivers';
8
+ */
9
+ export { BaseStorageDriver } from './base.driver.js';
10
+ export { LocalStorageDriver } from './local.driver.js';
11
+ export { S3StorageDriver } from './s3.driver.js';
12
+ export { GCSStorageDriver } from './gcs.driver.js';
13
+ export { AzureStorageDriver } from './azure.driver.js';
14
+ export { StorageDriverFactory, createDriver, getAvailableDrivers } from '../factory/driver.factory.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { BaseStorageDriver } from './base.driver.js';
2
- import { FileUploadResult, PresignedUrlResult, StorageConfig, ListFilesResult, UploadOptions } from '../types/storage.types.js';
2
+ import { FileUploadResult, PresignedUrlResult, StorageConfig, ListFilesResult, UploadOptions, FileInfo, BlobValidationOptions, BlobValidationResult, DeleteResult } from '../types/storage.types.js';
3
3
  /**
4
4
  * LocalStorageDriver - Saves files to your local filesystem.
5
5
  *
@@ -12,50 +12,33 @@ import { FileUploadResult, PresignedUrlResult, StorageConfig, ListFilesResult, U
12
12
  * - Magic byte detection for content-type validation (prevents extension spoofing)
13
13
  * - Files stay within the configured base directory
14
14
  *
15
- * **Symlink behavior:** This driver explicitly rejects symlinks for security.
16
- * If a file is a symlink, it will not be read, deleted, or listed. This prevents
17
- * attackers from using symlinks to access files outside the storage directory.
18
- *
19
15
  * Note: Local storage doesn't support presigned URLs since
20
16
  * there's no external service to sign requests against.
21
17
  */
22
18
  export declare class LocalStorageDriver extends BaseStorageDriver {
23
- private basePath;
19
+ private readonly basePath;
20
+ private readonly originalLocalPath;
24
21
  constructor(config: StorageConfig);
25
22
  /**
26
23
  * Saves a file to the local filesystem.
27
24
  *
28
25
  * Files are automatically organized into YYYY/MM folders.
29
- * For example, a file uploaded in January 2026 goes into:
30
- * {basePath}/2026/01/{unique_filename}.jpg
31
- *
32
- * For large files (>100MB), uses streaming to reduce memory usage
33
- * and prevent application crashes.
26
+ * For large files (>100MB), uses streaming to reduce memory usage.
34
27
  */
35
- upload(file: Express.Multer.File, _options?: UploadOptions): Promise<FileUploadResult>;
28
+ upload(file: Express.Multer.File, options?: UploadOptions): Promise<FileUploadResult>;
36
29
  /**
37
30
  * Uploads a large file using streaming.
38
- *
39
- * This method pipes the file stream directly to disk, which is more
40
- * memory-efficient for large files (>100MB).
31
+ * Pipes the file stream directly to disk for memory efficiency.
41
32
  */
42
33
  private uploadWithStream;
43
34
  /**
44
35
  * Builds a URL for accessing the file.
45
36
  *
46
- * If your basePath starts with 'public/', we strip that prefix
47
- * since Express.static('public') serves files from /
48
- *
49
- * Example: public/uploads/2026/01/photo.jpg -> /uploads/2026/01/photo.jpg
37
+ * If basePath starts with 'public/', strips that prefix since
38
+ * Express.static('public') serves files from /
50
39
  */
51
40
  private generateFileUrl;
52
- /**
53
- * Converts Windows backslashes to forward slashes.
54
- */
55
41
  private normalizePathSeparators;
56
- /**
57
- * Removes duplicate slashes from URLs.
58
- */
59
42
  private normalizeUrl;
60
43
  /**
61
44
  * Local storage doesn't support presigned upload URLs.
@@ -71,36 +54,32 @@ export declare class LocalStorageDriver extends BaseStorageDriver {
71
54
  * Content type detection uses a two-tier approach:
72
55
  * 1. Magic byte detection (examines actual file content for security)
73
56
  * 2. Extension-based fallback (when magic bytes don't match)
74
- *
75
- * This helps detect extension spoofing attacks where a malicious file
76
- * is renamed with an innocent extension (e.g., malware.exe -> photo.jpg).
77
57
  */
78
- validateAndConfirmUpload(reference: string, options?: import('../types/storage.types.js').BlobValidationOptions): Promise<import('../types/storage.types.js').BlobValidationResult>;
58
+ validateAndConfirmUpload(reference: string, options?: BlobValidationOptions): Promise<BlobValidationResult>;
79
59
  /**
80
60
  * Deletes a file from local storage.
81
61
  *
82
- * Security checks:
83
- * - Rejects path traversal attempts (../ sequences)
84
- * - Rejects null bytes in paths
85
- * - Verifies target stays within base directory
86
- * - Won't follow or delete symlinks (security: prevents directory escape attacks)
87
- * - Only deletes regular files (not directories)
88
- *
89
- * @param reference - The file path relative to the storage base directory
90
- * @returns true if file was deleted, false if not found or security check failed
62
+ * Security: decodeFileName() rejects traversal/encoding attacks.
63
+ * Containment check ensures resolved path stays within basePath.
64
+ * Symlinks and non-files are rejected.
91
65
  */
92
- delete(reference: string): Promise<boolean>;
66
+ delete(reference: string): Promise<DeleteResult>;
93
67
  /**
94
- * Safely resolves a reference to a file path within our base directory.
95
- * Returns null for any suspicious input.
68
+ * Resolves a decoded reference to a verified file path within basePath.
69
+ * Checks containment (path stays inside basePath), rejects symlinks,
70
+ * and verifies the target is a regular file.
71
+ *
72
+ * Callers are responsible for decoding/validating the reference first
73
+ * (via decodeFileName or StorageManager's hasPathTraversal check).
96
74
  */
97
75
  private resolveFilePath;
76
+ /**
77
+ * Returns metadata about a file without downloading it.
78
+ * Uses magic byte detection for accurate content type identification.
79
+ */
80
+ getMetadata(reference: string): Promise<FileInfo | null>;
98
81
  /**
99
82
  * Lists files in local storage with optional prefix filtering and pagination.
100
- *
101
- * Uses early termination to avoid loading all files into memory when possible.
102
- * Files are collected in sorted order and iteration stops once we have enough
103
- * results for the requested page.
104
83
  */
105
84
  listFiles(prefix?: string, maxResults?: number, continuationToken?: string): Promise<ListFilesResult>;
106
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local.driver.d.ts","sourceRoot":"","sources":["../../../src/drivers/local.driver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAY,MAAM,2BAA2B,CAAC;AA0I1I;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa;IAKjC;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwC5F;;;;;OAKG;YACW,gBAAgB;IAmC9B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMjH;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMrE;;;;;;;;;OASG;IACY,wBAAwB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,2BAA2B,EAAE,qBAAqB,GAClE,OAAO,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,CAAC;IAgFpE;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDjD;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuCvB;;;;;;OAMG;IACG,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,GAAE,MAAa,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,eAAe,CAAC;CA2L5B"}
1
+ {"version":3,"file":"local.driver.d.ts","sourceRoot":"","sources":["../../../src/drivers/local.driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,oBAAoB,EAAyB,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAoR5N;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,MAAM,EAAE,aAAa;IAMjC;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgD3F;;;OAGG;YACW,gBAAgB;IAqB9B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,YAAY;IAIpB;;OAEG;IAEG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOjH;;OAEG;IAEG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOrE;;;;;;OAMG;IACY,wBAAwB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;;;;;OAMG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgCtD;;;;;;;OAOG;YACW,eAAe;IA0B7B;;;OAGG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAsB9D;;OAEG;IACG,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,GAAE,MAAa,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,eAAe,CAAC;CAuC5B"}