UNPKG

@masa-dev/react-signage

Version:

This is a react library for signage.

63 lines (62 loc) 1.93 kB
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, }; }