2019-02-07 01:20:27 +01:00
|
|
|
import Transaction from "./transaction.js";
|
2019-06-26 22:00:50 +02:00
|
|
|
import { STORE_NAMES, StorageError } from "../common.js";
|
2019-02-05 00:21:50 +01:00
|
|
|
|
|
|
|
export default class Storage {
|
|
|
|
constructor(idbDatabase) {
|
|
|
|
this._db = idbDatabase;
|
|
|
|
const nameMap = STORE_NAMES.reduce((nameMap, name) => {
|
|
|
|
nameMap[name] = name;
|
|
|
|
return nameMap;
|
|
|
|
}, {});
|
|
|
|
this.storeNames = Object.freeze(nameMap);
|
|
|
|
}
|
|
|
|
|
|
|
|
_validateStoreNames(storeNames) {
|
2019-02-10 21:25:29 +01:00
|
|
|
const idx = storeNames.findIndex(name => !STORE_NAMES.includes(name));
|
|
|
|
if (idx !== -1) {
|
2019-06-26 22:00:50 +02:00
|
|
|
throw new StorageError(`Tried top, a transaction unknown store ${storeNames[idx]}`);
|
2019-02-05 00:21:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-16 00:27:13 +01:00
|
|
|
async readTxn(storeNames) {
|
2019-02-05 00:21:50 +01:00
|
|
|
this._validateStoreNames(storeNames);
|
2019-06-26 22:00:50 +02:00
|
|
|
try {
|
|
|
|
const txn = this._db.transaction(storeNames, "readonly");
|
|
|
|
return new Transaction(txn, storeNames);
|
|
|
|
} catch(err) {
|
|
|
|
throw new StorageError("readTxn failed", err);
|
|
|
|
}
|
2019-02-05 00:21:50 +01:00
|
|
|
}
|
|
|
|
|
2019-02-16 00:27:13 +01:00
|
|
|
async readWriteTxn(storeNames) {
|
2019-02-05 00:21:50 +01:00
|
|
|
this._validateStoreNames(storeNames);
|
2019-06-26 22:00:50 +02:00
|
|
|
try {
|
|
|
|
const txn = this._db.transaction(storeNames, "readwrite");
|
|
|
|
return new Transaction(txn, storeNames);
|
|
|
|
} catch(err) {
|
|
|
|
throw new StorageError("readWriteTxn failed", err);
|
|
|
|
}
|
2019-02-05 00:21:50 +01:00
|
|
|
}
|
2019-05-12 20:24:06 +02:00
|
|
|
}
|