fix: sern emitter err (#358)

* prep for fix

* fix ? (not tested

* fix error event not emitting payload
This commit is contained in:
Jacob Nguyen
2024-03-18 01:47:14 -05:00
committed by GitHub
parent 2106522812
commit 90e55dfa14
6 changed files with 13 additions and 12 deletions

View File

@@ -59,13 +59,14 @@ export const sharedEventStream = <T>(e: Emitter, eventName: string) => {
return (fromEvent(e, eventName) as Observable<T>).pipe(share()); return (fromEvent(e, eventName) as Observable<T>).pipe(share());
}; };
export function handleError<C>(crashHandler: ErrorHandling, logging?: Logging) { export function handleError<C>(crashHandler: ErrorHandling, emitter: Emitter, logging?: Logging) {
return (pload: unknown, caught: Observable<C>) => { return (pload: unknown, caught: Observable<C>) => {
// This is done to fit the ErrorHandling contract // This is done to fit the ErrorHandling contract
const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true })); if(!emitter.emit('error', pload)) {
//formatted payload const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true }));
logging?.error({ message: util.inspect(pload) }); logging?.error({ message: util.inspect(pload) });
crashHandler.updateAlive(err); crashHandler.updateAlive(err);
}
return caught; return caught;
}; };
} }

View File

@@ -10,7 +10,7 @@ export class DefaultErrorHandling implements ErrorHandling {
throw err; throw err;
} }
#keepAlive = 5; #keepAlive = 1;
updateAlive(err: Error) { updateAlive(err: Error) {
this.#keepAlive--; this.#keepAlive--;

View File

@@ -246,9 +246,9 @@ export function makeModuleExecutor<
); );
} }
export const handleCrash = (err: ErrorHandling, log?: Logging) => export const handleCrash = (err: ErrorHandling,sernemitter: Emitter, log?: Logging) =>
pipe( pipe(
catchError(handleError(err, log)), catchError(handleError(err, sernemitter, log)),
finalize(() => { finalize(() => {
log?.info({ log?.info({
message: 'A stream closed or reached end of lifetime', message: 'A stream closed or reached end of lifetime',

View File

@@ -31,6 +31,6 @@ export function eventsHandler(
* Where all events are turned on * Where all events are turned on
*/ */
mergeAll(), mergeAll(),
handleCrash(err, log)) handleCrash(err, emitter, log))
.subscribe(); .subscribe();
} }

View File

@@ -58,5 +58,5 @@ export function init(maybeWrapper: Wrapper | 'file') {
const messages$ = messageHandler(dependencies, wrapper.defaultPrefix); const messages$ = messageHandler(dependencies, wrapper.defaultPrefix);
const interactions$ = interactionHandler(dependencies); const interactions$ = interactionHandler(dependencies);
// listening to the message stream and interaction stream // listening to the message stream and interaction stream
merge(messages$, interactions$).pipe(handleCrash(errorHandler, logger)).subscribe(); merge(messages$, interactions$).pipe(handleCrash(errorHandler, dependencies[0], logger)).subscribe();
} }

View File

@@ -18,7 +18,7 @@ export type Args = ParseType<{ text: string[]; slash: SlashOptions }>;
export interface SernEventsMapping { export interface SernEventsMapping {
'module.register': [Payload]; 'module.register': [Payload];
'module.activate': [Payload]; 'module.activate': [Payload];
error: [Payload]; error: [{ type: PayloadType.Failure; module?: AnyModule; reason: string | Error }];
warning: [Payload]; warning: [Payload];
modulesLoaded: [never?]; modulesLoaded: [never?];
} }
@@ -26,7 +26,7 @@ export interface SernEventsMapping {
export type Payload = export type Payload =
| { type: PayloadType.Success; module: AnyModule } | { type: PayloadType.Success; module: AnyModule }
| { type: PayloadType.Failure; module?: AnyModule; reason: string | Error } | { type: PayloadType.Failure; module?: AnyModule; reason: string | Error }
| { type: PayloadType.Warning; reason: string }; | { type: PayloadType.Warning; module: undefined; reason: string };
export type ReplyOptions = string | Omit<InteractionReplyOptions, 'fetchReply'> | MessageReplyOptions; export type ReplyOptions = string | Omit<InteractionReplyOptions, 'fetchReply'> | MessageReplyOptions;