dreamstate
Version:
Store management library based on react context and observers
47 lines (44 loc) • 2.02 kB
JavaScript
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 };