UNPKG

dreamstate

Version:

Store management library based on react context and observers

47 lines (44 loc) 2.02 kB
import { DreamstateError } from '../../error/DreamstateError.js'; import { unRegisterQueryProvider } from './unRegisterQueryProvider.js'; import { EDreamstateErrorCode } from '../../../types/error.js'; import { isCorrectQueryType } from '../../../utils/typechecking.js'; /** * Registers a callback as a query provider to handle data queries. * * This function registers a query provider callback for a given query type in the current * scope's registry. The listener will handle incoming data queries and return the requested data. * * @template T - The type of the query. * @param {TQueryType} queryType - The type of query for which data provisioning is provided. * @param {TQueryListener<T, TAnyValue>} listener - The callback that listens to queries and returns * the requested data. * @param {IRegistry} registry - The current scope registry where the query provider is registered. * @returns {TCallable} A function that, when called, unsubscribes the registered query provider. */ function registerQueryProvider(queryType, listener, registry) { if (typeof listener !== "function") { throw new DreamstateError(EDreamstateErrorCode.INCORRECT_QUERY_PROVIDER, typeof listener); } else if (!isCorrectQueryType(queryType)) { throw new DreamstateError(EDreamstateErrorCode.INCORRECT_QUERY_TYPE, typeof queryType); } /* * Handle query providers as array so for one type many queries can be provided, but only first one will be called. */ if (registry.QUERY_PROVIDERS_REGISTRY.has(queryType)) { var currentProviders = registry.QUERY_PROVIDERS_REGISTRY.get(queryType); // Do not overwrite same listeners. if (!currentProviders.includes(listener)) { currentProviders.unshift(listener); } } else { // Just add new entry. registry.QUERY_PROVIDERS_REGISTRY.set(queryType, [listener]); } /* * Return un-subscriber callback. */ return function () { unRegisterQueryProvider(queryType, listener, registry); }; } export { registerQueryProvider };