Restore the v2.1.19 application baseline and retain only the focused import preflight summary with duplicate, unavailable, destination, job, and size-limit visibility.
This commit is contained in:
+23
-125
@@ -2,7 +2,7 @@
|
||||
'use strict';
|
||||
|
||||
const pathApi = typeof require === 'function' ? require('path') : null;
|
||||
const metadataVersion = 2;
|
||||
const protectedStatuses = new Set(['done', 'error', 'aborted', 'skipped']);
|
||||
|
||||
function normalizeFile(file, platform) {
|
||||
const value = typeof file === 'string' ? file.trim() : '';
|
||||
@@ -59,39 +59,18 @@
|
||||
return uniqueHosters(values);
|
||||
}
|
||||
|
||||
function confirmedHosters(jobs, requiredHosters) {
|
||||
function completedHosters(jobs, requiredHosters) {
|
||||
const values = [];
|
||||
for (const job of jobs) {
|
||||
if (job.sourceCleanupMetadataVersion === metadataVersion && Array.isArray(job.sourceCleanupConfirmedHosters)) {
|
||||
values.push(...job.sourceCleanupConfirmedHosters);
|
||||
if (Array.isArray(job.sourceCleanupCompletedHosters)) {
|
||||
values.push(...job.sourceCleanupCompletedHosters);
|
||||
}
|
||||
}
|
||||
const confirmed = new Set(uniqueHosters(values));
|
||||
return requiredHosters.filter((hoster) => confirmed.has(hoster));
|
||||
}
|
||||
|
||||
function provisionalHosters(jobs, requiredHosters) {
|
||||
const values = [];
|
||||
for (const job of jobs) {
|
||||
if (job.sourceCleanupMetadataVersion === metadataVersion && Array.isArray(job.sourceCleanupProvisionalHosters)) {
|
||||
values.push(...job.sourceCleanupProvisionalHosters);
|
||||
}
|
||||
if (job.status === 'done') values.push(job.hoster);
|
||||
}
|
||||
const provisional = new Set(uniqueHosters(values));
|
||||
return requiredHosters.filter((hoster) => provisional.has(hoster));
|
||||
}
|
||||
|
||||
function startedHosters(jobs, requiredHosters) {
|
||||
const values = [];
|
||||
let legacyMetadata = false;
|
||||
for (const job of jobs) {
|
||||
if (job.sourceCleanupMetadataVersion !== metadataVersion) continue;
|
||||
if (!Array.isArray(job.sourceCleanupStartedHosters)) legacyMetadata = true;
|
||||
else values.push(...job.sourceCleanupStartedHosters);
|
||||
}
|
||||
if (legacyMetadata) return [...requiredHosters];
|
||||
const started = new Set(uniqueHosters(values));
|
||||
return requiredHosters.filter((hoster) => started.has(hoster));
|
||||
const completed = new Set(uniqueHosters(values));
|
||||
return requiredHosters.filter((hoster) => completed.has(hoster));
|
||||
}
|
||||
|
||||
function storedToken(jobs) {
|
||||
@@ -111,16 +90,12 @@
|
||||
return null;
|
||||
}
|
||||
|
||||
function assignMetadata(jobs, token, requiredHosters, confirmed, provisional, started, fingerprint, touchedJobs, touchedSet) {
|
||||
function assignMetadata(jobs, token, requiredHosters, completed, fingerprint, touchedJobs, touchedSet) {
|
||||
for (const job of jobs) {
|
||||
job.sourceCleanupMetadataVersion = metadataVersion;
|
||||
job.sourceCleanupToken = token;
|
||||
job.sourceCleanupRequiredHosters = [...requiredHosters];
|
||||
job.sourceCleanupConfirmedHosters = [...confirmed];
|
||||
job.sourceCleanupProvisionalHosters = [...provisional];
|
||||
job.sourceCleanupStartedHosters = [...started];
|
||||
job.sourceCleanupCompletedHosters = [...completed];
|
||||
job.sourceCleanupFingerprint = cloneFingerprint(fingerprint);
|
||||
delete job.sourceCleanupCompletedHosters;
|
||||
if (!touchedSet.has(job)) {
|
||||
touchedSet.add(job);
|
||||
touchedJobs.push(job);
|
||||
@@ -133,10 +108,7 @@
|
||||
const touchedJobs = [];
|
||||
const touchedSet = new Set();
|
||||
const preparedFiles = new Set();
|
||||
const revokedHosters = [];
|
||||
const revokedSet = new Set();
|
||||
if (!Array.isArray(queueJobs) || !Array.isArray(jobsToStart)) return { groups, touchedJobs, revokedHosters };
|
||||
const currentRoundJobs = new Set(jobsToStart);
|
||||
if (!Array.isArray(queueJobs) || !Array.isArray(jobsToStart)) return { groups, touchedJobs };
|
||||
|
||||
for (const selectedJob of jobsToStart) {
|
||||
const file = normalizeFile(selectedJob && selectedJob.file, platform);
|
||||
@@ -152,28 +124,14 @@
|
||||
...persistedRequired,
|
||||
...siblings.map((job) => job.hoster)
|
||||
]);
|
||||
const currentStartedHosters = new Set(uniqueHosters(
|
||||
siblings.filter((job) => currentRoundJobs.has(job)).map((job) => job.hoster)
|
||||
));
|
||||
const started = uniqueHosters([...startedHosters(siblings, requiredHosters), ...currentStartedHosters]);
|
||||
const storedConfirmed = confirmedHosters(siblings, requiredHosters);
|
||||
const confirmed = storedConfirmed.filter((hoster) => !currentStartedHosters.has(hoster));
|
||||
const provisional = provisionalHosters(siblings, requiredHosters)
|
||||
.filter((hoster) => !currentStartedHosters.has(hoster));
|
||||
for (const hoster of storedConfirmed) {
|
||||
if (!currentStartedHosters.has(hoster) || revokedSet.has(hoster)) continue;
|
||||
revokedSet.add(hoster);
|
||||
revokedHosters.push(hoster);
|
||||
}
|
||||
const completed = completedHosters(siblings, requiredHosters);
|
||||
const fingerprint = storedFingerprint(siblings);
|
||||
|
||||
assignMetadata(
|
||||
siblings,
|
||||
token,
|
||||
requiredHosters,
|
||||
confirmed,
|
||||
provisional,
|
||||
started,
|
||||
completed,
|
||||
fingerprint,
|
||||
touchedJobs,
|
||||
touchedSet
|
||||
@@ -183,107 +141,48 @@
|
||||
token,
|
||||
file: selectedJob.file,
|
||||
requiredHosters: [...requiredHosters],
|
||||
confirmedHosters: [...confirmed],
|
||||
completedHosters: [...completed],
|
||||
fingerprint: cloneFingerprint(fingerprint),
|
||||
jobs: siblings.map((job) => ({
|
||||
jobId: job.id,
|
||||
hoster: normalizeHoster(job.hoster),
|
||||
status: job.status,
|
||||
currentRound: currentRoundJobs.has(job)
|
||||
status: job.status
|
||||
}))
|
||||
});
|
||||
}
|
||||
|
||||
return { groups, touchedJobs, revokedHosters };
|
||||
return { groups, touchedJobs };
|
||||
}
|
||||
|
||||
function markCompleted(queueJobs, job, platform) {
|
||||
const siblings = relatedJobs(queueJobs, job, platform);
|
||||
if (siblings.length === 0) return [];
|
||||
const requiredHosters = storedRequiredHosters(siblings);
|
||||
const provisional = new Set(provisionalHosters(siblings, requiredHosters));
|
||||
const completed = new Set(completedHosters(siblings, requiredHosters));
|
||||
const hoster = normalizeHoster(job.hoster);
|
||||
if (requiredHosters.includes(hoster)) provisional.add(hoster);
|
||||
const orderedConfirmed = confirmedHosters(siblings, requiredHosters);
|
||||
const orderedProvisional = requiredHosters.filter((required) => provisional.has(required));
|
||||
if (requiredHosters.includes(hoster)) completed.add(hoster);
|
||||
const orderedCompleted = requiredHosters.filter((required) => completed.has(required));
|
||||
for (const sibling of siblings) {
|
||||
sibling.sourceCleanupMetadataVersion = metadataVersion;
|
||||
sibling.sourceCleanupConfirmedHosters = [...orderedConfirmed];
|
||||
sibling.sourceCleanupProvisionalHosters = [...orderedProvisional];
|
||||
delete sibling.sourceCleanupCompletedHosters;
|
||||
sibling.sourceCleanupCompletedHosters = [...orderedCompleted];
|
||||
}
|
||||
return siblings;
|
||||
}
|
||||
|
||||
async function persistRoundCompletions(queueJobs, options = {}) {
|
||||
if (!Array.isArray(queueJobs) || typeof options.persist !== 'function') return false;
|
||||
const historyPersisted = options.historyPersisted === true;
|
||||
const groupsByToken = new Map();
|
||||
for (const job of queueJobs) {
|
||||
if (!job || typeof job.sourceCleanupToken !== 'string' || !job.sourceCleanupToken) continue;
|
||||
if (!groupsByToken.has(job.sourceCleanupToken)) groupsByToken.set(job.sourceCleanupToken, []);
|
||||
groupsByToken.get(job.sourceCleanupToken).push(job);
|
||||
}
|
||||
const snapshots = [];
|
||||
for (const jobs of groupsByToken.values()) {
|
||||
const requiredHosters = storedRequiredHosters(jobs);
|
||||
const confirmed = confirmedHosters(jobs, requiredHosters);
|
||||
const provisional = provisionalHosters(jobs, requiredHosters);
|
||||
const promoted = historyPersisted
|
||||
? uniqueHosters([...confirmed, ...provisional])
|
||||
: confirmed;
|
||||
const orderedPromoted = requiredHosters.filter((hoster) => promoted.includes(hoster));
|
||||
for (const job of jobs) {
|
||||
snapshots.push({
|
||||
job,
|
||||
confirmedHosters: job.sourceCleanupMetadataVersion === metadataVersion
|
||||
? uniqueHosters(job.sourceCleanupConfirmedHosters)
|
||||
: []
|
||||
});
|
||||
job.sourceCleanupMetadataVersion = metadataVersion;
|
||||
job.sourceCleanupConfirmedHosters = [...orderedPromoted];
|
||||
job.sourceCleanupProvisionalHosters = [];
|
||||
delete job.sourceCleanupCompletedHosters;
|
||||
}
|
||||
}
|
||||
let persisted = false;
|
||||
try {
|
||||
persisted = (await options.persist()) === true;
|
||||
} catch {}
|
||||
if (!persisted) {
|
||||
for (const snapshot of snapshots) {
|
||||
snapshot.job.sourceCleanupMetadataVersion = metadataVersion;
|
||||
snapshot.job.sourceCleanupConfirmedHosters = [...snapshot.confirmedHosters];
|
||||
snapshot.job.sourceCleanupProvisionalHosters = [];
|
||||
delete snapshot.job.sourceCleanupCompletedHosters;
|
||||
}
|
||||
}
|
||||
return persisted;
|
||||
}
|
||||
|
||||
function removeRequirement(queueJobs, job, platform) {
|
||||
if (!job || job.status !== 'preview' || job.interrupted) return [];
|
||||
if (!job || protectedStatuses.has(job.status)) return [];
|
||||
const siblings = relatedJobs(queueJobs, job, platform);
|
||||
const removedHoster = normalizeHoster(job.hoster);
|
||||
if (startedHosters(siblings, storedRequiredHosters(siblings)).includes(removedHoster)) return [];
|
||||
for (const sibling of siblings) {
|
||||
const required = Array.isArray(sibling.sourceCleanupRequiredHosters)
|
||||
? sibling.sourceCleanupRequiredHosters
|
||||
: [];
|
||||
const confirmed = sibling.sourceCleanupMetadataVersion === metadataVersion && Array.isArray(sibling.sourceCleanupConfirmedHosters)
|
||||
? sibling.sourceCleanupConfirmedHosters
|
||||
const completed = Array.isArray(sibling.sourceCleanupCompletedHosters)
|
||||
? sibling.sourceCleanupCompletedHosters
|
||||
: [];
|
||||
const provisional = sibling.sourceCleanupMetadataVersion === metadataVersion && Array.isArray(sibling.sourceCleanupProvisionalHosters)
|
||||
? sibling.sourceCleanupProvisionalHosters
|
||||
: [];
|
||||
sibling.sourceCleanupMetadataVersion = metadataVersion;
|
||||
sibling.sourceCleanupRequiredHosters = uniqueHosters(required)
|
||||
.filter((hoster) => hoster !== removedHoster);
|
||||
sibling.sourceCleanupConfirmedHosters = uniqueHosters(confirmed)
|
||||
sibling.sourceCleanupCompletedHosters = uniqueHosters(completed)
|
||||
.filter((hoster) => hoster !== removedHoster);
|
||||
sibling.sourceCleanupProvisionalHosters = uniqueHosters(provisional)
|
||||
.filter((hoster) => hoster !== removedHoster);
|
||||
delete sibling.sourceCleanupCompletedHosters;
|
||||
}
|
||||
return siblings;
|
||||
}
|
||||
@@ -312,7 +211,6 @@
|
||||
const api = {
|
||||
prepareGroups,
|
||||
markCompleted,
|
||||
persistRoundCompletions,
|
||||
removeRequirement,
|
||||
applyFingerprints
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user