@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
JavaScript
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
};