@yoroi/common
Version:
The Common package of Yoroi SDK
103 lines (102 loc) • 3.47 kB
JavaScript
;
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