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.
- package/README.md +366 -34
- package/dist/cjs/config/index.d.ts +10 -0
- package/dist/cjs/config/index.d.ts.map +1 -0
- package/dist/cjs/config/index.js +19 -0
- package/dist/cjs/config/index.js.map +1 -0
- package/dist/cjs/drivers/azure.driver.d.ts +27 -42
- package/dist/cjs/drivers/azure.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/azure.driver.js +206 -212
- package/dist/cjs/drivers/azure.driver.js.map +1 -1
- package/dist/cjs/drivers/base.driver.d.ts +69 -103
- package/dist/cjs/drivers/base.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/base.driver.js +170 -167
- package/dist/cjs/drivers/base.driver.js.map +1 -1
- package/dist/cjs/drivers/gcs.driver.d.ts +20 -38
- package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/gcs.driver.js +160 -176
- package/dist/cjs/drivers/gcs.driver.js.map +1 -1
- package/dist/cjs/drivers/index.d.ts +15 -0
- package/dist/cjs/drivers/index.d.ts.map +1 -0
- package/dist/cjs/drivers/index.js +26 -0
- package/dist/cjs/drivers/index.js.map +1 -0
- package/dist/cjs/drivers/local.driver.d.ts +24 -45
- package/dist/cjs/drivers/local.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/local.driver.js +266 -338
- package/dist/cjs/drivers/local.driver.js.map +1 -1
- package/dist/cjs/drivers/s3.driver.d.ts +19 -39
- package/dist/cjs/drivers/s3.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/s3.driver.js +205 -197
- package/dist/cjs/drivers/s3.driver.js.map +1 -1
- package/dist/cjs/factory/driver.factory.d.ts +32 -51
- package/dist/cjs/factory/driver.factory.d.ts.map +1 -1
- package/dist/cjs/factory/driver.factory.js +75 -155
- package/dist/cjs/factory/driver.factory.js.map +1 -1
- package/dist/cjs/index.d.ts +11 -15
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +14 -47
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/storage-manager.d.ts +107 -125
- package/dist/cjs/storage-manager.d.ts.map +1 -1
- package/dist/cjs/storage-manager.js +346 -416
- package/dist/cjs/storage-manager.js.map +1 -1
- package/dist/cjs/types/storage.types.d.ts +250 -107
- package/dist/cjs/types/storage.types.d.ts.map +1 -1
- package/dist/cjs/utils/file.utils.d.ts +62 -8
- package/dist/cjs/utils/file.utils.d.ts.map +1 -1
- package/dist/cjs/utils/file.utils.js +196 -29
- package/dist/cjs/utils/file.utils.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +12 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +36 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/rate-limiter.d.ts +40 -0
- package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
- package/dist/cjs/utils/rate-limiter.js +87 -0
- package/dist/cjs/utils/rate-limiter.js.map +1 -0
- package/dist/esm/config/index.d.ts +10 -0
- package/dist/esm/config/index.d.ts.map +1 -0
- package/dist/esm/config/index.js +10 -0
- package/dist/esm/config/index.js.map +1 -0
- package/dist/esm/drivers/azure.driver.d.ts +27 -42
- package/dist/esm/drivers/azure.driver.d.ts.map +1 -1
- package/dist/esm/drivers/azure.driver.js +172 -210
- package/dist/esm/drivers/azure.driver.js.map +1 -1
- package/dist/esm/drivers/base.driver.d.ts +69 -103
- package/dist/esm/drivers/base.driver.d.ts.map +1 -1
- package/dist/esm/drivers/base.driver.js +171 -168
- package/dist/esm/drivers/base.driver.js.map +1 -1
- package/dist/esm/drivers/gcs.driver.d.ts +20 -38
- package/dist/esm/drivers/gcs.driver.d.ts.map +1 -1
- package/dist/esm/drivers/gcs.driver.js +126 -174
- package/dist/esm/drivers/gcs.driver.js.map +1 -1
- package/dist/esm/drivers/index.d.ts +15 -0
- package/dist/esm/drivers/index.d.ts.map +1 -0
- package/dist/esm/drivers/index.js +15 -0
- package/dist/esm/drivers/index.js.map +1 -0
- package/dist/esm/drivers/local.driver.d.ts +24 -45
- package/dist/esm/drivers/local.driver.d.ts.map +1 -1
- package/dist/esm/drivers/local.driver.js +266 -338
- package/dist/esm/drivers/local.driver.js.map +1 -1
- package/dist/esm/drivers/s3.driver.d.ts +19 -39
- package/dist/esm/drivers/s3.driver.d.ts.map +1 -1
- package/dist/esm/drivers/s3.driver.js +171 -195
- package/dist/esm/drivers/s3.driver.js.map +1 -1
- package/dist/esm/factory/driver.factory.d.ts +32 -51
- package/dist/esm/factory/driver.factory.d.ts.map +1 -1
- package/dist/esm/factory/driver.factory.js +73 -158
- package/dist/esm/factory/driver.factory.js.map +1 -1
- package/dist/esm/index.d.ts +11 -15
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -19
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/storage-manager.d.ts +107 -125
- package/dist/esm/storage-manager.d.ts.map +1 -1
- package/dist/esm/storage-manager.js +348 -418
- package/dist/esm/storage-manager.js.map +1 -1
- package/dist/esm/types/storage.types.d.ts +250 -107
- package/dist/esm/types/storage.types.d.ts.map +1 -1
- package/dist/esm/utils/file.utils.d.ts +62 -8
- package/dist/esm/utils/file.utils.d.ts.map +1 -1
- package/dist/esm/utils/file.utils.js +190 -29
- package/dist/esm/utils/file.utils.js.map +1 -1
- package/dist/esm/utils/index.d.ts +12 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +11 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/rate-limiter.d.ts +40 -0
- package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
- package/dist/esm/utils/rate-limiter.js +82 -0
- package/dist/esm/utils/rate-limiter.js.map +1 -0
- package/package.json +83 -48
- package/src/config/index.ts +17 -0
- package/src/drivers/azure.driver.ts +434 -0
- package/src/drivers/base.driver.ts +436 -0
- package/src/drivers/gcs.driver.ts +366 -0
- package/src/drivers/index.ts +15 -0
- package/src/drivers/local.driver.ts +626 -0
- package/src/drivers/s3.driver.ts +459 -0
- package/src/factory/driver.factory.ts +101 -0
- package/src/index.ts +72 -0
- package/src/storage-manager.ts +801 -0
- package/src/types/storage.types.ts +561 -0
- package/src/utils/config.utils.ts +229 -0
- package/src/utils/file.utils.ts +536 -0
- package/src/utils/index.ts +35 -0
- 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.
|
|
25
|
-
this.
|
|
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
|
|
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
|
|
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
|
-
|
|
56
|
-
if (this.shouldUseStreaming(
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
109
|
-
|
|
110
|
-
|
|
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 =
|
|
148
|
-
|
|
149
|
-
|
|
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 =
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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
|
|
212
|
+
const bucket = await this.ensureBucket();
|
|
213
|
+
const gcsFile = bucket.file(reference);
|
|
204
214
|
const [metadata] = await gcsFile.getMetadata();
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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:
|
|
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 =
|
|
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
|
|
273
|
+
const [files, , apiResponse] = await bucket.getFiles(options);
|
|
280
274
|
const fileList = files.map((file) => {
|
|
281
275
|
const fileInfo = { name: file.name };
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IAMrD,YAAY,MAAqB;QAC/B,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,YAAa,CAAC;QAEtC,MAAM,cAAc,GAAgD;YAClE,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QAEF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,IAAyB,EAAE,OAAuB;QAC7D,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE3C,MAAM,QAAQ,GAKV;gBACF,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;aACnD,CAAC;YAEF,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;gBAC1B,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;gBAChC,QAAQ,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAC3D,CAAC;YACD,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YACvC,CAAC;YAED,8DAA8D;YAC9D,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,4CAA4C;YAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9F,MAAM,OAAO,GAAG,kCAAkC,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;YAEnF,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,iBAAiB,CAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,gBAAgB,CAC5B,OAAa,EACb,IAAyB,EACzB,QAAwH;QAExH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBAC5C,QAAQ;gBACR,SAAS,EAAE,IAAI,EAAE,2CAA2C;aAC7D,CAAC,CAAC;YAEH,+DAA+D;YAC/D,0DAA0D;YAC1D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE/B,UAAU;iBACP,IAAI,CAAC,WAAW,CAAC;iBACjB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;iBACnB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,WAAoB,EAAE,QAAiB;QAC/E,wEAAwE;QACxE,yFAAyF;QACzF,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,0BAA0B,CAAC,0CAA0C,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC,0BAA0B,CAAC,4DAA4D,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAClD,MAAM,mBAAmB,GAAG,WAAW,IAAI,0BAA0B,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YAE/E,MAAM,OAAO,GAMT;gBACF,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,SAAS;gBAClB,WAAW,EAAE,mBAAmB;aACjC,CAAC;YAEF,+CAA+C;YAC/C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,gBAAgB,GAAG;oBACzB,6BAA6B,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;iBACzD,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAExD,OAAO,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,0BAA0B,CACpC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,wCAAwC;QACxC,yFAAyF;QACzF,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,0BAA0B,CAAC,0CAA0C,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC,0BAA0B,CAAC,4DAA4D,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YAE/E,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC3C,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,0BAA0B,CACpC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,wCAAwC;QACxC,yFAAyF;QACzF,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACM,KAAK,CAAC,wBAAwB,CACrC,SAAiB,EACjB,OAA+B;QAE/B,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,KAAK,KAAK,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE/C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC/C,IAAI,cAAkC,CAAC;YACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC/F,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,CAAC;YAED,oCAAoC;YACpC,IAAI,OAAO,EAAE,mBAAmB,IAAI,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBACtF,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,WAAW,GAAyB;oBACxC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oCAAoC,OAAO,CAAC,mBAAmB,WAAW,iBAAiB,IAAI,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,6BAA6B,EAAE;iBAC5K,CAAC;gBACF,IAAI,iBAAiB;oBAAE,WAAW,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;gBACzE,IAAI,cAAc,KAAK,SAAS;oBAAE,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;gBAC9E,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,iCAAiC;YACjC,IAAI,OAAO,EAAE,gBAAgB,KAAK,SAAS,IAAI,cAAc,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC3F,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,WAAW,GAAyB;oBACxC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gCAAgC,OAAO,CAAC,gBAAgB,eAAe,cAAc,SAAS,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,6BAA6B,EAAE;iBAC3K,CAAC;gBACF,IAAI,iBAAiB;oBAAE,WAAW,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;gBACzE,IAAI,cAAc,KAAK,SAAS;oBAAE,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;gBAC9E,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAyB;gBACnC,OAAO,EAAE,IAAI;gBACb,SAAS;gBACT,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE;aACxC,CAAC;YAEF,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;YACtC,CAAC;YACD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC/C,CAAC;YACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;YACzC,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC;YAChG,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACb,MAAe,EACf,aAAqB,IAAI,EACzB,iBAA0B;QAE1B,IAAI,CAAC;YACH,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CACzD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAC5C,IAAI,CACL,CAAC,CAAC,CAAC;YAEJ,MAAM,OAAO,GAAgE;gBAC3E,UAAU,EAAE,mBAAmB;aAChC,CAAC;YACF,IAAI,MAAM;gBAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACpC,IAAI,iBAAiB;gBAAE,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;YAE7D,MAAM,CAAC,KAAK,EAAE,AAAD,EAAG,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEnE,MAAM,QAAQ,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE;gBACpD,MAAM,QAAQ,GAAa,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC1B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC9B,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACnD,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBAC1B,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAoB;gBAC9B,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,QAAQ;aAChB,CAAC;YAEF,MAAM,iBAAiB,GAAG,WAAqD,CAAC;YAChF,IAAI,iBAAiB,EAAE,aAAa,EAAE,CAAC;gBACrC,MAAM,CAAC,SAAS,GAAG,iBAAiB,CAAC,aAAa,CAAC;YACrD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;aACvE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,yBAA0B,SAAQ,gBAAgB;IAC7D,YAAY,MAAqB;QAC/B,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;;;;;OAUG;IACM,KAAK,CAAC,MAAM,CAAC,IAAyB,EAAE,QAAwB;QACvE,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAE9C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAClD,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAC;YAC7F,CAAC;YAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,iBAAiB,CAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
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
|
|
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,
|
|
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
|
|
47
|
-
*
|
|
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?:
|
|
58
|
+
validateAndConfirmUpload(reference: string, options?: BlobValidationOptions): Promise<BlobValidationResult>;
|
|
79
59
|
/**
|
|
80
60
|
* Deletes a file from local storage.
|
|
81
61
|
*
|
|
82
|
-
* Security
|
|
83
|
-
*
|
|
84
|
-
*
|
|
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<
|
|
66
|
+
delete(reference: string): Promise<DeleteResult>;
|
|
93
67
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
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":"
|
|
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"}
|