Spaces:
Sleeping
Sleeping
File size: 2,264 Bytes
7aec436 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import largeAssets from '../large-assets';
import {buildId} from '../build-id';
import Database from '../../common/idb';
const DATABASE_NAME = 'p4-large-assets';
const DATABASE_VERSION = 1;
const STORE_NAME = 'assets';
const db = new Database(DATABASE_NAME, DATABASE_VERSION, STORE_NAME);
const getAssetId = (asset) => {
if (asset.sha256) {
return asset.sha256;
}
return `${buildId}-${JSON.stringify(asset.src)}`;
};
const removeExtraneous = async () => {
const {transaction, store} = await db.createTransaction('readwrite');
return new Promise((resolve, reject) => {
Database.setTransactionErrorHandler(transaction, reject);
const keyRequest = store.getAllKeys();
keyRequest.onsuccess = async e => {
const keys = e.target.result;
const allValidAssetIds = Object.values(largeAssets).map(getAssetId);
const keysToDelete = keys.filter(i => !allValidAssetIds.includes(i));
for (const key of keysToDelete) {
await new Promise(resolveDelete => {
const deleteRequest = store.delete(key);
deleteRequest.onsuccess = () => {
resolveDelete();
};
});
}
resolve();
};
});
};
const get = async (asset) => {
const {transaction, store} = await db.createTransaction('readonly');
return new Promise((resolve, reject) => {
Database.setTransactionErrorHandler(transaction, reject);
const assetId = getAssetId(asset);
const request = store.get(assetId);
request.onsuccess = (e) => {
const result = e.target.result;
if (result) {
resolve(result.data);
} else {
resolve(null);
}
};
});
};
const set = async (asset, content) => {
const {transaction, store} = await db.createTransaction('readwrite');
return new Promise((resolve, reject) => {
Database.setTransactionErrorHandler(transaction, reject);
const assetId = getAssetId(asset);
const request = store.put({
id: assetId,
data: content
});
request.onsuccess = () => {
resolve();
};
});
};
const resetAll = () => db.deleteEverything();
removeExtraneous();
export default {
get,
set,
resetAll
};
|