UNPKG

@nent/core

Version:

Functional elements to add routing, data-binding, dynamic HTML, declarative actions, audio, video, and so much more. Supercharge static HTML files into web apps without script or builds.

102 lines (97 loc) 3.37 kB
/*! * NENT 2022 */ 'use strict'; 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;