UNPKG

@signaldb/core

Version:

SignalDB is a client-side database that provides a simple MongoDB-like interface to the data with first-class typescript support to achieve an optimistic UI. Data persistence can be achieved by using storage providers that store the data through a JSON in

70 lines (69 loc) 2.25 kB
import createPersistenceAdapter from "./index7.mjs"; function createTemporaryFallbackExecutor(firstResolvingPromiseFunction, secondResolvingPromiseFunction, options) { const cacheTimeout = options == null ? void 0 : options.cacheTimeout; let isResolved = false; let resolvedValue = null; let timeout = null; let secondaryPromise = null; return (...args) => { if (secondaryPromise == null) { if (timeout) { clearTimeout(timeout); timeout = null; } secondaryPromise = secondResolvingPromiseFunction(...args).then((result) => { { timeout = setTimeout(() => { isResolved = false; resolvedValue = null; secondaryPromise = null; }, cacheTimeout); } isResolved = true; resolvedValue = result; if (options == null ? void 0 : options.onResolve) options.onResolve(resolvedValue); return result; }); } else if (isResolved) { return secondaryPromise; } return firstResolvingPromiseFunction(...args); }; } function combinePersistenceAdapters(slowAdapter, fastAdapter) { let handleChange = null; const readExecutor = createTemporaryFallbackExecutor(() => fastAdapter.load(), () => slowAdapter.load(), { cacheTimeout: 100, onResolve: (result) => { var _a, _b, _c; if (handleChange) void handleChange(); void fastAdapter.save(result.items || [], { added: ((_a = result.changes) == null ? void 0 : _a.added) || [], modified: ((_b = result.changes) == null ? void 0 : _b.modified) || [], removed: ((_c = result.changes) == null ? void 0 : _c.removed) || [] }); } }); return createPersistenceAdapter({ async register(onChange) { handleChange = onChange; await Promise.all([slowAdapter.register(onChange), fastAdapter.register(onChange)]); }, async load() { const promise = readExecutor(); return promise; }, async save(items, changes) { await Promise.all([ fastAdapter.save(items, changes), slowAdapter.save(items, changes) ]); } }); } export { createTemporaryFallbackExecutor, combinePersistenceAdapters as default };