Files
handler/src/sern.ts
Jacob Nguyen f9e7eaf92d feat: 4.2.0 load multiple directories & handleModuleErrors (#378)
* error-handling-draft

* feat: array based module loading (#379)

Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com>

* Update utility.ts

* Update sern.ts

* describesemanticsbetter

---------

Co-authored-by: Duro <davidwright13503@gmail.com>
2025-01-18 11:47:51 -06:00

81 lines
3.1 KiB
TypeScript

//side effect: global container
import { useContainerRaw } from '@sern/ioc/global';
// set asynchronous capturing of errors
import events from 'node:events'
events.captureRejections = true;
import callsites from 'callsites';
import * as Files from './core/module-loading';
import eventsHandler from './handlers/user-defined-events';
import ready from './handlers/ready';
import { interactionHandler } from './handlers/interaction';
import { messageHandler } from './handlers/message'
import { presenceHandler } from './handlers/presence';
import type { Payload, UnpackedDependencies, Wrapper } from './types/utility';
import type { Presence} from './core/presences';
import { registerTasks } from './handlers/tasks';
/**
* @since 1.0.0
* @param maybeWrapper Options to pass into sern.
* Function to start the handler up
* @example
* ```ts title="src/index.ts"
* Sern.init({
* commands: 'dist/commands',
* events: 'dist/events',
* })
* ```
*/
export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) {
const startTime = performance.now();
const deps = useContainerRaw().deps<UnpackedDependencies>();
if (maybeWrapper.events !== undefined) {
eventsHandler(deps, maybeWrapper)
.then(() => {
deps['@sern/logger']?.info({ message: "Events registered" });
});
} else {
deps['@sern/logger']?.info({ message: "No events registered" });
}
// autohandle errors that occur in modules.
// convenient for rapid iteration
if(maybeWrapper.handleModuleErrors) {
if(!deps['@sern/logger']) {
throw Error('A logger is required to handleModuleErrors.\n A default logger is already supplied!');
}
deps['@sern/logger']?.info({ 'message': 'handleModuleErrors 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
ready(maybeWrapper.commands, deps)
.then(() => {
const time = ((performance.now() - startTime) / 1000).toFixed(2);
deps['@sern/logger']?.info({ message: `sern: registered in ${time} s` });
if(presencePath.exists) {
const setPresence = async (p: Presence.Result) => {
return deps['@sern/client'].user?.setPresence(p);
}
presenceHandler(presencePath.path, setPresence);
}
if(maybeWrapper.tasks) {
registerTasks(maybeWrapper.tasks, deps);
}
})
.catch(err => { throw err });
interactionHandler(deps, maybeWrapper.defaultPrefix);
messageHandler(deps, maybeWrapper.defaultPrefix)
}