@@ -209,7 +209,7 @@ abstract class AbstractMicroservice {
209209
210210 /**
211211 * Add process exit handler
212- * E.g. for close DB connection and etc.
212+ * E.g. for close DB connection etc.
213213 */
214214 public onExit ( handler : ProcessExitHandler ) : void {
215215 PROCESS_EXIT_EVENT_TYPES . forEach ( ( eventType ) => {
@@ -325,7 +325,7 @@ abstract class AbstractMicroservice {
325325 }
326326
327327 /**
328- * Get task from queue
328+ * Send response (if exist) and get new task from queue
329329 * @protected
330330 */
331331 protected async getTask ( httpAgent : Agent , response ?: MicroserviceResponse ) : Promise < ITask > {
@@ -344,13 +344,6 @@ abstract class AbstractMicroservice {
344344 } ) ;
345345
346346 const task = new MicroserviceRequest ( req . data ) ;
347- const taskSender = task . getParams ( ) ?. payload ?. sender ?? 'client' ;
348-
349- this . logDriver (
350- ( ) => `--> from ${ taskSender } : ${ task . toString ( ) } ` ,
351- LogType . REQ_INTERNAL ,
352- task . getId ( ) ,
353- ) ;
354347
355348 return { task, req } ;
356349 } catch ( e ) {
@@ -368,28 +361,6 @@ abstract class AbstractMicroservice {
368361 }
369362 }
370363
371- /**
372- * Send result of processing the task and get new task from queue
373- * @protected
374- */
375- protected sendResponse (
376- response : MicroserviceResponse ,
377- httpAgent : Agent ,
378- task : ITask [ 'task' ] ,
379- ) : Promise < ITask > {
380- const taskId = response . getId ( ) ;
381- const receiver =
382- task instanceof MicroserviceRequest ? task . getParams ( ) ?. payload ?. sender ?? 'queue' : 'queue' ;
383-
384- this . logDriver (
385- ( ) => `<-- to ${ receiver } : ${ response . toString ( ) } ` ,
386- LogType . RES_INTERNAL ,
387- taskId ,
388- ) ;
389-
390- return this . getTask ( httpAgent , response ) ;
391- }
392-
393364 /**
394365 * Execute request
395366 * @protected
@@ -399,6 +370,14 @@ abstract class AbstractMicroservice {
399370 req : ITask [ 'req' ] ,
400371 ) : Promise < MicroserviceResponse > {
401372 const response = new MicroserviceResponse ( { id : task . getId ( ) } ) ;
373+ const taskSender =
374+ task instanceof MicroserviceRequest ? task . getParams ( ) ?. payload ?. sender : null ;
375+
376+ this . logDriver (
377+ ( ) => `--> from ${ taskSender || 'client' } : ${ task . toString ( ) } ` ,
378+ LogType . REQ_INTERNAL ,
379+ task . getId ( ) ,
380+ ) ;
402381
403382 // Response error
404383 if ( task instanceof MicroserviceResponse ) {
@@ -452,9 +431,51 @@ abstract class AbstractMicroservice {
452431 }
453432 }
454433
434+ this . logDriver (
435+ ( ) => `<-- to ${ taskSender || 'queue' } : ${ response . toString ( ) } ` ,
436+ LogType . RES_INTERNAL ,
437+ response . getId ( ) ,
438+ ) ;
439+
455440 return response ;
456441 }
457442
443+ /**
444+ * Execute incoming event
445+ * @protected
446+ */
447+ protected async executeEvent ( data : IEventRequest ) : Promise < void > {
448+ const sender = data ?. payload ?. sender ?? 'unknown' ;
449+ const eventName = data ?. payload ?. eventName ;
450+
451+ this . logDriver (
452+ ( ) => `<-- event ${ eventName as string } from ${ sender } : ${ JSON . stringify ( data ) } ` ,
453+ LogType . INFO ,
454+ ) ;
455+
456+ if ( ! eventName ) {
457+ return ;
458+ }
459+
460+ for ( const [ eventHandlersName , handlers ] of Object . entries ( this . eventHandlers ) ) {
461+ if (
462+ eventHandlersName === eventName ||
463+ eventName . startsWith ( eventHandlersName . replace ( '*' , '' ) )
464+ ) {
465+ for ( const handler of handlers ) {
466+ try {
467+ await handler ( data , { app : this , sender } ) ;
468+ } catch ( e ) {
469+ this . logDriver (
470+ ( ) => `event handler error ${ eventHandlersName } : ${ e . message as string } ` ,
471+ LogType . INFO ,
472+ ) ;
473+ }
474+ }
475+ }
476+ }
477+ }
478+
458479 /**
459480 * Start queue worker
460481 * @protected
@@ -469,7 +490,7 @@ abstract class AbstractMicroservice {
469490 while ( true ) {
470491 const response = await this . executeRequest ( task , req ) ;
471492
472- ( { task, req } = await this . sendResponse ( response , httpAgent , task ) ) ;
493+ ( { task, req } = await this . getTask ( httpAgent , response ) ) ;
473494 }
474495 }
475496
@@ -505,28 +526,7 @@ abstract class AbstractMicroservice {
505526 timeout : eventWorkerTimeout ,
506527 } ) ;
507528
508- const sender = data ?. payload ?. sender ?? 'unknown' ;
509- const eventName = data ?. payload ?. eventName ;
510-
511- this . logDriver (
512- ( ) => `<-- event ${ eventName as string } from ${ sender } : ${ JSON . stringify ( data ) } ` ,
513- LogType . INFO ,
514- ) ;
515-
516- if ( ! eventName ) {
517- continue ;
518- }
519-
520- Object . entries ( this . eventHandlers ) . forEach ( ( [ eventHandlersName , handlers ] ) => {
521- if (
522- eventHandlersName === eventName ||
523- eventName . startsWith ( eventHandlersName . replace ( '*' , '' ) )
524- ) {
525- handlers . forEach ( ( handler ) => {
526- void handler ( data , { app : this , sender } ) ;
527- } ) ;
528- }
529- } ) ;
529+ await this . executeEvent ( data ) ;
530530 } catch ( e ) {
531531 // Could not connect to ijson or channel
532532 if ( e . message === 'socket hang up' || e . message . includes ( 'ECONNREFUSED' ) ) {
@@ -546,6 +546,7 @@ abstract class AbstractMicroservice {
546546 public static async eventPublish < TParams > (
547547 eventName : string ,
548548 params ?: IEventRequest < TParams > ,
549+ payload ?: Record < string , any > ,
549550 ) : Promise < number | string > {
550551 const ms = this . instance ;
551552 const {
@@ -570,6 +571,7 @@ abstract class AbstractMicroservice {
570571 payload : {
571572 sender : name ,
572573 eventName,
574+ ...payload ,
573575 } ,
574576 } ,
575577 headers : {
0 commit comments