ZIP extraction error handling (#4002) * Improve error handling in extractFileFromZipBuffer function * Add warning logging to NovelAI image upscaling
Signed| @@ -394,7 +394,8 @@ router.post('/generate-image', async (request, response) => { | ||
| 394 | 394 | }); |
| 395 | 395 | |
| 396 | 396 | if (!upscaleResult.ok) { |
| 397 | - throw new Error('NovelAI returned an error.'); | |
| 397 | + const text = await upscaleResult.text(); | |
| 398 | + throw new Error('NovelAI returned an error.', { cause: text }); | |
| 398 | 399 | } |
| 399 | 400 | |
| 400 | 401 | const upscaledArchiveBuffer = await upscaleResult.arrayBuffer(); |
| @@ -408,7 +409,7 @@ router.post('/generate-image', async (request, response) => { | ||
| 408 | 409 | |
| 409 | 410 | return response.send(upscaledBase64); |
| 410 | 411 | } catch (error) { |
| 411 | 412 | console.warn('NovelAI generated an image, but upscaling failed. Returning original image.', error); |
| 412 | 413 | return response.send(originalBase64); |
| 413 | 414 | } |
| 414 | 415 | } catch (error) { |
| @@ -207,16 +207,23 @@ export function formatBytes(bytes) { | ||
| 207 | 207 | * @returns {Promise<Buffer|null>} Buffer containing the extracted file. Null if the file was not found. |
| 208 | 208 | */ |
| 209 | 209 | export async function extractFileFromZipBuffer(archiveBuffer, fileExtension) { |
| 210 | - return await new Promise((resolve, reject) => yauzl.fromBuffer(Buffer.from(archiveBuffer), { lazyEntries: true }, (err, zipfile) => { | |
| 210 | + return await new Promise((resolve) => { | |
| 211 | - if (err) reject(err); | |
| 211 | + try { | |
| 212 | + yauzl.fromBuffer(Buffer.from(archiveBuffer), { lazyEntries: true }, (err, zipfile) => { | |
| 213 | + if (err) { | |
| 214 | + console.warn(`Error opening ZIP file: ${err.message}`); | |
| 215 | + return resolve(null); | |
| 216 | + } | |
| 212 | 217 | |
| 213 | 218 | zipfile.readEntry(); |
| 219 | + | |
| 214 | 220 | zipfile.on('entry', (entry) => { |
| 215 | 221 | if (entry.fileName.endsWith(fileExtension) && !entry.fileName.startsWith('__MACOSX')) { |
| 216 | 222 | console.info(`Extracting ${entry.fileName}`); |
| 217 | 223 | zipfile.openReadStream(entry, (err, readStream) => { |
| 218 | 224 | if (err) { |
| 219 | - reject(err); | |
| 225 | + console.warn(`Error opening read stream: ${err.message}`); | |
| 226 | + return zipfile.readEntry(); | |
| 220 | 227 | } else { |
| 221 | 228 | const chunks = []; |
| 222 | 229 | readStream.on('data', (chunk) => { |
| @@ -228,14 +235,30 @@ export async function extractFileFromZipBuffer(archiveBuffer, fileExtension) { | ||
| 228 | 235 | resolve(buffer); |
| 229 | 236 | zipfile.readEntry(); // Continue to the next entry |
| 230 | 237 | }); |
| 238 | + | |
| 239 | + readStream.on('error', (err) => { | |
| 240 | + console.warn(`Error reading stream: ${err.message}`); | |
| 241 | + zipfile.readEntry(); | |
| 242 | + }); | |
| 231 | 243 | } |
| 232 | 244 | }); |
| 233 | 245 | } else { |
| 234 | 246 | zipfile.readEntry(); |
| 235 | 247 | } |
| 236 | 248 | }); |
| 249 | + | |
| 250 | + zipfile.on('error', (err) => { | |
| 251 | + console.warn('ZIP processing error', err); | |
| 252 | + resolve(null); | |
| 253 | + }); | |
| 254 | + | |
| 237 | 255 | zipfile.on('end', () => resolve(null)); |
| 238 | 256 | })); |
| 257 | + } catch (error) { | |
| 258 | + console.warn('Failed to process ZIP buffer', error); | |
| 259 | + resolve(null); | |
| 260 | + } | |
| 261 | + }); | |
| 239 | 262 | } |
| 240 | 263 | |
| 241 | 264 | /** |