UNPKG

@yoroi/common

Version:
103 lines (102 loc) 3.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.observableStorageMaker = exports.observableMultiStorageMaker = void 0; var _observer = require("../../observer/observer"); var _arrays = require("../../utils/arrays"); var _parsers = require("../../utils/parsers"); const observableStorageMaker = storage => { const triggers = ['clear', // 'removeFolder', can be added later as long the key checks for "/" in the arg when string 'multiSet', 'setItem', 'multiRemove', 'removeItem']; const observer = (0, _observer.observerMaker)(); const onChange = (keysToObserve, callback) => { const wrappedCallback = keysUpdated => { if (!keysUpdated) { callback(null); } else { const keysToAnnounce = (0, _arrays.intersection)(keysToObserve, keysUpdated); if (keysToAnnounce.length > 0) callback(keysToAnnounce); } }; return observer.subscribe(wrappedCallback); }; const proxyHandler = { get(target, property, receiver) { const origProperty = target[property]; if (typeof origProperty === 'function' && triggers.includes(property)) { const origMethod = origProperty; return function (...args) { const notify = () => { const [firstArg] = args; const isArray = Array.isArray(firstArg); if ((0, _parsers.isString)(firstArg)) { // single operations observer.notify([firstArg]); } else if (isArray) { // multi operations const keys = firstArg; observer.notify(keys); } else { // clear observer.notify(null); } }; const result = origMethod.apply(target, args); if (result instanceof Promise) { return result.then(resolvedValue => { notify(); return resolvedValue; }); } else { notify(); return result; } }; } return Reflect.get(target, property, receiver); } }; const proxiedStorage = new Proxy(storage, proxyHandler); return { ...proxiedStorage, onChange, observable: observer.observable }; }; exports.observableStorageMaker = observableStorageMaker; const observableMultiStorageMaker = storage => { const triggers = ['clear', 'saveMany']; const observer = (0, _observer.observerMaker)(); const onChange = callback => observer.subscribe(callback); const proxyHandler = { get(target, property, receiver) { const origProperty = target[property]; if (typeof origProperty === 'function' && triggers.includes(property)) { const origMethod = origProperty; return function (...args) { const result = origMethod.apply(target, args); if (result instanceof Promise) { return result.then(resolvedValue => { observer.notify(null); return resolvedValue; }); } else { observer.notify(null); return result; } }; } return Reflect.get(target, property, receiver); } }; const proxiedStorage = new Proxy(storage, proxyHandler); return { ...proxiedStorage, onChange, observable: observer.observable }; }; exports.observableMultiStorageMaker = observableMultiStorageMaker; //# sourceMappingURL=observable-storage.js.map