@aether-baas/core 3.0.1 → 3.0.2
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.
|
@@ -29,6 +29,12 @@ export declare class StorageModule {
|
|
|
29
29
|
* @param contentType MIME type do arquivo (ex: 'image/png')
|
|
30
30
|
* @param folder Pasta de destino (opcional)
|
|
31
31
|
* @param onProgress Callback de progresso (opcional)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const { data, error } = await aether.storage.upload(file, 'foto.png', 'image/png');
|
|
36
|
+
* if (error) console.error('Falha no upload:', error);
|
|
37
|
+
* ```
|
|
32
38
|
*/
|
|
33
39
|
upload(file: File | Blob | Buffer, fileName: string, contentType?: string, folder?: string, onProgress?: (progress: UploadProgress) => void): Promise<{
|
|
34
40
|
data: FileObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/modules/storage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAMtF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,IAAI,CAAgB;gBAEhB,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa;IAKzD
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/modules/storage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAMtF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,IAAI,CAAgB;gBAEhB,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa;IAKzD;;;;;;;;;;;;;;OAcG;IACG,MAAM,CACV,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,GAC9C,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA6K7E;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgB9E;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAU9C;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAWrE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKpC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAWlE;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAUnE"}
|
package/dist/modules/storage.js
CHANGED
|
@@ -38,56 +38,149 @@ export class StorageModule {
|
|
|
38
38
|
* @param contentType MIME type do arquivo (ex: 'image/png')
|
|
39
39
|
* @param folder Pasta de destino (opcional)
|
|
40
40
|
* @param onProgress Callback de progresso (opcional)
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const { data, error } = await aether.storage.upload(file, 'foto.png', 'image/png');
|
|
45
|
+
* if (error) console.error('Falha no upload:', error);
|
|
46
|
+
* ```
|
|
41
47
|
*/
|
|
42
48
|
async upload(file, fileName, contentType, folder, onProgress) {
|
|
43
49
|
const projectId = this.client.projectId;
|
|
50
|
+
const mimeType = contentType || 'application/octet-stream';
|
|
51
|
+
// [SEGURANÇA] Validação básica do arquivo
|
|
52
|
+
if (!file) {
|
|
53
|
+
return { data: null, error: 'Arquivo não fornecido' };
|
|
54
|
+
}
|
|
55
|
+
if (!fileName || typeof fileName !== 'string') {
|
|
56
|
+
return { data: null, error: 'Nome do arquivo inválido' };
|
|
57
|
+
}
|
|
44
58
|
try {
|
|
45
|
-
//
|
|
59
|
+
// ================================================================
|
|
60
|
+
// ETAPA 1: Obter URL presigned do backend
|
|
61
|
+
// ================================================================
|
|
46
62
|
const { data: uploadData } = await this.http.post(`/projects/${projectId}/storage/upload-url`, {
|
|
47
63
|
fileName,
|
|
48
|
-
contentType:
|
|
64
|
+
contentType: mimeType,
|
|
49
65
|
folder,
|
|
66
|
+
size: file instanceof Blob ? file.size : file.length,
|
|
50
67
|
});
|
|
51
|
-
// [FIX] Backend retorna { data: { uploadUrl, ... } }, então acessamos uploadData.data
|
|
52
68
|
const presignedUrl = uploadData.data.uploadUrl || uploadData.data.url;
|
|
53
69
|
const fileId = uploadData.data.fileId;
|
|
54
70
|
if (!presignedUrl) {
|
|
55
|
-
|
|
71
|
+
return { data: null, error: 'Servidor não retornou URL de upload válida' };
|
|
72
|
+
}
|
|
73
|
+
if (!fileId) {
|
|
74
|
+
return { data: null, error: 'Servidor não retornou ID do arquivo' };
|
|
56
75
|
}
|
|
57
|
-
//
|
|
76
|
+
// ================================================================
|
|
77
|
+
// ETAPA 2: Preparar blob para upload
|
|
78
|
+
// ================================================================
|
|
58
79
|
let blob;
|
|
59
|
-
|
|
60
|
-
|
|
80
|
+
let fileSize;
|
|
81
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(file)) {
|
|
82
|
+
// Node.js Buffer
|
|
83
|
+
blob = new Blob([new Uint8Array(file)], { type: mimeType });
|
|
84
|
+
fileSize = file.length;
|
|
61
85
|
}
|
|
62
|
-
else {
|
|
86
|
+
else if (file instanceof Blob) {
|
|
87
|
+
// Browser File/Blob
|
|
63
88
|
blob = file;
|
|
89
|
+
fileSize = file.size;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return { data: null, error: 'Tipo de arquivo não suportado' };
|
|
93
|
+
}
|
|
94
|
+
// [SEGURANÇA] Validação de tamanho zero (arquivo vazio/corrompido)
|
|
95
|
+
if (fileSize === 0) {
|
|
96
|
+
return { data: null, error: 'Arquivo está vazio (0 bytes)' };
|
|
97
|
+
}
|
|
98
|
+
// ================================================================
|
|
99
|
+
// ETAPA 3: Upload para S3 com validação rigorosa
|
|
100
|
+
// ================================================================
|
|
101
|
+
try {
|
|
102
|
+
const s3Response = await axios.put(presignedUrl, blob, {
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': mimeType,
|
|
105
|
+
// [SEGURANÇA] S3 verifica Content-Length automaticamente
|
|
106
|
+
},
|
|
107
|
+
// [FIX] Validar explicitamente status de sucesso
|
|
108
|
+
validateStatus: (status) => status >= 200 && status < 300,
|
|
109
|
+
onUploadProgress: (event) => {
|
|
110
|
+
if (onProgress && event.total) {
|
|
111
|
+
onProgress({
|
|
112
|
+
loaded: event.loaded,
|
|
113
|
+
total: event.total,
|
|
114
|
+
percent: Math.round((event.loaded / event.total) * 100),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
// [PERFORMANCE] Timeout de 5 minutos para arquivos grandes
|
|
119
|
+
timeout: 300000,
|
|
120
|
+
// [FIX] Não transformar dados (enviar raw)
|
|
121
|
+
transformRequest: [(data) => data],
|
|
122
|
+
});
|
|
123
|
+
// [SEGURANÇA] Validação explícita do status
|
|
124
|
+
if (s3Response.status < 200 || s3Response.status >= 300) {
|
|
125
|
+
console.error('[Aether SDK] Upload S3 falhou:', s3Response.status, s3Response.statusText);
|
|
126
|
+
return {
|
|
127
|
+
data: null,
|
|
128
|
+
error: `Upload para storage falhou: ${s3Response.status} ${s3Response.statusText}`
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (s3Error) {
|
|
133
|
+
// [SEGURANÇA] Captura específica de erros do S3
|
|
134
|
+
const axiosError = s3Error;
|
|
135
|
+
// Log para debug (não expõe URL presigned)
|
|
136
|
+
console.error('[Aether SDK] Falha no PUT S3:', {
|
|
137
|
+
status: axiosError.response?.status,
|
|
138
|
+
statusText: axiosError.response?.statusText,
|
|
139
|
+
code: axiosError.code,
|
|
140
|
+
message: axiosError.message,
|
|
141
|
+
});
|
|
142
|
+
// Mensagens de erro amigáveis por código
|
|
143
|
+
if (axiosError.code === 'ERR_NETWORK') {
|
|
144
|
+
return { data: null, error: 'Falha de rede ao enviar arquivo. Verifique sua conexão.' };
|
|
145
|
+
}
|
|
146
|
+
if (axiosError.response?.status === 403) {
|
|
147
|
+
return { data: null, error: 'URL de upload expirou. Tente novamente.' };
|
|
148
|
+
}
|
|
149
|
+
if (axiosError.response?.status === 400) {
|
|
150
|
+
return { data: null, error: 'Arquivo rejeitado pelo storage. Verifique o tipo e tamanho.' };
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
data: null,
|
|
154
|
+
error: axiosError.message || 'Falha ao enviar arquivo para storage'
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ================================================================
|
|
158
|
+
// ETAPA 4: Confirmar upload no backend
|
|
159
|
+
// ================================================================
|
|
160
|
+
const { data: fileData } = await this.http.post(`/projects/${projectId}/storage/confirm`, { fileId });
|
|
161
|
+
// [SEGURANÇA] Validar resposta do confirm
|
|
162
|
+
if (!fileData?.data?.id) {
|
|
163
|
+
return { data: null, error: 'Confirmação de upload falhou' };
|
|
64
164
|
}
|
|
65
|
-
// Faz upload direto para S3/storage
|
|
66
|
-
await axios.put(presignedUrl, blob, {
|
|
67
|
-
headers: {
|
|
68
|
-
'Content-Type': contentType || 'application/octet-stream',
|
|
69
|
-
},
|
|
70
|
-
onUploadProgress: (event) => {
|
|
71
|
-
if (onProgress && event.total) {
|
|
72
|
-
onProgress({
|
|
73
|
-
loaded: event.loaded,
|
|
74
|
-
total: event.total,
|
|
75
|
-
percent: Math.round((event.loaded / event.total) * 100),
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
// Confirma upload
|
|
81
|
-
const { data: fileData } = await this.http.post(`/projects/${projectId}/storage/confirm`, {
|
|
82
|
-
fileId: fileId,
|
|
83
|
-
});
|
|
84
165
|
return { data: fileData.data, error: null };
|
|
85
166
|
}
|
|
86
167
|
catch (err) {
|
|
168
|
+
// [SEGURANÇA] Tratamento genérico com log
|
|
87
169
|
const error = err;
|
|
170
|
+
console.error('[Aether SDK] Erro no upload:', error.message);
|
|
171
|
+
// Mensagem amigável baseada no status
|
|
172
|
+
if (error.response?.status === 429) {
|
|
173
|
+
return { data: null, error: 'Limite de uploads atingido. Tente novamente em alguns minutos.' };
|
|
174
|
+
}
|
|
175
|
+
if (error.response?.status === 413) {
|
|
176
|
+
return { data: null, error: 'Arquivo muito grande para upload.' };
|
|
177
|
+
}
|
|
88
178
|
return {
|
|
89
179
|
data: null,
|
|
90
|
-
error: error.response?.data?.
|
|
180
|
+
error: error.response?.data?.error ||
|
|
181
|
+
error.response?.data?.message ||
|
|
182
|
+
error.message ||
|
|
183
|
+
'Erro desconhecido no upload'
|
|
91
184
|
};
|
|
92
185
|
}
|
|
93
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/modules/storage.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAGhF,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAmB;IACzB,IAAI,CAAgB;IAE5B,YAAY,MAAwB,EAAE,IAAmB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/modules/storage.ts"],"names":[],"mappings":"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"}
|