CI / verify (push) Has been cancelled
Refresh release metadata immediately before downloading an update and keep automatic checks current while the app remains open. Accept desktop file drops from the first renderer frame, preserve early and rapid drops until initialization completes, and show the live remaining upload size in the sidebar. Add regression coverage for update freshness, startup drag-and-drop ordering, localization, and remaining-byte retry behavior. Bump the application to v2.1.25.
44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
(function (root) {
|
|
'use strict';
|
|
|
|
function createSerializedRunner(task) {
|
|
if (typeof task !== 'function') throw new TypeError('task must be a function');
|
|
let pending = Promise.resolve();
|
|
return {
|
|
run(...args) {
|
|
const result = pending.catch(() => {}).then(() => task(...args));
|
|
pending = result;
|
|
return result;
|
|
},
|
|
flush() {
|
|
return pending;
|
|
}
|
|
};
|
|
}
|
|
|
|
function createReadySerializedRunner(task) {
|
|
let ready = false;
|
|
let releaseReady;
|
|
const readyPromise = new Promise((resolve) => { releaseReady = resolve; });
|
|
const runner = createSerializedRunner(async (...args) => {
|
|
await readyPromise;
|
|
return task(...args);
|
|
});
|
|
return {
|
|
run: (...args) => runner.run(...args),
|
|
flush: () => runner.flush(),
|
|
ready() {
|
|
if (ready) return false;
|
|
ready = true;
|
|
releaseReady();
|
|
return true;
|
|
},
|
|
get isReady() { return ready; }
|
|
};
|
|
}
|
|
|
|
const api = { createSerializedRunner, createReadySerializedRunner };
|
|
if (typeof module !== 'undefined' && module.exports) module.exports = api;
|
|
else if (root) root.SerializedRunner = api;
|
|
})(typeof window !== 'undefined' ? window : this);
|