Source code

Revision control

Copy as Markdown

Other Tools

// For each way of reading the record, reports which event fired and what reading the value threw.
function openDatabase(name) {
return new Promise((resolve, reject) => {
const request = indexedDB.open(name);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
function read(db, makeRequest, readValue) {
return new Promise(resolve => {
const store = db.transaction('store', 'readonly').objectStore('store');
const request = makeRequest(store);
request.onsuccess = () => {
try {
readValue(request.result);
resolve({ event: 'success', exception: null });
} catch (e) {
resolve({ event: 'success', exception: e.name });
}
};
request.onerror = e => {
e.preventDefault();
resolve({ event: 'error', error: request.error.name });
};
});
}
onmessage = async e => {
const db = await openDatabase(e.data);
const report = {
get: await read(db, store => store.get('key'), result => result),
getAll: await read(db, store => store.getAll(), result => result),
cursor: await read(db, store => store.openCursor(), cursor => cursor.value),
getAllRecords: 'getAllRecords' in IDBObjectStore.prototype
? await read(db, store => store.getAllRecords(), records => records[0].value)
: 'unsupported',
};
db.close();
postMessage(report);
};