async function* stepwiseLoad(url) {
const state = {
url,
label: 'unstarted',
log: [],
};
function report(label, data={}) {
state.label = label;
state.log.push({...data, event: label, date: new Date()});
return state;
}
try {
let p, response;
yield report('created');
p = fetch(url, {method: 'head', mode: 'cors'});
yield report('head-requested');
response = await p;
yield report('found', {response});
if (!response.ok)
throw new Error(response.status);
if (!url.endsWith('.json')) {
yield report('done');
return;
}
p = fetch(url, {mode: 'cors'});
yield report('body-requested');
response = await p;
yield report('body-responded', {response});
if (!response.ok)
throw new Error(response.status);
const data = await response.json();
yield report('parsed', {data});
const tally = tallyKeys(data);
yield report('tallied', {tally});
yield report('done');
} catch (error) {
state.error = error;
yield report('failed', {error});
}
return;
}