HIT Database Backup

Does things...

// ==UserScript==
// @name         HIT Database Backup
// @namespace    https://github.com/Kadauchi
// @version      1.0.2
// @description  Does things...
// @author       Kadauchi
// @icon         http://i.imgur.com/oGRQwPN.png
// @include      https://www.mturk.com/hitdb
// ==/UserScript==

document.body.innerHTML = `creating hit_database.json.... please wait`;

let hitdb;

const request = window.indexedDB.open(`HITDB`);

request.onsuccess = (event) => {
	hitdb = event.target.result;
	generateFile();
};
request.onupgradeneeded = (event) => {
	document.body.innerHTML = `no hit database found`;
};
request.onerror = (event) => {
	document.body.innerHTML = `error: something went wrong`;
};

async function generateFile() {
	const data = JSON.stringify({
		HIT: await getObjectStore(`HIT`),
		STATS: await getObjectStore(`STATS`),
		NOTES: await getObjectStore(`NOTES`)
	});

	document.body.innerHTML = `creating hit_database.json.... this may take awhile`;

	const exportFile = document.createElement(`a`);
        document.body.appendChild(exportFile);
	exportFile.href = window.URL.createObjectURL(new Blob([data], { type: `application/json` }));
	exportFile.download = `hit_database.json`;
	exportFile.click();

	document.body.innerHTML = `hit_database.json.... downloaded`;
}

function getObjectStore(name) {
	return new Promise((resolve) => {
		try {
			const transaction = hitdb.transaction([name], `readonly`);
			const objectStore = transaction.objectStore(name);

			let cursorCount = 0, cursorAccumulator = [];

			objectStore.openCursor().onsuccess = (event) => {
				document.body.innerHTML = `processing hit database.... ${name} ${++ cursorCount}`;

				const cursor = event.target.result;

				if (cursor) {
					cursorAccumulator.push(cursor.value);
					cursor.continue();
				}
				else {
					resolve(cursorAccumulator);
				}
			};
		}
		catch (error) {
			resolve();
		}
	});
}