From de6ae910f502ad783bb2adc0cee4112628ce64e5 Mon Sep 17 00:00:00 2001 From: jacoobes Date: Wed, 15 Jan 2025 19:42:29 -0600 Subject: [PATCH] error-handling-draft --- src/index.ts | 17 -------------- src/sern.ts | 23 +++++++++++++----- src/types/utility.ts | 55 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/index.ts b/src/index.ts index c0a01ef6..8becddc3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -53,20 +53,3 @@ export * from './core/plugin'; export { CommandType, PluginType, PayloadType, EventType } from './core/structures/enums'; export { Context } from './core/structures/context'; export { type CoreDependencies, makeDependencies, single, transient, Service, Services } from './core/ioc'; - - -import type { Container } from '@sern/ioc'; - -/** - * @deprecated This old signature will be incompatible with future versions of sern >= 4.0.0. See {@link makeDependencies} - * @example - * ```ts - * To switch your old code: - await makeDependencies(({ add }) => { - add('@sern/client', new Client()) - }) - * ``` - */ -export interface DependencyConfiguration { - build: (root: Container) => Container; -} diff --git a/src/sern.ts b/src/sern.ts index a9a461eb..26ef2b9b 100644 --- a/src/sern.ts +++ b/src/sern.ts @@ -11,7 +11,7 @@ import ready from './handlers/ready'; import { interactionHandler } from './handlers/interaction'; import { messageHandler } from './handlers/message' import { presenceHandler } from './handlers/presence'; -import { UnpackedDependencies, Wrapper } from './types/utility'; +import type { Payload, UnpackedDependencies, Wrapper } from './types/utility'; import type { Presence} from './core/presences'; import { registerTasks } from './handlers/tasks'; @@ -32,7 +32,6 @@ import { registerTasks } from './handlers/tasks'; export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) { const startTime = performance.now(); const deps = useContainerRaw().deps(); - if (maybeWrapper.events !== undefined) { eventsHandler(deps, maybeWrapper) .then(() => { @@ -42,6 +41,22 @@ export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) { deps['@sern/logger']?.info({ message: "No events registered" }); } + // autohandle errors that occur in modules. + // convenient for rapid iteration + if(maybeWrapper.autoHandleErrors) { + if(!deps['@sern/logger']) { + throw Error('A logger is required to autoHandleModuleErrors.\n A default logger is already supplied!'); + } + deps['@sern/logger']?.info({ 'message': 'autoHandleModuleErrors enabled' }) + deps['@sern/emitter'].addListener('error', (payload: Payload) => { + if(payload.type === 'failure') { + deps['@sern/logger']?.error({ message: payload.reason }) + } else { + deps['@sern/logger']?.warning({ message: "error event should only have payloads of 'failure'" }); + } + }) + } + const initCallsite = callsites()[1].getFileName(); const presencePath = Files.shouldHandle(initCallsite!, "presence"); //Ready event: load all modules and when finished, time should be taken and logged @@ -60,10 +75,6 @@ export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) { } }) .catch(err => { throw err }); - - //const messages$ = messageHandler(deps, maybeWrapper.defaultPrefix); interactionHandler(deps, maybeWrapper.defaultPrefix); messageHandler(deps, maybeWrapper.defaultPrefix) - // listening to the message stream and interaction stream - //merge(messages$, interactions$).subscribe(); } diff --git a/src/types/utility.ts b/src/types/utility.ts index 681ade76..9be96cd4 100644 --- a/src/types/utility.ts +++ b/src/types/utility.ts @@ -26,9 +26,64 @@ export type UnpackedDependencies = { export type ReplyOptions = string | Omit | MessageReplyOptions; +/** + * @interface Wrapper + * @description Configuration interface for the sern framework. This interface defines + * the structure for configuring essential framework features including command handling, + * event management, and task scheduling. + */ export interface Wrapper { + /** + * @property {string} commands + * @description Specifies the directory path where command modules are located. + * This is a required property that tells Sern where to find and load command files. + * The path should be relative to the project root. + * + * @example + * commands: "./dist/commands" + */ commands: string; + + /** + * @property {boolean} [autoHandleErrors] + * @description Optional flag to enable automatic error handling for modules. + * When enabled, sern will automatically catch and handle errors that occur + * during module execution, preventing crashes and providing error logging. + * + * @default false + */ + autoHandleErrors?: boolean; + + /** + * @property {string} [defaultPrefix] + * @description Optional prefix for text commands. This prefix will be used + * to identify text commands in messages. If not specified, text commands {@link CommandType.Text} + * will be disabled. + * + * @example + * defaultPrefix: "?" + */ defaultPrefix?: string; + + /** + * @property {string} [events] + * @description Optional directory path where event modules are located. + * If provided, Sern will automatically register and handle events from + * modules in this directory. The path should be relative to the project root. + * + * @example + * events: "./dist/events" + */ events?: string; + + /** + * @property {string} [tasks] + * @description Optional directory path where scheduled task modules are located. + * If provided, Sern will automatically register and handle scheduled tasks + * from modules in this directory. The path should be relative to the project root. + * + * @example + * tasks: "./dist/tasks" + */ tasks?: string; }