express-storage 2.0.2 → 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 (177) 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 +73 -0
  7. package/dist/cjs/drivers/azure.driver.d.ts.map +1 -0
  8. package/dist/cjs/drivers/azure.driver.js +390 -0
  9. package/dist/cjs/drivers/azure.driver.js.map +1 -0
  10. package/dist/cjs/drivers/base.driver.d.ts +136 -0
  11. package/dist/cjs/drivers/base.driver.d.ts.map +1 -0
  12. package/dist/cjs/drivers/base.driver.js +357 -0
  13. package/dist/cjs/drivers/base.driver.js.map +1 -0
  14. package/dist/{drivers → cjs/drivers}/gcs.driver.d.ts +20 -38
  15. package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -0
  16. package/dist/cjs/drivers/gcs.driver.js +343 -0
  17. package/dist/cjs/drivers/gcs.driver.js.map +1 -0
  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 +86 -0
  23. package/dist/cjs/drivers/local.driver.d.ts.map +1 -0
  24. package/dist/cjs/drivers/local.driver.js +556 -0
  25. package/dist/cjs/drivers/local.driver.js.map +1 -0
  26. package/dist/{drivers → cjs/drivers}/s3.driver.d.ts +19 -39
  27. package/dist/cjs/drivers/s3.driver.d.ts.map +1 -0
  28. package/dist/cjs/drivers/s3.driver.js +400 -0
  29. package/dist/cjs/drivers/s3.driver.js.map +1 -0
  30. package/dist/cjs/factory/driver.factory.d.ts +43 -0
  31. package/dist/cjs/factory/driver.factory.d.ts.map +1 -0
  32. package/dist/cjs/factory/driver.factory.js +101 -0
  33. package/dist/cjs/factory/driver.factory.js.map +1 -0
  34. package/dist/cjs/index.d.ts +26 -0
  35. package/dist/cjs/index.d.ts.map +1 -0
  36. package/dist/cjs/index.js +31 -0
  37. package/dist/cjs/index.js.map +1 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/storage-manager.d.ts +210 -0
  40. package/dist/cjs/storage-manager.d.ts.map +1 -0
  41. package/dist/cjs/storage-manager.js +649 -0
  42. package/dist/cjs/storage-manager.js.map +1 -0
  43. package/dist/cjs/types/storage.types.d.ts +438 -0
  44. package/dist/cjs/types/storage.types.d.ts.map +1 -0
  45. package/dist/cjs/types/storage.types.js +3 -0
  46. package/dist/cjs/types/storage.types.js.map +1 -0
  47. package/dist/cjs/utils/config.utils.d.ts.map +1 -0
  48. package/dist/cjs/utils/config.utils.js +213 -0
  49. package/dist/cjs/utils/config.utils.js.map +1 -0
  50. package/dist/{utils → cjs/utils}/file.utils.d.ts +62 -8
  51. package/dist/cjs/utils/file.utils.d.ts.map +1 -0
  52. package/dist/cjs/utils/file.utils.js +464 -0
  53. package/dist/cjs/utils/file.utils.js.map +1 -0
  54. package/dist/cjs/utils/index.d.ts +12 -0
  55. package/dist/cjs/utils/index.d.ts.map +1 -0
  56. package/dist/cjs/utils/index.js +36 -0
  57. package/dist/cjs/utils/index.js.map +1 -0
  58. package/dist/cjs/utils/rate-limiter.d.ts +40 -0
  59. package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
  60. package/dist/cjs/utils/rate-limiter.js +87 -0
  61. package/dist/cjs/utils/rate-limiter.js.map +1 -0
  62. package/dist/esm/config/index.d.ts +10 -0
  63. package/dist/esm/config/index.d.ts.map +1 -0
  64. package/dist/esm/config/index.js +10 -0
  65. package/dist/esm/config/index.js.map +1 -0
  66. package/dist/esm/drivers/azure.driver.d.ts +73 -0
  67. package/dist/esm/drivers/azure.driver.d.ts.map +1 -0
  68. package/dist/esm/drivers/azure.driver.js +353 -0
  69. package/dist/esm/drivers/azure.driver.js.map +1 -0
  70. package/dist/esm/drivers/base.driver.d.ts +136 -0
  71. package/dist/esm/drivers/base.driver.d.ts.map +1 -0
  72. package/dist/esm/drivers/base.driver.js +350 -0
  73. package/dist/esm/drivers/base.driver.js.map +1 -0
  74. package/dist/esm/drivers/gcs.driver.d.ts +68 -0
  75. package/dist/esm/drivers/gcs.driver.d.ts.map +1 -0
  76. package/dist/esm/drivers/gcs.driver.js +306 -0
  77. package/dist/esm/drivers/gcs.driver.js.map +1 -0
  78. package/dist/esm/drivers/index.d.ts +15 -0
  79. package/dist/esm/drivers/index.d.ts.map +1 -0
  80. package/dist/esm/drivers/index.js +15 -0
  81. package/dist/esm/drivers/index.js.map +1 -0
  82. package/dist/esm/drivers/local.driver.d.ts +86 -0
  83. package/dist/esm/drivers/local.driver.d.ts.map +1 -0
  84. package/dist/esm/drivers/local.driver.js +549 -0
  85. package/dist/esm/drivers/local.driver.js.map +1 -0
  86. package/dist/esm/drivers/s3.driver.d.ts +69 -0
  87. package/dist/esm/drivers/s3.driver.d.ts.map +1 -0
  88. package/dist/esm/drivers/s3.driver.js +363 -0
  89. package/dist/esm/drivers/s3.driver.js.map +1 -0
  90. package/dist/esm/factory/driver.factory.d.ts +43 -0
  91. package/dist/esm/factory/driver.factory.d.ts.map +1 -0
  92. package/dist/esm/factory/driver.factory.js +92 -0
  93. package/dist/esm/factory/driver.factory.js.map +1 -0
  94. package/dist/esm/index.d.ts +26 -0
  95. package/dist/esm/index.d.ts.map +1 -0
  96. package/dist/esm/index.js +26 -0
  97. package/dist/esm/index.js.map +1 -0
  98. package/dist/esm/package.json +1 -0
  99. package/dist/esm/storage-manager.d.ts +210 -0
  100. package/dist/esm/storage-manager.d.ts.map +1 -0
  101. package/dist/esm/storage-manager.js +645 -0
  102. package/dist/esm/storage-manager.js.map +1 -0
  103. package/dist/esm/types/storage.types.d.ts +438 -0
  104. package/dist/esm/types/storage.types.d.ts.map +1 -0
  105. package/dist/esm/types/storage.types.js.map +1 -0
  106. package/dist/esm/utils/config.utils.d.ts +45 -0
  107. package/dist/esm/utils/config.utils.d.ts.map +1 -0
  108. package/dist/esm/utils/config.utils.js.map +1 -0
  109. package/dist/esm/utils/file.utils.d.ts +196 -0
  110. package/dist/esm/utils/file.utils.d.ts.map +1 -0
  111. package/dist/esm/utils/file.utils.js +439 -0
  112. package/dist/esm/utils/file.utils.js.map +1 -0
  113. package/dist/esm/utils/index.d.ts +12 -0
  114. package/dist/esm/utils/index.d.ts.map +1 -0
  115. package/dist/esm/utils/index.js +11 -0
  116. package/dist/esm/utils/index.js.map +1 -0
  117. package/dist/esm/utils/rate-limiter.d.ts +40 -0
  118. package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
  119. package/dist/esm/utils/rate-limiter.js +82 -0
  120. package/dist/esm/utils/rate-limiter.js.map +1 -0
  121. package/package.json +90 -52
  122. package/src/config/index.ts +17 -0
  123. package/src/drivers/azure.driver.ts +434 -0
  124. package/src/drivers/base.driver.ts +436 -0
  125. package/src/drivers/gcs.driver.ts +366 -0
  126. package/src/drivers/index.ts +15 -0
  127. package/src/drivers/local.driver.ts +626 -0
  128. package/src/drivers/s3.driver.ts +459 -0
  129. package/src/factory/driver.factory.ts +101 -0
  130. package/src/index.ts +72 -0
  131. package/src/storage-manager.ts +801 -0
  132. package/src/types/storage.types.ts +561 -0
  133. package/src/utils/config.utils.ts +229 -0
  134. package/src/utils/file.utils.ts +536 -0
  135. package/src/utils/index.ts +35 -0
  136. package/src/utils/rate-limiter.ts +94 -0
  137. package/dist/drivers/azure.driver.d.ts +0 -88
  138. package/dist/drivers/azure.driver.d.ts.map +0 -1
  139. package/dist/drivers/azure.driver.js +0 -391
  140. package/dist/drivers/azure.driver.js.map +0 -1
  141. package/dist/drivers/base.driver.d.ts +0 -170
  142. package/dist/drivers/base.driver.d.ts.map +0 -1
  143. package/dist/drivers/base.driver.js +0 -347
  144. package/dist/drivers/base.driver.js.map +0 -1
  145. package/dist/drivers/gcs.driver.d.ts.map +0 -1
  146. package/dist/drivers/gcs.driver.js +0 -354
  147. package/dist/drivers/gcs.driver.js.map +0 -1
  148. package/dist/drivers/local.driver.d.ts +0 -107
  149. package/dist/drivers/local.driver.d.ts.map +0 -1
  150. package/dist/drivers/local.driver.js +0 -621
  151. package/dist/drivers/local.driver.js.map +0 -1
  152. package/dist/drivers/s3.driver.d.ts.map +0 -1
  153. package/dist/drivers/s3.driver.js +0 -387
  154. package/dist/drivers/s3.driver.js.map +0 -1
  155. package/dist/factory/driver.factory.d.ts +0 -62
  156. package/dist/factory/driver.factory.d.ts.map +0 -1
  157. package/dist/factory/driver.factory.js +0 -177
  158. package/dist/factory/driver.factory.js.map +0 -1
  159. package/dist/index.d.ts +0 -30
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/index.js +0 -33
  162. package/dist/index.js.map +0 -1
  163. package/dist/storage-manager.d.ts +0 -228
  164. package/dist/storage-manager.d.ts.map +0 -1
  165. package/dist/storage-manager.js +0 -715
  166. package/dist/storage-manager.js.map +0 -1
  167. package/dist/types/storage.types.d.ts +0 -295
  168. package/dist/types/storage.types.d.ts.map +0 -1
  169. package/dist/types/storage.types.js.map +0 -1
  170. package/dist/utils/config.utils.d.ts.map +0 -1
  171. package/dist/utils/config.utils.js.map +0 -1
  172. package/dist/utils/file.utils.d.ts.map +0 -1
  173. package/dist/utils/file.utils.js +0 -278
  174. package/dist/utils/file.utils.js.map +0 -1
  175. /package/dist/{utils → cjs/utils}/config.utils.d.ts +0 -0
  176. /package/dist/{types → esm/types}/storage.types.js +0 -0
  177. /package/dist/{utils → esm/utils}/config.utils.js +0 -0
