@yoroi/common
Version:
The Common package of Yoroi SDK
107 lines (106 loc) • 3.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.observableStorageMaker = exports.observableMultiStorageMaker = void 0;
var _observer = require("../../observer/observer");
var _parsers = require("../../utils/parsers");
var _arrays = require("../../utils/arrays");
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 observable = (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 observable.subscribe(wrappedCallback);
};
const proxyHandler = {
get(target, property, receiver) {
const origProperty = target[property];
if (typeof origProperty === 'function' && triggers.includes(property)) {
const origMethod = origProperty;
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
const notify = () => {
const [firstArg] = args;
const isArray = Array.isArray(firstArg);
if ((0, _parsers.isString)(firstArg)) {
// single operations
observable.notify([firstArg]);
} else if (isArray) {
// multi operations
const keys = firstArg;
observable.notify(keys);
} else {
// clear
observable.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
};
};
exports.observableStorageMaker = observableStorageMaker;
const observableMultiStorageMaker = storage => {
const triggers = ['clear', 'saveMany'];
const observable = (0, _observer.observerMaker)();
const onChange = callback => observable.subscribe(callback);
const proxyHandler = {
get(target, property, receiver) {
const origProperty = target[property];
if (typeof origProperty === 'function' && triggers.includes(property)) {
const origMethod = origProperty;
return function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
const result = origMethod.apply(target, args);
if (result instanceof Promise) {
return result.then(resolvedValue => {
observable.notify(null);
return resolvedValue;
});
} else {
observable.notify(null);
return result;
}
};
}
return Reflect.get(target, property, receiver);
}
};
const proxiedStorage = new Proxy(storage, proxyHandler);
return {
...proxiedStorage,
onChange
};
};
exports.observableMultiStorageMaker = observableMultiStorageMaker;
//# sourceMappingURL=observable-storage.js.map