11import { Inject , Injectable } from '@nestjs/common' ;
22import { DATABASE_DRIVER_FACTORY_TOKEN , DatabaseDriverFactory } from '../driver/database-driver.factory' ;
3+ import { DatabaseDriver } from '../driver/database.driver' ;
34import { InboxOutboxModuleEventOptions , InboxOutboxModuleOptions , MODULE_OPTIONS_TOKEN } from '../inbox-outbox.module-definition' ;
45import { IListener } from '../listener/contract/listener.interface' ;
56import { ListenerDuplicateNameException } from '../listener/exception/listener-duplicate-name.exception' ;
67import { INBOX_OUTBOX_EVENT_PROCESSOR_TOKEN , InboxOutboxEventProcessorContract } from '../processor/inbox-outbox-event-processor.contract' ;
78import { EVENT_CONFIGURATION_RESOLVER_TOKEN , EventConfigurationResolverContract } from '../resolver/event-configuration-resolver.contract' ;
89import { InboxOutboxEvent } from './contract/inbox-outbox-event.interface' ;
10+ import { DatabaseDriverPersister } from '../driver/database.driver-persister' ;
911
1012export enum TransactionalEventEmitterOperations {
1113 persist = 'persist' ,
@@ -21,14 +23,15 @@ export class TransactionalEventEmitter {
2123 @Inject ( DATABASE_DRIVER_FACTORY_TOKEN ) private databaseDriverFactory : DatabaseDriverFactory ,
2224 @Inject ( INBOX_OUTBOX_EVENT_PROCESSOR_TOKEN ) private inboxOutboxEventProcessor : InboxOutboxEventProcessorContract ,
2325 @Inject ( EVENT_CONFIGURATION_RESOLVER_TOKEN ) private eventConfigurationResolver : EventConfigurationResolverContract ,
24- ) { }
26+ ) { }
2527
2628 async emit (
2729 event : InboxOutboxEvent ,
2830 entities : {
2931 operation : TransactionalEventEmitterOperations ;
3032 entity : any ;
3133 } [ ] ,
34+ customDatabaseDriverPersister ?: DatabaseDriverPersister ,
3235 ) : Promise < void > {
3336 const eventOptions : InboxOutboxModuleEventOptions = this . options . events . find ( ( optionEvent ) => optionEvent . name === event . name ) ;
3437
@@ -39,24 +42,21 @@ export class TransactionalEventEmitter {
3942 const databaseDriver = this . databaseDriverFactory . create ( this . eventConfigurationResolver ) ;
4043 const currentTimestamp = new Date ( ) . getTime ( ) ;
4144
42- const inboxOutboxTransportEvent = databaseDriver . createInboxOutboxTransportEvent (
43- event . name ,
44- event ,
45- currentTimestamp + eventOptions . listeners . expiresAtTTL ,
46- currentTimestamp + eventOptions . listeners . readyToRetryAfterTTL ,
47- ) ;
45+ const inboxOutboxTransportEvent = databaseDriver . createInboxOutboxTransportEvent ( event . name , event , currentTimestamp + eventOptions . listeners . expiresAtTTL , currentTimestamp + eventOptions . listeners . readyToRetryAfterTTL ) ;
46+
47+ const persister = customDatabaseDriverPersister ?? databaseDriver ;
4848
4949 entities . forEach ( ( entity ) => {
50- if ( entity . operation === ' persist' ) {
51- databaseDriver . persist ( entity . entity ) ;
50+ if ( entity . operation === TransactionalEventEmitterOperations . persist ) {
51+ persister . persist ( entity . entity ) ;
5252 }
53- if ( entity . operation === ' remove' ) {
54- databaseDriver . remove ( entity . entity ) ;
53+ if ( entity . operation === TransactionalEventEmitterOperations . remove ) {
54+ persister . remove ( entity . entity ) ;
5555 }
5656 } ) ;
5757
58- databaseDriver . persist ( inboxOutboxTransportEvent ) ;
59- await databaseDriver . flush ( ) ;
58+ persister . persist ( inboxOutboxTransportEvent ) ;
59+ await persister . flush ( ) ;
6060
6161 this . inboxOutboxEventProcessor . process ( eventOptions , inboxOutboxTransportEvent , this . getListeners ( event . name ) ) ;
6262 }
0 commit comments