@fluojs/cqrs
Advanced tools
| import type { OnApplicationBootstrap } from '@fluojs/runtime'; | ||
| import { CqrsBusBase } from '../discovery.js'; | ||
| import type { CommandBus, ICommand } from '../types.js'; | ||
| import type { CommandBus, CqrsDispatchContext, ICommand } from '../types.js'; | ||
| /** | ||
@@ -19,2 +19,3 @@ * Discovers and executes command handlers during application bootstrap and runtime dispatch. | ||
| * @param command Command instance to execute. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The resolved handler result. | ||
@@ -25,3 +26,3 @@ * | ||
| */ | ||
| execute<TCommand extends ICommand, TResult = void>(command: TCommand): Promise<TResult>; | ||
| execute<TCommand extends ICommand, TResult = void>(command: TCommand, context?: CqrsDispatchContext): Promise<TResult>; | ||
| private ensureDiscovered; | ||
@@ -28,0 +29,0 @@ private discoverHandlers; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command-bus.d.ts","sourceRoot":"","sources":["../../src/buses/command-bus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAK9D,OAAO,EAAE,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EACV,UAAU,EAGV,QAAQ,EAET,MAAM,aAAa,CAAC;AAUrB;;;;;GAKG;AACH,qBACa,0BAA2B,SAAQ,WAAY,YAAW,UAAU,EAAE,sBAAsB;IACvG,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAErB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;;;;;OAQG;IACG,OAAO,CAAC,QAAQ,SAAS,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAmB/E,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,0BAA0B;CAmDnC"} | ||
| {"version":3,"file":"command-bus.d.ts","sourceRoot":"","sources":["../../src/buses/command-bus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAG7E,OAAO,KAAK,EACV,UAAU,EAGV,mBAAmB,EACnB,QAAQ,EAET,MAAM,aAAa,CAAC;AAUrB;;;;;GAKG;AACH,qBACa,0BAA2B,SAAQ,WAAY,YAAW,UAAU,EAAE,sBAAsB;IACvG,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAErB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;;;;;;OASG;IACG,OAAO,CAAC,QAAQ,SAAS,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;YAmB9G,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,0BAA0B;CAmDnC"} |
@@ -9,5 +9,5 @@ let _initClass; | ||
| import { APPLICATION_LOGGER, COMPILED_MODULES, RUNTIME_CONTAINER } from '@fluojs/runtime/internal'; | ||
| import { CqrsBusBase, createDuplicateHandlerMessage } from '../discovery.js'; | ||
| import { CommandHandlerNotFoundException, DuplicateCommandHandlerError } from '../errors.js'; | ||
| import { getCommandHandlerMetadata } from '../metadata.js'; | ||
| import { CqrsBusBase, createDuplicateHandlerMessage } from '../discovery.js'; | ||
| function isCommandHandler(value) { | ||
@@ -42,2 +42,3 @@ if (typeof value !== 'object' || value === null) { | ||
| * @param command Command instance to execute. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The resolved handler result. | ||
@@ -48,3 +49,3 @@ * | ||
| */ | ||
| async execute(command) { | ||
| async execute(command, context) { | ||
| await this.ensureDiscovered(); | ||
@@ -60,3 +61,3 @@ const commandType = command.constructor; | ||
| } | ||
| return await instance.execute(command); | ||
| return await instance.execute(command, context); | ||
| } | ||
@@ -63,0 +64,0 @@ async ensureDiscovered() { |
| import { type EventBus } from '@fluojs/event-bus'; | ||
| import type { OnApplicationShutdown, OnApplicationBootstrap } from '@fluojs/runtime'; | ||
| import type { OnApplicationBootstrap, OnApplicationShutdown } from '@fluojs/runtime'; | ||
| import { CqrsBusBase } from '../discovery.js'; | ||
| import type { CqrsModuleOptions } from '../module.js'; | ||
| import type { CqrsEventBus, IEvent } from '../types.js'; | ||
| import type { CqrsDispatchContext, CqrsEventBus, IEvent } from '../types.js'; | ||
| import { CqrsSagaLifecycleService } from './saga-bus.js'; | ||
@@ -36,2 +36,3 @@ /** | ||
| * @param event Event instance to publish. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once all local CQRS side effects and delegated publication complete. | ||
@@ -41,3 +42,3 @@ * | ||
| */ | ||
| publish<TEvent extends IEvent>(event: TEvent): Promise<void>; | ||
| publish<TEvent extends IEvent>(event: TEvent, context?: CqrsDispatchContext): Promise<void>; | ||
| /** | ||
@@ -47,5 +48,6 @@ * Publishes a batch of events sequentially through the CQRS event pipeline. | ||
| * @param events Event instances to publish in order. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once all events are published. | ||
| */ | ||
| publishAll<TEvent extends IEvent>(events: readonly TEvent[]): Promise<void>; | ||
| publishAll<TEvent extends IEvent>(events: readonly TEvent[], context?: CqrsDispatchContext): Promise<void>; | ||
| private runPublishPipeline; | ||
@@ -52,0 +54,0 @@ private runPublishAllPipeline; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/buses/event-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAyC,MAAM,EAAiB,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAYzD;;;;;GAKG;AACH,qBACa,mBAAoB,SAAQ,WAAY,YAAW,YAAY,EAAE,sBAAsB,EAAE,qBAAqB;IASvH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAI5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4B;IACnE,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,cAAc,CAAsF;gBAGzF,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,wBAAwB,EACtD,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC9D,eAAe,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7D,MAAM,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EACnC,aAAa,GAAE,iBAAsB;IAKlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5C;;;;OAIG;IACH,4BAA4B;IAe5B;;;;;;;OAOG;IACG,OAAO,CAAC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE;;;;;OAKG;IACG,UAAU,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAInE,kBAAkB;YAiBlB,qBAAqB;YAMrB,oBAAoB;YAUpB,2BAA2B;YAc3B,kBAAkB;IAiBhC,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,qBAAqB;YAIf,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,wBAAwB;CA4CjC"} | ||
| {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/buses/event-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAyC,MAAM,EAAiB,MAAM,aAAa,CAAC;AACnI,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAYzD;;;;;GAKG;AACH,qBACa,mBAAoB,SAAQ,WAAY,YAAW,YAAY,EAAE,sBAAsB,EAAE,qBAAqB;IASvH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAI5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4B;IACnE,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,cAAc,CAAsF;gBAGzF,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,wBAAwB,EACtD,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC9D,eAAe,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7D,MAAM,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EACnC,aAAa,GAAE,iBAAsB;IAKlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5C;;;;OAIG;IACH,4BAA4B;IAe5B;;;;;;;;OAQG;IACG,OAAO,CAAC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;YAIlG,kBAAkB;YAiBlB,qBAAqB;YAMrB,oBAAoB;YAUpB,2BAA2B;YAc3B,kBAAkB;IAiBhC,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,qBAAqB;YAIf,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,wBAAwB;CA4CjC"} |
+12
-10
@@ -13,4 +13,4 @@ let _initClass; | ||
| import { getEventHandlerMetadata } from '../metadata.js'; | ||
| import { createCqrsPlatformStatusSnapshot } from '../status.js'; | ||
| import { CQRS_MODULE_OPTIONS } from '../tokens.js'; | ||
| import { createCqrsPlatformStatusSnapshot } from '../status.js'; | ||
| import { CqrsSagaLifecycleService } from './saga-bus.js'; | ||
@@ -89,2 +89,3 @@ const DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS = 5000; | ||
| * @param event Event instance to publish. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once all local CQRS side effects and delegated publication complete. | ||
@@ -94,4 +95,4 @@ * | ||
| */ | ||
| async publish(event) { | ||
| await this.trackPublishPipeline(this.runPublishPipeline(event)); | ||
| async publish(event, context) { | ||
| await this.trackPublishPipeline(this.runPublishPipeline(event, context)); | ||
| } | ||
@@ -103,8 +104,9 @@ | ||
| * @param events Event instances to publish in order. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once all events are published. | ||
| */ | ||
| async publishAll(events) { | ||
| await this.trackPublishPipeline(this.runPublishAllPipeline(events)); | ||
| async publishAll(events, context) { | ||
| await this.trackPublishPipeline(this.runPublishAllPipeline(events, context)); | ||
| } | ||
| async runPublishPipeline(event) { | ||
| async runPublishPipeline(event, context) { | ||
| await this.ensureDiscovered(); | ||
@@ -116,10 +118,10 @@ for (const descriptor of this.matchEventDescriptors(event)) { | ||
| } | ||
| await instance.handle(createIsolatedEvent(descriptor.eventType, event)); | ||
| await instance.handle(createIsolatedEvent(descriptor.eventType, event), context); | ||
| } | ||
| await this.sagaService.dispatch(event); | ||
| await this.sagaService.dispatch(event, context); | ||
| await this.eventBus.publish(event); | ||
| } | ||
| async runPublishAllPipeline(events) { | ||
| async runPublishAllPipeline(events, context) { | ||
| for (const event of events) { | ||
| await this.publish(event); | ||
| await this.publish(event, context); | ||
| } | ||
@@ -126,0 +128,0 @@ } |
@@ -1,4 +0,4 @@ | ||
| import { type OnApplicationBootstrap } from '@fluojs/runtime'; | ||
| import type { OnApplicationBootstrap } from '@fluojs/runtime'; | ||
| import { CqrsBusBase } from '../discovery.js'; | ||
| import type { IQuery, QueryBus } from '../types.js'; | ||
| import type { CqrsDispatchContext, IQuery, QueryBus } from '../types.js'; | ||
| /** | ||
@@ -19,2 +19,3 @@ * Discovers and executes query handlers during bootstrap and runtime dispatch. | ||
| * @param query Query instance to execute. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The resolved handler result. | ||
@@ -25,3 +26,3 @@ * | ||
| */ | ||
| execute<TQuery extends IQuery<TResult>, TResult = unknown>(query: TQuery): Promise<TResult>; | ||
| execute<TQuery extends IQuery<TResult>, TResult = unknown>(query: TQuery, context?: CqrsDispatchContext): Promise<TResult>; | ||
| private ensureDiscovered; | ||
@@ -28,0 +29,0 @@ private discoverHandlers; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"query-bus.d.ts","sourceRoot":"","sources":["../../src/buses/query-bus.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAE,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EACV,MAAM,EAEN,QAAQ,EAGT,MAAM,aAAa,CAAC;AAUrB;;;;;GAKG;AACH,qBACa,wBAAyB,SAAQ,WAAY,YAAW,QAAQ,EAAE,sBAAsB;IACnG,OAAO,CAAC,WAAW,CAAgD;IACnE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAErB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;;;;;OAQG;IACG,OAAO,CAAC,MAAM,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAmBnF,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,wBAAwB;CAmDjC"} | ||
| {"version":3,"file":"query-bus.d.ts","sourceRoot":"","sources":["../../src/buses/query-bus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAG7E,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EAEN,QAAQ,EAGT,MAAM,aAAa,CAAC;AAUrB;;;;;GAKG;AACH,qBACa,wBAAyB,SAAQ,WAAY,YAAW,QAAQ,EAAE,sBAAsB;IACnG,OAAO,CAAC,WAAW,CAAgD;IACnE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAErB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;;;;;;OASG;IACG,OAAO,CAAC,MAAM,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;YAmBlH,gBAAgB;YAchB,gBAAgB;IAe9B,OAAO,CAAC,wBAAwB;CAmDjC"} |
@@ -9,5 +9,5 @@ let _initClass; | ||
| import { APPLICATION_LOGGER, COMPILED_MODULES, RUNTIME_CONTAINER } from '@fluojs/runtime/internal'; | ||
| import { CqrsBusBase, createDuplicateHandlerMessage } from '../discovery.js'; | ||
| import { DuplicateQueryHandlerError, QueryHandlerNotFoundException } from '../errors.js'; | ||
| import { getQueryHandlerMetadata } from '../metadata.js'; | ||
| import { CqrsBusBase, createDuplicateHandlerMessage } from '../discovery.js'; | ||
| function isQueryHandler(value) { | ||
@@ -42,2 +42,3 @@ if (typeof value !== 'object' || value === null) { | ||
| * @param query Query instance to execute. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The resolved handler result. | ||
@@ -48,3 +49,3 @@ * | ||
| */ | ||
| async execute(query) { | ||
| async execute(query, context) { | ||
| await this.ensureDiscovered(); | ||
@@ -60,3 +61,3 @@ const queryType = query.constructor; | ||
| } | ||
| return await instance.execute(query); | ||
| return await instance.execute(query, context); | ||
| } | ||
@@ -63,0 +64,0 @@ async ensureDiscovered() { |
| import type { OnApplicationBootstrap, OnApplicationShutdown } from '@fluojs/runtime'; | ||
| import { CqrsBusBase } from '../discovery.js'; | ||
| import type { CqrsModuleOptions } from '../module.js'; | ||
| import type { IEvent } from '../types.js'; | ||
| import type { CqrsDispatchContext, IEvent } from '../types.js'; | ||
| /** | ||
@@ -19,3 +19,2 @@ * Runtime saga coordinator that discovers `@Saga()` providers and serializes execution per saga token. | ||
| private readonly pendingDispatches; | ||
| private readonly dispatchContext; | ||
| private shutdownDrainTimeouts; | ||
@@ -43,3 +42,3 @@ constructor(runtimeContainer: ConstructorParameters<typeof CqrsBusBase>[0], compiledModules: ConstructorParameters<typeof CqrsBusBase>[1], logger: ConstructorParameters<typeof CqrsBusBase>[2], moduleOptions?: CqrsModuleOptions); | ||
| */ | ||
| dispatch<TEvent extends IEvent>(event: TEvent): Promise<void>; | ||
| dispatch<TEvent extends IEvent>(event: TEvent, context?: CqrsDispatchContext): Promise<void>; | ||
| private matchSagaDescriptors; | ||
@@ -50,3 +49,3 @@ private dispatchWithOrdering; | ||
| private resolveShutdownDrainTimeoutMs; | ||
| private runInDispatchContext; | ||
| private createDispatchContext; | ||
| private invokeSaga; | ||
@@ -53,0 +52,0 @@ private ensureDiscovered; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"saga-bus.d.ts","sourceRoot":"","sources":["../../src/buses/saga-bus.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAiB,MAAM,EAAyB,MAAM,aAAa,CAAC;AA2BhF;;;;;GAKG;AACH,qBACa,wBAAyB,SAAQ,WAAY,YAAW,sBAAsB,EAAE,qBAAqB;IAc9G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IACnE,OAAO,CAAC,cAAc,CAAsF;IAC5G,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgD;IAChF,OAAO,CAAC,qBAAqB,CAAK;gBAGhC,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC9D,eAAe,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7D,MAAM,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EACnC,aAAa,GAAE,iBAAsB;IAKlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5C;;;;OAIG;IACH,kBAAkB,IAAI;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,cAAc,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;QACxF,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;KAC/B;IAUD;;;;;OAKG;IACG,QAAQ,CAAC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnE,OAAO,CAAC,oBAAoB;YAYd,oBAAoB;YA+CpB,mBAAmB;YAmBnB,kBAAkB;IAiBhC,OAAO,CAAC,6BAA6B;YAUvB,oBAAoB;YAepB,UAAU;YAoBV,gBAAgB;YAchB,gBAAgB;IAiB9B,OAAO,CAAC,uBAAuB;CA+ChC"} | ||
| {"version":3,"file":"saga-bus.d.ts","sourceRoot":"","sources":["../../src/buses/saga-bus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,EAAyB,MAAM,aAAa,CAAC;AAqBrG;;;;;GAKG;AACH,qBACa,wBAAyB,SAAQ,WAAY,YAAW,sBAAsB,EAAE,qBAAqB;IAa9G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAZhC,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IACnE,OAAO,CAAC,cAAc,CAAsF;IAC5G,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,qBAAqB,CAAK;gBAGhC,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC9D,eAAe,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7D,MAAM,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EACnC,aAAa,GAAE,iBAAsB;IAKlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5C;;;;OAIG;IACH,kBAAkB,IAAI;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,cAAc,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;QACxF,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;KAC/B;IAUD;;;;;OAKG;IACG,QAAQ,CAAC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlG,OAAO,CAAC,oBAAoB;YAYd,oBAAoB;YAyCpB,mBAAmB;YAmBnB,kBAAkB;IAiBhC,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,qBAAqB;YAYf,UAAU;YAoBV,gBAAgB;YAchB,gBAAgB;IAiB9B,OAAO,CAAC,uBAAuB;CA+ChC"} |
+10
-18
@@ -7,4 +7,3 @@ let _initClass; | ||
| function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; } | ||
| import { AsyncLocalStorage } from 'node:async_hooks'; | ||
| import { Inject, InvariantError, FluoError } from '@fluojs/core'; | ||
| import { FluoError, Inject, InvariantError } from '@fluojs/core'; | ||
| import { APPLICATION_LOGGER, COMPILED_MODULES, RUNTIME_CONTAINER } from '@fluojs/runtime/internal'; | ||
@@ -48,3 +47,2 @@ import { CqrsBusBase } from '../discovery.js'; | ||
| pendingDispatches = new Set(); | ||
| dispatchContext = new AsyncLocalStorage(); | ||
| shutdownDrainTimeouts = 0; | ||
@@ -97,3 +95,3 @@ constructor(runtimeContainer, compiledModules, logger, moduleOptions = {}) { | ||
| */ | ||
| async dispatch(event) { | ||
| async dispatch(event, context) { | ||
| await this.ensureDiscovered(); | ||
@@ -104,3 +102,3 @@ const descriptors = this.matchSagaDescriptors(event); | ||
| } | ||
| await Promise.all(descriptors.map(descriptor => this.dispatchWithOrdering(descriptor, event))); | ||
| await Promise.all(descriptors.map(descriptor => this.dispatchWithOrdering(descriptor, event, context))); | ||
| } | ||
@@ -116,4 +114,3 @@ matchSagaDescriptors(event) { | ||
| } | ||
| async dispatchWithOrdering(descriptor, event) { | ||
| const activeContext = this.dispatchContext.getStore(); | ||
| async dispatchWithOrdering(descriptor, event, activeContext) { | ||
| const routeLabel = `${descriptor.targetType.name}(${descriptor.eventType.name})`; | ||
@@ -129,5 +126,3 @@ const isActiveRoute = activeContext?.activeRoutes.some(route => route.token === descriptor.token && route.eventType === descriptor.eventType); | ||
| if (isActiveToken) { | ||
| await this.runInDispatchContext(activeContext, descriptor, routeLabel, async () => { | ||
| await this.invokeSaga(descriptor, event); | ||
| }); | ||
| await this.invokeSaga(descriptor, event, this.createDispatchContext(activeContext, descriptor, routeLabel)); | ||
| return; | ||
@@ -137,5 +132,3 @@ } | ||
| const current = previous.then(async () => { | ||
| await this.runInDispatchContext(activeContext, descriptor, routeLabel, async () => { | ||
| await this.invokeSaga(descriptor, event); | ||
| }); | ||
| await this.invokeSaga(descriptor, event, this.createDispatchContext(activeContext, descriptor, routeLabel)); | ||
| }); | ||
@@ -183,4 +176,4 @@ this.executionChains.set(descriptor.token, current.catch(() => undefined)); | ||
| } | ||
| async runInDispatchContext(activeContext, descriptor, routeLabel, callback) { | ||
| const nextContext = { | ||
| createDispatchContext(activeContext, descriptor, routeLabel) { | ||
| return { | ||
| activeRoutes: [...(activeContext?.activeRoutes ?? []), { | ||
@@ -193,5 +186,4 @@ eventType: descriptor.eventType, | ||
| }; | ||
| await this.dispatchContext.run(nextContext, callback); | ||
| } | ||
| async invokeSaga(descriptor, event) { | ||
| async invokeSaga(descriptor, event, context) { | ||
| const instance = await this.resolveHandlerInstance(descriptor.token); | ||
@@ -202,3 +194,3 @@ if (!isSaga(instance)) { | ||
| try { | ||
| await instance.handle(createIsolatedEvent(descriptor.eventType, event)); | ||
| await instance.handle(createIsolatedEvent(descriptor.eventType, event), context); | ||
| } catch (error) { | ||
@@ -205,0 +197,0 @@ if (error instanceof FluoError) { |
+6
-6
@@ -0,11 +1,11 @@ | ||
| export { CommandBusLifecycleService } from './buses/command-bus.js'; | ||
| export { CqrsEventBusService } from './buses/event-bus.js'; | ||
| export { QueryBusLifecycleService } from './buses/query-bus.js'; | ||
| export { CommandHandler, EventHandler, QueryHandler, Saga } from './decorators.js'; | ||
| export { DuplicateCommandHandlerError, DuplicateEventHandlerError, DuplicateQueryHandlerError, CommandHandlerNotFoundException, QueryHandlerNotFoundException, SagaExecutionError, SagaTopologyError, } from './errors.js'; | ||
| export { commandHandlerMetadataSymbol, defineCommandHandlerMetadata, defineEventHandlerMetadata, defineQueryHandlerMetadata, eventHandlerMetadataSymbol, getCommandHandlerMetadata, getCommandHandlerMetadataEntry, getEventHandlerMetadata, getQueryHandlerMetadata, getQueryHandlerMetadataEntry, queryHandlerMetadataSymbol, defineSagaMetadata, getSagaMetadata, sagaMetadataSymbol, } from './metadata.js'; | ||
| export { CommandHandlerNotFoundException, DuplicateCommandHandlerError, DuplicateEventHandlerError, DuplicateQueryHandlerError, QueryHandlerNotFoundException, SagaExecutionError, SagaTopologyError, } from './errors.js'; | ||
| export { commandHandlerMetadataSymbol, defineCommandHandlerMetadata, defineEventHandlerMetadata, defineQueryHandlerMetadata, defineSagaMetadata, eventHandlerMetadataSymbol, getCommandHandlerMetadata, getCommandHandlerMetadataEntry, getEventHandlerMetadata, getQueryHandlerMetadata, getQueryHandlerMetadataEntry, getSagaMetadata, queryHandlerMetadataSymbol, sagaMetadataSymbol, } from './metadata.js'; | ||
| export { CqrsModule, type CqrsModuleOptions } from './module.js'; | ||
| export * from './status.js'; | ||
| export { CommandBusLifecycleService } from './buses/command-bus.js'; | ||
| export { CqrsEventBusService } from './buses/event-bus.js'; | ||
| export { QueryBusLifecycleService } from './buses/query-bus.js'; | ||
| export { COMMAND_BUS, EVENT_BUS, QUERY_BUS } from './tokens.js'; | ||
| export type { CommandBus, CommandHandlerClass, CommandHandlerDescriptor, CommandHandlerMetadata, CommandType, CqrsEventBus, CqrsEventType, EventHandlerDescriptor, EventHandlerClass, EventHandlerMetadata, ICommand, ICommandHandler, IEvent, IEventHandler, IQuery, IQueryHandler, ISaga, QueryBus, QueryHandlerClass, QueryHandlerDescriptor, QueryHandlerMetadata, QueryType, SagaClass, SagaDescriptor, SagaMetadata, } from './types.js'; | ||
| export type { CommandBus, CommandHandlerClass, CommandHandlerDescriptor, CommandHandlerMetadata, CommandType, CqrsDispatchContext, CqrsEventBus, CqrsEventType, EventHandlerClass, EventHandlerDescriptor, EventHandlerMetadata, ICommand, ICommandHandler, IEvent, IEventHandler, IQuery, IQueryHandler, ISaga, QueryBus, QueryHandlerClass, QueryHandlerDescriptor, QueryHandlerMetadata, QueryType, SagaClass, SagaDescriptor, SagaMetadata, } from './types.js'; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjE,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,MAAM,EACN,aAAa,EACb,MAAM,EACN,aAAa,EACb,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjE,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,MAAM,EACN,aAAa,EACb,MAAM,EACN,aAAa,EACb,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC"} |
+5
-5
@@ -0,9 +1,9 @@ | ||
| export { CommandBusLifecycleService } from './buses/command-bus.js'; | ||
| export { CqrsEventBusService } from './buses/event-bus.js'; | ||
| export { QueryBusLifecycleService } from './buses/query-bus.js'; | ||
| export { CommandHandler, EventHandler, QueryHandler, Saga } from './decorators.js'; | ||
| export { DuplicateCommandHandlerError, DuplicateEventHandlerError, DuplicateQueryHandlerError, CommandHandlerNotFoundException, QueryHandlerNotFoundException, SagaExecutionError, SagaTopologyError } from './errors.js'; | ||
| export { commandHandlerMetadataSymbol, defineCommandHandlerMetadata, defineEventHandlerMetadata, defineQueryHandlerMetadata, eventHandlerMetadataSymbol, getCommandHandlerMetadata, getCommandHandlerMetadataEntry, getEventHandlerMetadata, getQueryHandlerMetadata, getQueryHandlerMetadataEntry, queryHandlerMetadataSymbol, defineSagaMetadata, getSagaMetadata, sagaMetadataSymbol } from './metadata.js'; | ||
| export { CommandHandlerNotFoundException, DuplicateCommandHandlerError, DuplicateEventHandlerError, DuplicateQueryHandlerError, QueryHandlerNotFoundException, SagaExecutionError, SagaTopologyError } from './errors.js'; | ||
| export { commandHandlerMetadataSymbol, defineCommandHandlerMetadata, defineEventHandlerMetadata, defineQueryHandlerMetadata, defineSagaMetadata, eventHandlerMetadataSymbol, getCommandHandlerMetadata, getCommandHandlerMetadataEntry, getEventHandlerMetadata, getQueryHandlerMetadata, getQueryHandlerMetadataEntry, getSagaMetadata, queryHandlerMetadataSymbol, sagaMetadataSymbol } from './metadata.js'; | ||
| export { CqrsModule } from './module.js'; | ||
| export * from './status.js'; | ||
| export { CommandBusLifecycleService } from './buses/command-bus.js'; | ||
| export { CqrsEventBusService } from './buses/event-bus.js'; | ||
| export { QueryBusLifecycleService } from './buses/query-bus.js'; | ||
| export { COMMAND_BUS, EVENT_BUS, QUERY_BUS } from './tokens.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOhE,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAIjB,iBAAiB,EACjB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,8GAA8G;IAC9G,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAwBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,iBAAsB,GAAG,QAAQ,EAAE,CAkC/E;AAED,iFAAiF;AACjF,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU;CAiB5D"} | ||
| {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOhE,OAAO,KAAK,EACV,mBAAmB,EAEnB,iBAAiB,EAIjB,iBAAiB,EACjB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,8GAA8G;IAC9G,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AA0CD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,iBAAsB,GAAG,QAAQ,EAAE,CA8C/E;AAED,iFAAiF;AACjF,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU;CAiB5D"} |
+34
-10
@@ -27,2 +27,17 @@ import { EventBusModule } from '@fluojs/event-bus'; | ||
| } | ||
| function assertCommandBusService(service) { | ||
| if (!(service instanceof CommandBusLifecycleService)) { | ||
| throw new TypeError('CQRS command bus alias expected CommandBusLifecycleService.'); | ||
| } | ||
| } | ||
| function assertQueryBusService(service) { | ||
| if (!(service instanceof QueryBusLifecycleService)) { | ||
| throw new TypeError('CQRS query bus alias expected QueryBusLifecycleService.'); | ||
| } | ||
| } | ||
| function assertCqrsEventBusService(service) { | ||
| if (!(service instanceof CqrsEventBusService)) { | ||
| throw new TypeError('CQRS event bus alias expected CqrsEventBusService.'); | ||
| } | ||
| } | ||
@@ -42,18 +57,27 @@ /** | ||
| provide: COMMAND_BUS, | ||
| useFactory: service => ({ | ||
| execute: command => service.execute(command) | ||
| }) | ||
| useFactory: service => { | ||
| assertCommandBusService(service); | ||
| return { | ||
| execute: (command, context) => service.execute(command, context) | ||
| }; | ||
| } | ||
| }, QueryBusLifecycleService, { | ||
| inject: [QueryBusLifecycleService], | ||
| provide: QUERY_BUS, | ||
| useFactory: service => ({ | ||
| execute: query => service.execute(query) | ||
| }) | ||
| useFactory: service => { | ||
| assertQueryBusService(service); | ||
| return { | ||
| execute: (query, context) => service.execute(query, context) | ||
| }; | ||
| } | ||
| }, CqrsSagaLifecycleService, CqrsEventBusService, { | ||
| inject: [CqrsEventBusService], | ||
| provide: EVENT_BUS, | ||
| useFactory: service => ({ | ||
| publish: event => service.publish(event), | ||
| publishAll: events => service.publishAll(events) | ||
| }) | ||
| useFactory: service => { | ||
| assertCqrsEventBusService(service); | ||
| return { | ||
| publish: (event, context) => service.publish(event, context), | ||
| publishAll: (events, context) => service.publishAll(events, context) | ||
| }; | ||
| } | ||
| }, ...collectOptionHandlerProviders(options)]; | ||
@@ -60,0 +84,0 @@ } |
+31
-8
@@ -18,5 +18,6 @@ import type { Token } from '@fluojs/core'; | ||
| * @param command Command payload to handle. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The handler result returned to the command bus caller. | ||
| */ | ||
| execute(command: TCommand): TResult | Promise<TResult>; | ||
| execute(command: TCommand, context?: CqrsDispatchContext): TResult | Promise<TResult>; | ||
| } | ||
@@ -29,5 +30,6 @@ /** Contract implemented by classes decorated with {@link QueryHandler}. */ | ||
| * @param query Query payload to handle. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns The query result returned to the caller. | ||
| */ | ||
| execute(query: TQuery): TResult | Promise<TResult>; | ||
| execute(query: TQuery, context?: CqrsDispatchContext): TResult | Promise<TResult>; | ||
| } | ||
@@ -40,5 +42,6 @@ /** Contract implemented by classes decorated with {@link EventHandler}. */ | ||
| * @param event Event payload cloned for this handler before delegated event-bus publication. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise or void once side effects complete. | ||
| */ | ||
| handle(event: TEvent): void | Promise<void>; | ||
| handle(event: TEvent, context?: CqrsDispatchContext): void | Promise<void>; | ||
| } | ||
@@ -51,6 +54,24 @@ /** Contract implemented by classes decorated with {@link Saga}. */ | ||
| * @param event Event payload cloned for this saga route before delegated event-bus publication. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise or void once orchestration side effects complete. | ||
| */ | ||
| handle(event: TEvent): void | Promise<void>; | ||
| handle(event: TEvent, context?: CqrsDispatchContext): void | Promise<void>; | ||
| } | ||
| /** | ||
| * Opaque dispatch context used to preserve saga topology guards across nested CQRS calls. | ||
| * | ||
| * Pass this value unchanged from handlers and sagas into nested `execute(...)`, `publish(...)`, | ||
| * or `publishAll(...)` calls. Application code should not inspect or construct it directly. | ||
| */ | ||
| export interface CqrsDispatchContext { | ||
| /** Saga routes currently active in the in-process CQRS dispatch chain. */ | ||
| readonly activeRoutes: readonly Readonly<{ | ||
| eventType: CqrsEventType; | ||
| token: Token; | ||
| }>[]; | ||
| /** Current nested saga depth for in-process topology guarding. */ | ||
| readonly depth: number; | ||
| /** Human-readable saga route labels used when reporting topology failures. */ | ||
| readonly path: readonly string[]; | ||
| } | ||
| /** Constructor type used to identify a command message class. */ | ||
@@ -136,3 +157,3 @@ export interface CommandType<TCommand extends ICommand = ICommand> { | ||
| */ | ||
| execute<TCommand extends ICommand, TResult = void>(command: TCommand): Promise<TResult>; | ||
| execute<TCommand extends ICommand, TResult = void>(command: TCommand, context?: CqrsDispatchContext): Promise<TResult>; | ||
| } | ||
@@ -147,3 +168,3 @@ /** Query dispatch facade exposed by the CQRS module. */ | ||
| */ | ||
| execute<TQuery extends IQuery<TResult>, TResult = unknown>(query: TQuery): Promise<TResult>; | ||
| execute<TQuery extends IQuery<TResult>, TResult = unknown>(query: TQuery, context?: CqrsDispatchContext): Promise<TResult>; | ||
| } | ||
@@ -159,5 +180,6 @@ /** Event publishing facade exposed by the CQRS module. */ | ||
| * @param event Event instance to publish. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once publication completes. | ||
| */ | ||
| publish<TEvent extends IEvent>(event: TEvent): Promise<void>; | ||
| publish<TEvent extends IEvent>(event: TEvent, context?: CqrsDispatchContext): Promise<void>; | ||
| /** | ||
@@ -167,6 +189,7 @@ * Publishes a batch of events in order. | ||
| * @param events Event instances to publish. | ||
| * @param context Optional saga dispatch context to pass through nested CQRS calls. | ||
| * @returns A promise that resolves once all events are published. | ||
| */ | ||
| publishAll<TEvent extends IEvent>(events: readonly TEvent[]): Promise<void>; | ||
| publishAll<TEvent extends IEvent>(events: readonly TEvent[], context?: CqrsDispatchContext): Promise<void>; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} |
+4
-4
@@ -12,3 +12,3 @@ { | ||
| ], | ||
| "version": "1.1.0", | ||
| "version": "1.1.1", | ||
| "private": false, | ||
@@ -40,6 +40,6 @@ "license": "MIT", | ||
| "dependencies": { | ||
| "@fluojs/core": "^1.0.2", | ||
| "@fluojs/di": "^1.0.2", | ||
| "@fluojs/core": "^1.0.3", | ||
| "@fluojs/di": "^1.1.0", | ||
| "@fluojs/event-bus": "^1.0.0", | ||
| "@fluojs/runtime": "^1.1.0" | ||
| "@fluojs/runtime": "^1.1.7" | ||
| }, | ||
@@ -46,0 +46,0 @@ "devDependencies": { |
+6
-3
@@ -88,3 +88,3 @@ # @fluojs/cqrs | ||
| import { Inject } from '@fluojs/core'; | ||
| import { Saga, ISaga, IEvent, ICommand, CommandBusLifecycleService } from '@fluojs/cqrs'; | ||
| import { Saga, ISaga, IEvent, ICommand, CqrsDispatchContext, CommandBusLifecycleService } from '@fluojs/cqrs'; | ||
@@ -104,4 +104,4 @@ class UserCreatedEvent implements IEvent { | ||
| async handle(event: UserCreatedEvent): Promise<void> { | ||
| await this.commandBus.execute(new SendWelcomeEmailCommand(event.userId)); | ||
| async handle(event: UserCreatedEvent, context?: CqrsDispatchContext): Promise<void> { | ||
| await this.commandBus.execute(new SendWelcomeEmailCommand(event.userId), context); | ||
| } | ||
@@ -113,2 +113,4 @@ } | ||
| Saga, command handler, query handler, event handler 안에서 다시 CQRS `execute(...)`, `publish(...)`, `publishAll(...)`를 호출할 때는 optional `CqrsDispatchContext` 인자를 그대로 전달하세요. CQRS는 이 명시적인 runtime-agnostic context로 Node.js async-local API에 의존하지 않고 nested dispatch 전반의 saga topology check를 유지합니다. | ||
| ### Event 발행 계약 | ||
@@ -156,2 +158,3 @@ | ||
| - `ICommandHandler<C, R>`, `IQueryHandler<Q, R>`, `IEventHandler<E>`, `ISaga<E>`: 핸들러 계약입니다. | ||
| - `CqrsDispatchContext`: handler와 saga에서 nested CQRS dispatch로 그대로 전달하는 opaque optional context 값입니다. | ||
@@ -158,0 +161,0 @@ ### 오류 |
+6
-3
@@ -88,3 +88,3 @@ # @fluojs/cqrs | ||
| import { Inject } from '@fluojs/core'; | ||
| import { Saga, ISaga, IEvent, ICommand, CommandBusLifecycleService } from '@fluojs/cqrs'; | ||
| import { Saga, ISaga, IEvent, ICommand, CqrsDispatchContext, CommandBusLifecycleService } from '@fluojs/cqrs'; | ||
@@ -104,4 +104,4 @@ class UserCreatedEvent implements IEvent { | ||
| async handle(event: UserCreatedEvent): Promise<void> { | ||
| await this.commandBus.execute(new SendWelcomeEmailCommand(event.userId)); | ||
| async handle(event: UserCreatedEvent, context?: CqrsDispatchContext): Promise<void> { | ||
| await this.commandBus.execute(new SendWelcomeEmailCommand(event.userId), context); | ||
| } | ||
@@ -113,2 +113,4 @@ } | ||
| When a saga, command handler, query handler, or event handler performs another CQRS `execute(...)`, `publish(...)`, or `publishAll(...)` call, pass the optional `CqrsDispatchContext` argument through unchanged. CQRS uses this explicit runtime-agnostic context to keep saga topology checks intact across nested dispatch without relying on Node.js async-local APIs. | ||
| ### Event Publishing Contracts | ||
@@ -156,2 +158,3 @@ | ||
| - `ICommandHandler<C, R>`, `IQueryHandler<Q, R>`, `IEventHandler<E>`, `ISaga<E>`: Handler contracts. | ||
| - `CqrsDispatchContext`: Opaque optional context value to pass through nested CQRS dispatch from handlers and sagas. | ||
@@ -158,0 +161,0 @@ ### Errors |
140128
3.64%2203
2.13%179
1.7%Updated
Updated
Updated