s3-storage-dtb 0.0.1
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 +484 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/storage-client.d.ts +26 -0
- package/dist/client/storage-client.d.ts.map +1 -0
- package/dist/client/storage-client.js +237 -0
- package/dist/client/storage-client.js.map +1 -0
- package/dist/core/storage-core.d.ts +20 -0
- package/dist/core/storage-core.d.ts.map +1 -0
- package/dist/core/storage-core.js +192 -0
- package/dist/core/storage-core.js.map +1 -0
- package/dist/errors/storage-errors.d.ts +29 -0
- package/dist/errors/storage-errors.d.ts.map +1 -0
- package/dist/errors/storage-errors.js +78 -0
- package/dist/errors/storage-errors.js.map +1 -0
- package/dist/helpers/mime-validator.d.ts +2 -0
- package/dist/helpers/mime-validator.d.ts.map +1 -0
- package/dist/helpers/mime-validator.js +18 -0
- package/dist/helpers/mime-validator.js.map +1 -0
- package/dist/helpers/path-sanitizer.d.ts +8 -0
- package/dist/helpers/path-sanitizer.d.ts.map +1 -0
- package/dist/helpers/path-sanitizer.js +23 -0
- package/dist/helpers/path-sanitizer.js.map +1 -0
- package/dist/helpers/path-validator.d.ts +27 -0
- package/dist/helpers/path-validator.d.ts.map +1 -0
- package/dist/helpers/path-validator.js +66 -0
- package/dist/helpers/path-validator.js.map +1 -0
- package/dist/helpers/size-parser.d.ts +2 -0
- package/dist/helpers/size-parser.d.ts.map +1 -0
- package/dist/helpers/size-parser.js +22 -0
- package/dist/helpers/size-parser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/nestjs/index.d.ts +4 -0
- package/dist/nestjs/index.d.ts.map +1 -0
- package/dist/nestjs/index.js +8 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/nestjs/storage.module.d.ts +13 -0
- package/dist/nestjs/storage.module.d.ts.map +1 -0
- package/dist/nestjs/storage.module.js +86 -0
- package/dist/nestjs/storage.module.js.map +1 -0
- package/dist/nestjs/storage.service.d.ts +17 -0
- package/dist/nestjs/storage.service.d.ts.map +1 -0
- package/dist/nestjs/storage.service.js +106 -0
- package/dist/nestjs/storage.service.js.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StorageClient = void 0;
|
|
7
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
8
|
+
const storage_errors_1 = require("../errors/storage-errors");
|
|
9
|
+
class StorageClient {
|
|
10
|
+
baseUrl;
|
|
11
|
+
apiKey;
|
|
12
|
+
timeout;
|
|
13
|
+
apiPrefix = '/apifiles';
|
|
14
|
+
constructor(options) {
|
|
15
|
+
// Normalizar URL base (eliminar trailing slash)
|
|
16
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, '');
|
|
17
|
+
this.apiKey = options.apiKey;
|
|
18
|
+
this.timeout = options.timeout ?? 30000;
|
|
19
|
+
if (!this.baseUrl) {
|
|
20
|
+
throw new Error('baseUrl es requerido');
|
|
21
|
+
}
|
|
22
|
+
if (!this.apiKey) {
|
|
23
|
+
throw new Error('apiKey es requerido');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getHeaders(additionalHeaders) {
|
|
27
|
+
return {
|
|
28
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
29
|
+
'x-api-key': this.apiKey,
|
|
30
|
+
...additionalHeaders,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async request(method, endpoint, options = {}) {
|
|
34
|
+
const url = `${this.baseUrl}${this.apiPrefix}${endpoint}`;
|
|
35
|
+
const headers = this.getHeaders(options.headers);
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
38
|
+
try {
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method,
|
|
41
|
+
headers: options.body instanceof form_data_1.default ? {} : headers,
|
|
42
|
+
body: options.body,
|
|
43
|
+
signal: controller.signal,
|
|
44
|
+
});
|
|
45
|
+
clearTimeout(timeoutId);
|
|
46
|
+
if (options.responseType === 'stream') {
|
|
47
|
+
if (!response.body) {
|
|
48
|
+
throw new storage_errors_1.DownloadError('No se recibió contenido del servidor');
|
|
49
|
+
}
|
|
50
|
+
return response.body;
|
|
51
|
+
}
|
|
52
|
+
const data = (await response.json());
|
|
53
|
+
if (!data.success) {
|
|
54
|
+
const error = data.error;
|
|
55
|
+
if (!error) {
|
|
56
|
+
throw new storage_errors_1.StorageError('Error desconocido del servidor', 'UNKNOWN_ERROR');
|
|
57
|
+
}
|
|
58
|
+
// Mapear códigos de error del backend a errores del cliente
|
|
59
|
+
switch (error.code) {
|
|
60
|
+
case 'FILE_NOT_FOUND':
|
|
61
|
+
throw new storage_errors_1.FileNotFoundError(error.message);
|
|
62
|
+
case 'INVALID_MIME_TYPE':
|
|
63
|
+
throw new storage_errors_1.InvalidMimeTypeError(error.message);
|
|
64
|
+
case 'FILE_TOO_LARGE':
|
|
65
|
+
throw new storage_errors_1.FileTooLargeError(error.message);
|
|
66
|
+
case 'UPLOAD_ERROR':
|
|
67
|
+
throw new storage_errors_1.UploadError(error.message);
|
|
68
|
+
case 'DOWNLOAD_ERROR':
|
|
69
|
+
throw new storage_errors_1.DownloadError(error.message);
|
|
70
|
+
case 'DELETE_ERROR':
|
|
71
|
+
throw new storage_errors_1.DeleteError(error.message);
|
|
72
|
+
case 'METADATA_ERROR':
|
|
73
|
+
throw new storage_errors_1.MetadataError(error.message);
|
|
74
|
+
case 'LIST_ERROR':
|
|
75
|
+
throw new storage_errors_1.ListError(error.message);
|
|
76
|
+
default:
|
|
77
|
+
throw new storage_errors_1.StorageError(error.message, error.code);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (response.status === 401 || response.status === 403) {
|
|
81
|
+
throw new storage_errors_1.StorageError('No autorizado. Verifica tu API key y permisos', 'UNAUTHORIZED');
|
|
82
|
+
}
|
|
83
|
+
if (!data.data) {
|
|
84
|
+
throw new storage_errors_1.StorageError('Respuesta sin datos del servidor', 'NO_DATA');
|
|
85
|
+
}
|
|
86
|
+
return data.data;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
if (error instanceof storage_errors_1.StorageError) {
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
if (error instanceof Error) {
|
|
94
|
+
if (error.name === 'AbortError') {
|
|
95
|
+
throw new storage_errors_1.StorageError('Timeout al conectar con el servidor', 'TIMEOUT');
|
|
96
|
+
}
|
|
97
|
+
throw new storage_errors_1.StorageError(error.message, 'NETWORK_ERROR');
|
|
98
|
+
}
|
|
99
|
+
throw new storage_errors_1.StorageError('Error desconocido', 'UNKNOWN_ERROR');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async uploadFile(filePath, buffer, mimeType, prefix) {
|
|
103
|
+
try {
|
|
104
|
+
const formData = new form_data_1.default();
|
|
105
|
+
formData.append('file', buffer, {
|
|
106
|
+
filename: prefix ? `${prefix}@${Date.now()}` : `file-${Date.now()}`,
|
|
107
|
+
contentType: mimeType,
|
|
108
|
+
});
|
|
109
|
+
formData.append('filePath', filePath);
|
|
110
|
+
const headers = formData.getHeaders();
|
|
111
|
+
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
112
|
+
headers['x-api-key'] = this.apiKey;
|
|
113
|
+
const result = await this.request('POST', '/files', {
|
|
114
|
+
body: formData,
|
|
115
|
+
headers,
|
|
116
|
+
});
|
|
117
|
+
return result.path;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof storage_errors_1.StorageError) {
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
124
|
+
throw new storage_errors_1.UploadError(message);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async downloadFile(path) {
|
|
128
|
+
try {
|
|
129
|
+
const stream = await this.request('GET', `/files/${path}`, {
|
|
130
|
+
responseType: 'stream',
|
|
131
|
+
});
|
|
132
|
+
return stream;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (error instanceof storage_errors_1.FileNotFoundError || error instanceof storage_errors_1.DownloadError) {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
139
|
+
throw new storage_errors_1.DownloadError(message);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async deleteFile(path) {
|
|
143
|
+
try {
|
|
144
|
+
await this.request('DELETE', `/files/${path}`);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (error instanceof storage_errors_1.FileNotFoundError || error instanceof storage_errors_1.DeleteError) {
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
151
|
+
throw new storage_errors_1.DeleteError(message);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async getFileMetadata(path) {
|
|
155
|
+
try {
|
|
156
|
+
const response = await fetch(`${this.baseUrl}${this.apiPrefix}/files/${path}`, {
|
|
157
|
+
method: 'HEAD',
|
|
158
|
+
headers: this.getHeaders(),
|
|
159
|
+
});
|
|
160
|
+
if (response.status === 404) {
|
|
161
|
+
throw new storage_errors_1.FileNotFoundError();
|
|
162
|
+
}
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
const error = (await response.json());
|
|
165
|
+
throw new storage_errors_1.MetadataError(error.error?.message ?? 'Error al obtener metadata');
|
|
166
|
+
}
|
|
167
|
+
const contentType = response.headers.get('content-type') ?? 'application/octet-stream';
|
|
168
|
+
const contentLength = parseInt(response.headers.get('content-length') ?? '0', 10);
|
|
169
|
+
const lastModified = response.headers.get('last-modified');
|
|
170
|
+
const contentDisposition = response.headers.get('content-disposition');
|
|
171
|
+
let fileName = path.split('/').pop() ?? '';
|
|
172
|
+
if (contentDisposition) {
|
|
173
|
+
const filenameMatch = contentDisposition.match(/filename="(.+)"/);
|
|
174
|
+
if (filenameMatch) {
|
|
175
|
+
fileName = filenameMatch[1];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
name: fileName,
|
|
180
|
+
path,
|
|
181
|
+
size: contentLength,
|
|
182
|
+
mimeType: contentType,
|
|
183
|
+
createdAt: lastModified ? new Date(lastModified) : new Date(),
|
|
184
|
+
modifiedAt: lastModified ? new Date(lastModified) : new Date(),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
if (error instanceof storage_errors_1.FileNotFoundError || error instanceof storage_errors_1.MetadataError) {
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
192
|
+
throw new storage_errors_1.MetadataError(message);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async listFiles(directoryPath = '', options = {}) {
|
|
196
|
+
try {
|
|
197
|
+
const params = new URLSearchParams();
|
|
198
|
+
if (directoryPath) {
|
|
199
|
+
params.append('directory', directoryPath);
|
|
200
|
+
}
|
|
201
|
+
if (options.limit) {
|
|
202
|
+
params.append('limit', options.limit.toString());
|
|
203
|
+
}
|
|
204
|
+
if (options.offset) {
|
|
205
|
+
params.append('offset', options.offset.toString());
|
|
206
|
+
}
|
|
207
|
+
if (options.prefix) {
|
|
208
|
+
params.append('prefix', options.prefix);
|
|
209
|
+
}
|
|
210
|
+
const queryString = params.toString();
|
|
211
|
+
const endpoint = queryString ? `/files?${queryString}` : '/files';
|
|
212
|
+
const result = await this.request('GET', endpoint);
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error instanceof storage_errors_1.ListError) {
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
220
|
+
throw new storage_errors_1.ListError(message);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async fileExists(path) {
|
|
224
|
+
try {
|
|
225
|
+
await this.getFileMetadata(path);
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
if (error instanceof storage_errors_1.FileNotFoundError) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
throw error;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.StorageClient = StorageClient;
|
|
237
|
+
//# sourceMappingURL=storage-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-client.js","sourceRoot":"","sources":["../../src/client/storage-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import type { FileMetadata, ListFilesOptions, StorageCoreOptions } from '../types';
|
|
3
|
+
export declare class StorageCore {
|
|
4
|
+
private readonly rootPath;
|
|
5
|
+
private readonly maxFileSize;
|
|
6
|
+
private readonly allowedMimeTypes;
|
|
7
|
+
constructor(options: StorageCoreOptions);
|
|
8
|
+
private ensureDirectoryExists;
|
|
9
|
+
uploadFile(filePath: string, buffer: Buffer, mimeType: string, prefix?: string): Promise<string>;
|
|
10
|
+
downloadFile(path: string): Promise<Readable>;
|
|
11
|
+
deleteFile(path: string): Promise<void>;
|
|
12
|
+
getFileMetadata(path: string): Promise<FileMetadata>;
|
|
13
|
+
listFiles(directoryPath?: string, options?: ListFilesOptions): Promise<{
|
|
14
|
+
files: FileMetadata[];
|
|
15
|
+
total: number;
|
|
16
|
+
}>;
|
|
17
|
+
fileExists(path: string): Promise<boolean>;
|
|
18
|
+
private getMimeTypeFromExtension;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=storage-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-core.d.ts","sourceRoot":"","sources":["../../src/core/storage-core.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAYnF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;gBAEhC,OAAO,EAAE,kBAAkB;IAOvC,OAAO,CAAC,qBAAqB;IAMvB,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IA2CZ,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmB7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiCpD,SAAS,CACb,aAAa,GAAE,MAAW,EAC1B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAuD9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhD,OAAO,CAAC,wBAAwB;CAgBjC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StorageCore = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const uuid_1 = require("uuid");
|
|
7
|
+
const path_sanitizer_1 = require("../helpers/path-sanitizer");
|
|
8
|
+
const mime_validator_1 = require("../helpers/mime-validator");
|
|
9
|
+
const size_parser_1 = require("../helpers/size-parser");
|
|
10
|
+
const storage_errors_1 = require("../errors/storage-errors");
|
|
11
|
+
class StorageCore {
|
|
12
|
+
rootPath;
|
|
13
|
+
maxFileSize;
|
|
14
|
+
allowedMimeTypes;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.rootPath = options.rootPath;
|
|
17
|
+
this.maxFileSize = (0, size_parser_1.parseMaxFileSize)(options.maxFileSize ?? '50mb');
|
|
18
|
+
this.allowedMimeTypes = options.allowedMimeTypes ?? ['*'];
|
|
19
|
+
this.ensureDirectoryExists(this.rootPath);
|
|
20
|
+
}
|
|
21
|
+
ensureDirectoryExists(path) {
|
|
22
|
+
if (!(0, fs_1.existsSync)(path)) {
|
|
23
|
+
(0, fs_1.mkdirSync)(path, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async uploadFile(filePath, buffer, mimeType, prefix) {
|
|
27
|
+
try {
|
|
28
|
+
// Sanitizar path
|
|
29
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(filePath);
|
|
30
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
31
|
+
// Verificar MIME type permitido
|
|
32
|
+
if (!(0, mime_validator_1.isMimeTypeAllowed)(mimeType, this.allowedMimeTypes)) {
|
|
33
|
+
throw new storage_errors_1.InvalidMimeTypeError(mimeType);
|
|
34
|
+
}
|
|
35
|
+
// Verificar tamaño
|
|
36
|
+
if (buffer.length > this.maxFileSize) {
|
|
37
|
+
throw new storage_errors_1.FileTooLargeError(`${this.maxFileSize / (1024 * 1024)}mb`);
|
|
38
|
+
}
|
|
39
|
+
// Crear directorio si no existe
|
|
40
|
+
this.ensureDirectoryExists(fullPath);
|
|
41
|
+
// Generar nombre único. El prefix no debe contener / (evitar path en nombre).
|
|
42
|
+
const namePrefix = prefix && prefix.includes('/') ? prefix.split('/').pop() ?? undefined : prefix;
|
|
43
|
+
const fileExtension = mimeType.split('/')[1] ?? 'bin';
|
|
44
|
+
const fileName = namePrefix
|
|
45
|
+
? `${namePrefix}@${(0, uuid_1.v4)()}.${fileExtension}`
|
|
46
|
+
: `${(0, uuid_1.v4)()}.${fileExtension}`;
|
|
47
|
+
const finalPath = (0, path_1.join)(fullPath, fileName);
|
|
48
|
+
// Escribir archivo
|
|
49
|
+
(0, fs_1.writeFileSync)(finalPath, buffer);
|
|
50
|
+
// Retornar ruta relativa desde rootPath
|
|
51
|
+
return (0, path_1.join)(sanitizedPath, fileName).replace(/\\/g, '/');
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof storage_errors_1.InvalidMimeTypeError || error instanceof storage_errors_1.FileTooLargeError) {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
throw new storage_errors_1.UploadError(message);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async downloadFile(path) {
|
|
62
|
+
try {
|
|
63
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(path);
|
|
64
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
65
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
66
|
+
throw new storage_errors_1.FileNotFoundError();
|
|
67
|
+
}
|
|
68
|
+
return (0, fs_1.createReadStream)(fullPath);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof storage_errors_1.FileNotFoundError) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
throw new storage_errors_1.DownloadError(message);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async deleteFile(path) {
|
|
79
|
+
try {
|
|
80
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(path);
|
|
81
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
82
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
83
|
+
throw new storage_errors_1.FileNotFoundError();
|
|
84
|
+
}
|
|
85
|
+
(0, fs_1.unlinkSync)(fullPath);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof storage_errors_1.FileNotFoundError) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
92
|
+
throw new storage_errors_1.DeleteError(message);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async getFileMetadata(path) {
|
|
96
|
+
try {
|
|
97
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(path);
|
|
98
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
99
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
100
|
+
throw new storage_errors_1.FileNotFoundError();
|
|
101
|
+
}
|
|
102
|
+
const stats = (0, fs_1.statSync)(fullPath);
|
|
103
|
+
const fileName = fullPath.split(/[/\\]/).pop() ?? '';
|
|
104
|
+
// Intentar detectar MIME type desde extensión
|
|
105
|
+
const extension = fileName.split('.').pop()?.toLowerCase() ?? '';
|
|
106
|
+
const mimeType = this.getMimeTypeFromExtension(extension);
|
|
107
|
+
return {
|
|
108
|
+
name: fileName,
|
|
109
|
+
path: sanitizedPath,
|
|
110
|
+
size: stats.size,
|
|
111
|
+
mimeType,
|
|
112
|
+
createdAt: stats.birthtime,
|
|
113
|
+
modifiedAt: stats.mtime,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof storage_errors_1.FileNotFoundError) {
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
121
|
+
throw new storage_errors_1.MetadataError(message);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async listFiles(directoryPath = '', options = {}) {
|
|
125
|
+
try {
|
|
126
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(directoryPath, { allowEmpty: true });
|
|
127
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
128
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
129
|
+
return { files: [], total: 0 };
|
|
130
|
+
}
|
|
131
|
+
const files = [];
|
|
132
|
+
const entries = (0, fs_1.readdirSync)(fullPath, { withFileTypes: true });
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
if (entry.isFile()) {
|
|
135
|
+
const filePath = (0, path_1.join)(fullPath, entry.name);
|
|
136
|
+
const relativePath = (0, path_1.join)(sanitizedPath, entry.name).replace(/\\/g, '/');
|
|
137
|
+
const stats = (0, fs_1.statSync)(filePath);
|
|
138
|
+
// Filtrar por prefix si se especifica
|
|
139
|
+
if (options.prefix && !entry.name.startsWith(options.prefix)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const extension = entry.name.split('.').pop()?.toLowerCase() ?? '';
|
|
143
|
+
const mimeType = this.getMimeTypeFromExtension(extension);
|
|
144
|
+
files.push({
|
|
145
|
+
name: entry.name,
|
|
146
|
+
path: relativePath,
|
|
147
|
+
size: stats.size,
|
|
148
|
+
mimeType,
|
|
149
|
+
createdAt: stats.birthtime,
|
|
150
|
+
modifiedAt: stats.mtime,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Ordenar por fecha de modificación (más recientes primero)
|
|
155
|
+
files.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
|
|
156
|
+
// Aplicar paginación
|
|
157
|
+
const offset = options.offset ?? 0;
|
|
158
|
+
const limit = options.limit ?? files.length;
|
|
159
|
+
const paginatedFiles = files.slice(offset, offset + limit);
|
|
160
|
+
return {
|
|
161
|
+
files: paginatedFiles,
|
|
162
|
+
total: files.length,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
167
|
+
throw new storage_errors_1.ListError(message);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async fileExists(path) {
|
|
171
|
+
const sanitizedPath = (0, path_sanitizer_1.sanitizePath)(path);
|
|
172
|
+
const fullPath = (0, path_1.join)(this.rootPath, sanitizedPath);
|
|
173
|
+
return (0, fs_1.existsSync)(fullPath);
|
|
174
|
+
}
|
|
175
|
+
getMimeTypeFromExtension(extension) {
|
|
176
|
+
const mimeTypes = {
|
|
177
|
+
jpg: 'image/jpeg',
|
|
178
|
+
jpeg: 'image/jpeg',
|
|
179
|
+
png: 'image/png',
|
|
180
|
+
gif: 'image/gif',
|
|
181
|
+
svg: 'image/svg+xml',
|
|
182
|
+
webp: 'image/webp',
|
|
183
|
+
pdf: 'application/pdf',
|
|
184
|
+
mp4: 'video/mp4',
|
|
185
|
+
webm: 'video/webm',
|
|
186
|
+
mov: 'video/quicktime',
|
|
187
|
+
};
|
|
188
|
+
return mimeTypes[extension] ?? 'application/octet-stream';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.StorageCore = StorageCore;
|
|
192
|
+
//# sourceMappingURL=storage-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-core.js","sourceRoot":"","sources":["../../src/core/storage-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare class StorageError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
constructor(message: string, code: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class FileNotFoundError extends StorageError {
|
|
6
|
+
constructor(message?: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class InvalidMimeTypeError extends StorageError {
|
|
9
|
+
constructor(mimeType: string);
|
|
10
|
+
}
|
|
11
|
+
export declare class FileTooLargeError extends StorageError {
|
|
12
|
+
constructor(maxSize: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class UploadError extends StorageError {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
export declare class DownloadError extends StorageError {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class DeleteError extends StorageError {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class MetadataError extends StorageError {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
export declare class ListError extends StorageError {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=storage-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-errors.d.ts","sourceRoot":"","sources":["../../src/errors/storage-errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1C;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAAyB;CAK7C;AAED,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,QAAQ,EAAE,MAAM;CAK7B;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,aAAc,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,aAAc,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,SAAU,SAAQ,YAAY;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ListError = exports.MetadataError = exports.DeleteError = exports.DownloadError = exports.UploadError = exports.FileTooLargeError = exports.InvalidMimeTypeError = exports.FileNotFoundError = exports.StorageError = void 0;
|
|
4
|
+
class StorageError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'StorageError';
|
|
9
|
+
this.code = code;
|
|
10
|
+
Object.setPrototypeOf(this, StorageError.prototype);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.StorageError = StorageError;
|
|
14
|
+
class FileNotFoundError extends StorageError {
|
|
15
|
+
constructor(message = 'El archivo no existe') {
|
|
16
|
+
super(message, 'FILE_NOT_FOUND');
|
|
17
|
+
this.name = 'FileNotFoundError';
|
|
18
|
+
Object.setPrototypeOf(this, FileNotFoundError.prototype);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.FileNotFoundError = FileNotFoundError;
|
|
22
|
+
class InvalidMimeTypeError extends StorageError {
|
|
23
|
+
constructor(mimeType) {
|
|
24
|
+
super(`Tipo de archivo ${mimeType} no permitido`, 'INVALID_MIME_TYPE');
|
|
25
|
+
this.name = 'InvalidMimeTypeError';
|
|
26
|
+
Object.setPrototypeOf(this, InvalidMimeTypeError.prototype);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.InvalidMimeTypeError = InvalidMimeTypeError;
|
|
30
|
+
class FileTooLargeError extends StorageError {
|
|
31
|
+
constructor(maxSize) {
|
|
32
|
+
super(`El archivo excede el tamaño máximo de ${maxSize}`, 'FILE_TOO_LARGE');
|
|
33
|
+
this.name = 'FileTooLargeError';
|
|
34
|
+
Object.setPrototypeOf(this, FileTooLargeError.prototype);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.FileTooLargeError = FileTooLargeError;
|
|
38
|
+
class UploadError extends StorageError {
|
|
39
|
+
constructor(message) {
|
|
40
|
+
super(`Error al subir el archivo: ${message}`, 'UPLOAD_ERROR');
|
|
41
|
+
this.name = 'UploadError';
|
|
42
|
+
Object.setPrototypeOf(this, UploadError.prototype);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.UploadError = UploadError;
|
|
46
|
+
class DownloadError extends StorageError {
|
|
47
|
+
constructor(message) {
|
|
48
|
+
super(`Error al descargar el archivo: ${message}`, 'DOWNLOAD_ERROR');
|
|
49
|
+
this.name = 'DownloadError';
|
|
50
|
+
Object.setPrototypeOf(this, DownloadError.prototype);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.DownloadError = DownloadError;
|
|
54
|
+
class DeleteError extends StorageError {
|
|
55
|
+
constructor(message) {
|
|
56
|
+
super(`Error al eliminar el archivo: ${message}`, 'DELETE_ERROR');
|
|
57
|
+
this.name = 'DeleteError';
|
|
58
|
+
Object.setPrototypeOf(this, DeleteError.prototype);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.DeleteError = DeleteError;
|
|
62
|
+
class MetadataError extends StorageError {
|
|
63
|
+
constructor(message) {
|
|
64
|
+
super(`Error al obtener metadata: ${message}`, 'METADATA_ERROR');
|
|
65
|
+
this.name = 'MetadataError';
|
|
66
|
+
Object.setPrototypeOf(this, MetadataError.prototype);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.MetadataError = MetadataError;
|
|
70
|
+
class ListError extends StorageError {
|
|
71
|
+
constructor(message) {
|
|
72
|
+
super(`Error al listar archivos: ${message}`, 'LIST_ERROR');
|
|
73
|
+
this.name = 'ListError';
|
|
74
|
+
Object.setPrototypeOf(this, ListError.prototype);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.ListError = ListError;
|
|
78
|
+
//# sourceMappingURL=storage-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-errors.js","sourceRoot":"","sources":["../../src/errors/storage-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-validator.d.ts","sourceRoot":"","sources":["../../src/helpers/mime-validator.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAcT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMimeTypeAllowed = isMimeTypeAllowed;
|
|
4
|
+
function isMimeTypeAllowed(mimeType, allowedPatterns) {
|
|
5
|
+
if (allowedPatterns.includes('*')) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
return allowedPatterns.some((pattern) => {
|
|
9
|
+
if (pattern.endsWith('/*')) {
|
|
10
|
+
// Patrón tipo "image/*"
|
|
11
|
+
const prefix = pattern.slice(0, -2);
|
|
12
|
+
return mimeType.startsWith(prefix + '/');
|
|
13
|
+
}
|
|
14
|
+
// Patrón exacto
|
|
15
|
+
return mimeType === pattern;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=mime-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-validator.js","sourceRoot":"","sources":["../../src/helpers/mime-validator.ts"],"names":[],"mappings":";;AAAA,8CAiBC;AAjBD,SAAgB,iBAAiB,CAC/B,QAAgB,EAChB,eAAyB;IAEzB,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,wBAAwB;YACxB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,gBAAgB;QAChB,OAAO,QAAQ,KAAK,OAAO,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ValidatePathOptions } from './path-validator';
|
|
2
|
+
/**
|
|
3
|
+
* Valida y normaliza un path. Usa las mismas reglas estrictas que validatePathSafe.
|
|
4
|
+
* Lanza si el path contiene caracteres prohibidos (;, ", ', #, .., cd, etc.).
|
|
5
|
+
* @param allowEmpty - Si true, permite '' (p. ej. directorio raíz en listFiles).
|
|
6
|
+
*/
|
|
7
|
+
export declare function sanitizePath(inputPath: string, options?: ValidatePathOptions): string;
|
|
8
|
+
//# sourceMappingURL=path-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-sanitizer.d.ts","sourceRoot":"","sources":["../../src/helpers/path-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAcR"}
|