@nent/core
Version:
102 lines (97 loc) • 3.37 kB
JavaScript
/*!
* NENT 2022
*/
;
const index$1 = require('./index-637e8c28.js');
const interfaces = require('./interfaces-95d0415a.js');
const index = require('./index-96f3ab3f.js');
const values = require('./values-b2399e33.js');
const promises = require('./promises-463f4e01.js');
const logging = require('./logging-37c154cf.js');
/* istanbul ignore file */
const store = index.createStore({
debug: false,
providers: {},
providerTimeout: 1,
});
const { state, onChange, reset, dispose } = store;
const disposers = {};
const NEW_PROVIDER_ADDED = 'new-provider-added';
const emitter = new index$1.EventEmitter();
/**
* It adds a data provider to the data state
* @param {string} name - The name of the provider.
* @param {IDataProvider} provider - IDataProvider - This is the data provider that we're adding.
*/
function addDataProvider(name, provider) {
var _a;
values.requireValue(name, 'provider name');
if (typeof provider.get !== 'function') {
throw new TypeError(`The provider ${name} is missing the get(key) function.`);
}
const debouncedChanges = promises.debounce(1000, (...args) => {
index$1.eventBus.emit(interfaces.DATA_EVENTS.DataChanged, {
provider: name,
data: args,
});
}, false);
const dispose = (_a = provider.changed) === null || _a === void 0 ? void 0 : _a.on('*', (...args) => {
debouncedChanges(args);
});
disposers[name] = dispose;
state.providers[name.toLowerCase()] = provider;
emitter.emit(NEW_PROVIDER_ADDED, name.toLocaleLowerCase());
logging.debugIf(state.debug && name !== 'data', `data-provider: ${name} registered`);
}
/**
* It returns a promise that resolves to the data provider with the given name, or null if the provider
* is not found
* @param {string} name - The name of the provider to get.
* @returns A promise that resolves to an IDataProvider or null.
*/
async function getDataProvider(name) {
const key = name.toLowerCase();
values.requireValue(name, 'provider name');
if (Object.keys(state.providers).includes(key))
return state.providers[key];
return new Promise(resolve => {
const timeout = setTimeout(() => {
resolve(null);
}, state.providerTimeout * 1000);
const dispose = emitter.on(NEW_PROVIDER_ADDED, (registered) => {
if (name == registered) {
clearTimeout(timeout);
dispose();
resolve(state.providers[key]);
}
});
});
}
/**
* It removes a data provider from the data state, calls the disposer function, and then deletes the
* disposer function
* @param {string} name - The name of the data provider.
*/
function removeDataProvider(name) {
var _a;
delete state.providers[name];
(_a = disposers[name]) === null || _a === void 0 ? void 0 : _a.call(this);
delete disposers[name];
}
/**
* It loops through all the data providers, calls their disposer function, and then deletes them from
* the dataState object
*/
function clearDataProviders() {
Object.keys(state.providers).forEach(key => {
var _a;
(_a = disposers[key]) === null || _a === void 0 ? void 0 : _a.call(this);
delete disposers[key];
delete state.providers[key];
});
}
exports.addDataProvider = addDataProvider;
exports.clearDataProviders = clearDataProviders;
exports.getDataProvider = getDataProvider;
exports.removeDataProvider = removeDataProvider;
exports.state = state;