@@ -0,0 +1,343 @@
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 __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GCSStorageDriver = void 0;
37
+ const base_driver_js_1 = require("./base.driver.js");
38
+ const file_utils_js_1 = require("../utils/file.utils.js");
39
+ function parseGcsFileSize(size) {
40
+ if (size === undefined || size === null)
41
+ return undefined;
42
+ const parsed = typeof size === 'string' ? parseInt(size, 10) : Number(size);
43
+ return Number.isNaN(parsed) ? undefined : parsed;
44
+ }
45
+ // Lazy SDK loader — module is imported on first use, not at import time.
46
+ let _gcsMod;
47
+ function loadGCSSDK() {
48
+ if (!_gcsMod) {
49
+ _gcsMod = Promise.resolve().then(() => __importStar(require('@google-cloud/storage'))).catch(() => {
50
+ _gcsMod = undefined;
51
+ throw new Error('@google-cloud/storage is required for GCS storage.\n' +
52
+ 'Install: npm install @google-cloud/storage');
53
+ });
54
+ }
55
+ return _gcsMod;
56
+ }
57
+ /**
58
+ * GCSStorageDriver - Handles file operations with Google Cloud Storage.
59
+ *
60
+ * Supports two authentication methods:
61
+ * 1. Service account JSON file (GCS_CREDENTIALS path)
62
+ * 2. Application Default Credentials (when running on GCP)
63
+ *
64
+ * If you're running on GCP (Cloud Run, GKE, etc.), you usually don't need
65
+ * to provide credentials — the SDK picks them up automatically.
66
+ *
67
+ * When driver is 'gcs-presigned', upload() returns presigned URLs
68
+ * instead of uploading directly.
69
+ *
70
+ * Required package: @google-cloud/storage
71
+ */
72
+ class GCSStorageDriver extends base_driver_js_1.BaseStorageDriver {
73
+ _storage;
74
+ _bucket;
75
+ bucketName;
76
+ projectId;
77
+ constructor(config) {
78
+ super(config);
79
+ if (!config.bucketName) {
80
+ throw new Error('bucketName is required for GCS. Set BUCKET_NAME environment variable or pass bucketName in credentials.');
81
+ }
82
+ if (!config.gcsProjectId) {
83
+ throw new Error('gcsProjectId is required for GCS. Set GCS_PROJECT_ID environment variable or pass gcsProjectId in credentials.');
84
+ }
85
+ this.bucketName = config.bucketName;
86
+ this.projectId = config.gcsProjectId;
87
+ }
88
+ async ensureBucket() {
89
+ if (this._bucket)
90
+ return this._bucket;
91
+ const { Storage } = await loadGCSSDK();
92
+ const storageOptions = {
93
+ projectId: this.projectId,
94
+ };
95
+ if (this.config.gcsCredentials) {
96
+ storageOptions.keyFilename = this.config.gcsCredentials;
97
+ }
98
+ this._storage = new Storage(storageOptions);
99
+ this._bucket = this._storage.bucket(this.bucketName);
100
+ return this._bucket;
101
+ }
102
+ destroy() {
103
+ this._storage = undefined;
104
+ this._bucket = undefined;
105
+ }
106
+ /**
107
+ * Uploads a file to GCS, or returns a presigned URL when in presigned mode.
108
+ *
109
+ * For large files (>100MB), uses streaming upload to reduce
110
+ * memory usage and improve reliability.
111
+ */
112
+ async upload(file, options) {
113
+ if (this.presignedMode) {
114
+ return this.presignedUpload(file);
115
+ }
116
+ try {
117
+ const { errors: validationErrors, resolvedSize } = await this.validateFile(file);
118
+ if (validationErrors.length > 0) {
119
+ return this.createErrorResult(validationErrors.join(', '), 'VALIDATION_FAILED');
120
+ }
121
+ const fileName = this.generateFileName(file.originalname);
122
+ const filePath = this.buildFilePath(fileName);
123
+ const bucket = await this.ensureBucket();
124
+ const gcsFile = bucket.file(filePath);
125
+ const metadata = {
126
+ contentType: options?.contentType || file.mimetype,
127
+ };
128
+ if (options?.cacheControl) {
129
+ metadata.cacheControl = options.cacheControl;
130
+ }
131
+ if (options?.contentDisposition) {
132
+ metadata.contentDisposition = options.contentDisposition;
133
+ }
134
+ if (options?.metadata) {
135
+ metadata.metadata = options.metadata;
136
+ }
137
+ options?.signal?.throwIfAborted();
138
+ if (this.shouldUseStreaming(resolvedSize)) {
139
+ await this.uploadWithStream(gcsFile, file, metadata);
140
+ }
141
+ else {
142
+ const fileContent = await this.getFileContent(file);
143
+ await gcsFile.save(fileContent, { metadata });
144
+ }
145
+ const fileUrl = `https://storage.googleapis.com/${this.bucketName}/${(0, file_utils_js_1.encodePathSegments)(filePath)}`;
146
+ return this.createSuccessResult(filePath, fileUrl);
147
+ }
148
+ catch (error) {
149
+ await this.cleanupTempFile(file);
150
+ return this.createErrorResult(error instanceof Error ? error.message : 'Failed to upload file to GCS');
151
+ }
152
+ }
153
+ /**
154
+ * Uploads a large file using streaming.
155
+ * Pipes the file stream directly to GCS for memory efficiency.
156
+ */
157
+ async uploadWithStream(gcsFile, file, metadata) {
158
+ return new Promise((resolve, reject) => {
159
+ const fileStream = this.getFileStream(file);
160
+ const writeStream = gcsFile.createWriteStream({
161
+ metadata,
162
+ resumable: true,
163
+ });
164
+ fileStream.on('error', reject);
165
+ fileStream
166
+ .pipe(writeStream)
167
+ .on('error', reject)
168
+ .on('finish', resolve);
169
+ });
170
+ }
171
+ /**
172
+ * Creates a presigned URL for uploading directly to GCS.
173
+ *
174
+ * The URL enforces:
175
+ * - Exact content type
176
+ * - Exact file size (via x-goog-content-length-range header)
177
+ */
178
+ async generateUploadUrl(fileName, contentType, fileSize) {
179
+ try {
180
+ const decodedFileName = this.decodeFileName(fileName);
181
+ const bucket = await this.ensureBucket();
182
+ const gcsFile = bucket.file(decodedFileName);
183
+ const resolvedContentType = contentType || 'application/octet-stream';
184
+ const expiresOn = new Date(Date.now() + (this.getPresignedUrlExpiry() * 1000));
185
+ const options = {
186
+ version: 'v4',
187
+ action: 'write',
188
+ expires: expiresOn,
189
+ contentType: resolvedContentType,
190
+ };
191
+ if (fileSize !== undefined) {
192
+ options.extensionHeaders = {
193
+ 'x-goog-content-length-range': `${fileSize},${fileSize}`,
194
+ };
195
+ }
196
+ const [uploadUrl] = await gcsFile.getSignedUrl(options);
197
+ return this.createPresignedSuccessResult(uploadUrl);
198
+ }
199
+ catch (error) {
200
+ return this.createPresignedErrorResult(error instanceof Error ? error.message : 'Failed to generate upload URL');
201
+ }
202
+ }
203
+ /**
204
+ * Creates a presigned URL for downloading/viewing a file.
205
+ */
206
+ async generateViewUrl(fileName) {
207
+ try {
208
+ const decodedFileName = this.decodeFileName(fileName);
209
+ const bucket = await this.ensureBucket();
210
+ const gcsFile = bucket.file(decodedFileName);
211
+ const expiresOn = new Date(Date.now() + (this.getPresignedUrlExpiry() * 1000));
212
+ const [viewUrl] = await gcsFile.getSignedUrl({
213
+ version: 'v4',
214
+ action: 'read',
215
+ expires: expiresOn,
216
+ });
217
+ return this.createPresignedSuccessResult(undefined, viewUrl);
218
+ }
219
+ catch (error) {
220
+ return this.createPresignedErrorResult(error instanceof Error ? error.message : 'Failed to generate view URL');
221
+ }
222
+ }
223
+ /**
224
+ * Deletes a file from GCS.
225
+ */
226
+ async delete(fileName) {
227
+ try {
228
+ const decodedFileName = this.decodeFileName(fileName);
229
+ const bucket = await this.ensureBucket();
230
+ const gcsFile = bucket.file(decodedFileName);
231
+ const [exists] = await gcsFile.exists();
232
+ if (!exists) {
233
+ return { success: false, reference: fileName, error: 'File not found', code: 'FILE_NOT_FOUND' };
234
+ }
235
+ await gcsFile.delete();
236
+ return { success: true, reference: fileName };
237
+ }
238
+ catch (error) {
239
+ return { success: false, reference: fileName, error: error instanceof Error ? error.message : 'Failed to delete file', code: 'PROVIDER_ERROR' };
240
+ }
241
+ }
242
+ /**
243
+ * Confirms an upload and optionally validates the file.
244
+ * Uses shared validation logic from BaseStorageDriver.
245
+ */
246
+ async validateAndConfirmUpload(reference, options) {
247
+ try {
248
+ const bucket = await this.ensureBucket();
249
+ const gcsFile = bucket.file(reference);
250
+ const [metadata] = await gcsFile.getMetadata();
251
+ const actual = {
252
+ contentType: metadata.contentType,
253
+ fileSize: parseGcsFileSize(metadata.size),
254
+ };
255
+ const validationError = await this.checkUploadedFileMetadata(reference, actual, options);
256
+ if (validationError)
257
+ return validationError;
258
+ const viewResult = await this.generateViewUrl(reference);
259
+ return this.buildValidationSuccess(reference, viewResult.success ? viewResult.viewUrl : undefined, actual.contentType, actual.fileSize);
260
+ }
261
+ catch (error) {
262
+ return {
263
+ success: false,
264
+ error: error instanceof Error ? error.message : 'File not found or access denied',
265
+ code: 'FILE_NOT_FOUND',
266
+ };
267
+ }
268
+ }
269
+ /**
270
+ * Returns metadata about a file from GCS without downloading it.
271
+ */
272
+ async getMetadata(reference) {
273
+ try {
274
+ const decoded = this.decodeFileName(reference);
275
+ const bucket = await this.ensureBucket();
276
+ const gcsFile = bucket.file(decoded);
277
+ const [exists] = await gcsFile.exists();
278
+ if (!exists)
279
+ return null;
280
+ const [metadata] = await gcsFile.getMetadata();
281
+ const info = { name: reference };
282
+ const size = parseGcsFileSize(metadata.size);
283
+ if (size !== undefined)
284
+ info.size = size;
285
+ if (metadata.contentType)
286
+ info.contentType = metadata.contentType;
287
+ if (metadata.updated)
288
+ info.lastModified = new Date(metadata.updated);
289
+ return info;
290
+ }
291
+ catch {
292
+ return null;
293
+ }
294
+ }
295
+ /**
296
+ * Lists files in the bucket with optional prefix filtering and pagination.
297
+ */
298
+ async listFiles(prefix, maxResults = 1000, continuationToken) {
299
+ try {
300
+ const validatedMaxResults = this.validateMaxResults(maxResults);
301
+ const bucket = await this.ensureBucket();
302
+ const options = {
303
+ maxResults: validatedMaxResults,
304
+ };
305
+ if (prefix)
306
+ options.prefix = prefix;
307
+ if (continuationToken)
308
+ options.pageToken = continuationToken;
309
+ const [files, , apiResponse] = await bucket.getFiles(options);
310
+ const fileList = files.map((file) => {
311
+ const fileInfo = { name: file.name };
312
+ const size = parseGcsFileSize(file.metadata.size);
313
+ if (size !== undefined)
314
+ fileInfo.size = size;
315
+ if (file.metadata.contentType) {
316
+ fileInfo.contentType = file.metadata.contentType;
317
+ }
318
+ if (file.metadata.updated) {
319
+ fileInfo.lastModified = new Date(file.metadata.updated);
320
+ }
321
+ return fileInfo;
322
+ });
323
+ const result = {
324
+ success: true,
325
+ files: fileList,
326
+ };
327
+ const responseWithToken = apiResponse;
328
+ if (responseWithToken?.nextPageToken) {
329
+ result.nextToken = responseWithToken.nextPageToken;
330
+ }
331
+ return result;
332
+ }
333
+ catch (error) {
334
+ return {
335
+ success: false,
336
+ error: error instanceof Error ? error.message : 'Failed to list files',
337
+ code: 'PROVIDER_ERROR',
338
+ };
339
+ }
340
+ }
341
+ }
342
+ exports.GCSStorageDriver = GCSStorageDriver;
343
+ //# sourceMappingURL=gcs.driver.js.map
@@ -0,0 +1 @@
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,26 @@
1
+ "use strict";
2
+ /**
3
+ * express-storage/drivers
4
+ *
5
+ * Driver classes, factory, and base class for custom driver implementations.
6
+ *
7
+ * @example
8
+ * import { BaseStorageDriver, createDriver } from 'express-storage/drivers';
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getAvailableDrivers = exports.createDriver = exports.StorageDriverFactory = exports.AzureStorageDriver = exports.GCSStorageDriver = exports.S3StorageDriver = exports.LocalStorageDriver = exports.BaseStorageDriver = void 0;
12
+ var base_driver_js_1 = require("./base.driver.js");
13
+ Object.defineProperty(exports, "BaseStorageDriver", { enumerable: true, get: function () { return base_driver_js_1.BaseStorageDriver; } });
14
+ var local_driver_js_1 = require("./local.driver.js");
15
+ Object.defineProperty(exports, "LocalStorageDriver", { enumerable: true, get: function () { return local_driver_js_1.LocalStorageDriver; } });
16
+ var s3_driver_js_1 = require("./s3.driver.js");
17
+ Object.defineProperty(exports, "S3StorageDriver", { enumerable: true, get: function () { return s3_driver_js_1.S3StorageDriver; } });
18
+ var gcs_driver_js_1 = require("./gcs.driver.js");
19
+ Object.defineProperty(exports, "GCSStorageDriver", { enumerable: true, get: function () { return gcs_driver_js_1.GCSStorageDriver; } });
20
+ var azure_driver_js_1 = require("./azure.driver.js");
21
+ Object.defineProperty(exports, "AzureStorageDriver", { enumerable: true, get: function () { return azure_driver_js_1.AzureStorageDriver; } });
22
+ var driver_factory_js_1 = require("../factory/driver.factory.js");
23
+ Object.defineProperty(exports, "StorageDriverFactory", { enumerable: true, get: function () { return driver_factory_js_1.StorageDriverFactory; } });
24
+ Object.defineProperty(exports, "createDriver", { enumerable: true, get: function () { return driver_factory_js_1.createDriver; } });
25
+ Object.defineProperty(exports, "getAvailableDrivers", { enumerable: true, get: function () { return driver_factory_js_1.getAvailableDrivers; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/drivers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,qDAAuD;AAA9C,qHAAA,kBAAkB,OAAA;AAC3B,+CAAiD;AAAxC,+GAAA,eAAe,OAAA;AACxB,iDAAmD;AAA1C,iHAAA,gBAAgB,OAAA;AACzB,qDAAuD;AAA9C,qHAAA,kBAAkB,OAAA;AAC3B,kEAAuG;AAA9F,yHAAA,oBAAoB,OAAA;AAAE,iHAAA,YAAY,OAAA;AAAE,wHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,86 @@
1
+ import { BaseStorageDriver } from './base.driver.js';
2
+ import { FileUploadResult, PresignedUrlResult, StorageConfig, ListFilesResult, UploadOptions, FileInfo, BlobValidationOptions, BlobValidationResult, DeleteResult } from '../types/storage.types.js';
3
+ /**
4
+ * LocalStorageDriver - Saves files to your local filesystem.
5
+ *
6
+ * Great for development and small-scale applications.
7
+ * Files are organized by year/month folders automatically.
8
+ *
9
+ * **Security features:**
10
+ * - Path traversal prevention (blocks ../ and null bytes)
11
+ * - Symlinks are NOT followed or deleted (prevents directory escape attacks)
12
+ * - Magic byte detection for content-type validation (prevents extension spoofing)
13
+ * - Files stay within the configured base directory
14
+ *
15
+ * Note: Local storage doesn't support presigned URLs since
16
+ * there's no external service to sign requests against.
17
+ */
18
+ export declare class LocalStorageDriver extends BaseStorageDriver {
19
+ private readonly basePath;
20
+ private readonly originalLocalPath;
21
+ constructor(config: StorageConfig);
22
+ /**
23
+ * Saves a file to the local filesystem.
24
+ *
25
+ * Files are automatically organized into YYYY/MM folders.
26
+ * For large files (>100MB), uses streaming to reduce memory usage.
27
+ */
28
+ upload(file: Express.Multer.File, options?: UploadOptions): Promise<FileUploadResult>;
29
+ /**
30
+ * Uploads a large file using streaming.
31
+ * Pipes the file stream directly to disk for memory efficiency.
32
+ */
33
+ private uploadWithStream;
34
+ /**
35
+ * Builds a URL for accessing the file.
36
+ *
37
+ * If basePath starts with 'public/', strips that prefix since
38
+ * Express.static('public') serves files from /
39
+ */
40
+ private generateFileUrl;
41
+ private normalizePathSeparators;
42
+ private normalizeUrl;
43
+ /**
44
+ * Local storage doesn't support presigned upload URLs.
45
+ */
46
+ generateUploadUrl(_fileName: string, _contentType?: string, _maxSize?: number): Promise<PresignedUrlResult>;
47
+ /**
48
+ * Local storage doesn't support presigned view URLs.
49
+ */
50
+ generateViewUrl(_fileName: string): Promise<PresignedUrlResult>;
51
+ /**
52
+ * Validates a local file exists and matches expected values.
53
+ *
54
+ * Content type detection uses a two-tier approach:
55
+ * 1. Magic byte detection (examines actual file content for security)
56
+ * 2. Extension-based fallback (when magic bytes don't match)
57
+ */
58
+ validateAndConfirmUpload(reference: string, options?: BlobValidationOptions): Promise<BlobValidationResult>;
59
+ /**
60
+ * Deletes a file from local storage.
61
+ *
62
+ * Security: decodeFileName() rejects traversal/encoding attacks.
63
+ * Containment check ensures resolved path stays within basePath.
64
+ * Symlinks and non-files are rejected.
65
+ */
66
+ delete(reference: string): Promise<DeleteResult>;
67
+ /**
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).
74
+ */
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>;
81
+ /**
82
+ * Lists files in local storage with optional prefix filtering and pagination.
83
+ */
84
+ listFiles(prefix?: string, maxResults?: number, continuationToken?: string): Promise<ListFilesResult>;
85
+ }
86
+ //# sourceMappingURL=local.driver.d.ts.map
@@ -0,0 +1 @@
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"}