perf: bound Build my Today readiness checks (Closes #637)
This commit is contained in:
1 parent
9737300d55
commit
bbc3e10525
15 files changed
+180
-36
No files matched your search
+21
-16
@@ -1466,6 +1466,9 @@
|
||||
}
|
||||
|
||||
function closePlanToday(navigate = true) {
|
||||
planTodayReadiness.cancel();
|
||||
qs('#build-today-plan').disabled = false;
|
||||
qs('#plan-today-build-status').textContent = '';
|
||||
if (navigate) {
|
||||
taskOverlayHistory.close();
|
||||
return;
|
||||
@@ -1514,28 +1517,30 @@
|
||||
},
|
||||
});
|
||||
|
||||
const planTodayReadiness = createPlanTodayReadiness({
|
||||
concurrency:3,
|
||||
identity:item => todayWork.identity(item),
|
||||
inspect:async item => {
|
||||
if (item.kind !== 'issue') return { status:'ready' };
|
||||
const detail = await inspectTodayDependencies(item);
|
||||
if (!detail.available) return { status:'unverified' };
|
||||
if (detail.dependencies.length) return {
|
||||
status:'blocked', reason:detail.dependencies.length + ' open ' +
|
||||
(detail.dependencies.length === 1 ? 'dependency' : 'dependencies'),
|
||||
};
|
||||
return { status:'ready' };
|
||||
},
|
||||
});
|
||||
|
||||
async function buildTodayPlan() {
|
||||
const button = qs('#build-today-plan');
|
||||
const state = planToday.snapshot();
|
||||
const candidates = state.ids.map(id => planToday.item(id)).concat(planToday.candidates());
|
||||
button.disabled = true;
|
||||
qs('#plan-today-build-status').textContent = 'Checking readiness and fitting your highest-ranked work…';
|
||||
const checks = await Promise.all(candidates.map(async item => {
|
||||
const id = todayWork.identity(item);
|
||||
if (item.kind !== 'issue') return [id, { status:'ready' }];
|
||||
try {
|
||||
const detail = await inspectTodayDependencies(item);
|
||||
if (!detail.available) return [id, { status:'unverified' }];
|
||||
if (detail.dependencies.length) return [id, {
|
||||
status:'blocked', reason:detail.dependencies.length + ' open ' +
|
||||
(detail.dependencies.length === 1 ? 'dependency' : 'dependencies'),
|
||||
}];
|
||||
return [id, { status:'ready' }];
|
||||
} catch (_error) {
|
||||
return [id, { status:'unverified' }];
|
||||
}
|
||||
}));
|
||||
planToday.buildRecommendation(Object.fromEntries(checks));
|
||||
const checks = await planTodayReadiness.run(candidates);
|
||||
if (!checks) return;
|
||||
planToday.buildRecommendation(checks);
|
||||
button.disabled = false;
|
||||
renderPlanToday();
|
||||
}
|
||||
|
||||
@@ -907,6 +907,7 @@
|
||||
<script src="static/comment-next.js"></script>
|
||||
<script src="static/update-reply-read-next.js"></script>
|
||||
<script src="static/plan-today.js"></script>
|
||||
<script src="static/plan-today-readiness.js"></script>
|
||||
<script src="static/plan-today-preview.js"></script>
|
||||
<script src="static/today-sync.js"></script>
|
||||
<script src="static/today-rollover.js"></script>
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
function createPlanTodayReadiness({ identity, inspect, concurrency = 3 }) {
|
||||
const workerCount = Math.max(1, Math.floor(Number(concurrency) || 1));
|
||||
let generation = 0;
|
||||
|
||||
async function run(items) {
|
||||
const runGeneration = ++generation;
|
||||
const candidates = Array.from(items || []);
|
||||
const results = new Array(candidates.length);
|
||||
let next = 0;
|
||||
|
||||
async function worker() {
|
||||
while (next < candidates.length) {
|
||||
const index = next;
|
||||
next += 1;
|
||||
const item = candidates[index];
|
||||
let result;
|
||||
try {
|
||||
result = await inspect(item);
|
||||
} catch (_error) {
|
||||
result = { status:'unverified' };
|
||||
}
|
||||
results[index] = [identity(item), result];
|
||||
}
|
||||
}
|
||||
|
||||
await Promise.all(Array.from(
|
||||
{ length:Math.min(workerCount, candidates.length) },
|
||||
() => worker(),
|
||||
));
|
||||
if (runGeneration !== generation) return null;
|
||||
return Object.fromEntries(results);
|
||||
}
|
||||
|
||||
function cancel() {
|
||||
generation += 1;
|
||||
}
|
||||
|
||||
return { run, cancel };
|
||||
}
|
||||
|
||||
if (typeof module !== 'undefined' && module.exports) module.exports = createPlanTodayReadiness;
|
||||
@@ -1,6 +1,6 @@
|
||||
const BASE = new URL('./', self.location.href).pathname;
|
||||
importScripts(BASE + 'static/background-issue-sync.js');
|
||||
const CACHE = 'stackchain-dashboard-shell-v94';
|
||||
const CACHE = 'stackchain-dashboard-shell-v95';
|
||||
const OFFLINE_LEASE_URL = new URL(BASE + '__offline-session-lease', self.location.origin).href;
|
||||
const OUTAGE_STATUSES = new Set([500, 502, 503, 504]);
|
||||
const NAVIGATION_TIMEOUT_MS = self.__STACKCHAIN_NAVIGATION_TIMEOUT_MS || 4000;
|
||||
@@ -41,6 +41,7 @@ const SHELL = [
|
||||
BASE + 'static/comment-next.js',
|
||||
BASE + 'static/update-reply-read-next.js',
|
||||
BASE + 'static/plan-today.js',
|
||||
BASE + 'static/plan-today-readiness.js',
|
||||
BASE + 'static/plan-today-preview.js',
|
||||
BASE + 'static/today-sync.js',
|
||||
BASE + 'static/today-rollover.js',
|
||||
|
||||
Reference in new issue
Block a user