Files
Multi-Hoster-Upload/lib/upload-recovery.js
T
Sucukdeluxe b286574902
CI / verify (push) Failing after 21m12s
Harden upload finalization and release verification
Preserve uncertain remote commits and destructive source-cleanup requirements across cancellation, persistence failures, retries, and restart recovery. Revalidate account availability after admission waits and prevent late upload results from bypassing cancellation state. Strengthen release argument, CI tag, source allowlist, and secret scanning gates. Run the Electron smoke suite in a fully hidden offscreen harness that cannot reveal, focus, or elevate native windows.
2026-08-15 04:06:53 +02:00

97 lines
3.9 KiB
JavaScript

(function exposeUploadRecovery(root, factory) {
const api = factory();
if (typeof module !== 'undefined' && module.exports) module.exports = api;
if (root) root.UploadRecovery = api;
})(typeof window !== 'undefined' ? window : globalThis, () => {
const terminalStatuses = new Set(['done', 'error', 'skipped', 'aborted']);
function buildTerminalJobSnapshots(summary) {
const snapshots = new Map();
for (const file of Array.isArray(summary?.files) ? summary.files : []) {
for (const result of Array.isArray(file?.results) ? file.results : []) {
const jobId = typeof result?.jobId === 'string' ? result.jobId : '';
const status = typeof result?.status === 'string' ? result.status : '';
if (!jobId || !terminalStatuses.has(status)) continue;
const uploadResult = result.download_url || result.embed_url || result.file_code
? {
download_url: result.download_url || null,
embed_url: result.embed_url || null,
file_code: result.file_code || null
}
: null;
snapshots.set(jobId, {
jobId,
status,
error: result.error || null,
failureDetails: result.failureDetails || null,
...(result.remoteCommitUncertain === true ? { remoteCommitUncertain: true } : {}),
result: uploadResult
});
}
}
return Array.from(snapshots.values());
}
function buildFailedUploadSummary(tasks, message, now = Date.now()) {
const files = new Map();
for (const [index, task] of (Array.isArray(tasks) ? tasks : []).entries()) {
if (!task || typeof task !== 'object') continue;
const filePath = typeof task.file === 'string' ? task.file : '';
const fileName = filePath.split(/[\\/]/).pop() || `upload-${index + 1}`;
const key = filePath || `${fileName}\0${index}`;
if (!files.has(key)) files.set(key, { name: fileName, size: 0, results: [] });
files.get(key).results.push({
jobId: typeof task.jobId === 'string' ? task.jobId : '',
hoster: typeof task.hoster === 'string' ? task.hoster : '',
status: 'error',
error: message,
failureDetails: null,
download_url: null,
embed_url: null,
file_code: null
});
}
const grouped = Array.from(files.values());
const failed = grouped.reduce((count, file) => count + file.results.length, 0);
return {
id: `start-error-${now}`,
timestamp: new Date(now).toISOString(),
total: failed,
succeeded: 0,
failed,
skipped: 0,
files: grouped,
error: message
};
}
function getRecoveryOutcome(job, recovery) {
const status = typeof job?.status === 'string' ? job.status : 'preview';
const jobId = typeof job?.id === 'string' ? job.id : '';
const terminal = Array.isArray(recovery?.terminalJobs)
? recovery.terminalJobs.find(entry => entry?.jobId === jobId && terminalStatuses.has(entry.status))
: null;
if (terminal) {
return {
status: terminal.status,
error: terminal.error || null,
failureDetails: terminal.failureDetails || null,
...(terminal.remoteCommitUncertain === true ? { remoteCommitUncertain: true } : {}),
result: terminal.result || null,
...(recovery?.historyPending === true ? { historyPending: true } : {}),
interrupted: false
};
}
const interruptedIds = new Set(Array.isArray(recovery?.jobIds) ? recovery.jobIds.filter(Boolean) : []);
return { status, interrupted: interruptedIds.has(jobId) && !terminalStatuses.has(status) };
}
function resolveRemoteCommitUncertainty(previous, progress) {
if (progress?.remoteCommitUncertain === true) return true;
if (progress?.status === 'done') return false;
return previous === true;
}
return { buildFailedUploadSummary, buildTerminalJobSnapshots, getRecoveryOutcome, resolveRemoteCommitUncertainty };
});