Skip to content

Commit 79953af

Browse files
Copilottwlite
andcommitted
Implement parallel event handler support
Co-authored-by: twlite <[email protected]>
1 parent ac0b5b0 commit 79953af

File tree

1 file changed

+62
-4
lines changed

1 file changed

+62
-4
lines changed

packages/commandkit/src/app/handlers/AppEventsHandler.ts

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { CommandKitErrorCodes, isErrorType } from '../../utils/error-codes';
1414
export 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

Comments
 (0)