UNPKG

scrivito

Version:

Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.

86 lines (73 loc) 1.99 kB
import { ScrivitoError, collectAndSchedule, nextTick, onReset, } from 'scrivito_sdk/common'; import { LoadableData } from 'scrivito_sdk/loadable'; import { ParamsWithLoader } from 'scrivito_sdk/loadable/create_loader_process'; import { StoreEntry } from 'scrivito_sdk/loadable/offline_store'; let isEnabled = false; /** @beta */ export function enableOfflineStore() { isEnabled = true; } let isInOfflineMode: boolean | PromiseLike<boolean> = false; export function setOfflineMode(mode: boolean | PromiseLike<boolean>) { isInOfflineMode = mode; } /** @beta */ export function isOfflineStoreEnabled(): boolean { return !!isEnabled; } onReset(() => { isInOfflineMode = false; isEnabled = false; }); export function applyOfflineHandling<T>( loadable: LoadableData<T>, params: ParamsWithLoader<T> ): { loader: () => Promise<T>; onChange?: () => void; } { const loader = params.loader; const offlineLoader = params.offlineLoader; if (offlineLoader) { return { loader: async () => (await isInOfflineMode) ? offlineLoader() : loader(), }; } const offlineEntry = params.offlineEntry; if (!offlineEntry) return { loader }; return { loader: async () => (await isInOfflineMode) ? loadFromEntry(offlineEntry) : loader(), onChange: collectAndSchedule(nextTick, async () => { if (isEnabled && !(await isInOfflineMode)) { storeIntoEntry(loadable, offlineEntry); } }), }; } async function storeIntoEntry<T>( loadable: LoadableData<T>, offlineEntry: StoreEntry<T> ) { try { offlineEntry.write(loadable.getOrThrow()); } catch (e) { offlineEntry.delete(); } } export class NotAvailableOfflineError extends ScrivitoError {} async function loadFromEntry<T>(offlineEntry: StoreEntry<T>) { const data = await offlineEntry.read(); if (data === undefined) { throw new NotAvailableOfflineError( `missing: ${offlineEntry.debugIdentifier()})}` ); } return data; }