@masa-dev/react-signage
Version:
This is a react library for signage.
63 lines (62 loc) • 1.93 kB
JavaScript
import { db } from './db';
export function useDataStore() {
async function getMediaData(url) {
await updateMediaStatus(url, { accessedAt: new Date() });
return await db.mediaData.get(url);
}
async function upsertMediaData(params) {
const size = params.blob?.size ?? 0;
await updateMediaStatus(params.url, { size, accessedAt: new Date() });
while (true) {
try {
await db.mediaData.put({ url: params.url, blob: params.blob, updatedAt: new Date() });
return true;
}
catch (e) {
const deletedSize = await deleteLeastAccessedMediaData();
if (!deletedSize) {
return false;
}
}
}
}
async function deleteLeastAccessedMediaData() {
const orderKey = 'accessedAt';
const data = await db.mediaStatus.orderBy(orderKey).first();
if (!data)
return 0;
return await deleteMediaData(data.url);
}
async function deleteMediaData(url) {
const status = await db.mediaStatus.get(url);
if (!status)
return 0;
await db.mediaStatus.delete(url);
await db.mediaData.delete(url);
return status.size;
}
async function mediaDataExists(url) {
const urlKey = 'url';
const count = await db.mediaData.where(urlKey).equals(url).count();
return count > 0;
}
async function updateMediaStatus(url, status) {
const defaultStatus = {
url,
status: 'pending',
size: 0,
accessedAt: new Date()
};
await db.mediaStatus.put({
...defaultStatus,
...status,
});
}
return {
upsertMediaData,
getMediaData,
deleteMediaData,
mediaDataExists,
updateMediaStatus,
};
}