diff --git a/lib/clouddrop-upload.js b/lib/clouddrop-upload.js index 6a31130..7bd9585 100644 --- a/lib/clouddrop-upload.js +++ b/lib/clouddrop-upload.js @@ -78,10 +78,22 @@ class ClouddropUploader { fileId = await this._uploadChunked(filePath, fileName, fileSize, progressCb, signal, throttle); } - // Create a share link for the uploaded file - const shareUrl = await this._createShareLink(fileId, signal); + // Create a share link — retry a few times while server post-processes the file. + // If share-link ultimately fails, DO NOT throw: upload itself succeeded and we + // don't want upload-manager to retry the entire (possibly multi-GB) upload. + let shareUrl = null; + const shareAttempts = 6; + for (let i = 0; i < shareAttempts; i++) { + if (signal && signal.aborted) throw new Error('Aborted'); + try { + shareUrl = await this._createShareLink(fileId, signal); + if (shareUrl) break; + } catch (err) { + if (i === shareAttempts - 1) break; + await new Promise(r => setTimeout(r, 3000 + i * 2000)); + } + } - // Extract slug from share URL (format: https://clouddrop.cc/share/SLUG) const slugMatch = String(shareUrl || '').match(/\/share\/([a-zA-Z0-9]+)/); const fileCode = slugMatch ? slugMatch[1] : fileId;