@hexadrop/query
Version:
Hexagonal architecture utils library
43 lines (40 loc) • 2.5 kB
TypeScript
import Either from '@hexadrop/either';
import DomainError from '@hexadrop/error';
import { Class } from '@hexadrop/types/class';
import Query from './query.js';
import '@hexadrop/types/primitives';
/**
* Type definition for a QueryBusCallback.
*
* @param {QueryType} query - The Query to be handled.
* @returns {Either<DomainError, ResponseType> | Promise<Either<DomainError, ResponseType>>} - Either a DomainError or the ResponseType type, or a Promise of either.
* @template ResponseType - The type of the response that the query handler should return. Defaults to unknown.
* @template QueryType - The type of the Query that extends Query<ResponseType>. Defaults to Query<ResponseType>.
*/
type QueryBusCallback<ResponseType = unknown, QueryType extends Query<ResponseType> = Query<ResponseType>> = (query: QueryType) => Either<DomainError, ResponseType> | Promise<Either<DomainError, ResponseType>>;
/**
* Interface representing a QueryHandler.
*
* @template ResponseType - The type of the response that the query handler should return. Defaults to unknown.
* @template QueryType - The type of the Query that extends Query<ResponseType>. Defaults to Query<ResponseType>.
*
* @property {QueryBusCallback<ResponseType, QueryType>} run - A QueryBusCallback function that takes a Query and returns either a DomainError or the ResponseType type, or a Promise of either.
*/
interface QueryHandler<ResponseType = unknown, QueryType extends Query<ResponseType> = Query<ResponseType>> {
run: QueryBusCallback<ResponseType, QueryType>;
}
type QueryHandlerClass<ResponseType = unknown, QueryType extends Query<ResponseType> = Query<ResponseType>> = Class<any[], QueryHandler<ResponseType, QueryType>>;
/**
* Abstract class representing a QueryBus
*/
declare abstract class QueryBus {
/**
* Abstract method that takes a Query and returns either a DomainError or the ResponseType type, or a Promise of that either
* @abstract
* @param {Query<ResponseType>} query - The Query to be asked
* @returns {Either<DomainError, ResponseType> | Promise<Either<DomainError, ResponseType>>} - Either a DomainError or the ResponseType type, or a Promise of either
* @template ResponseType - The type of the ResponseType
*/
abstract ask<const ResponseType>(query: Query<ResponseType>): Either<DomainError, ResponseType> | Promise<Either<DomainError, ResponseType>>;
}
export { type QueryBusCallback, type QueryHandler, type QueryHandlerClass, QueryBus as default };