Redesign the desktop workspace with task sidebars, live filters, clearer settings, and an accessible update dialog. Harden encrypted backup imports, configuration persistence, history retention, queue snapshots, shutdown recovery, and update installation ordering. Publish verified Windows artifacts and refreshed English documentation.
60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
(function (root) {
|
|
'use strict';
|
|
|
|
function makeThrottleTimer(opts) {
|
|
const o = opts || {};
|
|
const now = typeof o.now === 'function' ? o.now : (() => Date.now());
|
|
const schedule = typeof o.schedule === 'function'
|
|
? o.schedule
|
|
: ((cb, ms) => setTimeout(cb, ms));
|
|
const clear = typeof o.clear === 'function' ? o.clear : ((h) => clearTimeout(h));
|
|
|
|
let handle = null;
|
|
let burstStart = null;
|
|
let pendingFn = null;
|
|
|
|
function fire() {
|
|
handle = null;
|
|
burstStart = null;
|
|
const fn = pendingFn;
|
|
pendingFn = null;
|
|
if (typeof fn === 'function') fn();
|
|
}
|
|
|
|
function request(fn, delay, maxWait) {
|
|
if (typeof fn === 'function') pendingFn = fn;
|
|
const t = now();
|
|
if (burstStart === null) burstStart = t;
|
|
let wait = typeof delay === 'number' && delay >= 0 ? delay : 0;
|
|
if (typeof maxWait === 'number' && maxWait >= 0) {
|
|
const remaining = maxWait - (t - burstStart);
|
|
wait = Math.min(wait, remaining < 0 ? 0 : remaining);
|
|
}
|
|
if (handle !== null) clear(handle);
|
|
handle = schedule(fire, wait);
|
|
}
|
|
|
|
function flushSync() {
|
|
if (handle !== null) { clear(handle); handle = null; }
|
|
burstStart = null;
|
|
const fn = pendingFn;
|
|
pendingFn = null;
|
|
if (typeof fn === 'function') fn();
|
|
}
|
|
|
|
function cancel() {
|
|
if (handle !== null) { clear(handle); handle = null; }
|
|
burstStart = null;
|
|
pendingFn = null;
|
|
}
|
|
|
|
function isPending() { return handle !== null; }
|
|
|
|
return { request, flushSync, cancel, isPending };
|
|
}
|
|
|
|
const api = { makeThrottleTimer };
|
|
if (typeof module !== 'undefined' && module.exports) module.exports = api;
|
|
else if (root) root.ThrottleTimer = api;
|
|
})(typeof window !== 'undefined' ? window : this);
|