From 90e55dfa1466c91e5da48922251309331921b1ef Mon Sep 17 00:00:00 2001 From: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Date: Mon, 18 Mar 2024 01:47:14 -0500 Subject: [PATCH] fix: sern emitter err (#358) * prep for fix * fix ? (not tested * fix error event not emitting payload --- src/core/operators.ts | 11 ++++++----- src/core/structures/services/error-handling.ts | 2 +- src/handlers/event-utils.ts | 4 ++-- src/handlers/user-defined-events.ts | 2 +- src/sern.ts | 2 +- src/types/utility.ts | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/core/operators.ts b/src/core/operators.ts index d534c5b..4c5ff72 100644 --- a/src/core/operators.ts +++ b/src/core/operators.ts @@ -59,13 +59,14 @@ export const sharedEventStream = (e: Emitter, eventName: string) => { return (fromEvent(e, eventName) as Observable).pipe(share()); }; -export function handleError(crashHandler: ErrorHandling, logging?: Logging) { +export function handleError(crashHandler: ErrorHandling, emitter: Emitter, logging?: Logging) { return (pload: unknown, caught: Observable) => { // This is done to fit the ErrorHandling contract - const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true })); - //formatted payload - logging?.error({ message: util.inspect(pload) }); - crashHandler.updateAlive(err); + if(!emitter.emit('error', pload)) { + const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true })); + logging?.error({ message: util.inspect(pload) }); + crashHandler.updateAlive(err); + } return caught; }; } diff --git a/src/core/structures/services/error-handling.ts b/src/core/structures/services/error-handling.ts index 3f55b16..143639c 100644 --- a/src/core/structures/services/error-handling.ts +++ b/src/core/structures/services/error-handling.ts @@ -10,7 +10,7 @@ export class DefaultErrorHandling implements ErrorHandling { throw err; } - #keepAlive = 5; + #keepAlive = 1; updateAlive(err: Error) { this.#keepAlive--; diff --git a/src/handlers/event-utils.ts b/src/handlers/event-utils.ts index 643ab35..fc7a16c 100644 --- a/src/handlers/event-utils.ts +++ b/src/handlers/event-utils.ts @@ -246,9 +246,9 @@ export function makeModuleExecutor< ); } -export const handleCrash = (err: ErrorHandling, log?: Logging) => +export const handleCrash = (err: ErrorHandling,sernemitter: Emitter, log?: Logging) => pipe( - catchError(handleError(err, log)), + catchError(handleError(err, sernemitter, log)), finalize(() => { log?.info({ message: 'A stream closed or reached end of lifetime', diff --git a/src/handlers/user-defined-events.ts b/src/handlers/user-defined-events.ts index 3dd4989..66e7dfb 100644 --- a/src/handlers/user-defined-events.ts +++ b/src/handlers/user-defined-events.ts @@ -31,6 +31,6 @@ export function eventsHandler( * Where all events are turned on */ mergeAll(), - handleCrash(err, log)) + handleCrash(err, emitter, log)) .subscribe(); } diff --git a/src/sern.ts b/src/sern.ts index e88bd06..fd458f4 100644 --- a/src/sern.ts +++ b/src/sern.ts @@ -58,5 +58,5 @@ export function init(maybeWrapper: Wrapper | 'file') { const messages$ = messageHandler(dependencies, wrapper.defaultPrefix); const interactions$ = interactionHandler(dependencies); // 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(); } diff --git a/src/types/utility.ts b/src/types/utility.ts index 65efc3d..90339e4 100644 --- a/src/types/utility.ts +++ b/src/types/utility.ts @@ -18,7 +18,7 @@ export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; export interface SernEventsMapping { 'module.register': [Payload]; 'module.activate': [Payload]; - error: [Payload]; + error: [{ type: PayloadType.Failure; module?: AnyModule; reason: string | Error }]; warning: [Payload]; modulesLoaded: [never?]; } @@ -26,7 +26,7 @@ export interface SernEventsMapping { export type Payload = | { type: PayloadType.Success; module: AnyModule } | { 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 | MessageReplyOptions;