Spaces:
Sleeping
Sleeping
| 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 | |
| }; | |