@@ -14,6 +14,7 @@ import { CommandKitErrorCodes, isErrorType } from '../../utils/error-codes';
1414export type EventListener = {
1515 handler : ListenerFunction ;
1616 once : boolean ;
17+ parallel : boolean ;
1718} ;
1819
1920/**
@@ -111,6 +112,7 @@ export class AppEventsHandler {
111112 listeners . push ( {
112113 handler : handler . default ,
113114 once : ! ! handler . once ,
115+ parallel : ! ! handler . parallel ,
114116 } ) ;
115117 }
116118
@@ -164,6 +166,12 @@ export class AppEventsHandler {
164166 const onceListeners = listeners . filter ( ( listener ) => listener . once ) ;
165167 const onListeners = listeners . filter ( ( listener ) => ! listener . once ) ;
166168
169+ // Further separate into parallel and sequential groups
170+ const onParallelListeners = onListeners . filter ( ( listener ) => listener . parallel ) ;
171+ const onSequentialListeners = onListeners . filter ( ( listener ) => ! listener . parallel ) ;
172+ const onceParallelListeners = onceListeners . filter ( ( listener ) => listener . parallel ) ;
173+ const onceSequentialListeners = onceListeners . filter ( ( listener ) => ! listener . parallel ) ;
174+
167175 // Initialize set to track executed once listeners
168176 const executedOnceListeners = new Set < ListenerFunction > ( ) ;
169177
@@ -200,7 +208,24 @@ export class AppEventsHandler {
200208 variables : new Map ( ) ,
201209 } ,
202210 async ( ) => {
203- for ( const listener of onListeners ) {
211+ // Execute parallel listeners first using Promise.all
212+ if ( onParallelListeners . length > 0 ) {
213+ await Promise . all (
214+ onParallelListeners . map ( async ( listener ) => {
215+ try {
216+ await listener . handler ( ...args , client , this . commandkit ) ;
217+ } catch ( e ) {
218+ // Log errors but don't stop other parallel listeners
219+ Logger . error `Error handling event ${ name } ${
220+ namespace ? ` of namespace ${ namespace } ` : ''
221+ } : ${ e } `;
222+ }
223+ } ) ,
224+ ) ;
225+ }
226+
227+ // Execute sequential listeners in order
228+ for ( const listener of onSequentialListeners ) {
204229 try {
205230 await listener . handler ( ...args , client , this . commandkit ) ;
206231 } catch ( e ) {
@@ -248,7 +273,40 @@ export class AppEventsHandler {
248273 } )
249274 . catch ( Object ) ;
250275
251- for ( const listener of onceListeners ) {
276+ // Execute parallel once listeners first using Promise.all
277+ if ( onceParallelListeners . length > 0 ) {
278+ await Promise . all (
279+ onceParallelListeners . map ( async ( listener ) => {
280+ return runInEventWorkerContext (
281+ {
282+ event : name ,
283+ namespace : namespace ?? null ,
284+ data : data . event ,
285+ commandkit : this . commandkit ,
286+ arguments : args ,
287+ variables : new Map ( ) ,
288+ } ,
289+ async ( ) => {
290+ try {
291+ // Skip if already executed
292+ if ( executedOnceListeners . has ( listener . handler ) ) return ;
293+
294+ await listener . handler ( ...args , client , this . commandkit ) ;
295+ executedOnceListeners . add ( listener . handler ) ;
296+ } catch ( e ) {
297+ // Log errors but don't stop other parallel listeners
298+ Logger . error `Error handling event ${ name } ${
299+ namespace ? ` of namespace ${ namespace } ` : ''
300+ } : ${ e } `;
301+ }
302+ } ,
303+ ) ;
304+ } ) ,
305+ ) ;
306+ }
307+
308+ // Execute sequential once listeners in order
309+ for ( const listener of onceSequentialListeners ) {
252310 if ( broken ) break ; // Stop executing remaining listeners if propagation was stopped
253311
254312 await runInEventWorkerContext (
@@ -307,7 +365,7 @@ export class AppEventsHandler {
307365 ...data ,
308366 mainListener :
309367 onListeners . length > 0
310- ? { handler : mainHandler , once : false }
368+ ? { handler : mainHandler , once : false , parallel : false }
311369 : undefined ,
312370 executedOnceListeners,
313371 } ) ;
@@ -332,7 +390,7 @@ export class AppEventsHandler {
332390 Logger . info (
333391 `🔌 Registered event ${ name } ${
334392 namespace ? ` of namespace ${ namespace } ` : ''
335- } (${ onListeners . length } regular , ${ onceListeners . length } once-only )`,
393+ } (${ onSequentialListeners . length } sequential , ${ onParallelListeners . length } parallel, ${ onceSequentialListeners . length } once-sequential, ${ onceParallelListeners . length } once-parallel )`,
336394 ) ;
337395 }
338396 }
0 commit comments